{"_id":"@trufflehq/transframe","_rev":"64-21d8d66a06c0513fa363189815c5d74a","name":"@trufflehq/transframe","dist-tags":{"latest":"0.1.9","nightly":"0.0.37","alpha":"0.1.5-alpha.1"},"versions":{"0.0.1":{"name":"@trufflehq/transframe","version":"0.0.1","description":"A library for creating apis for iframes","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"types":"./dist/cjs/index.d.ts","gitHead":"974781e5d0e7cf8fbf70ef71ec0ffbbcd4b5b135","_id":"@trufflehq/transframe@0.0.1","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-eyWwdcVKyfCLUCIQsAhCWAOua00AsaXnUIniR80tUP0XrrYkLBfXXf/EswKb6wZWkCm+7d/MKriR2rMj4LFcyQ==","shasum":"63a7017fc394d3ab9f5f6ec0aac026d8c133bdb7","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.1.tgz","fileCount":50,"unpackedSize":45222,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC++8XURwW6G2xICiQUPIBO7KxInxcTfKPBMNlckojEngIhAN0FCCLyQlUOGRpgZGWVykd05nurhxClNy9ogUvgJdj3"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj4X/lACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr1xA/8C3e4l+nkiWKgQTMhG8ZYT+QqRVZk/bv1lrHKdPACiuFAGAXh\r\n3mBMoyqQ/87a/LeiUqItS3CLyfNO5C/8HIbnNBjMEF3ogGUoiVGrRzFBR/+t\r\nn4kT0UP5LYXFN5h+g8n00gw05Fg4kqA5rC1XC8sS3RO1o0W2SNo2l8EFQTcg\r\nvDmzU5I1fP1qUwsiQixmD6g8/XekW8Zqip/VbIfXXRC535wlHCtJneI9nkAa\r\nvveRcjXBZMZwIeylp7SODXjmihyo49YhVACR/gdzrF/gSp/tDFASVCieYN7v\r\nAwdMtO+NWGcIH6nuu4SAjKspZKSkSFh6MfpcD+iJzjGG0h/8WmgaQO+7BLT9\r\n/JCQGTrQu7qjxnDyYsmi1Z1u5f39L/JC5ombPGmnVljSIUVuSK/ByWrmDaJS\r\n1CWZ3TDgUGAySPJQLWr+m0iB6c8YsEiHKw1UkeSu45OHN1Uw/J7diVWJ3YyJ\r\nDm20h9IlI5VvS0sw7X+OmAvYAyfTfiwpYPaXa5LvlnqKvYFWDW2HbuhXGf6c\r\n/kslm6YdThiV/3vmYnQzEomWAOpFvagIQsnD5cy1flT7HQGrh7flL9kxokD5\r\nHLYGfS/lbwmaRQuxnUnaZPEPup15RP3AtKkIgg+oQ/r/edaAWF065cAmp1JY\r\n+aYun/SW2E2+L/pFgWro51fYNGCFufomqms=\r\n=I26N\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.1_1675722725054_0.14626415598124898"},"_hasShrinkwrap":false},"0.0.2":{"name":"@trufflehq/transframe","version":"0.0.2","description":"A library for creating apis for iframes","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"types":"./dist/cjs/index.d.ts","gitHead":"b6d03296debf22e9be182acaa24fe792f3fa328e","_id":"@trufflehq/transframe@0.0.2","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-WfaLHju0PcoWp+GnyLjwrOilMG8llIGQ/rqg5X02vGFo7ZRuNuapF5lYoQ08IOUefbyiaGtlbQrdSwreRPJIjA==","shasum":"21591532d802eaf0ca04da41efa7d9bcbdd862d5","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.2.tgz","fileCount":54,"unpackedSize":52956,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCYQHMIxehKIeXhppPb+cdDQPVsFaOXTa7qA3anNxhkdgIgMhEYE1rJzgQ1yCu9SEjKy8zCc+XqyzAPjSMiRMXNp8U="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj4YCkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoN6A/+Jbn6gm6SBTUN+BmFKiwzgxadYSYwky2kNc8JtHKpK7nO0g5t\r\naJ+lBEiUYTGOcu6RdynLdDch9wvVHjw+KbyD7AMSizFrtHrxMjoxwe/9rQgf\r\nucwg8d9yJ4oTjrh9uRz5HgFrGsK0XzJAEn/XFE7dolpk/LNUKDVEwMTjE870\r\nbVXNgA7fNCxmfHIVVCNNAo5qku8rYl1m4/HE3L6M3t3w1LrgXBGPvidfqZgw\r\nIURIq7TfsP/YmMXDbCV/JBKx/tm16svhoJSZOtVmin4sRpA8zlLXibj8rRgU\r\nnEOdSgElr9G3a+gLnik79ZkNSi5ZzPRNcbG5vc6ZDRJwcZlOCeg5t8tAdqk1\r\nbb1baFG1DjS8/cFdWGSfaVe87QRGKJNL/Fl+97l2AgZcdUInwWj0VXDSMg3w\r\n1eKCgh2yDeXoXQQVoHR4qtqtAkb02jPUxNUs1G8UkqfiPli4rzKcUkK532CK\r\n6RGZ4bpL/gMzu5EozTLcPOnKBSVrpU59lpKNhQBz3fG7g79Uq+X9wiJutPXL\r\nqZsR3mXKnlXnX1+hyOE86RhDroIdUHFEwf2LGMsLq3iz9YXpAKU7950lHZMm\r\n8rEd5ub38LsR8ODbhfIQMRH0jTfqmelFakMafYwe7eka38LIlvthz7bwaQMu\r\nA9X20tZ6wGiFojNZa/uw10Y7K5LeBeO7Tco=\r\n=HHxq\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.2_1675722916419_0.15558352935931086"},"_hasShrinkwrap":false},"0.0.3":{"name":"@trufflehq/transframe","version":"0.0.3","description":"A library for creating apis for iframes","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"types":"./dist/cjs/index.d.ts","gitHead":"b6d03296debf22e9be182acaa24fe792f3fa328e","_id":"@trufflehq/transframe@0.0.3","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-tyT+PUajla/Xr7LY+Cpnvxk5zr3aqb7oYRz3jVrqRjDUeURVTziZPiSfGA314F2Wmet8YAZfkJdU3ll7Lv/UEQ==","shasum":"44b9b6d6e3a67f753803a9cda8428913c91e9af3","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.3.tgz","fileCount":54,"unpackedSize":52686,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICl52xolrtHlNZoPN4/i8ZR6BtkyP8vLY5g/JP78UdP8AiAljyFkStjKfO3QjP+osRIyFOyvquBnnaEPQIDOB4q5Wg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj4YGCACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrPcw/+LIG5ZddbwOxhBXpe7tx4sCkimlXQR3n+MFD9lbrXnULZSkMk\r\nwU2YLH2JATxPTqQpnj+LsgKtiJ85iiPejqn0zJHh9RbccrjytGjuB/RzlOYP\r\nS5xCMzfvA+Q9RbfHgSt9jhqN1NW6waOSXAngA1FOSCvM6NKcVFkTeentwAOI\r\nwBaD+5iOyQp2eXZSw7KYlItYMUb77N/YefHv8pG0LSuBAUELmp2nYPmkLomW\r\nJkV9hc4Y8Wczg2BK5ZWa+0EJ+UwcsEr4QzmhOAIpkawX7z6adcwVVog6mDgm\r\nd4JUB35I+wWgHA91PuamSyB4HLfFih9wXYUBqOI3c3zc5jHV2DVXRQt9SdX7\r\nLE8fFYlcUmWxHdB9a6lCnqTl64Jel4GeaKCwwkR5fVFvwY9HiamPHPbRCV9n\r\nhYpF6Ed9uPy1mmaHKVQchRYhhKDrXsApSRItajiIkQDUzRUJU5gimy5G53rM\r\nJqt43fRTyd6T0TqZLlpvExwizHMzjIUW8PXHGuxnGCiilITRVc+d+WLsQkKY\r\nK/ioqizjfsNQrEeH17B1u4q+WMzJ5lyoZRg+Y1vQw6p0BmS4ymcTre5Ta0Ow\r\nM4I8gAnyBY+kK8yKMqb6RjSMH74lGRnVbB4/BCbOR5ErCWZak+TurpLQeFw3\r\nXrgZLU8esFGjeOLdYCget4Zyca4gc1qlBOw=\r\n=fJt1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.3_1675723138547_0.3051375635247504"},"_hasShrinkwrap":false},"0.0.4":{"name":"@trufflehq/transframe","version":"0.0.4","description":"A library for creating apis for iframes","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"types":"./dist/cjs/index.d.ts","gitHead":"285c0fb453b49a3be30dcae4c65d8fa16ae73bd6","_id":"@trufflehq/transframe@0.0.4","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-E+hp8oT0UtImchKjHbnbvPz5ezVTksc8PPsURMm47iXLYYB/0jvmNUKJgbEAaa1F7wXb2YRjQLjvtXDaAz228w==","shasum":"2496dfd1f12fc9c1a6aea3cfc00ec0011b906171","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.4.tgz","fileCount":54,"unpackedSize":52750,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCA/9LrMYLueJ45CZmDHog2uxHS/zaOjHIoafeAGsJv7gIhAIj0pkUvBTFmjT7pWh0Jg2DImojY4pQfmTu39pRIktjv"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj4bURACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqRsRAAgrmCgQjt0LyWkMO3n4K7FARz7qqU0EIVrR7emuLWUkncGmD9\r\ntENFFYKluR2OzYCUSUN667jbmRrcXI5kWXgZlIsqv0xiR394vnaADzH0XkG3\r\nxU5bZm20+K4h2DlHbzv2kLipRQ9aD7Pg3ZF6LCbaeQ+TpymXfuuJLruKQXlB\r\ntfZYsD0tsos3co8pD96cb99KxnAd6dXNlZES2O6zh+ZG7KShIV57oGJSx2vP\r\nuQhfK1MIUFFCvohXiVW5PUVU5VWEEOwuGujBZgX3LvPLpMbMExuGo7tQZLJO\r\noaBELlBMazHFbUl6qmyZFhA60Bg5cMbBftB/jugm0qLzBCiNrl20aR6bc2pH\r\noRCqPayNABunchThh+Y743J6c+GhNP+nqHLmbkGyoKe+aGwR2WM1eVWKgopO\r\nz+vGY4UZUoN03H7l2iiUOmGSEiZ1IJikFMjLSUXiflLlj4uVxcrbkvJDRLSi\r\nENHmUbWG38+oDA5EClkg7YLLyYeQbIVhGhNB1AEw2eP1TVPweqD9b7isMvMx\r\niLLcNc1RF4XJBM7DD/QYC5t2arJVL1CFptYLTFvjv9PQccimzy6A+GOmOibM\r\ndUr51E6zCXC0tbfKDAbw3kJBd7f6a1xf6tw52M/TeTPKnVIIcJTWrhjPreOS\r\nIvK+aKEujg6Rx3pvXBDehfWKyT2+NO8eEhY=\r\n=qwl6\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.4_1675736337054_0.07167391764006026"},"_hasShrinkwrap":false},"0.0.5":{"name":"@trufflehq/transframe","version":"0.0.5","description":"A library for creating apis for iframes","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"types":"./dist/cjs/index.d.ts","gitHead":"32001447a5efb41f136c2b31de444616ad86e420","_id":"@trufflehq/transframe@0.0.5","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-iyJueJPDzVNlfhYRnuqCoGOZaq/6kdSZEe1oBxZ/hc7TLonRNbrffZmFSqlItj8AdMVOhqshWIJ8vW0vjC2sug==","shasum":"67092a8b156814112ac536fb63ae2ac0c2612d43","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.5.tgz","fileCount":54,"unpackedSize":52606,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH24t62odCbJJiyGzHnpkFmX8OtgGgsYSFweT1oF6/d6AiABCf4E19WOtEeujE0eh93Z5uAO3t0i6FWSaRkKQTUj8w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj4bYBACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq2OBAAlxDHCnoqA4IR42/zE/PKcQBVrrIfwx/31XgOKi9veLjO3G+I\r\n/OSiEtvUuqXv/Va7JMqBTj/HGC3pxMH//y7DyiKQe1C6nOSBTCGCHUeaiFU+\r\n4sMZI96PIZN1MbfndmusUyDFB3IwCcpiZ/yOA7cxv1dbvjIefGDbD3dKLOuC\r\n2v/qGCzjMXupDcOvMw7vAtAC7/KAMg8VN+wiNmJ4qH+h20i3tDYLHy+JutH2\r\nda2dxtvwPRVvm/bluzVjy5pSL3V7yorZM1v5/3vXE1u73AhiIRfsBdrvMg7b\r\nwQJk2AgYbCAOvNAgXRgJYiBvi5X93sxBDf0djufEd5O4sFcTpJAtllAjuG65\r\nEH7LR+ZJ/swuMvH6SsLspVN1l39eQiLwHFGHG1jJtJ1CH7AIHwzetEomsHEu\r\nr6QRPMNFk+2oowlPcRL1cEQGHECW4yHI8lD9bCNdtXLMegIxESCZnxK9qK5b\r\n6K21oZwmfS4lQDz/sX2IPqnwIhG1lyCULSZD3pSx37Lqu/WW0kdNFSx1mtyB\r\nwxokIbKiU8WtINTR5Z4gBr0lCJWkkwlKyidYcT5+/A5VPAqw4/kALXMCNyur\r\n7SJP/3xMKn6hYyLjD6yiJ7E84J4QLMkTVWjWU157dE+B8XcuG7j7pt4sBsn0\r\nqVi+8Ae+ZJFsk1ZtWs+2hjunqkSLS8nd9jI=\r\n=L1nS\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.5_1675736577309_0.2784942156508645"},"_hasShrinkwrap":false},"0.0.6":{"name":"@trufflehq/transframe","version":"0.0.6","description":"A library for creating apis for iframes","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"types":"./dist/cjs/index.d.ts","gitHead":"2200adeebb344bc55eb81670bc175200df60b7be","_id":"@trufflehq/transframe@0.0.6","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-sqqwEoWyuz1nqBfyChMZr5aZxooi0qDVmXRZFuy3nenTiXUoa7AbzJW/MvU5DfOuXxp7gVXX8Df1eqbh4tuz2g==","shasum":"f8948fb81790b6e00e11fe46f4cd60386671037f","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.6.tgz","fileCount":54,"unpackedSize":48404,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFGC+4C0F9X/icMLH9nWm776vkwmFGIYMLZk3yyoJPgqAiBbVXd4jV38AWrpxxKY/b16Gg18x4nRWR34CsLC2BIrfg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj4o4IACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmppOQ//V09zhN5DnxJXrFp+5+2SVwk0gp1ckxMHox7BaZC9HNAArLog\r\nKaN9+dUaY/73jKCIYPMkZ/9jduF67RppBIV9PmwXAti1ImiJmd1AiaWkWdt/\r\nZq6fKUK5EVafeKeLRRhXPEb5Myu0zqVo5uHZtK6Xy+eZthqDhDVEfBEZbUz7\r\n8Zyag70nM1vj/eePsF3toSxskiWPiaaXBHLD67QeSZ/233Y7x66bCpgdVbCN\r\nQmdX0Pjp9XCECsgImMmpu5+TzgCJOSfKY/rrraX2Iq9icEqsTvvUjiMV+pdL\r\nxb956xBtCpxdzOjjuvsjLga35c/m6mftg0HKqrnIOBvx1nbYQoy3Vi3d+fwi\r\nR74qWSKzxOJVIEOicEbioGQaL/ttf9hu5EhmCkzY4v//Hp5mY72ZA7pcrkmq\r\nhYcStguYoXQCN+wrCtqvZ7dASG0Cw27tWBOVFujGlWXArRAjIrqOyki6oL3l\r\nfv/hHmQwWYbd+jnol4luyo9kguX8nOX68zHPOCx95qSX+tda02DT0GfnpcSU\r\nulQJai+//E7Pchk5H6vFn5gDZ2iBYFM9stzBqhQW7R53y/YtFYRCBjL8xnaJ\r\nUgQF428OHWASa86hu/dIr1xIXBXKrdHRJoE1iwO3fqChwhgFGsD0GzOJiWC0\r\n8dvCDrnnC/+vg8p1aoxvwnq3HQfkFKiN8MU=\r\n=DhD1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.6_1675791880103_0.33021564759782907"},"_hasShrinkwrap":false},"0.0.7":{"name":"@trufflehq/transframe","version":"0.0.7","description":"A library for creating apis for iframes","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"types":"./dist/cjs/index.d.ts","gitHead":"56fa8effac05848827b1cc350cfab11c98d021a8","_id":"@trufflehq/transframe@0.0.7","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-h1LPEB42MAhgnyN7D3L/tLyzvUz3WGxX1ZUrPEQLUmcsLdsf+sadGwml8jwjJOwLqYgvh/6gaRZZiRUt2g34rQ==","shasum":"af4e7e251a99cdf9f1e1681ca8bb08b75d339119","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.7.tgz","fileCount":54,"unpackedSize":48624,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHHtVUa2X8H8VRYhBj6rWpFJpWo698U79ASciIR46MpMAiBsmTRSdQEhdaUqfyvmlprU20hsW+8x6ZhLVBgsTywJRw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj4ufJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrtbA/9F3r+yJ9kIUjPK39mDk7w/VFrrCoLLYaGe/fb7HQTnK19c1H9\r\n7D1v+hvCf3tDUSrhpGH5KVun3H9zejfcMnxCPJd61B3i5WbMwnflkWWgkIsO\r\nWN7F7njVDMPmEuii3vdYTv0uPo4eL31TqtAhKAjNVnmy33ou+9NzcH9uxWx5\r\n3tXZzIfccGki8PtHMZObc7Jg3vsyxjsufLJWKCzFKI5XbQuBe0c6KuIGADY0\r\nBZtN0H165idsIc7fLUg085By76CB6TdN78Pl62ZCG1Dv5Hw3vLGadDpH3EKW\r\nEtal/XhOC5RyOf/mHRHxc7t//3UczBq8cYH4+iqwqCbQqI/kowBNi6JosUOW\r\natmYBBv9tM6EyJJliVFmoaGniVfMmHZ4qdbHirbPWJtCJl8HLFt8SP0l4AnH\r\n9OpX+Y2SyO88qFqt9pPG+5MMkDW+76y3lcToGVaEAfTKtypesnX4vQsLeFFp\r\nZ+8rqQ6eagqzIIahS2F340Kowc/n2Eu6EVHLGRIu5wqXYbhKcOz2WpEoG2mW\r\noCxuY48uTfZkBqib4T2P4tTx/dkvb+V+c7PgCgDXUZmbU4kzwcx62Z+10Eyy\r\nWEbXqRUDnVyJ5k/QQW8rb0IAop0FtgArdsbnfzJJuCvnBORHeZv/LM90KsDs\r\na23RshvelR+6YYFrwS+qE74ySQl0bArdkac=\r\n=RNUN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.7_1675814857640_0.11269229917674384"},"_hasShrinkwrap":false},"0.0.8":{"name":"@trufflehq/transframe","version":"0.0.8","description":"A library for creating apis for iframes","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"types":"./dist/cjs/index.d.ts","gitHead":"200f6d56db8f880be5ea411f8c4fbbe94a876b16","_id":"@trufflehq/transframe@0.0.8","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-LPhI/xhwQ308ARcrsSzbljHzooug7W+VP3xr1tEAUo3HV58qoyqUZpcjmNrLmw6xolOIRbQYJXJho4+aMOrXFQ==","shasum":"511765baffa20695133cd43c204f1c153bec9163","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.8.tgz","fileCount":54,"unpackedSize":50942,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC/YLqTHLOGNJRWoMz4HMYome5INoRtAvYrHLDCNlR1dgIhAMs/3RaVe7Y9bNBeEOWtvTqNblLXNx41R/3NL0Muq7on"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj4+hhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqQdQ//VL9O04xHnioUyBNSbXMTFBVvoQ3ZAF5sXUFpbItPxbFQA8Bf\r\npGwYmuMw7CFg6MlTlhdFaHubMyajG3e44IRI4SipSk25o6rtnYYqPHSqiNnz\r\nCtLpAtxVhFdkur2m5EIcHhOGePd/QoqDaTqtGIu15ym4HsF1L63Ddu+gtgRe\r\nmqOY4pUGVkxSp2fDHE2aQdS+fGvbNIhCPUR5lkYlRZcMnaMNBCwBaIYp5Dlu\r\nqK98MPfy8Ibad5zMy5u34qGCETlVqE/ePtP91N/kqPG1Z6eh2e0Jxi0m0IdR\r\nV089mG2HPDxmhPOIfrhLTKyeyUgN4Bt1PYqhp3/IFzhDsFEi+iBjiv566y49\r\n1ZRT4+eQDNFMwg3wwg9J+RqOgUr4ahuGNbIEG9UFADAvWTuvBrVKsPOCZcjw\r\nqyUD89Y8lsJf54LcclZvQVCisNInzbofZeHCElYsAmD4lhx15KCqKF2LtB9u\r\n0+qk9LeXrmW5t16KrKeLk1FyGD+wG42WzI3MckB0ZTjTMhPF7o/3mt0oIQNF\r\nwtav10cg4VsKrH1Ylb+z0tR5VUnCb6b9Wqvicop/K998RlHUrvOy5R9P6dvH\r\nWdHqweXRU1oVpnu6IOXqjVXvVHIEdeZMxVvrBjSE+IWaBAUCjCendXgojSjl\r\nAZKkYF3Sw+WFF5Y7KQmFF6zO41ztYEUoOBg=\r\n=YsKg\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.8_1675880545177_0.5818306614959119"},"_hasShrinkwrap":false},"0.0.9":{"name":"@trufflehq/transframe","version":"0.0.9","description":"A library for creating apis for iframes","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"types":"./dist/cjs/index.d.ts","gitHead":"036f44487b3830afd350a56fe29c819ab59eb133","_id":"@trufflehq/transframe@0.0.9","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-NYJ/BrtsGHvmmEcs9O/3bmRfzAglIgJ8VUdfpkLXB39JPNNSwnPysAokwnkSH2cQAQii8L/qcL2KBsrWxA1s1g==","shasum":"cff583f424fb20d8e50104c8c8e5cb145978b4db","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.9.tgz","fileCount":54,"unpackedSize":50866,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCOd2dYoasGhcjr9/q1U7ms+ZQSboPqKHXezNhT/zcRLAIhAKH5Hipv9bvgvX2CkZD4TlXznhPqiabqorqmPyz5Sua9"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj4+uLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmojyw/9G5+dGIbtegtwrydeC7yf8qvhglFWoQcqnXfNiGH44QNbwvhH\r\nPKpHmFLNepGxe0M9WkNsTTMWzq/EMTlbKILn6fQTDjb5ZMFFG31OTb+qEKzC\r\nF8MBj4GeiZraU5uj8aBimmvJB1Fa0YiircRqvqh8hLWpzbtwayJh9UeKGw99\r\nBGu4DrU6MVDrPniqFNaZxx2Bj5N2A1xVVC3QB2+lr3uXg99FqSybNOFat3ls\r\nlWZOKLCblsob7OmWedtJSnDMHlOw2nMhlnpww6LbWgqdUodsSAfkmhtY8gf6\r\n22XOi6NRecLdL1igzHgaZW4iozMx2fCS9zipI+oCTh0XfPY6MGaQ9L2RSWQB\r\nNsqjTzF1kVX14fLusVxQa/Kg0aSiA2WX/wm3wkLQBaqZwemPQX1tazCrs9s+\r\nrFPVIR4UF7ZqRHIfc5kv/37Iwc5TQqEdGv2K0y2eOSjQfH9jGAhVh1qvd60n\r\nOOMpFwNQjGVMxByA2IQgA/vsRS/sF2Lm08jpVdJL+AVe3ZrqJAIITiIRZt2z\r\nHxbdoPL3qW3MAti6fqPsx3PdJ+r8zUMsYTZiep9wPuwYKxHEN0Y1JLIfvKpF\r\nrtNdVkxP9udYNfx2LNDTB5rYEnTJ7A0n6sYm4zF9k6sLX2FZ3Hy1Ee0JLQ9h\r\nJUaA4Jbf2XG4pudYng/5yN2C/jccRBAofEw=\r\n=TgA3\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.9_1675881355603_0.4573182445555646"},"_hasShrinkwrap":false},"0.0.10":{"name":"@trufflehq/transframe","version":"0.0.10","description":"A library for creating apis for iframes","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"types":"./dist/cjs/index.d.ts","gitHead":"c8befacfc6bd933e1972d6facb5e67b32eb849e4","_id":"@trufflehq/transframe@0.0.10","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-uBEOkFeYC93qGzHLw9rXMHHyGjcOE5YlN/Xg4TsY8Pa4E2IIl2qz4kv7ScT6jgtdFezAeTX/XTTtf8bXAMhNsQ==","shasum":"b91c0a40a22188528fb87498213f61d94e2991c4","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.10.tgz","fileCount":58,"unpackedSize":52085,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGcxLpvg9kkhPW7Z8f+GHGzrJtq3x8BiO6pLCn0UEWJcAiEA71E6/dkWamb3mZnNi2eGnz9jnQFarYFmtd3RznmlMHw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj4/BHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr/Gg/+Im8mVbQC/xSm8rHq+cK4TbCERD9KC+UyQmgen/M6khBKfpGo\r\nbsjVZQQRbf4i43QvQOq1bF6PN4HBMA2nSWgNx+l4smIXMiGeSI6Gtcl3R9kU\r\nHBOQSVMHqLVjL9sj4vJl21SztLVqsaNZP66ApEeCXghiMyWf7BuwyZQ4MPuF\r\nQS0mgIhEDMg5WGkd2v8IrpLpQvBCT+96z9CItkBDRQo6df1Ww2moiybMdfGu\r\n/EqRkFItk7UI4Vzitkb7/Makuct5HJuYFzF57Bt1LeHFBJ4ZCcSqMU1kaBzX\r\nwg+D56q/V5Ue7GzTHW885zk2BNijlUlzn6/elzxguMGJh62ytZGZc0xzhPha\r\n7LqmV8SGQt6edYSkjk3nPyN4rAfayyRw4pHmRSqvPDEb3GGbSTRoKAeYUTs0\r\nOXvz9eYFy+ljzok5Nl4wGbDuVdDqxipCM3K9G5eUdJY/qqTv/WQoDNtfS4rI\r\n23sNeMZs10kAr7s/0ho1hWWo54JlRkduTyQnPGh+GGfhLCzsqWSPQDArPPHM\r\nd/L7OV7u2QuaG6HPQAiPMgprwik0ExGaZsMHWkITjG7gOpXKgkjBbNqmavrB\r\n/3ZaFNXSDqYGp3wccnQEiTEGUljYd8nn2vsS0031t/1miitc0clu6E6BFaur\r\nUE5y0gaKz7vpdE+/8X/gdWlhlG367k//oHM=\r\n=qmU1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.10_1675882567116_0.5598416330871328"},"_hasShrinkwrap":false},"0.0.11":{"name":"@trufflehq/transframe","version":"0.0.11","description":"A library for creating apis for iframes","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"types":"./dist/cjs/index.d.ts","gitHead":"1a343c4b6832a204f00b694760f247b3c64543ae","_id":"@trufflehq/transframe@0.0.11","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-/kVTLjLqk+G43sM36dJdBApL9WK//R/VcGW/5YaFqPNhDboUAgFsmFYKY7erWEGX4bFdFNX9eFvj4l3XXSBOnA==","shasum":"ab5aa70defd03d71551be9802b08f88f071aba66","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.11.tgz","fileCount":58,"unpackedSize":52155,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB9+fYwz2cJIBw/BUpOOWqLtILbRFIl0xf9VM+Z43PWfAiEApjGYBTTUgs3fP3cHynCLwDMl121G2Gfq8JpYw/TVZWc="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj5TGRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoCnA/9HPr4TFeLbdrZwWe3psLs4kJp/UcY9TgtoyKx1KnEMP/ReC0n\r\nbqE4QzBu6fXu9WqembwCj1gY2Xux/gA6bmA6vxBr8yujqeC8s9KnVT6ECQM7\r\nZgUCQlwljdZciVh2mf9x8jwhDahXGz3prCXDIpNGrMl+Q4jxA1s4PNUL4sjV\r\nYVq0AXC96r9FssWM2QLTJSu3ipVqyoRjaMkZbaqIvbzDAHnKGFe8md/p8Ck7\r\nb8wrwGdfwX5c3GCmwsQeJY/5S2bon9pVp7KxyJMr40u8plMhWem/crQPpUUm\r\n9Mzp/2c92bJpY15xn/KGj4LfzgTV3a81fCsrHjRMw8CStKRkYDw8HeECxoth\r\ns6/E+vo/GDMbXUPd1dqLAbomXSVNHCfZ0WNTiNeQr7LNNyTgxJ5XC9wLgYlY\r\nGhxSmw9eSQeuAwrhlW4dAMrY77pfRqgYV6vInB/jkKJVZvm/zyGsI0qdgwfv\r\nrOqS/ROyAP9rSa2RMI1D5s+hW5KYKaOIjdPsfPPgwck7/ny+CrByuCOIdMzW\r\nmxVNC4khRrr+GYHdNyD0zmzIIE2C2bje+0jHoM0h1iEvjEt4PJsVMCc/aFUe\r\n9l8ykg5eUlSBLGJsdKPbs6sxrdRSlFq5iRbPY/2Vd6UWZ4gFyvE2eDWW74ck\r\noCSicVPWtfTfNF0YXAJ9NUsZppu7jHnBh7k=\r\n=xzUz\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.11_1675964817640_0.9401905387942275"},"_hasShrinkwrap":false},"0.0.12":{"name":"@trufflehq/transframe","version":"0.0.12","description":"A library for creating apis for iframes","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"types":"./dist/cjs/index.d.ts","gitHead":"80d350bb39ff1c17b028b3ce29313eb1f775911c","_id":"@trufflehq/transframe@0.0.12","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-h8q+qJy3hJiG9kWstXFCqXbb42a7N7pYsB1gvDrV4JGGCCqRfFRxcbWMMu/a7x+24AjJsy8a9lXRim6aLEHgqg==","shasum":"170f720adc90ddb01a1cb19d562207f77cd7d530","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.12.tgz","fileCount":58,"unpackedSize":53187,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDs3942MPZuc8Um5432F3XgT05nh4GaJUUFpXeNdzQl0gIhALBWr9PumOgHIEbmgsimEr4259TZ+hM84vya4/thmcJF"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj5dHSACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp/1A//bQSqp/4FqFM3dAHnHtDe1Kj1IHVl6arsUrmE17FbCTiPpb0U\r\nSQ3N45OjUcrauI7ACxIkZX2JF3GeZ+ZOJ1rOQa7uJhmYvIVYZqnS68BAvIrQ\r\nGHSz/kT5oP/gZCWjyBSqUjPMAm1ulOLQ72nPdxlpHvWK+lglyRqJMwT5IWjI\r\nLcf0j7Nc1DN5R3n+vEzfOIDfXflk9q2B2qS5XiY26h+6fEaDQtpp+JoEuSyD\r\n70PADHFIVG+2lxmNWacTbNkRSTpsdDpgg8JrMV7i6eiJcXeFLbOUKb7HMJjw\r\nf/ynJtzSUXju51agGugwsZUmB2BNYYA/dakVTGk3dD1nxMihcItXnvs4/tUC\r\n4699j99NCfJrNbLqxxH5Pq3zVrWpH00KAQBYvXvBHN9A/TcGT1+Rgm+Ge6ha\r\nsH57hqgqx4mOp+lkWrLMc6dI21kL+yyWah46UUO7PxcYISaH9azK4/Tx7y2+\r\nphTN/XVH7Mf8GWC6OAm94FnxTW248XmFWxj6RPveK4VjQwugZJC8lqchy/Wy\r\nJn9nkNP8RNnYVazT/UYBdxEqFHL5IyS9qwe8eQ+/XbTvmPnNGd9MAd+8rj1V\r\nTY/MRfORcsRgg/t7MMFS+A/zI/JBy6kK9hvqP0DU0a0KltGzfWtlTk0zbMFI\r\nFcxmGfh7OqOC4xKXwitExRGP6l0FCNYAZdI=\r\n=9eG/\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.12_1676005842617_0.7564341509104051"},"_hasShrinkwrap":false},"0.0.13":{"name":"@trufflehq/transframe","version":"0.0.13","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"dependencies":{"webextension-polyfill":"^0.10.0"},"gitHead":"413bebb7c671b4b0b23942d5ba546a769d055ab1","_id":"@trufflehq/transframe@0.0.13","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-EtWGoOrGqKRNby6tML/QUd+raY2j5TsyAsRuEyRdS6sBEQW9yQr5XbaVwP7fiDjkewUw0GiJ9Bev/VyGSu87Gw==","shasum":"6311285cd5b67f655d72bd90ed0f01449ad1de92","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.13.tgz","fileCount":82,"unpackedSize":65828,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDQnxNmWY8tDSPLwBAS/qrEfHyvpnzM+Bv+Z4mlcYGw9gIgaNNvC0OlBDE+tnn0y39K/rOm1TdNE4/pJULPD/xYnF4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj6+rzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqAjxAAgMkvEE6Q3py/4BOXbolVMEJ+VSjsnvNVrdsfG7wzuF1Zsqqo\r\n9qujK0F/qZon6qnV0fopmKacft9ze979sZ50UO1EB4aSyNd0yzJYIvbL+2hH\r\nltfMWjO9VwdrYG2lj7XXCMkmOxP9vlMvqDhW1BwNabTxxVl+P/IeoyLBKwMU\r\nSEou4tFnXYbkcjf1r0OwOm/pSDfxZ3TR4MKc6LcSuCKFATpRL9TSF5EadnTt\r\nowxlA9zAR9olLfDF9kTIAcn+WyehJBlUB9AyacFxajHSplBjRbGdwtxpLjLS\r\nuA9PdgYlDDc4t3r0AVuGXqnNhQ1iKIFlUtJno/IjQBA2cdO5tY1HUAUmrXud\r\nI/tgwSysCODVCgDZpActbEVisH50pMoH/PmdAw7e/wRYnxJQNUpSo/ahufdy\r\ny/TQI9fjOaW5T1B+yQ/jkrjfIBLnY1fpPdo8pz4BdGsnQzRe/Sv8tKeIZjgm\r\nC4E/PWF+SFipcylj9OqrsXsR9nzWLMX6W5klC8szxSC0C/kQlGIaJnr3X8Ga\r\naVSlAWZdOvv0cwlxt0ljWMI3rpu+cGtSmsqVTM7zeaQnOsa4pIAdyH0YpjH1\r\n4eeNUnlEb/2DyFOHwHp5f56rarHjuX4hdFWxmiX4cNXJK9cCeTrL/RZzkUMO\r\nGdbmUR4Fz1+RmQMUbIqneP56e5S27KwpsZg=\r\n=VGHl\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.13_1676405491520_0.030706159807087685"},"_hasShrinkwrap":false},"0.0.14":{"name":"@trufflehq/transframe","version":"0.0.14","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"dependencies":{"webextension-polyfill":"^0.10.0"},"gitHead":"7b08e758ed143a5bce4ba873dee241192a51170c","_id":"@trufflehq/transframe@0.0.14","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-0f5PENAg7K5Ztbe8ndUMjpX1NWQQDra023l7HYoxnDs6G6zys30KwTqp0MJ8oHWSCiONjmY/x1t6uOzURK+ADQ==","shasum":"a4134891f694ce8bb04798e560c86ae8b7f7ca0e","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.14.tgz","fileCount":82,"unpackedSize":65702,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCI34k2HwThx63JSccu9G2s1mSTiQpqZsqAGETgKx4E6QIgb9/aBj/cnqQgMoCs8FNF+LWl6+2En1fSNd6J3D2MDPQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj7AlLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq35A//Wdume5YYm9wk46DhYdk2/ZuONDiVwtOr8NHGLVCuiexAfK6F\r\n9c1QKLdO5tcbjDUt5WNB9JfRmhtWtX65KXn9Uq88tgr+gO9zFSBrsjw6djOa\r\nF1Ty/nFFfkAReMV/v4MPkaaT5nfamFSDlQzYJq3U690zEWkLw0CHzUckwY9x\r\nTgh6Pw0rhSHPI82ak6S/HYQVgqW3NFivbuCWclFPruL6o9ZU9OoIrn/Ciyre\r\nD2LnbVdQyGCFL6qjFS/5JnkeQ9ANyvzAndjtAQJkeVpIOmKmP/AA9X74D4Oy\r\nYlfZ3RTsTYOEvvsCQqg4Txd5Sx3tmCXMpWgYnkIQDy/mlTmvDDffnb2objkz\r\niwk8INHgjpoUc1v9XUloggY97YEBC+Gvkm54Uow/h66LEjc+Q5FZuJKLLhpp\r\nGYxa+DOPrF5rEUN0gFNALlrfx6IWG4FkVbq1gtRYwXlxhCIqUN8NlaJW6jUU\r\ndMWkBtRVIk//BFS/7Poiq/AJhgBQDmF+7OAzAIbpyzqsOQcmJ8pC7p6toQP0\r\nNv+JM9oVFvVPGTEF51J6A57FzHmSApvSxu2r+c1g/GdO4B4btJizsupnrjhk\r\nWW/RRGviYSrbdtFyhzmymgG+UXDfmRqs7d8+d+RXTlhlD0DQRFeH3dV5XouG\r\nNOYcmvVD6BYHfYqERSN+KkElSfuTbdo8Bn4=\r\n=FKq/\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.14_1676413259693_0.5243231236926611"},"_hasShrinkwrap":false},"0.0.15":{"name":"@trufflehq/transframe","version":"0.0.15","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"dependencies":{"webextension-polyfill":"^0.10.0"},"gitHead":"c0f40ce9ac18ad2aba95083b5a7c9ea2ba416ec9","_id":"@trufflehq/transframe@0.0.15","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Erc/+6hIv5BwTjx8dEMpvkfYwCk73h+njAQDtXs38CAQlSNa+v/R3uxHvWThyuayzSbiolzAR6cKB8mazvTZcQ==","shasum":"e23c41cd0448a1be2e08754ee8a11fa22e29839c","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.15.tgz","fileCount":82,"unpackedSize":65942,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCXZajNwzJgW9DyGHzCiLvTHA61lgPVJ2MWhjXTRgkbOAIhAICwp8fx3ol4pUfi4sGFLtkTCnBGA601pU5zOZij+rr8"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj7Bj3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpYPRAAlwXHZN3RTnxynOnPyylvtY207A55G9eQ/Q5zyGLL/slN31Im\r\nUJK0SfxsXOzky6XhmVU1UT86BqDtX9ScqU18kP9ayXj2CZna/+xql/wHr//k\r\noqIqqJFvUny/BzZo2NZ30wt6ZcuAM+m9GnQuEfBgGlvHJLJFrmcddJtmNfg1\r\njVD0QySbhb1xYC4m+BP55kCvNdKceVGdTRljeK2Zj/UKP0CDr3SiDBsaEFTv\r\nww1rmq02f+kiS5K9a3tP+9KkKDqdCY+RZcShRcSY0wxs3ewUZTIoBPmNgEFl\r\nXZsUc5eTHs0JSSl6FqdoHfYfafaxb0xBLKQRiYFF8S2y/IAe7A8CFZXJbdzF\r\nHswQFDWG1Fx1ySMucRELazsTYkq/qVQ3AVkn/5NgpROutBgM+aDzjRdiXj7X\r\nWGqYOScmzXNR3ePkl+G23pAOEfpyUmpbQlCfgruBnZHk+K1FIUl6AMh9xb7r\r\nxpdjuelTd/cUmvnnT14lLp+K+ZmyRyG5prJcXTdmJvjDCxccv+6c5hYq9thO\r\nMYdJqBiRPnV/ZaAzx9t0K5nfgCT1Q6RVQv4zfuPy9hVlOKn85PFolInlNEzH\r\nPVggMAaiTPPeXupsXDJXcYT3oaRZJ6JtSrJbWUZmeqkobDtJ3JU+XL2WkMLf\r\nBMykrjQ8B/F2AUHB3ApYDrurOjW5BNZ2OQg=\r\n=UqsV\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.15_1676417271422_0.7590392511431701"},"_hasShrinkwrap":false},"0.0.16":{"name":"@trufflehq/transframe","version":"0.0.16","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"gitHead":"8c658a8ba278cf4251bfb1add7a751739a6d4b53","_id":"@trufflehq/transframe@0.0.16","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-eXXadxisr8sXlturpVDt4M56oGuVddqlZAKM0T0G2DZuJBrIQQ7jpSl2pwDCg5opA1DvDJNAizD63h3gVA+nmg==","shasum":"e76221bb82f51859c66a06441a9574a835097fb3","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.16.tgz","fileCount":82,"unpackedSize":65958,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDRSyEeF+VDjhQjhu7N3ZCiXVj8x1eKhU7R6nIb0qzhlgIhAL5jDKfIBErwNkd49tOKfGtBk+l/3jOVnILC2YQU0rLl"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj7CuAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoM2xAAn2aJN1s6Ep0emuI5euSVei01HWbj0bz/tHQa0hPcS4qDjj9s\r\nVeFzQoQ0OL5bSMX9oU0GqLl10tvPsbSQA+dpFIu5Led1q0hIYkUTS36qJ5aR\r\nt5eUxXjnBeT310YCQEJz0l8TGeBDUJnC3ylFxME1X/t1W+Htcfd1rFfdo326\r\nC2lRWI4+WLgJR9v3qJ/JYGBQncvpJzEXFid/Aqj9tfDVRu/1gW7sSnfNcCro\r\ncNT7blyVFqO/0q+Y9NVaW1hfdiGqjQtjw30AFlaZOA3J9SO/tioCWxP9SiOs\r\nVF3FrnYQVgfbGm1N5lVyrefT10Dfg3IEbA1KGSp8FdUfNjhkYipORCP+VOCF\r\n4F2t/05t+h1Bvr06oWkSiroLzCjUYFqqjk3GEcxVU03ueBJRa6CgaMRIVyaT\r\nc3frC/C8lKnT0eGdNttmB9J57j5Eps3cO2l2AIl15E+XlR+Tm2tyIkq8jcq4\r\nRMJ2BpXdfdJ7AP2sddS6QZuMNFnvvjb0EPRkZmugwTja/8AU96wo1f7GA6gx\r\noLOuUFFuGnUX6L9XriFveYKm5SmnsQ6gpKs9XsHAm/xz3/KVo/aokbmW6W7X\r\nsp/+XUz9RvNWPFpLE+uuJMVxExT1BX5yMNCaJ9O/yot3C7kVdL3gyPLSUL74\r\nuooJQI6B9qgqM8+TGdh0gNvpoucdfM8Vvyw=\r\n=ZhAK\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.16_1676422016167_0.272195279288189"},"_hasShrinkwrap":false},"0.0.17":{"name":"@trufflehq/transframe","version":"0.0.17","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"8c658a8ba278cf4251bfb1add7a751739a6d4b53","_id":"@trufflehq/transframe@0.0.17","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-62ep3gLDfSXUxzvcLONuCqmkus7tlWzhnJaXFbkTRNcAabuJUNIyLAbHpY8JGgGRVtHScSxODWKRlS23ne/CBA==","shasum":"5728edc2c26ab0c80471197250f497f8b2fa02dd","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.17.tgz","fileCount":82,"unpackedSize":66051,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDrhHv+THYOsOqq84F4qTlNE/2UGuiLezooBtyvbuJ2NAiBkMHUsZEUZQGFBSTFz/57eI58ATj8KHWaanaIq7OcMGQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj7CvlACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpOjhAAh/Objza79RpCmMI8nhlqsA+rloYgk4MQthRVh2c4ZHlGAGvo\r\nCSkA6+QqD7xyNMQV8TC0AayIkBFnwAI4JOFwDdF1+34fzpm+5Q6/wOO3y4T1\r\n3G/8gUxT7QAYwHVTSc73dsm2PJtWsxFaPBhN4NwhnRvlUGzcSKSBM5AF57Bg\r\nYInaTWiudrOpZQ3qaYS0LyaPugTKeqN299I5cNawGOS/RbgHJMNNJdJ4DHiI\r\niSMDtHT8mmcUHJnRf9wraDBR5sYdcwZ7durgcjT7b3OiL0EJfXmDeRmc4kJx\r\nUQCRW9xB+lGLtV7q5zdFqY7jcjGtPa2Ytl9fR0fNXkBq/7b72QzNcrQdFore\r\n2gf2xRIoRiULJN+pUDX7LLSSLue4A4htdYBo5r9fz17oJg/C3aP+PeFXmfZz\r\n58VdNd3yOIJA0B2n0aArv79gRMXCCNLU1T+jzWtLl57iMoMGpDkU9vM04o8z\r\nVqZpNRlThccSAUjlwJNTf7Nu/Sjx9i7Ye2V19DBPtbBQDYYZFQUyrtgaqjm9\r\nzn1QbNy/ytnfqqeFxHBXn2fGf08Um5ksQgYu6uqyLSIOMB9iuaiz4QXI0jkD\r\nwmd1VoSRauOqyb+r0b0IPo5Ee1Moowq3UzsjqW0m6xXzEOL2WTKXzhaiEzPk\r\nzHIjzaHzxzVdulHX5X3DS6ya99zI8SSKHFE=\r\n=Bxmc\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.17_1676422117517_0.39304195913735196"},"_hasShrinkwrap":false},"0.0.18":{"name":"@trufflehq/transframe","version":"0.0.18","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"8c658a8ba278cf4251bfb1add7a751739a6d4b53","_id":"@trufflehq/transframe@0.0.18","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-RbZwodiMydel5+veAVmqXKysMGERk/rMmcBPJHvlMw68KnqotlafnT00RsHLgiLO+nKmr5GbQVgM1ihsNDOFtg==","shasum":"22ba3730eea049afe0d2465eeea7fbccac2da6a9","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.18.tgz","fileCount":82,"unpackedSize":66661,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID/4spQVh2l/o+qgknAkpsp57uNKR9ONsMNHrkHUr3SLAiBA7EPWBqXa0/osYUqytWg1N4XTmHSvglzwq6Yp8qYvzQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj7IcTACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqpxQ//bruTWWe9sPrPeFgKH3H7cL7R3ZP9j/sXidZhk1Yn2/ZpsoPl\r\n4CozfsJbPgj1s0W1nqki5JWZLh6Mp5xdZVA5qcydf63Vapta0bq3x+r+PP2f\r\ntYXp/f/EExitiE3x4Gy8fz5xnrW7smjqTqIDdJB824LmImrAD1/+hYw/Z97y\r\nzVp/AEw/B0CPjWOOrKg2ANHrS96wSiArCX7r3TxHULnU+88q6unmzRlVmkVd\r\n2F89n9/WrUs+RE/Pl5yS4aE2zqNDU8XOOWxxLbRinxx+XmLDupKILMumNjv7\r\nrJ28eNsc5/ZK+SFxwbSoDRy3BmLoqcqE+WNELLErHyCCxbEG045F8OFtLkgM\r\nffdDlDdkbM6X4/rDDMUsvWl7Vw6NSHwgnwVEKNqzjtPHHPWwYIMmWBNG77l1\r\nqkdG4IdoJwjVPuzvsCAfnsWoxnMWfL7JyA32FEYazsct5lHZI8ZOQMexXUJP\r\nb2xP/fzl7P99bYZBT7wwavb3dSHvM5e5A0Ht4d9TqB5xJUWZ+ZltyZ6BnV1g\r\n6W/9LqbWhWMnHUc2QhesHHYSc0wab8eDZcXIl0SzBwTjt5s/soLv3Wbf0bE3\r\n8xZW87nDnPrA6voDM8QLdWS2sLMBIPkAq68YmHvXbyxcWqsjG7JrpaEIvPxy\r\nUwQ3z2zjr+n31BNpP0WDVSC6jHr4rj5AYHk=\r\n=1mLp\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.18_1676445458819_0.20226431055144767"},"_hasShrinkwrap":false},"0.0.19":{"name":"@trufflehq/transframe","version":"0.0.19","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"private":false,"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.js","types":"./dist/esm/index.d.ts"},"./iframe":{"import":"./dist/esm/interfaces/iframe/index.js","require":"./dist/cjs/interfaces/iframe/index.js","types":"./dist/esm/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/esm/interfaces/background-script/index.js","require":"./dist/cjs/interfaces/background-script/index.js","types":"./dist/esm/interfaces/background-script/index.d.ts"}},"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"6e85a1ee111be4f5afc674ccbf4ff2dac69ef27d","_id":"@trufflehq/transframe@0.0.19","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-fHkDKVvwPRqLLXce7/WOYgb52mlo7g9wW0DazkYm4gsppoc7v6XslaE8UKxnv2TZRsoC/344o99AaAGoa7lSIw==","shasum":"cdd7f0cca527f7851335d8f8e17daa99e5552cc3","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.19.tgz","fileCount":82,"unpackedSize":70136,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDsww4/HlMXBTOSB31FJBr5dJWr8oToEzw7F8QGwFOD/QIgfjCOaSSAgiLwhgGIsAPs/OXgz3ZUEhbKeCSHs4l8ASM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj7Z8DACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrLlRAAja7VT7CIqo4KSW4EopneGbVIPc/tkCf8B4G5oDiIETXu+ZaI\r\nmqvb/mfuf0tu6a+pozsLx3Dr06jULoG38OGoCFy2vOafoQwpsl6Hh5Zy6b4p\r\nxMS9zIKZwfy539sOmGPsmDJnHGExtvrUhGKjzwxIFVaLvYNSUqz0gaxQK0aL\r\nwF3SEfp2I87sW5774YT4W7tBsM39fzi4ZsCsVlzM5QFxMAmeuMJG4D7GXnxs\r\nYJ0by+sodWoUy7hZmey4dzdOk3bqUd/upvSX6p5Eoj77ANqlJizlCau5umkw\r\ndTL7G2RAQ2r5OF2M5ISL6H3lROzU89fZCXuzNaZS9qRN4uab9E1SmNB3i1C7\r\n4IO3ISLR5b1n78i/38ZKzDOzyaGJQ2XpFC0VNTTMLTPQRnLSnDvYZxU+3IaG\r\n2ckBM22TapULkaowZH+HMxWwuW0TJsEpR99d7gODOpvBwLvvQo7IkIgsMqf/\r\n/wDfhB5uzO0QEw+x25UdQRAiUZVolyDctk1iuHl3uupRsoxNw3hiYfGxv+M+\r\n0+r+ja1F3QI5sABDewSvH2V3IWWMar0YRVVi1mA2YaS54MRfvM0+x8H8jrFp\r\nxJlATrD3QJxjhK7kj8Fp4B5WyrfBs9UeT8ZAED95larZDCPhslrh5AG9PLhQ\r\n02PFkVo/cJ34I60MRkW+iiitLNq0Ht2+Pj0=\r\n=4jNP\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.19_1676517122796_0.8657904236602647"},"_hasShrinkwrap":false},"0.0.20":{"name":"@trufflehq/transframe","version":"0.0.20","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"private":false,"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.js","types":"./dist/esm/index.d.ts"},"./iframe":{"import":"./dist/esm/interfaces/iframe/index.js","require":"./dist/cjs/interfaces/iframe/index.js","types":"./dist/esm/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/esm/interfaces/background-script/index.js","require":"./dist/cjs/interfaces/background-script/index.js","types":"./dist/esm/interfaces/background-script/index.d.ts"}},"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"afcee88c646ce7bf9a91c397af259ee084a576e3","_id":"@trufflehq/transframe@0.0.20","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-hWoDqiesKRq5wyA1M/hNAGUiDqQaK+J4q4ioBjdu82Lz4DKyMpyfqZJqlDibqhFRRzEc7dRhmjyn8MCrz6Ke3Q==","shasum":"306f0b19d6f7bfb644879f0fa915b957a9cac8b2","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.20.tgz","fileCount":84,"unpackedSize":70629,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGzGjc1cpdFp4LmNQqGb2+g+YTQNCWiNLC+tZ55ORLIjAiBbuD7EvAqe4Q59wMR9GPhmdrYamlXj617qED0MOoG7Zg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj7aBJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmriFA//aJhA+BPPd1waIPoZZJvamLuPT1ZmFT58X4VckwyXgllDfXfQ\r\n9wiA7/LOj2c2vR0c6OqqHtTggSegCiSbm/P4YgbOwzp5O1BcsIM3rVNYyems\r\nF9cmARnddch3b9FTN0/nMBJth24J0ZhMEIaRruOgQbkf7GJ+WXGbdP8vqgF8\r\n+Pt1I60tR6WKFsZ6Q+0edw39L9K2spNKFGI2mpybJmbx3ienOpePdERnXzM9\r\nxH4jlGDA7zv++ljO2FoQnYTKGkpXsDhQjwMfogMjhsk3OXMAkYtc19ZQqYK0\r\n37hPNMqQQI41rt2C2sKwgZ7wGaUATtF3SwdLvF/lo10GUQcutDbef0p+YzAA\r\n636gOkldql22mCTkMPD12QVln2s1r2w2G5WNtIUzrzQWx6j62gRmNqTPq/Cp\r\nS99T7E1j+iVl3D4btWp5w9rFccJ2OzmhujvqbMWs8xRIScXTr9kGOrF2jy97\r\n+4hQuU3vcoVRlu7RsrI6JRb05QS+h4cFP8s9UzepTtFIMiJUFCj9TlpdJuyf\r\nNMZJFgS+6oVzg5WZXYkrWJYpb0S4rzgwIo8IBvx4Z5R2ANyD6Ae8EE8zkKQ2\r\nXPjSPUnQwtGxCazFe7tV+aEOvVSjXZgw8aVBAvd8A43i2KADqgsrlRoAYR82\r\n5U2QnX/yqZ/zGB0me8xv9s9tRweTW7vV7cs=\r\n=Gwug\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.20_1676517449168_0.10531551985172971"},"_hasShrinkwrap":false},"0.0.21":{"name":"@trufflehq/transframe","version":"0.0.21","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"private":false,"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.js","types":"./dist/esm/index.d.ts"},"./iframe":{"import":"./dist/esm/interfaces/iframe/index.js","require":"./dist/cjs/interfaces/iframe/index.js","types":"./dist/esm/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/esm/interfaces/background-script/index.js","require":"./dist/cjs/interfaces/background-script/index.js","types":"./dist/esm/interfaces/background-script/index.d.ts"}},"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"1f255bf2b1b17ac15ee8823be4dff9180a35db8e","_id":"@trufflehq/transframe@0.0.21","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-mcl2YhknoV9ljGTu/+AV8kt58MdFC91LmbXrdhy4v12beSOA2lNdFtW2k2ZGW8KtUzNqyUp738yHxTBf/P/vig==","shasum":"b763fb48ef6306572ef16082dcf3c65491cb1b25","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.21.tgz","fileCount":84,"unpackedSize":74851,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICG2uDv4sAs67WkQMsDQDitY3UiVwSvI/aBjb9/dW0YpAiEA/hgKcmTV3cdDOCLybaXQBmdwWKuvaTfSC6abga+2ybs="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj7cXhACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqC4Q/9GfZipssQ2Ngr+Qo2054jAh15oLdWHwO37GRYQesF4fGLOQlK\r\nodGU0Ar3o1lDwoPf63a91kdbk0Qg0U+VtpKmZluDJk7VwrHt5IFs3MZVgtCT\r\nSj2gNcw+B2pz3vWTlRX0tjlATWf72RtXeBKc8fJJvB1otjY2SGhf+xKakdWe\r\nFBB/nAXB3fx1gFee8st0YC8dV5i7d+8BFkt6Mz98kIauACvkZki+CTReJsZ+\r\nPtwrmSjxUwONZoX3Qwr+3l4slKVkOq5c+e5J5+0qS+zU4Tehyz38cMeQr0Gv\r\n+mFF9tTyvUP5Omfw31LvAyXvj7H197InQRgxqUycNIfT7aPuS3HcRi2AwdFB\r\nmOeRHJO6/R3XdgeqpDQ6Mdvb3Kk+0qZmvo79wJVv/bMazVUFKCPaQ07RsN4P\r\nnotZUCjVRmfLPzZvktG5i28Um/JS6Uqx5CnwhSQITBlYZGVsoJa4j9aBvNY7\r\nXuFs6M2ddteU0uXgOKhS8Iy+2f4WNm9E3ZCEWitSiNwbtF1WNDGq2nRN6tjT\r\nJMwwBvg4nTjS5Ml3fAH+4qOY5oAWPLRR2upYzM+17laVfHcfCfbmJrHY3Qe9\r\nIDMitxIHbBjXyFiixrylsnylZyogTmtGCoBbvSMzXS/sZ36zf3f5Bk2R5Y06\r\n06Y/AFTPydpvgCOhVSM846e+MNK4C0DopqE=\r\n=GWE3\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.21_1676527073324_0.4039728585608353"},"_hasShrinkwrap":false},"0.0.22":{"name":"@trufflehq/transframe","version":"0.0.22","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"private":false,"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.js","types":"./dist/esm/index.d.ts"},"./iframe":{"import":"./dist/esm/interfaces/iframe/index.js","require":"./dist/cjs/interfaces/iframe/index.js","types":"./dist/esm/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/esm/interfaces/background-script/index.js","require":"./dist/cjs/interfaces/background-script/index.js","types":"./dist/esm/interfaces/background-script/index.d.ts"}},"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"8516641cafb864c79674066e1028cf5d5e7e67c0","_id":"@trufflehq/transframe@0.0.22","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-4DqcixMaPhZYj2PpWsspstCwNGCW5Rgoep15JtNtQXNOrRT88sQY1GSOsCcipA0N28aYMRH8/8KJ/UgYkcTa4g==","shasum":"3d208b64bb28b8a2157f4bb0fc465b370eabf504","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.22.tgz","fileCount":84,"unpackedSize":74851,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDWXj+poPE3mni7/MpPgnl9gqbdyMSuhRI0TUC45RJ8HAiEApTINxLig9ZejeLXqeEUOZqdCqz0RKXlv+Up57TZgVbU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkFAAGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpmVhAAjvKNEMocEO4pL451CqNAMrHxkcCTUJXyjvkUMh7/p2ExKtul\r\njgYG5/I5socGGU7iZqdUpEloXsqHFTL/lMYV2xSc1rIcRpOC5PaqH7fhbr3o\r\nwwGIjq/Wei7SM1V4DswP0Xy1SQwNbgstGGmpheOM9iYSZw4MSYlwX+u9/2R3\r\nEOahCCAQimpDWpjrWUOkCbqiaUXp9NzYt2S7GOn4B8U7paCQGUqg6T/sjQJA\r\n+4oG7ILhhHTRtVSqSu8RBdQJdnXHMUAivspUosu78aaBvJtqR3MPmjRckrI8\r\nvu5O7AzvZuO+DgD+QyHT5mKOFDJ7ww0UhqpIWK2cQszMJiAr7vUfRk7o4CER\r\nOyko6Pc+8wfAjTtwX2bA1lObs4l3sC24+JdayTmKq40sHIQiHGu0nTxDsFdS\r\nO+qE6V8BWJgugQpAWuIBRJx4OE/WQVatnhYZIpVK6qkBMi7N9XjrymJFbGpJ\r\nogjA6fQL0imX87C6+LN0ixgsGPMsScegdnhLw5bdKI7AkoS6nfpB/qhbuIoF\r\nabn5KkpJHNqcsvq3l+j9V1cPgPAseOp/2ozaWmRfGxAWLzNTum2pLqqknMMD\r\nmOTDV85QWLkz+hrkVjIzGqRNOvPnl7v0jDcreTU/iaM2+j8bGTkC17bp807i\r\nGhFyimuctRxxikxUAhXJEJRBs1w4WK8iC58=\r\n=orJ9\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.22_1679032326525_0.46908736053799793"},"_hasShrinkwrap":false},"0.0.23":{"name":"@trufflehq/transframe","version":"0.0.23","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"private":false,"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.js","types":"./dist/esm/index.d.ts"},"./iframe":{"import":"./dist/esm/interfaces/iframe/index.js","require":"./dist/cjs/interfaces/iframe/index.js","types":"./dist/esm/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/esm/interfaces/background-script/index.js","require":"./dist/cjs/interfaces/background-script/index.js","types":"./dist/esm/interfaces/background-script/index.d.ts"}},"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"58671f578e150c7ac6d9f4a49cd46ebaf7085561","_id":"@trufflehq/transframe@0.0.23","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Q4/pFxj6hyi/nVIKWUreDp1T7xBRN6IkyC91QtSde8i6Wr/ghb42L7FIHaXIW0MxC7KRnjUr1waMjGmgLnxo/w==","shasum":"d4f90589db665bf33c2ab2e95c0c8034559e1267","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.23.tgz","fileCount":84,"unpackedSize":76589,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHwZU7TU3S66zYXvFqQpEKyHiJ0mg5wwwqFPAAd0Avo2AiEAkMHQCpE5AEPm/RRG2+0j2YtuJWLbmsNR/5vAb5b6NwM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkFAd5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoEyw/+MqMGEjpMqi/7+KljiwVFRcu5TIkFmFBZmU3Z612U4xn4UeJM\r\ngzLc+ru23KDMPKtvsoftZH4JN20gArqm4czfggjKCufm52H3NwbhCQEweC8p\r\nFFNQncQfPL1dukHUGmlyUcysheeg6eSb8bTKYdbXB9HSiFMsQwgDWI6X0FnH\r\no1WjDG7thdJW2sUp95vMtGqkxrFf4zxOlDHAg2xPdEw+tiaMKeiItLR6q1za\r\n7yA0E/zkOna6ELkra6s5WB8jhbQmXp8b5FcLc8VuRff1g/cc7Fi73IeQkd5J\r\nV4LY0Ml3Z5hLtgRpkB/86i3G/FkATnv7EnsUmcraoqA4rxgLxLkH+Z4FWKow\r\n0ElylWcdBqoJG5fx0neDJrZwsCeOp8A0aCdLvCRCf6Q1XxS4FK8DfFAMvHBg\r\n/o8HTwP07A/kHEmMsBdo9TUNi2u2f+C6aeoH3UUd6ENubFz4diuQq2QK0LRR\r\ncj6+vJkz/rL49ANLVaiHANrIFe8C9MgSdghEK4XCq5YQqYo0Provb3OSL4Jm\r\nCs/SlW8n+x9Flk6/Rt1gvTD/gQv6GRywwCQeZgh7AOeF6RAbnFVeTcy6GYfQ\r\ndV2DHDeId9nFU5QUwuChyoauhZagoLDOK+TYrzw8kdm8YQQ63aj/uR3CBabC\r\nioY84IBRk5uqLXQXivWZibgIHexiel+Q/L0=\r\n=jGBI\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.23_1679034233618_0.17689197538354517"},"_hasShrinkwrap":false},"0.0.24":{"name":"@trufflehq/transframe","version":"0.0.24","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"private":false,"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.js","types":"./dist/esm/index.d.ts"},"./iframe":{"import":"./dist/esm/interfaces/iframe/index.js","require":"./dist/cjs/interfaces/iframe/index.js","types":"./dist/esm/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/esm/interfaces/background-script/index.js","require":"./dist/cjs/interfaces/background-script/index.js","types":"./dist/esm/interfaces/background-script/index.d.ts"}},"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"72976853ad88095bab542b6cae34ec52a2e04a19","_id":"@trufflehq/transframe@0.0.24","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-BNwt5MkCapBQ8teU4vBgMLbZK9IBfuHsSmP88RAwkN1PrfeIh23jm84049BUhj/3TiBNf5RpB3CeL7TCe1KAdg==","shasum":"d79532233ff3fb4c479f85d3fa361ad45e84fd84","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.24.tgz","fileCount":84,"unpackedSize":76061,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGS71uUgQK5b7WknggPuWG3QiAl7NKwGJBYyv8L/hXc0AiEA5ZTifsY9Y6B/01mCJCWS5s8vfl5JlAis+VVXP9WB8eo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkFAjpACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo9lg//RX2+XMFKJqmTFAUEJE+b4GKsiTdxMToyE4NrwlKRMBKvl4VC\r\nSfDh4W4fdwI9R3EiWrMJ6z3SArPwa3vQm0ffSlFJUXNKfx4KI5A9WNWboxo1\r\n94KuZJoYsiRFL/M6Jlhl+jLGO+3r6dikLaynbGNs/kePe/LhFsoxtiq7fB8S\r\n/JqRAMLzFop6PJdT/7XTFruETLYBS7z4jhwTEmO+4N9raKDI5v2gf//rjLAz\r\njFY9/bwyWfhYhOq6M2AJzzY3a7LYPD64qC0sL1wUn/Aqmk1IZn61Z1+D85Db\r\nYt7L+dIuIJ0kp/opH8kOxrFMjJwZc3aCExjwyTFPt3mLl60hqG6x1UdtPehf\r\n+gNp++wZnzR//Wyo5L7dTqtAi46a1YQSv3XX1q1O9i6XlqyKqSnFVWWXAeaX\r\nzXbPJ5gR0kCA+R9tCrz193+rR+go4m7xyY9W205goS7cTIVpIC100aPV8t+L\r\npYrW9slMOEaWPs2DnqNkGpEGfhGb2iKvE1dBoHlRbx5fYGN18cN6iPSryue7\r\nds8M3eOaKBbPy0v/z6INjyVgPChm/Ke8EV2Fowvi6erxmZRUZw6i4Pgodwf0\r\nEdhfowG3e6Fj1pA17HgHxPgv7qcAW1iWaSV9VUm1XzsdM0LwwEGD+RLTal+B\r\n8KFB/LuzwrrL7WoYvIK/25UBU2T4w0ryTLU=\r\n=5L5L\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.24_1679034600970_0.8666592438433549"},"_hasShrinkwrap":false},"0.0.25":{"name":"@trufflehq/transframe","version":"0.0.25","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"private":false,"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.js","types":"./dist/esm/index.d.ts"},"./iframe":{"import":"./dist/esm/interfaces/iframe/index.js","require":"./dist/cjs/interfaces/iframe/index.js","types":"./dist/esm/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/esm/interfaces/background-script/index.js","require":"./dist/cjs/interfaces/background-script/index.js","types":"./dist/esm/interfaces/background-script/index.d.ts"}},"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"3c342f5f63c773642dcd4f275f995b95d74164fd","_id":"@trufflehq/transframe@0.0.25","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-HH9s1omtO2DDo0STPtN6tkozWk9LRjxjdK1bF1A3Q7+g7qZpzI8MsHrkzpL1BYn/yfdHd+Ntmu87kRnTfljx6g==","shasum":"8930cbc479fb5e5af46a4962b32db1e18e6656ac","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.25.tgz","fileCount":84,"unpackedSize":90197,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEMskLJ4NtLhsFp1Yrq+9xuJSAOQCVsS4WO8VN2cz5QvAiEAgPcKbnYOG5gvgHYOqjFDWkPFtbu2hSfODh8VyAveJNI="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkGOH6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpDUw//Vs3K+53+MycE0jaRySoPC/8N9RNfgMGR9aKjfVBmzOLzIV9/\r\nLAM//kFiu6OigArcNfx+fs3KCn5pGzSzTSwg0Z0N58o09amM+5ZM2NQ2i+IG\r\nqj+1dYTfeZAPjlTaeHd5UD8skDaAbzEIehMmNbc9+d1Q9QiCauu8nVGkw2A3\r\nXcsm5DQWV1BWg+m86sCeHU2+nDbodWZBhDZjScCjhMKTvt4vEXckaIoeML5m\r\n3t5PKHADLuQgQfqvkkrV0HavVyY8zn+4VkIu/g0nc1lheg6/6opBdvLR7FUj\r\ndB2j6aNEetDboWPKqKdYGUB63FgFx+uFcuUP4/TPmKkagVrXxNbzmfux15XA\r\niQjHuX8B438fHDHhpy5B2F6A9u1IUROMSsz8gwgIaGdsD42sFOHQIY5gTVfy\r\n/2Y1SH2Sk6oigUYK+ADec11tlYWXh07ZuMegt6jFYJbpAAedlShiFMM+10Vk\r\nRZD5sHwOzD12Kh7WdqYTAUln7pH4POSiiUgm2btZ9WCzF6ixei2Urf7/zZnD\r\nSyDxJbc6TrehcVBZ+kERq0uommLVFNr4UIrGCLR5HaACk4TBO+DeZ+CGhjA9\r\nezT3+BwTeHLz8RsLqVD2RB++sFay1T/cO/wG+iaKEkWHbaFfsmxhwunkk3n9\r\nGK/wgs/hdIqv35kXc0DRAd5f9EHKm//N9XU=\r\n=0Lfd\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.25_1679352313948_0.9576069014523927"},"_hasShrinkwrap":false},"0.0.26":{"name":"@trufflehq/transframe","version":"0.0.26","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"private":false,"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.js","types":"./dist/esm/index.d.ts"},"./iframe":{"import":"./dist/esm/interfaces/iframe/index.js","require":"./dist/cjs/interfaces/iframe/index.js","types":"./dist/esm/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/esm/interfaces/background-script/index.js","require":"./dist/cjs/interfaces/background-script/index.js","types":"./dist/esm/interfaces/background-script/index.d.ts"}},"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"f87f3840a4ffdf46d818a03e2fccb0e2c50830e1","_id":"@trufflehq/transframe@0.0.26","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-1MxUBajYYTFnJVvpRXAiarOLcYesfeYBd4L0aFTo3nyXyDZpPbFbc1xIKTanT52JiUyT4LCjOiG71C3KShO21Q==","shasum":"92fbc133ceb7a94812015f290ccfa2fb61a63e1c","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.26.tgz","fileCount":84,"unpackedSize":90883,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDIvcN2fLoK5/+JsNqgpxG8TRjU3Y8KMv2eORdvnw4W0AIhALY5plCldsAhR3yjBOuXm9yY0SUp0G6ynXkT/q22oWa6"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkG1BGACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoK1Q//Tb6YFRPDiUxmh8j0eiUDW+dyte3faXkpzUvGmJ889jQ2sxbC\r\nhLwDPs+9kPgqOJTgjpS3N0ywB42XZfGC9MVuQtblZ+C3VIkK5AQaMIGf8We9\r\nsEPKPN1I+/JUcM352UvUVqZWlyK1PrwkBa6UunC08kR4CvIRIu1b0xGh2EGV\r\nJ17cYjJYDZUAPPh1f7zxz1Hu60MbdK05VFR3hqOvEDw3/IQyS10HPiQVun1H\r\nlp1iH3Qt7w1aui3efABfscXHkwpmZ1gYjfGNRASq45ymfXwDfFaOZkB91ngl\r\nSHxsQBONoxofPzpjFzvAz7yc5QB03Xd278JuE7LXrLk0BNZx0I+I93zbSqwR\r\nPPU6xx5UMmyJzrOzGmMUnwQOsQaSUi7xyrQ8zpYzeSxr5VjhZWE3epK7tufC\r\nmDL4C+HizNCzL/YLbcA8RZUGzWsM5cWITn0qliVwyjtIQpedfHeN09gHoxil\r\naYihn9v6ZORi8C4sVaPTM+L48e9qUo+5po1AiFmTThK2+F+5X8K6fQ42VT1L\r\nm7GM72tZPsj1M+MOkuxA2CuA+ZJqLXCnNeJbDnGgZQ1ru96/lYj2KSxu+xd4\r\n7xuumzPs4+KKfUNymACMfjnltNFsmdu37AJA4SX68XJKM8VmiYBdf8oO11mQ\r\n9iDTu7skWR72esPrJcxpDM+BtGftF8gG0/o=\r\n=+iaD\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.26_1679511622624_0.45449735426745086"},"_hasShrinkwrap":false},"0.0.27":{"name":"@trufflehq/transframe","version":"0.0.27","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"private":false,"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.js","types":"./dist/esm/index.d.ts"},"./iframe":{"import":"./dist/esm/interfaces/iframe/index.js","require":"./dist/cjs/interfaces/iframe/index.js","types":"./dist/esm/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/esm/interfaces/background-script/index.js","require":"./dist/cjs/interfaces/background-script/index.js","types":"./dist/esm/interfaces/background-script/index.d.ts"}},"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"f87f3840a4ffdf46d818a03e2fccb0e2c50830e1","_id":"@trufflehq/transframe@0.0.27","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-/L8v/sJwx03efZ5zAKJNPURTbbmRqFFJ45Vqn0JKpivDyoJZe4dwnFLUlqxTOiPt/kC2944gOv3vrvG3WpMeLw==","shasum":"908e0943697e7de55202ca55fc8b464f5af55ed9","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.27.tgz","fileCount":84,"unpackedSize":90937,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGTwSAp+U290cQ3UJVJt3NS8jkbl20YntNv6C+biSKLuAiBaGN2ZjmrowiUxDzr/Vc+IbtBN8hbePqBaiPxeutrg/Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkG1EnACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmofohAAjmgHPORZP8OpqwgtsJVxi+hE/vMWD0rjpUkiJ0iiiI/U11t/\r\nyHwXNcR6Z5sCVGrE/xM5HDHvQ2ZxjMVRc9EREE8Pu0RUovpleGXd6zhDtPNt\r\nB4yoZGfFEN86NzjgFaHPr2DyPddEtT21uPtW0BEJjWGpvahF/Z4KdOL8sN8K\r\nO3V7xu0XjSaebyyISX5mRJGd2VAXo1aYrK1mzJI64W0t22ZeskcGQKO0sf3I\r\nGfXPv9kUwEjFqBAClc7fMGBes37xF7Dhd7lEzmp4fixKs9xwnnkVYHQabaDD\r\n+9G95B21vpYg1ppkDxgEwoQg9duRDqzIHwJO7UEDAGy2kSQiocs074Wv6+qz\r\ns4JxPtJtCdOSByBYgt6DfPvFMHMI6maNiR1GM+OL0fa9EwC66po+I5Mw/dxt\r\ngrttWLYlfD3ChqqCvhDloQgBCbx4fNADyQ/kH5ExR9jLenAvpVKa0+LP0cgJ\r\n/kOz72gw32auCZJukIBttlt0V0kAm/GHhhT63cAw3L6RPcvFDm56ArZJIyD1\r\n2x/XlYiChYBzQLzJhiFbLc7UAd43bH/TEjZcD1ikB5E/5f0aX+Gnqnyq6t55\r\n4kakRhUhmGm6N/VdkEeH1N0SKZ3tbNkiQUinuIiFLskgrNRPBsYG2Cos9EtB\r\nVhZDkdaViDqwpDdACLozBWomKJ5fw78wFRg=\r\n=1SL4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.27_1679511847189_0.4055109025000734"},"_hasShrinkwrap":false},"0.0.28":{"name":"@trufflehq/transframe","version":"0.0.28","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"private":false,"type":"module","main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.js","types":"./dist/esm/index.d.ts"},"./iframe":{"import":"./dist/esm/interfaces/iframe/index.js","require":"./dist/cjs/interfaces/iframe/index.js","types":"./dist/esm/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/esm/interfaces/background-script/index.js","require":"./dist/cjs/interfaces/background-script/index.js","types":"./dist/esm/interfaces/background-script/index.d.ts"}},"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"202c39df1111e8615931f763b87e0074228aacba","_id":"@trufflehq/transframe@0.0.28","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-OKjnqTrbDb4NR4AtgIrow5fhhMiWS+nZDl/cOoRreI2PkkccKtFRaEXPUboDeoBg0nU6PfBWlYvynaNh4zj7aw==","shasum":"4dd2db14289610472c80cd05bc735d61284d298e","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.28.tgz","fileCount":84,"unpackedSize":90957,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC5+1UlXWQj7585ftXlqXlxnTIltjcIm3pik3ei3Jz2agIhAMxoFtMzJrQ6JJLRWwb6QwVy4BBmySIQwhE+I9SHojE1"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkG3GPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr6VRAAkX2kpKDOErZuqRdCn2OeV1zIcDcFckr/A/0zG88jLDpDXMrY\r\nI0geUk3P3JD12hzCDQQGyE4+W9mlYHxFM2HDLZ9GvSGyDH2AgvJLgmOnVPOR\r\nhk1dPh0bq3VNSDSIEpwA6pU8sDdN5mql8nQb2e7B2gxBZT/mO0V4TdRg1yxi\r\nHqvZQ0XgGmbzgc3CcIte2jqzNEsnHENanwPdCeQlXaYBEZcYGgAKOFNKCeKe\r\nnGIdPWdboueV155LA172Co3cOD3eP0WvdIdiIBeYshOsp5uiSjlcbuiiR0EW\r\nfEd0mEunk9G6ZiwIyGzncuRxy8l1EummnoXQN946OVbs7noyYepc/xJB7qqj\r\nQT0H3U8uNJpiMpW6cV8Hff17bOReatY5P4gCl/e4wG08/LPfNbbMP1BRkYmF\r\nUUsHGSxlxUoCS/I/4BcJEnQTcqAMBisSFbyQvPun3N6pcmWSN18EDgeOR94u\r\nXXgSar43+u9Ms99RorEhs/zlf2McDiXBiE0Z/drBQE7OwpHIQcl+gj43y5zo\r\nrpq3atcRgOtLfT/O8KuWvbaio0jTGnf8uedisITcPMLLwlh6BUxTjWaVxmRS\r\n2We7vFfANt8eVcY/c6ohUzOQYZfz64c5Ac5TQKVnC2cmEK6Xc8DC+GL+1Rqo\r\nJZIRRbFgXlkJSS1atmxAAXbtsDCQdxQfsjE=\r\n=A2pt\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.28_1679520143754_0.4490757290031886"},"_hasShrinkwrap":false},"0.0.29":{"name":"@trufflehq/transframe","version":"0.0.29","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"private":false,"type":"module","main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.js","types":"./dist/esm/index.d.ts"},"./iframe":{"import":"./dist/esm/interfaces/iframe/index.js","require":"./dist/cjs/interfaces/iframe/index.js","types":"./dist/esm/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/esm/interfaces/background-script/index.js","require":"./dist/cjs/interfaces/background-script/index.js","types":"./dist/esm/interfaces/background-script/index.d.ts"}},"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"readme":"## Transframe\n\nA generic cross-frame communication library\n","readmeFilename":"README.md","gitHead":"9e783f1e36c7b996de8fa2e8fe80e0c758b20e82","_id":"@trufflehq/transframe@0.0.29","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-Wd+AM7n9LN+Gn5EbpUCYW+OEdcnSezxxP6/nKPUQIBgAzYzvmsFu9KOoJEa/TcdRkKx5BhJxEgEermEnbrWZOw==","shasum":"72ce4569c9548d49ce56d910bdecc270798e6932","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.29.tgz","fileCount":84,"unpackedSize":98544,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFv4jE46DHIS87iL0vPdBF15LSNP86ta4VOLfTraO1qIAiAybbCxoySgAfJfApK8yiYm2rT6djU1hsCojE5xTuHQGQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkG4hJACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmouBhAAo4YKI7WP6y9XkCkFuKsXSEEF9w3Ih7y6Ie3wT0VZVL/Q2OkE\r\nuUAnN1S/pXWmhjWHjCDWWMGQcYNUFIWP5Z8g0Hk/4jdVnzhlJGrR6jon2Ljk\r\nCQLd2PpE2S5Dv/sK12VqFoPitcC70VdfvPhLoa7OpI7Cww3OOCC1cOF86EP4\r\n62Lix5MwH8kD6tjFEqBayfVWlTXTpByFM0RaUbvUy9tXR5QGlSWarqaAYV66\r\njeQoIVqv6CzD3BqnDqVKgtqNU9/sz39koVdBFPxDmGgZqclViO2BMBXedc89\r\nCgZ6zBIrxdOZA8I9Ny76MbCnHmgD2PyXjqQKnVtJBY0uGIYAN5aJohZnHrJ7\r\nePjXRsP0yl8s8BT2+lbyJ31s8dWMfZhE+4IUPFmKO1Wu00hdI6/qO7RAbx5t\r\ncs6xuLzjYAJXsH294uIEXp1kZ0zKkTNhP1uL2lg2gHvES1C6JTBnp5XQkIZr\r\nT+lHSTFmqNkNh4xYaAGKIqcwBsUmcY6y4euyJcXEV1/7rJ2A9rJKvEp5csmf\r\nR1tyzXNG8oWjjfhlbB9QIrruuG6zmqkMvOB9I86VBhSwpSC2N9nnyD2Q4ibz\r\nSm8ZKg8aMH/q7JQG/tX9ngBRFIx1XVBofz31Bs8Q0IXyZlHxVmEoJeH4IM0J\r\nh6Q4FHYGsJRQ9ApRJlxooG5tYkvUIIqfgvo=\r\n=4Tk+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.29_1679525961216_0.09200952449729649"},"_hasShrinkwrap":false},"0.0.30":{"name":"@trufflehq/transframe","version":"0.0.30","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"private":false,"type":"module","main":"dist/index.cjs","module":"dist/index.js","types":"dist/index.d.ts","scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"readme":"## Transframe\n\nA generic cross-frame communication library\n","readmeFilename":"README.md","gitHead":"9e783f1e36c7b996de8fa2e8fe80e0c758b20e82","_id":"@trufflehq/transframe@0.0.30","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-24eZcP52gTa33jo7FQW/0/t2/EckQjHQrLS7++lMYUVMPWdPcAMR5QNI4lElvVNJXEd/1eIzGAAxFCqkm5MCIw==","shasum":"add2c1edd48904d3323c8e8a7ee272a210b51056","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.30.tgz","fileCount":7,"unpackedSize":79074,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICydbMbCwIkwYtWhIA39jUo+yQBePz66X+UBeW75mI9pAiBJ/A+j/SWPvGmTQo44mMzhmsqw66DjfwfS20ejeZv4QQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkG43mACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq3vA/+Jbr3/Zwh1ofWBWO5y/cIIrHuTKqLWVlY05HTPXtwfc+qI3c8\r\nWb39t5iFYpweZ4ThZqSD2nvF9DAosXTmLY8lxrG3TRJkEluOJKrNkXWvZANz\r\nppnlLZsr7RBs5q+kG9cASff+0QzQ2DjnbqqmcSXc6ely0X4W+JWGmEyYjvJY\r\nbqTVOWyT0gvYffRMfse0Mfks71ldbOKJGhCCnUY31PqSK63GTQ0N9jNp0Y5E\r\nNq3M+oQGgc4baBZ6lkdic+OE4BMJkinOaBBWgZ3RHFZwMbLwhP2oPgJBUC8B\r\nKj0TNFmffzfKLRQ9TUZKe9m5MmAXT3zZqEkwoBbmvB5Yh9Pjd96WZyhRXyAW\r\nIU94ENIXUTUogtjoXmPzDgJWfnBmEy+CRaVbBDxBn4kUOadYAqoaydeScFi5\r\npSqrCByqhdsFkHmhkNoanufXw7ZLUjz6klWZXgfKfcIgwn/HnAMmuAw+yFcl\r\nDxiwaZVNqKjsvP5zwA/ZhqHw3n9sp6Vk8E/Mqtum6rd4MatTXHdiNHbup1tb\r\n5dTL7ToKB7BtMiT7m4qBNYxXOJ6/796K1ue0eUyTD1PSgpF4khTIg2NzyndA\r\nsLvcQV1H2qEWiFCH8qlEd6yL0C7f1UAZd+WQ/FJ3xnEPPGi8YNyHowPuuoGZ\r\nMQJti1y5VXl5ZdqYrg/bc6/5YxbpOgIKwvo=\r\n=eoYM\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.30_1679527398253_0.3502038591396057"},"_hasShrinkwrap":false},"0.0.31":{"name":"@trufflehq/transframe","version":"0.0.31","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"private":false,"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.js","types":"./dist/esm/index.d.ts"},"./iframe":{"import":"./dist/esm/interfaces/iframe/index.js","require":"./dist/cjs/interfaces/iframe/index.js","types":"./dist/esm/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/esm/interfaces/background-script/index.js","require":"./dist/cjs/interfaces/background-script/index.js","types":"./dist/esm/interfaces/background-script/index.d.ts"}},"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"readme":"## Transframe\n\nA generic cross-frame communication library\n","readmeFilename":"README.md","gitHead":"9e783f1e36c7b996de8fa2e8fe80e0c758b20e82","_id":"@trufflehq/transframe@0.0.31","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-LHYETNs3gll0g1oReDlejbfJnMKgVwE0Mvf6axkUdV5sTWA4FWEg5hbdsUt4yY+C4lG8xPtLnlDHahW+eVJS4w==","shasum":"2661d4ffcbb583795b23f5792cf9415f2aace459","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.31.tgz","fileCount":84,"unpackedSize":90937,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEKFr9VMMXomBxMRHfDW+s165mBFELwjP+79+QOrnlpKAiEA673Y5+beJeK6wIk76yayOx2A08ma3VcOwXwabaTrnoY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkG52oACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo0IBAAmiSTpjpxK9SEHTJXp4D7WaGH7QTNzaqcMRYZaoUm3O8vScmO\r\n6uYkB3BOenGd/4LD3F6Gv+Sq7yGajiluIFewijc1eWM4XZUxfpIuQlnZNJ45\r\ntC4gzYsZuy1FcfQBOxWreEyjebQScCZ3JwBgb6QujHAlct2NYFqzOAsU+RZr\r\nQerWjuT66KKIRjAEMHYpy9FYHoCqQebj7Yu5Qe4cUp6QwmNBmGHKFfByUfQV\r\nAwxpnPv6sG3c4nVrYgccRxzBU2J1AFeMbNMYKTCz6TkWJfQbKsl+luA++TXe\r\n/2X2yjQw9M+Bdc2FQK9wLoeH4hFtsImL4bWbqkWmCpl4ExQ2xoZiWIphjtEl\r\nfpx9UBZc2ZbLxxaqWzfdY29wB6xxTVNOqsIB5cqrrEPm9uXdZg5YwS+bx+zp\r\nW5lnaSDebJopwqew/mz1I3JVccME6ZDEfeP/GCcPpaR5Nf8+5NUVMihnr72K\r\np50m4EQKUzmWrTZpu3xQ8LhBUIIU+Pm+MuBHIOqVSyCJYIK0VcU9ms7KWT8W\r\nnYLACw9khfBtnZHXlNoW2Q9M46QJEegUMRRmsX8fDFDX082CcSyUm0ipbNH+\r\n8Yb59N8wus+EebieC8Tvh1xp8IpIxzgyzW1hrSJsZaQuO84gUQPBZH0GVV8j\r\nJFIXfl+fL+ByH2rQN+x00aZByaZ4SOLx/AA=\r\n=EZMN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.31_1679531432113_0.03145990000485965"},"_hasShrinkwrap":false},"0.0.32":{"name":"@trufflehq/transframe","version":"0.0.32","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"private":false,"main":"dist/cjs/index.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.js","types":"./dist/esm/index.d.ts"},"./iframe":{"import":"./dist/esm/interfaces/iframe/index.js","require":"./dist/cjs/interfaces/iframe/index.js","types":"./dist/esm/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/esm/interfaces/background-script/index.js","require":"./dist/cjs/interfaces/background-script/index.js","types":"./dist/esm/interfaces/background-script/index.d.ts"}},"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"npm run clean && npm run build:esm ; npm run build:cjs","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","jest":"^29.3.1","ts-jest":"^29.0.5","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"readme":"## Transframe\n\nA generic cross-frame communication library\n","readmeFilename":"README.md","gitHead":"9e783f1e36c7b996de8fa2e8fe80e0c758b20e82","_id":"@trufflehq/transframe@0.0.32","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-uR6t2L+PXViJeuHG7ubVtdRs12LNl+V9QysY2RCFDjPZp/R9/qG2xjzRisaTJ4zGx10hqvI7o1Y+TDNDzQtILQ==","shasum":"b8a55327262c3bd3bbf37e15b0580bf6b7f112d9","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.32.tgz","fileCount":84,"unpackedSize":90905,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCxJFB/mYvHWkLj/1GcQdmYu2K/hK7VghGWQTruiTtE6AIgYF7p2RQZhX578qCqyuTMQgcDPHC08d1T2g1/7LDFCEQ="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkHIy9ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoLcQ/5ACBhRPbijTj2xyDTPtGAEu6HiVKU1Wxkmnj9lopTYkLwBWAx\r\njwmK/SsXkH6NTXN0PYx0flsYX8T0dmbArKs6Z+FRddRYv7jWFzlBkyzmNOGb\r\nD6uX4fzjMyayMe3cP7BtPKWPPSWwB6edrBvzKhXs60kF5iMjQWx/IxHTQByx\r\nShVdN5O3cSKLEkLgYv4OJj6z8kJAa+T7o09ZiaWCCPl1lKQWAUy6G55dkt0q\r\nL/BNpFN9V0C4pYUOWxZzPRqiI57v9cKF/rSkE70K2GxamMWrXhEG8RhI6k7X\r\n3OmvQiJ2H2aGCiX6m6n8JiRcNVmJj8dUrpxMDtPm2+DuzO/vR6EXPMLd0H1Z\r\ns3030I2esMzVd4/BOryxMeWMTEKdkAP8WjPDGf0U3/dQZ3agx2Ck+p0fyToX\r\nBN9soad8YRqgNFwqJoO4LFE3GSbgvwMT8xc/Xalg0mi+1idsNXr9AjutSVnw\r\n2rgADPI+XOpUVVtWXOjGrxwvc8OP/0jLIP2b7BP9Sv9VTQcRgWaarBj9AciK\r\nBI28kIQlpXla054Y//r2175lXp2H+6fFjjPGJSHSbBkvs1kuYXcgRiA0xXLm\r\n1UAgnY2tCbFrl/BRhxyCbXm9SiwI6gdCA0RiEzuatHlfwUSSCJSxMJOwwhJV\r\n41zD/LaWzm7iXs2d0h4ksXSMx8DUF37CN9Y=\r\n=HrUg\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.32_1679592637237_0.6567746355161446"},"_hasShrinkwrap":false},"0.0.33":{"name":"@trufflehq/transframe","version":"0.0.33","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"readme":"## Transframe\n\nA generic cross-frame communication library\n","readmeFilename":"README.md","gitHead":"4f99bc8d7183aca97b2f794c8212167959922302","_id":"@trufflehq/transframe@0.0.33","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-N66upo5V38QfBMH/LfDHNu/bHWG1r+kwM/i/eyiD6LHJ9noiXe4evuv6m7IxX70vT631qhceQiXoUlDB7meP4Q==","shasum":"b251530423a866725220620a10fd6af541ff669a","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.33.tgz","fileCount":106,"unpackedSize":168856,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCS+28IBRepQvWnU/jNvS+krk8nDNxUSPonsNAyxjsO1gIhAMLReXj8KOTtFnJXSLhccsWbuKoR+GgTblGBYHICutiL"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkIiMoACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpCMQ//SI7R547QaaX+9fYIGfy92Z2xC6FN/im8prtHxs3YyOQoqEv/\r\nbv/X+xiyqHFNs/xvQDy2cy0/f2fDF2p7Xvpp5TpNx/QVINfL8zyaDLijt9K1\r\n+qyd13qsLFbsvaOJSMLYZHI2S8W2CSNuh0clMuRJ3DV83lIkHMjGQCE1VC9b\r\nE3L3ZJ/B2seRSli57zKTZAhf9W81PG7sr07/jTCF4dSTJh21M/cuqZEIkGB6\r\nBzYJuD/LZcl0Ddwy//0XPRrThIIiKxy/uOsJbUmI5om+EHVaCggk6VUWg7JG\r\n3sY72wRMxHBlGTS2puzL1UeZqvqAFp1+Usu37p2iTcc3Ax7KLX4wvurGaFrb\r\nLOBxABBSp2+u4UjNYLP6uS1IS8Mm+oiTgw/EcFWZR1Atj5KlaYcePbqsKhBT\r\nDDGRvt7jFcOUz1EWtssfvLWfdkC8tO6ZU1Ao8wcEQxK009wBaARVL5ZCk91m\r\ngiYhV0cdzkCmUmx3ZvkrmyWXUwkImvlDwjThJkNo7STMG96UX9SVebQnu9z8\r\nn0EiFCzo/w4smgULFaXE7nkpFZl30wnz0zrM8uHrdKlrtes5lUBgCmr2NwY7\r\nRyBVMXpphThNA9HumzH1PUAF4sKiHWGZEX8zLTgNvLrb97FRSwv+avbbLg8e\r\ntyBz0gcOFcbo0QHPUUPnqp4K6HgqgipvAh8=\r\n=sT5t\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.33_1679958823838_0.4495591358225097"},"_hasShrinkwrap":false},"0.0.34":{"name":"@trufflehq/transframe","version":"0.0.34","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"readme":"## Transframe\n\nA generic cross-frame communication library\n","readmeFilename":"README.md","gitHead":"4f99bc8d7183aca97b2f794c8212167959922302","_id":"@trufflehq/transframe@0.0.34","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-lrzzmX1biZ2dHHUJiVrZQ8PBC5Mdypz63yI9mxvOItrMhuMFXebnimhW8bv9F4i8pPi6JLIVqz8zwg/Py5B3bg==","shasum":"b7f8541243fbd1bdca7a34df55d563af8aa033cc","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.34.tgz","fileCount":106,"unpackedSize":170542,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBGEzNgs0FxCditkErqvHv4I82aBfJYb87AX/Ce+hpAMAiAauC4Si79H9DH6VfYbRjp8u1I+/woQpmFs1J74A45vPQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkIiYZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpjrg/+Jm7JOjvlcOmCgymdTueC9Wy8i/ymU3zVmgz/eN3Q84ndNnd9\r\nZBUZPQd8Jbj0+rz0Gcipbj/EYIobMTAPN8D/O4dtJNwMptKi5lxhiKHbKwIE\r\ncUECXGFSDkAnImh1p1VVQ7WSkSs5eRo79CGAwU/CLZnD0dLG6QEyqLsxzdFq\r\nQK1rj+m/7hcQUHeD9YPXyr8awnEvOO/g/g4obbrHFJUIatSu3Awcowdd+Kot\r\ncmjoP0AXR8uqIE9TechmJficZHAaB+wnqO7vnZy8HeVRRwibygIMUwlI3PVB\r\nnwsl9FGAoFR4tyZkaV5kN+R9fupyG93FeiA2uY94LxjL3zgnYEVel2YAEjH2\r\nemfqHJpUcKbCDsFhyb121sFIeilTE9emeejUHdVE24efbGxeTn71pxTaO4a3\r\nqxQxJSrUBhgW4q4X4nRshEYVaoXJhUUDfY1SIkVxDcWmSPzKAYtz313TTYfm\r\nebxfnfthyFkhsBuDCzosBxqgt5ZFKvF/KMio2wgPM1qWF2ZDiOHRUve6L2IL\r\nU8CLGQ0hoctk6I7IyPJAzkxA5P8jOPgiwssaECDKxlzluXBGR5yTci6HgJ7A\r\nE/Ff8fVSVVzI8gcitpIXnGz4DZubUNFvM79Kw8SYEdq89TdDsVFUdc4PpKUv\r\nFLZcREb1UYYVFze0rfLxx9lULyh82VxflgA=\r\n=c7GW\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.34_1679959576968_0.08715677421246748"},"_hasShrinkwrap":false},"0.0.35":{"name":"@trufflehq/transframe","version":"0.0.35","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"readme":"## Transframe\n\nA generic cross-frame communication library\n","readmeFilename":"README.md","gitHead":"4f99bc8d7183aca97b2f794c8212167959922302","_id":"@trufflehq/transframe@0.0.35","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-uBKjSbA2mwlRBqF3YGWftLEsATeKUbhAb1T1pLpheTxF2wH11NUVAG/baCtw3p9MrU9RRqPXl2zgJJr9CDiI0A==","shasum":"a120992dd13ce0902ce6cf26c58306d32be84390","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.35.tgz","fileCount":121,"unpackedSize":179680,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCQzQ73Me/sV7mLj8vDV7MFtbczKlWeMyR4ZwQvSa6crgIhAMyuA6z9lK7QQzNKnuOxnRvweP4v9dPzXynNxfv8Cr+X"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkInclACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoPyw//coACapPiVyd3xZKp3jNWiqki9bMWhc9zGMWPyg7UB/1hKv/0\r\nl3MUosfqb4PjKcxzqZe/U5d2LVYslVYlmsqh29W/9pnAzswcdHnfDaDFncjd\r\n/sqNoXLvDT6qQgqaLsVyD4hOmVDkAk4IdygJYSlKB05EMqKOO7BEop8g56Xe\r\nZ1Ji4FeSIeD0trt3eRKiFsySOaYShTCX0nNs10jThweTvMaXWfJo1+wT6NSh\r\nRmAyIc6CFAJMwU3+nF6BHBhGdHyMs5wRKecge+OTO2Rr8yvF+LvsXvTgjq8/\r\n6UwEUQY9KEfNPFcaQe3XwmbRDEVM0ud9Ccve9COQBWWN0342g6AVzfQb5rNn\r\nL0B08KCv+JJ8Ta7rxTX3+9tx8zul9boOxGUbbN7OunrwZxJGPtdaKzjdhrSp\r\nIGYIFsgXsTubUJgMOMg7oXvKfdPa9PYk8dzY9WGsEe2wLZFbO+F+wTrU58NH\r\n8d3t4ohm6BSgE7ds5/z38k8PoXjnhS0GWylx4SnJ6GBCad/xrK3FTNOe+JCL\r\nVN/0ce0+GTeKmh9tXEYULB4e9BQEKriIat2iv1Ygvh5XD3+B7WTThV7Qb2Xs\r\nxFijtxFs1W9bTv8qjJ1pR2TbF2t5UoJFKnvJ1qIenRu6j79IEc5IDMbR9DOG\r\n6QruAq5dZ+iGlxF14iwmZx6rentlsWj7tjk=\r\n=m1yN\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.35_1679980325209_0.1135420078034639"},"_hasShrinkwrap":false},"0.0.36":{"name":"@trufflehq/transframe","version":"0.0.36","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"readme":"## Transframe\n\nA generic cross-frame communication library\n","readmeFilename":"README.md","gitHead":"4f99bc8d7183aca97b2f794c8212167959922302","_id":"@trufflehq/transframe@0.0.36","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-8eLeXVy9BNlyWTI37nAlq2qpvq6ZkqjWYsRUUE9qzbRsvifJGIKoB3CXEsEgtSo95RwsU5zgQ7T/f3wQ5UkEGQ==","shasum":"cff329ee12e55d2d5da5bbf00a54a375eeaff46d","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.36.tgz","fileCount":121,"unpackedSize":179710,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAlTjxwJehx15uEn3kkV+YJTYOukGLJNk+hiiUGyYInwAiEAku5oV1Iy0i4KPoAIcuSqR6fWqYZzg+i3PrbkaH6dyh4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkInofACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoCwg/9H4lQinVktN/vUhfewtaQS/Lczga8B5sE9hqK7nfuuSkX56lJ\r\ncB0Jn85CYF6KAC4mBBPE+X2fDxa6izwi2q+EQ9m999qWCb4kP2gz3lEv/Dhr\r\n9qMWqqg4ts8D1Fj7wp3dD9hGCZNPHCaRrOSAPQZuwJwap9HoF0XIAIU04YZo\r\nL55CRzWJ2bykHMWcQ2eQ3SkAjrYoEG+fWq/mPWxoAjDXhIybCxIR4WNgsfCD\r\nImYfenJz6vwIlzZb1t1+uERPMd3lHVwtVYTVLXC3vmk6M1ybhkcKEOTKrKbl\r\n0Xjv7lglufOqy+MOeazZJ2xTT9wHDYVJaKGJHPHs4zW4/sa7l+kyOGTEXeqg\r\n+sSbhZ51vA9DnrJTITDb0ZbRndMz8QYnxfyDzWCR+knBGyQ8rJjrHCspnUpV\r\n43fWUKOWy4JAQA743EHj5eETewUk0Ppewg6PXj34kSg33rUBZrqDb2ocC6yL\r\nHFjzYAXR3kyDv4CwJ1gjdPAR6MC/8hN9KYF4ukRsqM0p31sJX1kq5wuX/R26\r\n8qAmyHIzdDpdpD9whnj3haoqr4f0VZIw+6mqpra4bpL7C63Xs70oX6OhuuES\r\ngTA6K/oEru/9hufqy/uZo9KVn4ga/gNrO3ddleAEoNnD9JuEolu1wQFosTLk\r\ngn/RvtE+0r2qdOCJCDboQzfWIrDyKUrRwWQ=\r\n=tWXa\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.36_1679981087333_0.8058172324404267"},"_hasShrinkwrap":false},"0.0.37":{"name":"@trufflehq/transframe","version":"0.0.37","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"readme":"## Transframe\n\nA generic cross-frame communication library\n","readmeFilename":"README.md","gitHead":"4f99bc8d7183aca97b2f794c8212167959922302","_id":"@trufflehq/transframe@0.0.37","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-y73xLjaiPFoE2+yQws1y2xGG2W1XWmYG5X+TVxzIMFcUjOubJTVSLquWJlalYkqJ+uSeHY6sO8MpicVBjuXklw==","shasum":"167517bbb7131d2fd1819e21597435e870218f79","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.37.tgz","fileCount":121,"unpackedSize":178188,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDmAgxde4jT9KAPqnr9Qsaj4jgdnNu84gLn0UV7omHQ+gIgJS0E7Ub2cRJE1ikO2JpnGloIY6XNjD5Q1mmUVCoQnCw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkIz28ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqwlRAAmSdGDt7F1G7QxRaiqHV24rthjwCFashhPet5afg50ZngSPiF\r\nS3vCyPAgr5L+fODx0mqQu2pWONjxN5y6dk4a0DdK4q0Gc3tf3JVCgyRgCare\r\ntssQCNmfLZHkWu5IpL4XX/+eb+HXI0BKjuRM0zpyNnKxm2iNyKEoeK2tvCcW\r\nMNkxO0c0AacwMg171R+H6JaT0j5skKPn6ICnIrAqUbDlRizW3iaaT0azy2OW\r\nQrIFcRN4y6BXwUpl97Vh8+7cIa5P1CsyohszgAWUSKhrEIrDsI6L75nLVhed\r\n3ZyyUAnBPygqL/jlQEWvuBCGIW6IFh7XoC7igrMfQExpG/0UqnZyuWSuQtn9\r\njxlEP/IRT1hUCVjqCzeG+nod2KzZCaYyAVZ1SxRo1Yd/Y1CyZmKXE1uomuY+\r\nE5MEtBj4iGE8xkMoThIWDccwER/csoG9zN/CRpHS4d3V3R5MInZ7wlmeLlmU\r\np1X2og1oTLgFj5A938Vdj8FtV8yAicY+mdUlYiCEE65cT6dgpdpQAx/UlPJY\r\nkYmNCwJhOOXBERwKmzLeGaF0fZAr3FuSK1iTlZ53w0EpOt+81x1y9ZjSz07b\r\npZ7lIuJlZ8Cak6S2jHY81vueX9mYjlineDfCA13tTvG0B3vk6pc5KxvOiUTb\r\nmuAqO4IZETZk1Wrctt9h8+D1kfyIO1ExU/4=\r\n=NgzA\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.37_1680031164431_0.18920696275083237"},"_hasShrinkwrap":false},"0.0.38":{"name":"@trufflehq/transframe","version":"0.0.38","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"f8417aef204ef29dd3c67bbe8e52a6083a663f4b","_id":"@trufflehq/transframe@0.0.38","_nodeVersion":"18.7.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-1hRNtED/zlBVarfM3XecvwU0iIiTOeFv6wOdAwqnrw/MgIPJLlBg3T7O7/4U1CByOxV5Zlc9Piakv393TMHf6A==","shasum":"6e963601826cc3d382fe090fe4fc657f8426c7fe","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.38.tgz","fileCount":106,"unpackedSize":163828,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC5kMKxrhfZ4tUQDEgc2Sx5TgV1i5DYC3gvk8Zhibva7AiBUswf3A4eXTxOlezmod/wQO7q1SYG/G50NSKuHarwnOg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkTbM7ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo8RxAAgetZaNB5CpNfs3TNDFiUaXDtf/KnOydAPttDH915dFhRymU/\r\n233jaKqLoBge4IlTFzK6rEyr/2n97FV/zZG7i8OnjZtOaPPNpSmXlU4tGpUs\r\n/gZcCM/AJQ9AmlyOS7b1COXlR9f3Mv/h/YOqRYFg/iNpA78Tro77piF7SMAD\r\nPsLQA8mFTH5sw6jTUMfgRsZ5gJQf+w+rbS6LZppIvP97GcrxE/hxdwU8RwqW\r\nD6WTltsu35wKdiRtDIrIEU4GheVMlm+6y7DFymT+SkzwEVYy2k/GlHnj/iwd\r\n8Fg16LEKbBItFXMm2ltY7Xa3ab6FwlzoL7mUihZPoMc7yHPFcU2A4zW0YUo6\r\nbgqwGOBvn75m09wEeL3tLkfBYYxw9l7AxVmNUdEZoDD8ZlAv28XRaLnvTNg9\r\nMH2hkGCV0yASTxKGkJJXEQ2r2gx5pxUy9zCqTRA/JskYflmLM3MTewTTgTtq\r\nymqzdLQidL6mr2w8D/x/RaCovTa/jcbKFWByWAQxyKVEi/9Cy+rvFXCo/XW1\r\npainmGrNpdXFSoKREdn+wRlM3rXPDjObiPATjCBSgIXYeujzfbtcdTCHlKl3\r\net3Q1fnHjh5O3oX9q+7MSmHRHLrKIpx3ex4Ph5/96KU2xXial+VJHTcqXSXq\r\nW6BqokLBgEIP4F+qZz2nlNFl2SAvLir+yT4=\r\n=yexS\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.38_1682813755477_0.22598684208850184"},"_hasShrinkwrap":false},"0.0.39":{"name":"@trufflehq/transframe","version":"0.0.39","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"5c5a2c9a003ec76c3272814a22e53a1e703c4ad7","_id":"@trufflehq/transframe@0.0.39","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-pJF9fIcCh6CRw0kVHzv4klLk/FH87lcXuZCHMg29wa+VXlbD3ZapozjEjYgA2HxptMaBSXzOF+8A/lNWxSgL5A==","shasum":"ed685db5748a62502524518f3eafb10d64080f91","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.39.tgz","fileCount":106,"unpackedSize":172525,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDJxsE4cC7/Wc2RHYgAp1d+Rt886ywUIONa4QbJPlhQJQIhAL+An8oP7oW0xDsap3QdUyqfd1h+82pzUyCXcyOB1TNt"}]},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.39_1685602827653_0.3118103570734623"},"_hasShrinkwrap":false},"0.0.40":{"name":"@trufflehq/transframe","version":"0.0.40","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"a0175a732dc60e69f17c6efcc0cde57e305f1af9","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"homepage":"https://github.com/trufflehq/truffle-packages#readme","_id":"@trufflehq/transframe@0.0.40","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-VAN0YHcVMTcw9j2P2WkNgpGW7fDt9zLls7gSwaonBEu4FVrsIlD7zLvqw1GB+6OQ2+sm5iHkS9FVTFBHXFYjXw==","shasum":"c67ab1596f884bb4946dddbd09996528046db28c","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.40.tgz","fileCount":106,"unpackedSize":172665,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDRdKtLB0MSfJxXYyOFrmsX8u3WKtQq48QmtAoiKE60yAiABfpiewIFj2ltgCBP8d8G8y4EEGbO44Z/1bJSC+bGTJw=="}]},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.40_1685603101545_0.396305536881183"},"_hasShrinkwrap":false},"0.0.41":{"name":"@trufflehq/transframe","version":"0.0.41","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"a0175a732dc60e69f17c6efcc0cde57e305f1af9","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_id":"@trufflehq/transframe@0.0.41","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-B0bufNM1U7zKj3/9055Fn2QsXrxGS9A7Vx3qvWfNZvXAwJ5UM5hLNh/tdThhbaSCnwvNbu60nO2OrkgugSb1rA==","shasum":"6a4582f88a3f20666ef3fb33e0c542241e5304ba","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.41.tgz","fileCount":106,"unpackedSize":172765,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAGLsMX8O4e9xNnKG2phU6YYpLONzO3QDXiwU0WxUa3pAiA7u4+hy0Qb3M4noih5y56feS8DAp8uZikQYUBFmen4BQ=="}]},"_npmUser":{"name":"faytruffle","email":"afay@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.41_1685603217817_0.28184008918619385"},"_hasShrinkwrap":false},"0.0.42":{"name":"@trufflehq/transframe","version":"0.0.42","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"07021a7ee110e8721b905c7884d01e37cb5d4f0a","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_id":"@trufflehq/transframe@0.0.42","_nodeVersion":"18.7.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-4LWXKa7Oa/l/2DJHBPFR6z2xt61uClJpFkdaGfK5GqnwkVyTM2Jr9lK+okWqGoz20oDGtFGw/M04Cc2M3U5Q4w==","shasum":"721347950c736d7d6192a7b49aaa7ebb40a49cbe","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.42.tgz","fileCount":106,"unpackedSize":173967,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFivA1LRWGWOQgWvdzgTTMl3/ES/pvQoRm2bDNBuebszAiAOJ2EbYLs01T+ZlQv2HL/5pYcIEKyFBly413twyQW1vA=="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.42_1689649646773_0.6711616483770833"},"_hasShrinkwrap":false},"0.0.43":{"name":"@trufflehq/transframe","version":"0.0.43","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"f987e83946ba44cf8e4d31c88b54343c948b481d","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_id":"@trufflehq/transframe@0.0.43","_nodeVersion":"18.7.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-Pakg1Pno4XeSvqyCqUoXwZn7twyC1ELLhNSmKZUnHc4NTK5sfSi9LwCaM5DJ9npE1bg5P+pypj2IVhjTvvWaMw==","shasum":"c542d43a8dc4d08af9ddd927c027efb6ffd7fc33","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.43.tgz","fileCount":106,"unpackedSize":174879,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDlFBku99AkvQIGTCCoWfRV9lU7JDqtGBMC+AJh0RgvtAIhAP6DNsNTrFwBH4VH9qpShtX9GvLTGULcTKCwFt+lBJOC"}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.43_1689652629745_0.652436989455857"},"_hasShrinkwrap":false},"0.0.44":{"name":"@trufflehq/transframe","version":"0.0.44","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"fc8dce2b5bfa15cda2f31dba0fd05427ae65234b","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_id":"@trufflehq/transframe@0.0.44","_nodeVersion":"18.7.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-NVF3VxVLQzZDhT0Zl15bgwM/C90t9DxVE6qCOEQXwRkafhGX8Leh0Vpflr47/mCdg0fMN2svsArOXq7zrBSa/w==","shasum":"6f0e78467fc9c6fdc0088d535e948dff7a248d0b","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.0.44.tgz","fileCount":106,"unpackedSize":174931,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDaiiyq1bA0dJzRm2vujJlw5+e6TaxMK/CMpyjnkztcoQIgDTsbgPYJsEiBSm9eYpqZm0nQ+yaXVXCyFQrN3MdHZa0="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.0.44_1689653824417_0.3448456198319154"},"_hasShrinkwrap":false},"0.1.0":{"name":"@trufflehq/transframe","version":"0.1.0","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"b8098d52595806ec79bdba9b56b579a8d452fd65","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_id":"@trufflehq/transframe@0.1.0","_nodeVersion":"18.7.0","_npmVersion":"8.15.0","dist":{"integrity":"sha512-P8NOxu2+rdHftnPocDMg8fA2ghYo20rDe3GXm8QRZHd0oTW8f6b43GaXbqI+XSZlm7ZJdJCs12lOBAfOG4MUVw==","shasum":"b19395c69cc92a97480562f8b442f6c11b214cae","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.0.tgz","fileCount":106,"unpackedSize":174930,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGP7loLv4B90NT5ipiJcQW9puqPCw/D72ZjMZwzBzvXIAiEA+ncO0jsMeWgwoXNYisHxMJcZVxJK8+Ruogoo+DNOYGI="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.0_1690513663115_0.18032549790824826"},"_hasShrinkwrap":false},"0.1.1":{"name":"@trufflehq/transframe","version":"0.1.1","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"01440acefc6f77dcf1d09504f49f1156e961a289","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_id":"@trufflehq/transframe@0.1.1","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-qVJ2h3T/EPGRfF7npggaGJe+9nmKbK/DyXAseJsCAZygREL5NzK1AYroIbItUCfPhTsnpcDC6w7Y4Jwmgh0soA==","shasum":"5d91d836bc976d94de03384a638fd66028d19eb1","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.1.tgz","fileCount":106,"unpackedSize":176554,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC2sQb7o9s37GE1YklIUCLmusxpPKaJCcf8TWgsftyquQIgVrDFxHd2jIZnZSf74pDhSW/WjQN6Z6Zkr/MAH+QWw+E="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.1_1704863139995_0.6323581843760249"},"_hasShrinkwrap":false},"0.1.2":{"name":"@trufflehq/transframe","version":"0.1.2","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"gitHead":"01440acefc6f77dcf1d09504f49f1156e961a289","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_id":"@trufflehq/transframe@0.1.2","_nodeVersion":"18.12.1","_npmVersion":"8.19.2","dist":{"integrity":"sha512-+UFRL/icNhd+G58vd8AQT8FDgMNhcv4atluCG9YIsBykqyuTfcOXZyfEmGk1Y4XCJTkZ/FKU+VZb3Sdelju0iw==","shasum":"c1cf8a29ad43eb411b8a638cf93eca4abf012f27","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.2.tgz","fileCount":106,"unpackedSize":177779,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCcMQ4WUihL9w7gkIwYQ8DjTLc3s47NGaXJ/OJQLg3PBQIhAN8THdGeF/G5SSfKYPb7xIK1rMZRXjzOSKhXCNnbaYek"}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.2_1704867070547_0.25033127920309584"},"_hasShrinkwrap":false},"0.1.3-alpha.0":{"name":"@trufflehq/transframe","version":"0.1.3-alpha.0","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview":{"import":"./dist/interfaces/react-native-webview/index.mjs","require":"./dist/interfaces/react-native-webview/index.js","types":"./dist/interfaces/react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"dependencies":{"react-native-webview":"^13.8.1"},"_id":"@trufflehq/transframe@0.1.3-alpha.0","readme":"# Transframe\n\nHave you ever needed to implement communication with an iframe? Or maybe you're\nbuilding a browser extension and you need to communicate between your content\nscript and your background script. You probably went on MDN or Stack Overflow\nand found all the different ways of communicating (`window.postMessage`,\n`chrome.runtime.sendMessage`, etc). You probably started using those and came up\nwith some janky method of serializing and deserializing messages that have weird\nand inconsistent structures because you're just trying to get your app to work.\nWhen you're all done, the communication mechanism you built becomes the most\nfragile part of your app.\n\nIf this happened to you, look no further! Transframe has you covered. Transframe\nallows you to easily create cross \"frame\" APIs!\n\n(hence the name \"transframe\")\n\nTruffle uses Transframe as the communication mechansim for the\n[Truffle Extension](https://truffle.vip/extension). If you're not familiar with\nit, you should check it out. It's super cool :p\n\nBefore I bore you with all of the details, let's see how you can get started\nright away.\n\n## Getting started\n\nTo get started, install Transframe with your favorite package manager.\n\n```bash\n$ npm install @trufflehq/transframe\n$ yarn add @trufflehq/transframe\n```\n\nWith every Transframe setup, there are two sides: a _provider_ and and a\n_consumer_. A _provider_ provides an API that a _consumer_ can consume. Let's\ntake a look at how to set this up.\n\nScript in parent page:\n\n```typescript\nimport {\n  createIframeProvider,\n  createIframeApi\n} from \"@trufflehq/transframe/iframe\";\n\ncreateIframeProvider({\n  api: createIframeApi({\n    sayHello() {\n      return \"Hello!\";\n    },\n  }),\n});\n```\n\nNow for the script in the page to be iframed:\n\n```typescript\nimport { createIframeConsumer } from \"@trufflehq/transframe/iframe\";\n\nconst transframeConsumer = createIframeConsumer();\nconst api = transframeConsumer.api;\n\nconst messageFromParent = await api.sayHello();\nconsole.log(\"Message from parent:\", messageFromParent);\n// Output: Message from parent: Hello!\n```\n\nCongrats! You've implemented your first Transframe API and interacted with it.\n\n### Passing args\n\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    sum(_context, a: number, b: number) {\n      return a + b;\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconst onePlusTwo = await consumer.api.sum(1, 2); // 3\n```\n\n> The `_context` parameter contains information about the call to the API method. For the iframe interface, it contains a `message` property that is forwarded from `window.addEventListener` (see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#the_dispatched_event) for more details). `_context` is always the first parameter to API methods (though you will probably seldom use it).\n\n### Callbacks\n\nYou can also pass callbacks to your API methods.\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    subscribe(_context, callback: (iterations: number) => void) {\n      let iterations = 0;\n\n      setInterval(() => {\n        callback(iterations);\n        iterations++;\n      }, 1000);\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconsumer.api.subscribe((iterations: number) => {\n  console.log(`I've been called ${iterations} times.`);\n});\n\n// Output:\n// I've been called 0 times.\n// I've been called 1 times.\n// I've been called 2 times.\n// ...\n```\n\nIf you're interested in diving deeper, check out\n[this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child).\n\n\n## Architecture\n\nAt its core, Transframe is simply an RPC library. What makes it special is its ability to operate in different contexts using different *interfaces*. Under the hood, the iframe interface uses `window.postMessage` and `window.addEventListener('message', ...)`, while the background script interface uses the `Browser.runtime` api. If you wanted to, you could implement another interface to enable Transframe to work in another context. We haven't done it yet, but theoretically we could make a websocket interface 👀.\n\nHere's a high-level diagram for those visual folks:\n\n![High level Transframe diagram](./transframe.png)\n\n## Contexts\n\nHere are different contexts that transframe can operate in. This is a non-exhaustive list, mainly because the iframe interface can be cleverly configured in lots of ways with the `providerWindow` option.\n\nThe following lists will be notated as \"consumer -> provider\".\n\n### Iframe\n\n> All of these can also work in reverse by correctly configuring the `providerWindow` option.\n\n- Iframe -> Parent webpage\n- Nested iframe -> Parent webpage\n- Nested iframe -> Parent iframe\n- Popup -> Popup opener webpage\n- Webpage -> Browser extension content script\n\n### Background script (browser extensions)\n> Due to how this interface was implemented, the background script must always be the provider. Under the hood, it's using [this api](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port#:~:text=Content%20script%20to%20background%20script) (Content Script to Background Script).\n- Content script -> Background script\n\n## Configuring iframe consumers\n\nI mentioned above that the iframe interface can be configured in lots of different contexts using the `providerWindow` option. This is done when creating an iframe consumer.\n\n```typescript\nconst transframeConsumer = createIframeConsumer({\n  providerWindow: window.parent\n});\n```\n\nBy default, it uses `window.top` as the provider window. This means that iframes and nested iframes will communicate with the top-most webpage. With the above code, nested iframes would communicate with the iframe just above it.\n\nHere's a table that shows how to set `providerWindow` for different contexts:\n\n| Context | `providerWindow` |\n| ------- | ---------------- |\n| Iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent iframe | `window.parent` |\n| Popup -> Popup opener webpage | `window.opener` |\n| Webpage -> Browser extension content script | `window` |\n\n## Namespaces\n\nIn a given context, it's possible to have multiple Transframe APIs. To avoid collisions and errors between these APIs, it's a best practice to always specify a namespace.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  namespace: 'my-api'\n});\n\n// consumer\ncreateIframeConsumer({\n  namespace: 'my-api'\n});\n```\n\n## Security\n\nTransframe has a few security features to help you ensure that only the intended consumers and providers are communicating with each other.\n\n### Frame registration (iframe interface)\n\nIf you want to ensure that only certain iframes can use your API, you can use the `strictMode` option when creating an iframe provider and subesquently register frames that will be able to use your api.\n\n```typescript\n// provider\nconst provider = createIframeProvider({\n  api,\n  strictMode: true\n});\n\n// get a reference to the iframe you want to register\nconst iframe = document.getElementById('my-iframe');\n\n// register the iframe\nprovider.registerFrame(iframe);\n```\n\nIn this case, only the iframe with the id \"my-iframe\" will be able to use your API. If any other iframe tries to use it, it will fail.\n\nRegistering frames also causes `_context.fromId` to be defined in calls to your API methods, so you can uniquely identify the iframe that called your API method. Check out [this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child) for a demonstration of this.\n\n### Origin verification (iframe interface)\n\nIf you want to ensure that only iframes from certain origins can use your API, you can use the `allowedOrigins` option when creating an iframe provider.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, only iframes from `https://my-website.com` will be able to use your API. If any other iframe tries to use it, it will fail.\n\nIf you want to ensure that your consumer is not connecting to a malicious provider, you can use the `allowedOrigins` option when creating an iframe consumer.\n\n```typescript\n// consumer\ncreateIframeConsumer({\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, the consumer will only send messages to origins specified in `allowedOrigins`. Under the hood, it's passing the origins you specify to `window.postMessage` (see the [docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#syntax)).\n\n### Content scripts -> Background scripts\n\nDue to how the background script interface was implemented, content scripts will only ever be able to communicate with background scripts in the same extension. So you can be sure that only content scripts that you write will be able to communicate with your background script.","readmeFilename":"README.md","gitHead":"536ebbeaf1a13da015fbdd48454ae69d7c91cf12","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-Mm06UYbs6DeL9ijgasOANp+JEny9mv89ccClPLqHHMOP8+1VFUYTFhrYx4Q2sFTAKAPcSYKSbKUKZf5806JQTQ==","shasum":"cdcacbd5eb8f2c16390086b748223246da3f7708","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.3-alpha.0.tgz","fileCount":131,"unpackedSize":205891,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCZ8x7/49j0yNNQQdXfFrZH9JBfzWaDLPYA1ZRJ16ZkEwIhAMzQBMkiFLjVzT5eb8w/uX0dVlohm4iAcaYTHCpByR6S"}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.3-alpha.0_1710807351610_0.7389322958432001"},"_hasShrinkwrap":false},"0.1.3-alpha.1":{"name":"@trufflehq/transframe","version":"0.1.3-alpha.1","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview":{"import":"./dist/interfaces/react-native-webview/index.mjs","require":"./dist/interfaces/react-native-webview/index.js","types":"./dist/interfaces/react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"dependencies":{"react-native-webview":"^13.8.1"},"_id":"@trufflehq/transframe@0.1.3-alpha.1","readme":"# Transframe\n\nHave you ever needed to implement communication with an iframe? Or maybe you're\nbuilding a browser extension and you need to communicate between your content\nscript and your background script. You probably went on MDN or Stack Overflow\nand found all the different ways of communicating (`window.postMessage`,\n`chrome.runtime.sendMessage`, etc). You probably started using those and came up\nwith some janky method of serializing and deserializing messages that have weird\nand inconsistent structures because you're just trying to get your app to work.\nWhen you're all done, the communication mechanism you built becomes the most\nfragile part of your app.\n\nIf this happened to you, look no further! Transframe has you covered. Transframe\nallows you to easily create cross \"frame\" APIs!\n\n(hence the name \"transframe\")\n\nTruffle uses Transframe as the communication mechansim for the\n[Truffle Extension](https://truffle.vip/extension). If you're not familiar with\nit, you should check it out. It's super cool :p\n\nBefore I bore you with all of the details, let's see how you can get started\nright away.\n\n## Getting started\n\nTo get started, install Transframe with your favorite package manager.\n\n```bash\n$ npm install @trufflehq/transframe\n$ yarn add @trufflehq/transframe\n```\n\nWith every Transframe setup, there are two sides: a _provider_ and and a\n_consumer_. A _provider_ provides an API that a _consumer_ can consume. Let's\ntake a look at how to set this up.\n\nScript in parent page:\n\n```typescript\nimport {\n  createIframeProvider,\n  createIframeApi\n} from \"@trufflehq/transframe/iframe\";\n\ncreateIframeProvider({\n  api: createIframeApi({\n    sayHello() {\n      return \"Hello!\";\n    },\n  }),\n});\n```\n\nNow for the script in the page to be iframed:\n\n```typescript\nimport { createIframeConsumer } from \"@trufflehq/transframe/iframe\";\n\nconst transframeConsumer = createIframeConsumer();\nconst api = transframeConsumer.api;\n\nconst messageFromParent = await api.sayHello();\nconsole.log(\"Message from parent:\", messageFromParent);\n// Output: Message from parent: Hello!\n```\n\nCongrats! You've implemented your first Transframe API and interacted with it.\n\n### Passing args\n\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    sum(_context, a: number, b: number) {\n      return a + b;\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconst onePlusTwo = await consumer.api.sum(1, 2); // 3\n```\n\n> The `_context` parameter contains information about the call to the API method. For the iframe interface, it contains a `message` property that is forwarded from `window.addEventListener` (see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#the_dispatched_event) for more details). `_context` is always the first parameter to API methods (though you will probably seldom use it).\n\n### Callbacks\n\nYou can also pass callbacks to your API methods.\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    subscribe(_context, callback: (iterations: number) => void) {\n      let iterations = 0;\n\n      setInterval(() => {\n        callback(iterations);\n        iterations++;\n      }, 1000);\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconsumer.api.subscribe((iterations: number) => {\n  console.log(`I've been called ${iterations} times.`);\n});\n\n// Output:\n// I've been called 0 times.\n// I've been called 1 times.\n// I've been called 2 times.\n// ...\n```\n\nIf you're interested in diving deeper, check out\n[this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child).\n\n\n## Architecture\n\nAt its core, Transframe is simply an RPC library. What makes it special is its ability to operate in different contexts using different *interfaces*. Under the hood, the iframe interface uses `window.postMessage` and `window.addEventListener('message', ...)`, while the background script interface uses the `Browser.runtime` api. If you wanted to, you could implement another interface to enable Transframe to work in another context. We haven't done it yet, but theoretically we could make a websocket interface 👀.\n\nHere's a high-level diagram for those visual folks:\n\n![High level Transframe diagram](./transframe.png)\n\n## Contexts\n\nHere are different contexts that transframe can operate in. This is a non-exhaustive list, mainly because the iframe interface can be cleverly configured in lots of ways with the `providerWindow` option.\n\nThe following lists will be notated as \"consumer -> provider\".\n\n### Iframe\n\n> All of these can also work in reverse by correctly configuring the `providerWindow` option.\n\n- Iframe -> Parent webpage\n- Nested iframe -> Parent webpage\n- Nested iframe -> Parent iframe\n- Popup -> Popup opener webpage\n- Webpage -> Browser extension content script\n\n### Background script (browser extensions)\n> Due to how this interface was implemented, the background script must always be the provider. Under the hood, it's using [this api](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port#:~:text=Content%20script%20to%20background%20script) (Content Script to Background Script).\n- Content script -> Background script\n\n## Configuring iframe consumers\n\nI mentioned above that the iframe interface can be configured in lots of different contexts using the `providerWindow` option. This is done when creating an iframe consumer.\n\n```typescript\nconst transframeConsumer = createIframeConsumer({\n  providerWindow: window.parent\n});\n```\n\nBy default, it uses `window.top` as the provider window. This means that iframes and nested iframes will communicate with the top-most webpage. With the above code, nested iframes would communicate with the iframe just above it.\n\nHere's a table that shows how to set `providerWindow` for different contexts:\n\n| Context | `providerWindow` |\n| ------- | ---------------- |\n| Iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent iframe | `window.parent` |\n| Popup -> Popup opener webpage | `window.opener` |\n| Webpage -> Browser extension content script | `window` |\n\n## Namespaces\n\nIn a given context, it's possible to have multiple Transframe APIs. To avoid collisions and errors between these APIs, it's a best practice to always specify a namespace.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  namespace: 'my-api'\n});\n\n// consumer\ncreateIframeConsumer({\n  namespace: 'my-api'\n});\n```\n\n## Security\n\nTransframe has a few security features to help you ensure that only the intended consumers and providers are communicating with each other.\n\n### Frame registration (iframe interface)\n\nIf you want to ensure that only certain iframes can use your API, you can use the `strictMode` option when creating an iframe provider and subesquently register frames that will be able to use your api.\n\n```typescript\n// provider\nconst provider = createIframeProvider({\n  api,\n  strictMode: true\n});\n\n// get a reference to the iframe you want to register\nconst iframe = document.getElementById('my-iframe');\n\n// register the iframe\nprovider.registerFrame(iframe);\n```\n\nIn this case, only the iframe with the id \"my-iframe\" will be able to use your API. If any other iframe tries to use it, it will fail.\n\nRegistering frames also causes `_context.fromId` to be defined in calls to your API methods, so you can uniquely identify the iframe that called your API method. Check out [this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child) for a demonstration of this.\n\n### Origin verification (iframe interface)\n\nIf you want to ensure that only iframes from certain origins can use your API, you can use the `allowedOrigins` option when creating an iframe provider.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, only iframes from `https://my-website.com` will be able to use your API. If any other iframe tries to use it, it will fail.\n\nIf you want to ensure that your consumer is not connecting to a malicious provider, you can use the `allowedOrigins` option when creating an iframe consumer.\n\n```typescript\n// consumer\ncreateIframeConsumer({\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, the consumer will only send messages to origins specified in `allowedOrigins`. Under the hood, it's passing the origins you specify to `window.postMessage` (see the [docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#syntax)).\n\n### Content scripts -> Background scripts\n\nDue to how the background script interface was implemented, content scripts will only ever be able to communicate with background scripts in the same extension. So you can be sure that only content scripts that you write will be able to communicate with your background script.","readmeFilename":"README.md","gitHead":"536ebbeaf1a13da015fbdd48454ae69d7c91cf12","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-36FfbsbXKOUVWe7N++Icp/llwXiu8PnBJ8afGkRkydIF5Z3gPk3ayHrakECGvcaLGtKyLJ2PRG5PWJcGJpdDZg==","shasum":"da75510bf6d34f318ab86f934a9b387bdb63a0e6","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.3-alpha.1.tgz","fileCount":131,"unpackedSize":205891,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD89hghA1im/YEhVVDxFOCqB7xtNYvDsSMTSuz4YOkdoAIgW3lxrYPjDBSe1gVwPNzq01C2dwpwrgIZ8skuIgVMbBo="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.3-alpha.1_1710807732315_0.2662264771053444"},"_hasShrinkwrap":false},"0.1.3-alpha.2":{"name":"@trufflehq/transframe","version":"0.1.3-alpha.2","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview":{"import":"./dist/interfaces/react-native-webview/index.mjs","require":"./dist/interfaces/react-native-webview/index.js","types":"./dist/interfaces/react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"dependencies":{"react-native-webview":"^13.8.1"},"_id":"@trufflehq/transframe@0.1.3-alpha.2","readme":"# Transframe\n\nHave you ever needed to implement communication with an iframe? Or maybe you're\nbuilding a browser extension and you need to communicate between your content\nscript and your background script. You probably went on MDN or Stack Overflow\nand found all the different ways of communicating (`window.postMessage`,\n`chrome.runtime.sendMessage`, etc). You probably started using those and came up\nwith some janky method of serializing and deserializing messages that have weird\nand inconsistent structures because you're just trying to get your app to work.\nWhen you're all done, the communication mechanism you built becomes the most\nfragile part of your app.\n\nIf this happened to you, look no further! Transframe has you covered. Transframe\nallows you to easily create cross \"frame\" APIs!\n\n(hence the name \"transframe\")\n\nTruffle uses Transframe as the communication mechansim for the\n[Truffle Extension](https://truffle.vip/extension). If you're not familiar with\nit, you should check it out. It's super cool :p\n\nBefore I bore you with all of the details, let's see how you can get started\nright away.\n\n## Getting started\n\nTo get started, install Transframe with your favorite package manager.\n\n```bash\n$ npm install @trufflehq/transframe\n$ yarn add @trufflehq/transframe\n```\n\nWith every Transframe setup, there are two sides: a _provider_ and and a\n_consumer_. A _provider_ provides an API that a _consumer_ can consume. Let's\ntake a look at how to set this up.\n\nScript in parent page:\n\n```typescript\nimport {\n  createIframeProvider,\n  createIframeApi\n} from \"@trufflehq/transframe/iframe\";\n\ncreateIframeProvider({\n  api: createIframeApi({\n    sayHello() {\n      return \"Hello!\";\n    },\n  }),\n});\n```\n\nNow for the script in the page to be iframed:\n\n```typescript\nimport { createIframeConsumer } from \"@trufflehq/transframe/iframe\";\n\nconst transframeConsumer = createIframeConsumer();\nconst api = transframeConsumer.api;\n\nconst messageFromParent = await api.sayHello();\nconsole.log(\"Message from parent:\", messageFromParent);\n// Output: Message from parent: Hello!\n```\n\nCongrats! You've implemented your first Transframe API and interacted with it.\n\n### Passing args\n\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    sum(_context, a: number, b: number) {\n      return a + b;\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconst onePlusTwo = await consumer.api.sum(1, 2); // 3\n```\n\n> The `_context` parameter contains information about the call to the API method. For the iframe interface, it contains a `message` property that is forwarded from `window.addEventListener` (see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#the_dispatched_event) for more details). `_context` is always the first parameter to API methods (though you will probably seldom use it).\n\n### Callbacks\n\nYou can also pass callbacks to your API methods.\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    subscribe(_context, callback: (iterations: number) => void) {\n      let iterations = 0;\n\n      setInterval(() => {\n        callback(iterations);\n        iterations++;\n      }, 1000);\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconsumer.api.subscribe((iterations: number) => {\n  console.log(`I've been called ${iterations} times.`);\n});\n\n// Output:\n// I've been called 0 times.\n// I've been called 1 times.\n// I've been called 2 times.\n// ...\n```\n\nIf you're interested in diving deeper, check out\n[this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child).\n\n\n## Architecture\n\nAt its core, Transframe is simply an RPC library. What makes it special is its ability to operate in different contexts using different *interfaces*. Under the hood, the iframe interface uses `window.postMessage` and `window.addEventListener('message', ...)`, while the background script interface uses the `Browser.runtime` api. If you wanted to, you could implement another interface to enable Transframe to work in another context. We haven't done it yet, but theoretically we could make a websocket interface 👀.\n\nHere's a high-level diagram for those visual folks:\n\n![High level Transframe diagram](./transframe.png)\n\n## Contexts\n\nHere are different contexts that transframe can operate in. This is a non-exhaustive list, mainly because the iframe interface can be cleverly configured in lots of ways with the `providerWindow` option.\n\nThe following lists will be notated as \"consumer -> provider\".\n\n### Iframe\n\n> All of these can also work in reverse by correctly configuring the `providerWindow` option.\n\n- Iframe -> Parent webpage\n- Nested iframe -> Parent webpage\n- Nested iframe -> Parent iframe\n- Popup -> Popup opener webpage\n- Webpage -> Browser extension content script\n\n### Background script (browser extensions)\n> Due to how this interface was implemented, the background script must always be the provider. Under the hood, it's using [this api](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port#:~:text=Content%20script%20to%20background%20script) (Content Script to Background Script).\n- Content script -> Background script\n\n## Configuring iframe consumers\n\nI mentioned above that the iframe interface can be configured in lots of different contexts using the `providerWindow` option. This is done when creating an iframe consumer.\n\n```typescript\nconst transframeConsumer = createIframeConsumer({\n  providerWindow: window.parent\n});\n```\n\nBy default, it uses `window.top` as the provider window. This means that iframes and nested iframes will communicate with the top-most webpage. With the above code, nested iframes would communicate with the iframe just above it.\n\nHere's a table that shows how to set `providerWindow` for different contexts:\n\n| Context | `providerWindow` |\n| ------- | ---------------- |\n| Iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent iframe | `window.parent` |\n| Popup -> Popup opener webpage | `window.opener` |\n| Webpage -> Browser extension content script | `window` |\n\n## Namespaces\n\nIn a given context, it's possible to have multiple Transframe APIs. To avoid collisions and errors between these APIs, it's a best practice to always specify a namespace.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  namespace: 'my-api'\n});\n\n// consumer\ncreateIframeConsumer({\n  namespace: 'my-api'\n});\n```\n\n## Security\n\nTransframe has a few security features to help you ensure that only the intended consumers and providers are communicating with each other.\n\n### Frame registration (iframe interface)\n\nIf you want to ensure that only certain iframes can use your API, you can use the `strictMode` option when creating an iframe provider and subesquently register frames that will be able to use your api.\n\n```typescript\n// provider\nconst provider = createIframeProvider({\n  api,\n  strictMode: true\n});\n\n// get a reference to the iframe you want to register\nconst iframe = document.getElementById('my-iframe');\n\n// register the iframe\nprovider.registerFrame(iframe);\n```\n\nIn this case, only the iframe with the id \"my-iframe\" will be able to use your API. If any other iframe tries to use it, it will fail.\n\nRegistering frames also causes `_context.fromId` to be defined in calls to your API methods, so you can uniquely identify the iframe that called your API method. Check out [this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child) for a demonstration of this.\n\n### Origin verification (iframe interface)\n\nIf you want to ensure that only iframes from certain origins can use your API, you can use the `allowedOrigins` option when creating an iframe provider.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, only iframes from `https://my-website.com` will be able to use your API. If any other iframe tries to use it, it will fail.\n\nIf you want to ensure that your consumer is not connecting to a malicious provider, you can use the `allowedOrigins` option when creating an iframe consumer.\n\n```typescript\n// consumer\ncreateIframeConsumer({\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, the consumer will only send messages to origins specified in `allowedOrigins`. Under the hood, it's passing the origins you specify to `window.postMessage` (see the [docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#syntax)).\n\n### Content scripts -> Background scripts\n\nDue to how the background script interface was implemented, content scripts will only ever be able to communicate with background scripts in the same extension. So you can be sure that only content scripts that you write will be able to communicate with your background script.","readmeFilename":"README.md","gitHead":"536ebbeaf1a13da015fbdd48454ae69d7c91cf12","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-yxzWv88w98j5Dfdn8nFZwls1dv14JFjBO6/h07pwZq35uUYcZ0ueWIRbbEmMGzF70a8WMroUxPBclgO6T556Nw==","shasum":"0122d68af1ba27f5ff8532b99e71b40b9c58411e","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.3-alpha.2.tgz","fileCount":132,"unpackedSize":206141,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC5xrzNvWCBWHIbNQRK8d5eaewKZtyKCGjnJLC0LNs2RwIhAKBAkGKcnvS91p83ExRnXp4Tf/AF9jGrFvwwP+TSfUxj"}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.3-alpha.2_1710808630879_0.9628656411671024"},"_hasShrinkwrap":false},"0.1.3-alpha.3":{"name":"@trufflehq/transframe","version":"0.1.3-alpha.3","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview":{"import":"./dist/interfaces/react-native-webview/index.mjs","require":"./dist/interfaces/react-native-webview/index.js","types":"./dist/interfaces/react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"dependencies":{"react-native-webview":"^13.8.1"},"_id":"@trufflehq/transframe@0.1.3-alpha.3","readme":"# Transframe\n\nHave you ever needed to implement communication with an iframe? Or maybe you're\nbuilding a browser extension and you need to communicate between your content\nscript and your background script. You probably went on MDN or Stack Overflow\nand found all the different ways of communicating (`window.postMessage`,\n`chrome.runtime.sendMessage`, etc). You probably started using those and came up\nwith some janky method of serializing and deserializing messages that have weird\nand inconsistent structures because you're just trying to get your app to work.\nWhen you're all done, the communication mechanism you built becomes the most\nfragile part of your app.\n\nIf this happened to you, look no further! Transframe has you covered. Transframe\nallows you to easily create cross \"frame\" APIs!\n\n(hence the name \"transframe\")\n\nTruffle uses Transframe as the communication mechansim for the\n[Truffle Extension](https://truffle.vip/extension). If you're not familiar with\nit, you should check it out. It's super cool :p\n\nBefore I bore you with all of the details, let's see how you can get started\nright away.\n\n## Getting started\n\nTo get started, install Transframe with your favorite package manager.\n\n```bash\n$ npm install @trufflehq/transframe\n$ yarn add @trufflehq/transframe\n```\n\nWith every Transframe setup, there are two sides: a _provider_ and and a\n_consumer_. A _provider_ provides an API that a _consumer_ can consume. Let's\ntake a look at how to set this up.\n\nScript in parent page:\n\n```typescript\nimport {\n  createIframeProvider,\n  createIframeApi\n} from \"@trufflehq/transframe/iframe\";\n\ncreateIframeProvider({\n  api: createIframeApi({\n    sayHello() {\n      return \"Hello!\";\n    },\n  }),\n});\n```\n\nNow for the script in the page to be iframed:\n\n```typescript\nimport { createIframeConsumer } from \"@trufflehq/transframe/iframe\";\n\nconst transframeConsumer = createIframeConsumer();\nconst api = transframeConsumer.api;\n\nconst messageFromParent = await api.sayHello();\nconsole.log(\"Message from parent:\", messageFromParent);\n// Output: Message from parent: Hello!\n```\n\nCongrats! You've implemented your first Transframe API and interacted with it.\n\n### Passing args\n\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    sum(_context, a: number, b: number) {\n      return a + b;\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconst onePlusTwo = await consumer.api.sum(1, 2); // 3\n```\n\n> The `_context` parameter contains information about the call to the API method. For the iframe interface, it contains a `message` property that is forwarded from `window.addEventListener` (see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#the_dispatched_event) for more details). `_context` is always the first parameter to API methods (though you will probably seldom use it).\n\n### Callbacks\n\nYou can also pass callbacks to your API methods.\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    subscribe(_context, callback: (iterations: number) => void) {\n      let iterations = 0;\n\n      setInterval(() => {\n        callback(iterations);\n        iterations++;\n      }, 1000);\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconsumer.api.subscribe((iterations: number) => {\n  console.log(`I've been called ${iterations} times.`);\n});\n\n// Output:\n// I've been called 0 times.\n// I've been called 1 times.\n// I've been called 2 times.\n// ...\n```\n\nIf you're interested in diving deeper, check out\n[this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child).\n\n\n## Architecture\n\nAt its core, Transframe is simply an RPC library. What makes it special is its ability to operate in different contexts using different *interfaces*. Under the hood, the iframe interface uses `window.postMessage` and `window.addEventListener('message', ...)`, while the background script interface uses the `Browser.runtime` api. If you wanted to, you could implement another interface to enable Transframe to work in another context. We haven't done it yet, but theoretically we could make a websocket interface 👀.\n\nHere's a high-level diagram for those visual folks:\n\n![High level Transframe diagram](./transframe.png)\n\n## Contexts\n\nHere are different contexts that transframe can operate in. This is a non-exhaustive list, mainly because the iframe interface can be cleverly configured in lots of ways with the `providerWindow` option.\n\nThe following lists will be notated as \"consumer -> provider\".\n\n### Iframe\n\n> All of these can also work in reverse by correctly configuring the `providerWindow` option.\n\n- Iframe -> Parent webpage\n- Nested iframe -> Parent webpage\n- Nested iframe -> Parent iframe\n- Popup -> Popup opener webpage\n- Webpage -> Browser extension content script\n\n### Background script (browser extensions)\n> Due to how this interface was implemented, the background script must always be the provider. Under the hood, it's using [this api](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port#:~:text=Content%20script%20to%20background%20script) (Content Script to Background Script).\n- Content script -> Background script\n\n## Configuring iframe consumers\n\nI mentioned above that the iframe interface can be configured in lots of different contexts using the `providerWindow` option. This is done when creating an iframe consumer.\n\n```typescript\nconst transframeConsumer = createIframeConsumer({\n  providerWindow: window.parent\n});\n```\n\nBy default, it uses `window.top` as the provider window. This means that iframes and nested iframes will communicate with the top-most webpage. With the above code, nested iframes would communicate with the iframe just above it.\n\nHere's a table that shows how to set `providerWindow` for different contexts:\n\n| Context | `providerWindow` |\n| ------- | ---------------- |\n| Iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent iframe | `window.parent` |\n| Popup -> Popup opener webpage | `window.opener` |\n| Webpage -> Browser extension content script | `window` |\n\n## Namespaces\n\nIn a given context, it's possible to have multiple Transframe APIs. To avoid collisions and errors between these APIs, it's a best practice to always specify a namespace.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  namespace: 'my-api'\n});\n\n// consumer\ncreateIframeConsumer({\n  namespace: 'my-api'\n});\n```\n\n## Security\n\nTransframe has a few security features to help you ensure that only the intended consumers and providers are communicating with each other.\n\n### Frame registration (iframe interface)\n\nIf you want to ensure that only certain iframes can use your API, you can use the `strictMode` option when creating an iframe provider and subesquently register frames that will be able to use your api.\n\n```typescript\n// provider\nconst provider = createIframeProvider({\n  api,\n  strictMode: true\n});\n\n// get a reference to the iframe you want to register\nconst iframe = document.getElementById('my-iframe');\n\n// register the iframe\nprovider.registerFrame(iframe);\n```\n\nIn this case, only the iframe with the id \"my-iframe\" will be able to use your API. If any other iframe tries to use it, it will fail.\n\nRegistering frames also causes `_context.fromId` to be defined in calls to your API methods, so you can uniquely identify the iframe that called your API method. Check out [this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child) for a demonstration of this.\n\n### Origin verification (iframe interface)\n\nIf you want to ensure that only iframes from certain origins can use your API, you can use the `allowedOrigins` option when creating an iframe provider.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, only iframes from `https://my-website.com` will be able to use your API. If any other iframe tries to use it, it will fail.\n\nIf you want to ensure that your consumer is not connecting to a malicious provider, you can use the `allowedOrigins` option when creating an iframe consumer.\n\n```typescript\n// consumer\ncreateIframeConsumer({\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, the consumer will only send messages to origins specified in `allowedOrigins`. Under the hood, it's passing the origins you specify to `window.postMessage` (see the [docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#syntax)).\n\n### Content scripts -> Background scripts\n\nDue to how the background script interface was implemented, content scripts will only ever be able to communicate with background scripts in the same extension. So you can be sure that only content scripts that you write will be able to communicate with your background script.","readmeFilename":"README.md","gitHead":"536ebbeaf1a13da015fbdd48454ae69d7c91cf12","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-FfOiIObOW5lsdFaswqwp/wXaVQ/nxm8tMtEwTqPHEyg61NtgMXJfztWptMMMnxhU64/cfOfs20wYM+bTlxWdHQ==","shasum":"ec2a42083bd52680cffddd39c259181735f627d7","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.3-alpha.3.tgz","fileCount":132,"unpackedSize":205863,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFlgn5VphPgwb7K9Ww1BQoLmCU1L0PYEEselAA8Tu1OLAiAHsnskNcDmMtrCPdSWrvx6UqTy79vQdgaiTVlaFRnNuQ=="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.3-alpha.3_1710809157667_0.8290192268700769"},"_hasShrinkwrap":false},"0.1.3-alpha.4":{"name":"@trufflehq/transframe","version":"0.1.3-alpha.4","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview":{"import":"./dist/interfaces/react-native-webview/index.mjs","require":"./dist/interfaces/react-native-webview/index.js","types":"./dist/interfaces/react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"dependencies":{"react-native-webview":"^13.8.1"},"_id":"@trufflehq/transframe@0.1.3-alpha.4","readme":"# Transframe\n\nHave you ever needed to implement communication with an iframe? Or maybe you're\nbuilding a browser extension and you need to communicate between your content\nscript and your background script. You probably went on MDN or Stack Overflow\nand found all the different ways of communicating (`window.postMessage`,\n`chrome.runtime.sendMessage`, etc). You probably started using those and came up\nwith some janky method of serializing and deserializing messages that have weird\nand inconsistent structures because you're just trying to get your app to work.\nWhen you're all done, the communication mechanism you built becomes the most\nfragile part of your app.\n\nIf this happened to you, look no further! Transframe has you covered. Transframe\nallows you to easily create cross \"frame\" APIs!\n\n(hence the name \"transframe\")\n\nTruffle uses Transframe as the communication mechansim for the\n[Truffle Extension](https://truffle.vip/extension). If you're not familiar with\nit, you should check it out. It's super cool :p\n\nBefore I bore you with all of the details, let's see how you can get started\nright away.\n\n## Getting started\n\nTo get started, install Transframe with your favorite package manager.\n\n```bash\n$ npm install @trufflehq/transframe\n$ yarn add @trufflehq/transframe\n```\n\nWith every Transframe setup, there are two sides: a _provider_ and and a\n_consumer_. A _provider_ provides an API that a _consumer_ can consume. Let's\ntake a look at how to set this up.\n\nScript in parent page:\n\n```typescript\nimport {\n  createIframeProvider,\n  createIframeApi\n} from \"@trufflehq/transframe/iframe\";\n\ncreateIframeProvider({\n  api: createIframeApi({\n    sayHello() {\n      return \"Hello!\";\n    },\n  }),\n});\n```\n\nNow for the script in the page to be iframed:\n\n```typescript\nimport { createIframeConsumer } from \"@trufflehq/transframe/iframe\";\n\nconst transframeConsumer = createIframeConsumer();\nconst api = transframeConsumer.api;\n\nconst messageFromParent = await api.sayHello();\nconsole.log(\"Message from parent:\", messageFromParent);\n// Output: Message from parent: Hello!\n```\n\nCongrats! You've implemented your first Transframe API and interacted with it.\n\n### Passing args\n\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    sum(_context, a: number, b: number) {\n      return a + b;\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconst onePlusTwo = await consumer.api.sum(1, 2); // 3\n```\n\n> The `_context` parameter contains information about the call to the API method. For the iframe interface, it contains a `message` property that is forwarded from `window.addEventListener` (see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#the_dispatched_event) for more details). `_context` is always the first parameter to API methods (though you will probably seldom use it).\n\n### Callbacks\n\nYou can also pass callbacks to your API methods.\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    subscribe(_context, callback: (iterations: number) => void) {\n      let iterations = 0;\n\n      setInterval(() => {\n        callback(iterations);\n        iterations++;\n      }, 1000);\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconsumer.api.subscribe((iterations: number) => {\n  console.log(`I've been called ${iterations} times.`);\n});\n\n// Output:\n// I've been called 0 times.\n// I've been called 1 times.\n// I've been called 2 times.\n// ...\n```\n\nIf you're interested in diving deeper, check out\n[this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child).\n\n\n## Architecture\n\nAt its core, Transframe is simply an RPC library. What makes it special is its ability to operate in different contexts using different *interfaces*. Under the hood, the iframe interface uses `window.postMessage` and `window.addEventListener('message', ...)`, while the background script interface uses the `Browser.runtime` api. If you wanted to, you could implement another interface to enable Transframe to work in another context. We haven't done it yet, but theoretically we could make a websocket interface 👀.\n\nHere's a high-level diagram for those visual folks:\n\n![High level Transframe diagram](./transframe.png)\n\n## Contexts\n\nHere are different contexts that transframe can operate in. This is a non-exhaustive list, mainly because the iframe interface can be cleverly configured in lots of ways with the `providerWindow` option.\n\nThe following lists will be notated as \"consumer -> provider\".\n\n### Iframe\n\n> All of these can also work in reverse by correctly configuring the `providerWindow` option.\n\n- Iframe -> Parent webpage\n- Nested iframe -> Parent webpage\n- Nested iframe -> Parent iframe\n- Popup -> Popup opener webpage\n- Webpage -> Browser extension content script\n\n### Background script (browser extensions)\n> Due to how this interface was implemented, the background script must always be the provider. Under the hood, it's using [this api](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port#:~:text=Content%20script%20to%20background%20script) (Content Script to Background Script).\n- Content script -> Background script\n\n## Configuring iframe consumers\n\nI mentioned above that the iframe interface can be configured in lots of different contexts using the `providerWindow` option. This is done when creating an iframe consumer.\n\n```typescript\nconst transframeConsumer = createIframeConsumer({\n  providerWindow: window.parent\n});\n```\n\nBy default, it uses `window.top` as the provider window. This means that iframes and nested iframes will communicate with the top-most webpage. With the above code, nested iframes would communicate with the iframe just above it.\n\nHere's a table that shows how to set `providerWindow` for different contexts:\n\n| Context | `providerWindow` |\n| ------- | ---------------- |\n| Iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent iframe | `window.parent` |\n| Popup -> Popup opener webpage | `window.opener` |\n| Webpage -> Browser extension content script | `window` |\n\n## Namespaces\n\nIn a given context, it's possible to have multiple Transframe APIs. To avoid collisions and errors between these APIs, it's a best practice to always specify a namespace.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  namespace: 'my-api'\n});\n\n// consumer\ncreateIframeConsumer({\n  namespace: 'my-api'\n});\n```\n\n## Security\n\nTransframe has a few security features to help you ensure that only the intended consumers and providers are communicating with each other.\n\n### Frame registration (iframe interface)\n\nIf you want to ensure that only certain iframes can use your API, you can use the `strictMode` option when creating an iframe provider and subesquently register frames that will be able to use your api.\n\n```typescript\n// provider\nconst provider = createIframeProvider({\n  api,\n  strictMode: true\n});\n\n// get a reference to the iframe you want to register\nconst iframe = document.getElementById('my-iframe');\n\n// register the iframe\nprovider.registerFrame(iframe);\n```\n\nIn this case, only the iframe with the id \"my-iframe\" will be able to use your API. If any other iframe tries to use it, it will fail.\n\nRegistering frames also causes `_context.fromId` to be defined in calls to your API methods, so you can uniquely identify the iframe that called your API method. Check out [this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child) for a demonstration of this.\n\n### Origin verification (iframe interface)\n\nIf you want to ensure that only iframes from certain origins can use your API, you can use the `allowedOrigins` option when creating an iframe provider.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, only iframes from `https://my-website.com` will be able to use your API. If any other iframe tries to use it, it will fail.\n\nIf you want to ensure that your consumer is not connecting to a malicious provider, you can use the `allowedOrigins` option when creating an iframe consumer.\n\n```typescript\n// consumer\ncreateIframeConsumer({\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, the consumer will only send messages to origins specified in `allowedOrigins`. Under the hood, it's passing the origins you specify to `window.postMessage` (see the [docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#syntax)).\n\n### Content scripts -> Background scripts\n\nDue to how the background script interface was implemented, content scripts will only ever be able to communicate with background scripts in the same extension. So you can be sure that only content scripts that you write will be able to communicate with your background script.","readmeFilename":"README.md","gitHead":"536ebbeaf1a13da015fbdd48454ae69d7c91cf12","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-9eDLLyz11pCptGdJZO0+seXxxLpeZxpTB2U0r+GhcnBJ8Zq3suT+Va+lJn1wwb9w8uD+ECEm2qSbW0nyDCZWAw==","shasum":"397e5553ef6e31100a9af99958ae6838dae4581b","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.3-alpha.4.tgz","fileCount":132,"unpackedSize":205863,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGvZK8rXxhlTKby1jZRUpBJkMi9ijmnPYUJ/lA7t9lGkAiA7AGwB+gmGq1YfIgGnaOms5EUAvvENVEJWkopFfz5dmw=="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.3-alpha.4_1710817550751_0.6493231144835869"},"_hasShrinkwrap":false},"0.1.3-alpha.5":{"name":"@trufflehq/transframe","version":"0.1.3-alpha.5","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview":{"import":"./dist/interfaces/react-native-webview/index.mjs","require":"./dist/interfaces/react-native-webview/index.js","types":"./dist/interfaces/react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"webextension-polyfill":{"optional":true}},"dependencies":{"react-native-webview":"^13.8.1"},"_id":"@trufflehq/transframe@0.1.3-alpha.5","readme":"# Transframe\n\nHave you ever needed to implement communication with an iframe? Or maybe you're\nbuilding a browser extension and you need to communicate between your content\nscript and your background script. You probably went on MDN or Stack Overflow\nand found all the different ways of communicating (`window.postMessage`,\n`chrome.runtime.sendMessage`, etc). You probably started using those and came up\nwith some janky method of serializing and deserializing messages that have weird\nand inconsistent structures because you're just trying to get your app to work.\nWhen you're all done, the communication mechanism you built becomes the most\nfragile part of your app.\n\nIf this happened to you, look no further! Transframe has you covered. Transframe\nallows you to easily create cross \"frame\" APIs!\n\n(hence the name \"transframe\")\n\nTruffle uses Transframe as the communication mechansim for the\n[Truffle Extension](https://truffle.vip/extension). If you're not familiar with\nit, you should check it out. It's super cool :p\n\nBefore I bore you with all of the details, let's see how you can get started\nright away.\n\n## Getting started\n\nTo get started, install Transframe with your favorite package manager.\n\n```bash\n$ npm install @trufflehq/transframe\n$ yarn add @trufflehq/transframe\n```\n\nWith every Transframe setup, there are two sides: a _provider_ and and a\n_consumer_. A _provider_ provides an API that a _consumer_ can consume. Let's\ntake a look at how to set this up.\n\nScript in parent page:\n\n```typescript\nimport {\n  createIframeProvider,\n  createIframeApi\n} from \"@trufflehq/transframe/iframe\";\n\ncreateIframeProvider({\n  api: createIframeApi({\n    sayHello() {\n      return \"Hello!\";\n    },\n  }),\n});\n```\n\nNow for the script in the page to be iframed:\n\n```typescript\nimport { createIframeConsumer } from \"@trufflehq/transframe/iframe\";\n\nconst transframeConsumer = createIframeConsumer();\nconst api = transframeConsumer.api;\n\nconst messageFromParent = await api.sayHello();\nconsole.log(\"Message from parent:\", messageFromParent);\n// Output: Message from parent: Hello!\n```\n\nCongrats! You've implemented your first Transframe API and interacted with it.\n\n### Passing args\n\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    sum(_context, a: number, b: number) {\n      return a + b;\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconst onePlusTwo = await consumer.api.sum(1, 2); // 3\n```\n\n> The `_context` parameter contains information about the call to the API method. For the iframe interface, it contains a `message` property that is forwarded from `window.addEventListener` (see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#the_dispatched_event) for more details). `_context` is always the first parameter to API methods (though you will probably seldom use it).\n\n### Callbacks\n\nYou can also pass callbacks to your API methods.\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    subscribe(_context, callback: (iterations: number) => void) {\n      let iterations = 0;\n\n      setInterval(() => {\n        callback(iterations);\n        iterations++;\n      }, 1000);\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconsumer.api.subscribe((iterations: number) => {\n  console.log(`I've been called ${iterations} times.`);\n});\n\n// Output:\n// I've been called 0 times.\n// I've been called 1 times.\n// I've been called 2 times.\n// ...\n```\n\nIf you're interested in diving deeper, check out\n[this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child).\n\n\n## Architecture\n\nAt its core, Transframe is simply an RPC library. What makes it special is its ability to operate in different contexts using different *interfaces*. Under the hood, the iframe interface uses `window.postMessage` and `window.addEventListener('message', ...)`, while the background script interface uses the `Browser.runtime` api. If you wanted to, you could implement another interface to enable Transframe to work in another context. We haven't done it yet, but theoretically we could make a websocket interface 👀.\n\nHere's a high-level diagram for those visual folks:\n\n![High level Transframe diagram](./transframe.png)\n\n## Contexts\n\nHere are different contexts that transframe can operate in. This is a non-exhaustive list, mainly because the iframe interface can be cleverly configured in lots of ways with the `providerWindow` option.\n\nThe following lists will be notated as \"consumer -> provider\".\n\n### Iframe\n\n> All of these can also work in reverse by correctly configuring the `providerWindow` option.\n\n- Iframe -> Parent webpage\n- Nested iframe -> Parent webpage\n- Nested iframe -> Parent iframe\n- Popup -> Popup opener webpage\n- Webpage -> Browser extension content script\n\n### Background script (browser extensions)\n> Due to how this interface was implemented, the background script must always be the provider. Under the hood, it's using [this api](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port#:~:text=Content%20script%20to%20background%20script) (Content Script to Background Script).\n- Content script -> Background script\n\n## Configuring iframe consumers\n\nI mentioned above that the iframe interface can be configured in lots of different contexts using the `providerWindow` option. This is done when creating an iframe consumer.\n\n```typescript\nconst transframeConsumer = createIframeConsumer({\n  providerWindow: window.parent\n});\n```\n\nBy default, it uses `window.top` as the provider window. This means that iframes and nested iframes will communicate with the top-most webpage. With the above code, nested iframes would communicate with the iframe just above it.\n\nHere's a table that shows how to set `providerWindow` for different contexts:\n\n| Context | `providerWindow` |\n| ------- | ---------------- |\n| Iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent iframe | `window.parent` |\n| Popup -> Popup opener webpage | `window.opener` |\n| Webpage -> Browser extension content script | `window` |\n\n## Namespaces\n\nIn a given context, it's possible to have multiple Transframe APIs. To avoid collisions and errors between these APIs, it's a best practice to always specify a namespace.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  namespace: 'my-api'\n});\n\n// consumer\ncreateIframeConsumer({\n  namespace: 'my-api'\n});\n```\n\n## Security\n\nTransframe has a few security features to help you ensure that only the intended consumers and providers are communicating with each other.\n\n### Frame registration (iframe interface)\n\nIf you want to ensure that only certain iframes can use your API, you can use the `strictMode` option when creating an iframe provider and subesquently register frames that will be able to use your api.\n\n```typescript\n// provider\nconst provider = createIframeProvider({\n  api,\n  strictMode: true\n});\n\n// get a reference to the iframe you want to register\nconst iframe = document.getElementById('my-iframe');\n\n// register the iframe\nprovider.registerFrame(iframe);\n```\n\nIn this case, only the iframe with the id \"my-iframe\" will be able to use your API. If any other iframe tries to use it, it will fail.\n\nRegistering frames also causes `_context.fromId` to be defined in calls to your API methods, so you can uniquely identify the iframe that called your API method. Check out [this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child) for a demonstration of this.\n\n### Origin verification (iframe interface)\n\nIf you want to ensure that only iframes from certain origins can use your API, you can use the `allowedOrigins` option when creating an iframe provider.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, only iframes from `https://my-website.com` will be able to use your API. If any other iframe tries to use it, it will fail.\n\nIf you want to ensure that your consumer is not connecting to a malicious provider, you can use the `allowedOrigins` option when creating an iframe consumer.\n\n```typescript\n// consumer\ncreateIframeConsumer({\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, the consumer will only send messages to origins specified in `allowedOrigins`. Under the hood, it's passing the origins you specify to `window.postMessage` (see the [docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#syntax)).\n\n### Content scripts -> Background scripts\n\nDue to how the background script interface was implemented, content scripts will only ever be able to communicate with background scripts in the same extension. So you can be sure that only content scripts that you write will be able to communicate with your background script.","readmeFilename":"README.md","gitHead":"536ebbeaf1a13da015fbdd48454ae69d7c91cf12","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-0vQCmDVHOiKYIyZMME6vot8I5z1xsaWB89IMlit9K8dLIoMbPCjWbtjsnG/SsoNZazoW2PAfG1YHOeErvLwwOw==","shasum":"d27f499fd4ccd9e53195005181a65b610a34d859","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.3-alpha.5.tgz","fileCount":132,"unpackedSize":206877,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCARSr4q1h20A+kye8puVTFox+knGHdSs//uBKHU91ppQIgXgu8IJXBkc1lVs18deDJTXO23rNyqqnBXwj3qFpg8Us="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.3-alpha.5_1710818789728_0.40455214412158513"},"_hasShrinkwrap":false},"0.1.3-alpha.6":{"name":"@trufflehq/transframe","version":"0.1.3-alpha.6","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview":{"import":"./dist/interfaces/react-native-webview/index.mjs","require":"./dist/interfaces/react-native-webview/index.js","types":"./dist/interfaces/react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","@types/react":"^18.0.0","react-native-webview":"^13.8.1","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"react":"^18.0.0","react-native-webview":"^13.8.1","webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-webview":{"optional":true},"webextension-polyfill":{"optional":true}},"_id":"@trufflehq/transframe@0.1.3-alpha.6","readme":"# Transframe\n\nHave you ever needed to implement communication with an iframe? Or maybe you're\nbuilding a browser extension and you need to communicate between your content\nscript and your background script. You probably went on MDN or Stack Overflow\nand found all the different ways of communicating (`window.postMessage`,\n`chrome.runtime.sendMessage`, etc). You probably started using those and came up\nwith some janky method of serializing and deserializing messages that have weird\nand inconsistent structures because you're just trying to get your app to work.\nWhen you're all done, the communication mechanism you built becomes the most\nfragile part of your app.\n\nIf this happened to you, look no further! Transframe has you covered. Transframe\nallows you to easily create cross \"frame\" APIs!\n\n(hence the name \"transframe\")\n\nTruffle uses Transframe as the communication mechansim for the\n[Truffle Extension](https://truffle.vip/extension). If you're not familiar with\nit, you should check it out. It's super cool :p\n\nBefore I bore you with all of the details, let's see how you can get started\nright away.\n\n## Getting started\n\nTo get started, install Transframe with your favorite package manager.\n\n```bash\n$ npm install @trufflehq/transframe\n$ yarn add @trufflehq/transframe\n```\n\nWith every Transframe setup, there are two sides: a _provider_ and and a\n_consumer_. A _provider_ provides an API that a _consumer_ can consume. Let's\ntake a look at how to set this up.\n\nScript in parent page:\n\n```typescript\nimport {\n  createIframeProvider,\n  createIframeApi\n} from \"@trufflehq/transframe/iframe\";\n\ncreateIframeProvider({\n  api: createIframeApi({\n    sayHello() {\n      return \"Hello!\";\n    },\n  }),\n});\n```\n\nNow for the script in the page to be iframed:\n\n```typescript\nimport { createIframeConsumer } from \"@trufflehq/transframe/iframe\";\n\nconst transframeConsumer = createIframeConsumer();\nconst api = transframeConsumer.api;\n\nconst messageFromParent = await api.sayHello();\nconsole.log(\"Message from parent:\", messageFromParent);\n// Output: Message from parent: Hello!\n```\n\nCongrats! You've implemented your first Transframe API and interacted with it.\n\n### Passing args\n\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    sum(_context, a: number, b: number) {\n      return a + b;\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconst onePlusTwo = await consumer.api.sum(1, 2); // 3\n```\n\n> The `_context` parameter contains information about the call to the API method. For the iframe interface, it contains a `message` property that is forwarded from `window.addEventListener` (see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#the_dispatched_event) for more details). `_context` is always the first parameter to API methods (though you will probably seldom use it).\n\n### Callbacks\n\nYou can also pass callbacks to your API methods.\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    subscribe(_context, callback: (iterations: number) => void) {\n      let iterations = 0;\n\n      setInterval(() => {\n        callback(iterations);\n        iterations++;\n      }, 1000);\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconsumer.api.subscribe((iterations: number) => {\n  console.log(`I've been called ${iterations} times.`);\n});\n\n// Output:\n// I've been called 0 times.\n// I've been called 1 times.\n// I've been called 2 times.\n// ...\n```\n\nIf you're interested in diving deeper, check out\n[this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child).\n\n\n## Architecture\n\nAt its core, Transframe is simply an RPC library. What makes it special is its ability to operate in different contexts using different *interfaces*. Under the hood, the iframe interface uses `window.postMessage` and `window.addEventListener('message', ...)`, while the background script interface uses the `Browser.runtime` api. If you wanted to, you could implement another interface to enable Transframe to work in another context. We haven't done it yet, but theoretically we could make a websocket interface 👀.\n\nHere's a high-level diagram for those visual folks:\n\n![High level Transframe diagram](./transframe.png)\n\n## Contexts\n\nHere are different contexts that transframe can operate in. This is a non-exhaustive list, mainly because the iframe interface can be cleverly configured in lots of ways with the `providerWindow` option.\n\nThe following lists will be notated as \"consumer -> provider\".\n\n### Iframe\n\n> All of these can also work in reverse by correctly configuring the `providerWindow` option.\n\n- Iframe -> Parent webpage\n- Nested iframe -> Parent webpage\n- Nested iframe -> Parent iframe\n- Popup -> Popup opener webpage\n- Webpage -> Browser extension content script\n\n### Background script (browser extensions)\n> Due to how this interface was implemented, the background script must always be the provider. Under the hood, it's using [this api](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port#:~:text=Content%20script%20to%20background%20script) (Content Script to Background Script).\n- Content script -> Background script\n\n## Configuring iframe consumers\n\nI mentioned above that the iframe interface can be configured in lots of different contexts using the `providerWindow` option. This is done when creating an iframe consumer.\n\n```typescript\nconst transframeConsumer = createIframeConsumer({\n  providerWindow: window.parent\n});\n```\n\nBy default, it uses `window.top` as the provider window. This means that iframes and nested iframes will communicate with the top-most webpage. With the above code, nested iframes would communicate with the iframe just above it.\n\nHere's a table that shows how to set `providerWindow` for different contexts:\n\n| Context | `providerWindow` |\n| ------- | ---------------- |\n| Iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent iframe | `window.parent` |\n| Popup -> Popup opener webpage | `window.opener` |\n| Webpage -> Browser extension content script | `window` |\n\n## Namespaces\n\nIn a given context, it's possible to have multiple Transframe APIs. To avoid collisions and errors between these APIs, it's a best practice to always specify a namespace.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  namespace: 'my-api'\n});\n\n// consumer\ncreateIframeConsumer({\n  namespace: 'my-api'\n});\n```\n\n## Security\n\nTransframe has a few security features to help you ensure that only the intended consumers and providers are communicating with each other.\n\n### Frame registration (iframe interface)\n\nIf you want to ensure that only certain iframes can use your API, you can use the `strictMode` option when creating an iframe provider and subesquently register frames that will be able to use your api.\n\n```typescript\n// provider\nconst provider = createIframeProvider({\n  api,\n  strictMode: true\n});\n\n// get a reference to the iframe you want to register\nconst iframe = document.getElementById('my-iframe');\n\n// register the iframe\nprovider.registerFrame(iframe);\n```\n\nIn this case, only the iframe with the id \"my-iframe\" will be able to use your API. If any other iframe tries to use it, it will fail.\n\nRegistering frames also causes `_context.fromId` to be defined in calls to your API methods, so you can uniquely identify the iframe that called your API method. Check out [this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child) for a demonstration of this.\n\n### Origin verification (iframe interface)\n\nIf you want to ensure that only iframes from certain origins can use your API, you can use the `allowedOrigins` option when creating an iframe provider.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, only iframes from `https://my-website.com` will be able to use your API. If any other iframe tries to use it, it will fail.\n\nIf you want to ensure that your consumer is not connecting to a malicious provider, you can use the `allowedOrigins` option when creating an iframe consumer.\n\n```typescript\n// consumer\ncreateIframeConsumer({\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, the consumer will only send messages to origins specified in `allowedOrigins`. Under the hood, it's passing the origins you specify to `window.postMessage` (see the [docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#syntax)).\n\n### Content scripts -> Background scripts\n\nDue to how the background script interface was implemented, content scripts will only ever be able to communicate with background scripts in the same extension. So you can be sure that only content scripts that you write will be able to communicate with your background script.","readmeFilename":"README.md","gitHead":"536ebbeaf1a13da015fbdd48454ae69d7c91cf12","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-Y97h90PVEFJ48esj22un4MgYn0g19ZmSRndc6l62Kj7Vgnn7jU/LVHkC+krrSdRkevra8szfwgCWrKW3H7uCrQ==","shasum":"a5f800d625f2c402586baf208f6b99e9a4676da4","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.3-alpha.6.tgz","fileCount":132,"unpackedSize":206438,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAk8/oIaxe2s1CrrT4LoQebeRlQZNA17fkyKLxWK1AVEAiABRXmBb5PEzXSOzz1eUmcqpGi8kdyXXnwjX6Tv5mC39Q=="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.3-alpha.6_1710822583305_0.5797898158255432"},"_hasShrinkwrap":false},"0.1.3-alpha.7":{"name":"@trufflehq/transframe","version":"0.1.3-alpha.7","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview":{"import":"./dist/interfaces/react-native-webview/index.mjs","require":"./dist/interfaces/react-native-webview/index.js","types":"./dist/interfaces/react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","@types/react":"^18.0.0","react-native-webview":"^13.8.1","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"react":"^18.0.0","react-native-webview":"^13.8.1","webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-webview":{"optional":true},"webextension-polyfill":{"optional":true}},"_id":"@trufflehq/transframe@0.1.3-alpha.7","readme":"# Transframe\n\nHave you ever needed to implement communication with an iframe? Or maybe you're\nbuilding a browser extension and you need to communicate between your content\nscript and your background script. You probably went on MDN or Stack Overflow\nand found all the different ways of communicating (`window.postMessage`,\n`chrome.runtime.sendMessage`, etc). You probably started using those and came up\nwith some janky method of serializing and deserializing messages that have weird\nand inconsistent structures because you're just trying to get your app to work.\nWhen you're all done, the communication mechanism you built becomes the most\nfragile part of your app.\n\nIf this happened to you, look no further! Transframe has you covered. Transframe\nallows you to easily create cross \"frame\" APIs!\n\n(hence the name \"transframe\")\n\nTruffle uses Transframe as the communication mechansim for the\n[Truffle Extension](https://truffle.vip/extension). If you're not familiar with\nit, you should check it out. It's super cool :p\n\nBefore I bore you with all of the details, let's see how you can get started\nright away.\n\n## Getting started\n\nTo get started, install Transframe with your favorite package manager.\n\n```bash\n$ npm install @trufflehq/transframe\n$ yarn add @trufflehq/transframe\n```\n\nWith every Transframe setup, there are two sides: a _provider_ and and a\n_consumer_. A _provider_ provides an API that a _consumer_ can consume. Let's\ntake a look at how to set this up.\n\nScript in parent page:\n\n```typescript\nimport {\n  createIframeProvider,\n  createIframeApi\n} from \"@trufflehq/transframe/iframe\";\n\ncreateIframeProvider({\n  api: createIframeApi({\n    sayHello() {\n      return \"Hello!\";\n    },\n  }),\n});\n```\n\nNow for the script in the page to be iframed:\n\n```typescript\nimport { createIframeConsumer } from \"@trufflehq/transframe/iframe\";\n\nconst transframeConsumer = createIframeConsumer();\nconst api = transframeConsumer.api;\n\nconst messageFromParent = await api.sayHello();\nconsole.log(\"Message from parent:\", messageFromParent);\n// Output: Message from parent: Hello!\n```\n\nCongrats! You've implemented your first Transframe API and interacted with it.\n\n### Passing args\n\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    sum(_context, a: number, b: number) {\n      return a + b;\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconst onePlusTwo = await consumer.api.sum(1, 2); // 3\n```\n\n> The `_context` parameter contains information about the call to the API method. For the iframe interface, it contains a `message` property that is forwarded from `window.addEventListener` (see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#the_dispatched_event) for more details). `_context` is always the first parameter to API methods (though you will probably seldom use it).\n\n### Callbacks\n\nYou can also pass callbacks to your API methods.\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    subscribe(_context, callback: (iterations: number) => void) {\n      let iterations = 0;\n\n      setInterval(() => {\n        callback(iterations);\n        iterations++;\n      }, 1000);\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconsumer.api.subscribe((iterations: number) => {\n  console.log(`I've been called ${iterations} times.`);\n});\n\n// Output:\n// I've been called 0 times.\n// I've been called 1 times.\n// I've been called 2 times.\n// ...\n```\n\nIf you're interested in diving deeper, check out\n[this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child).\n\n\n## Architecture\n\nAt its core, Transframe is simply an RPC library. What makes it special is its ability to operate in different contexts using different *interfaces*. Under the hood, the iframe interface uses `window.postMessage` and `window.addEventListener('message', ...)`, while the background script interface uses the `Browser.runtime` api. If you wanted to, you could implement another interface to enable Transframe to work in another context. We haven't done it yet, but theoretically we could make a websocket interface 👀.\n\nHere's a high-level diagram for those visual folks:\n\n![High level Transframe diagram](./transframe.png)\n\n## Contexts\n\nHere are different contexts that transframe can operate in. This is a non-exhaustive list, mainly because the iframe interface can be cleverly configured in lots of ways with the `providerWindow` option.\n\nThe following lists will be notated as \"consumer -> provider\".\n\n### Iframe\n\n> All of these can also work in reverse by correctly configuring the `providerWindow` option.\n\n- Iframe -> Parent webpage\n- Nested iframe -> Parent webpage\n- Nested iframe -> Parent iframe\n- Popup -> Popup opener webpage\n- Webpage -> Browser extension content script\n\n### Background script (browser extensions)\n> Due to how this interface was implemented, the background script must always be the provider. Under the hood, it's using [this api](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port#:~:text=Content%20script%20to%20background%20script) (Content Script to Background Script).\n- Content script -> Background script\n\n## Configuring iframe consumers\n\nI mentioned above that the iframe interface can be configured in lots of different contexts using the `providerWindow` option. This is done when creating an iframe consumer.\n\n```typescript\nconst transframeConsumer = createIframeConsumer({\n  providerWindow: window.parent\n});\n```\n\nBy default, it uses `window.top` as the provider window. This means that iframes and nested iframes will communicate with the top-most webpage. With the above code, nested iframes would communicate with the iframe just above it.\n\nHere's a table that shows how to set `providerWindow` for different contexts:\n\n| Context | `providerWindow` |\n| ------- | ---------------- |\n| Iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent iframe | `window.parent` |\n| Popup -> Popup opener webpage | `window.opener` |\n| Webpage -> Browser extension content script | `window` |\n\n## Namespaces\n\nIn a given context, it's possible to have multiple Transframe APIs. To avoid collisions and errors between these APIs, it's a best practice to always specify a namespace.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  namespace: 'my-api'\n});\n\n// consumer\ncreateIframeConsumer({\n  namespace: 'my-api'\n});\n```\n\n## Security\n\nTransframe has a few security features to help you ensure that only the intended consumers and providers are communicating with each other.\n\n### Frame registration (iframe interface)\n\nIf you want to ensure that only certain iframes can use your API, you can use the `strictMode` option when creating an iframe provider and subesquently register frames that will be able to use your api.\n\n```typescript\n// provider\nconst provider = createIframeProvider({\n  api,\n  strictMode: true\n});\n\n// get a reference to the iframe you want to register\nconst iframe = document.getElementById('my-iframe');\n\n// register the iframe\nprovider.registerFrame(iframe);\n```\n\nIn this case, only the iframe with the id \"my-iframe\" will be able to use your API. If any other iframe tries to use it, it will fail.\n\nRegistering frames also causes `_context.fromId` to be defined in calls to your API methods, so you can uniquely identify the iframe that called your API method. Check out [this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child) for a demonstration of this.\n\n### Origin verification (iframe interface)\n\nIf you want to ensure that only iframes from certain origins can use your API, you can use the `allowedOrigins` option when creating an iframe provider.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, only iframes from `https://my-website.com` will be able to use your API. If any other iframe tries to use it, it will fail.\n\nIf you want to ensure that your consumer is not connecting to a malicious provider, you can use the `allowedOrigins` option when creating an iframe consumer.\n\n```typescript\n// consumer\ncreateIframeConsumer({\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, the consumer will only send messages to origins specified in `allowedOrigins`. Under the hood, it's passing the origins you specify to `window.postMessage` (see the [docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#syntax)).\n\n### Content scripts -> Background scripts\n\nDue to how the background script interface was implemented, content scripts will only ever be able to communicate with background scripts in the same extension. So you can be sure that only content scripts that you write will be able to communicate with your background script.","readmeFilename":"README.md","gitHead":"536ebbeaf1a13da015fbdd48454ae69d7c91cf12","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-UhFW6D+2mveZkwYKjVPoJMGe+NH3RGgBmntPjcTXJbPxrH+TgyUCszFNuj/14ySTCbyscec/Sc7LDQfhcrVqWA==","shasum":"817b20e300b4450eedc504f13e4c8e9bf643c421","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.3-alpha.7.tgz","fileCount":132,"unpackedSize":206438,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDJaa5xUBzjfHb8BzonDJ/lAJF2U5W3zuEsao587AuH5gIgBK2c7MPUAFCAvEsGjE0EAlffy1BZcn3N0hz/FrjUe1g="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.3-alpha.7_1710823330747_0.22120755400137648"},"_hasShrinkwrap":false},"0.1.3-alpha.8":{"name":"@trufflehq/transframe","version":"0.1.3-alpha.8","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview":{"import":"./dist/interfaces/react-native-webview/index.mjs","require":"./dist/interfaces/react-native-webview/index.js","types":"./dist/interfaces/react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","@types/react":"^18.0.0","react-native-webview":"^13.8.1","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"react":"^18.0.0","react-native-webview":"^13.8.1","webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-webview":{"optional":true},"webextension-polyfill":{"optional":true}},"_id":"@trufflehq/transframe@0.1.3-alpha.8","readme":"# Transframe\n\nHave you ever needed to implement communication with an iframe? Or maybe you're\nbuilding a browser extension and you need to communicate between your content\nscript and your background script. You probably went on MDN or Stack Overflow\nand found all the different ways of communicating (`window.postMessage`,\n`chrome.runtime.sendMessage`, etc). You probably started using those and came up\nwith some janky method of serializing and deserializing messages that have weird\nand inconsistent structures because you're just trying to get your app to work.\nWhen you're all done, the communication mechanism you built becomes the most\nfragile part of your app.\n\nIf this happened to you, look no further! Transframe has you covered. Transframe\nallows you to easily create cross \"frame\" APIs!\n\n(hence the name \"transframe\")\n\nTruffle uses Transframe as the communication mechansim for the\n[Truffle Extension](https://truffle.vip/extension). If you're not familiar with\nit, you should check it out. It's super cool :p\n\nBefore I bore you with all of the details, let's see how you can get started\nright away.\n\n## Getting started\n\nTo get started, install Transframe with your favorite package manager.\n\n```bash\n$ npm install @trufflehq/transframe\n$ yarn add @trufflehq/transframe\n```\n\nWith every Transframe setup, there are two sides: a _provider_ and and a\n_consumer_. A _provider_ provides an API that a _consumer_ can consume. Let's\ntake a look at how to set this up.\n\nScript in parent page:\n\n```typescript\nimport {\n  createIframeProvider,\n  createIframeApi\n} from \"@trufflehq/transframe/iframe\";\n\ncreateIframeProvider({\n  api: createIframeApi({\n    sayHello() {\n      return \"Hello!\";\n    },\n  }),\n});\n```\n\nNow for the script in the page to be iframed:\n\n```typescript\nimport { createIframeConsumer } from \"@trufflehq/transframe/iframe\";\n\nconst transframeConsumer = createIframeConsumer();\nconst api = transframeConsumer.api;\n\nconst messageFromParent = await api.sayHello();\nconsole.log(\"Message from parent:\", messageFromParent);\n// Output: Message from parent: Hello!\n```\n\nCongrats! You've implemented your first Transframe API and interacted with it.\n\n### Passing args\n\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    sum(_context, a: number, b: number) {\n      return a + b;\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconst onePlusTwo = await consumer.api.sum(1, 2); // 3\n```\n\n> The `_context` parameter contains information about the call to the API method. For the iframe interface, it contains a `message` property that is forwarded from `window.addEventListener` (see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#the_dispatched_event) for more details). `_context` is always the first parameter to API methods (though you will probably seldom use it).\n\n### Callbacks\n\nYou can also pass callbacks to your API methods.\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    subscribe(_context, callback: (iterations: number) => void) {\n      let iterations = 0;\n\n      setInterval(() => {\n        callback(iterations);\n        iterations++;\n      }, 1000);\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconsumer.api.subscribe((iterations: number) => {\n  console.log(`I've been called ${iterations} times.`);\n});\n\n// Output:\n// I've been called 0 times.\n// I've been called 1 times.\n// I've been called 2 times.\n// ...\n```\n\nIf you're interested in diving deeper, check out\n[this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child).\n\n\n## Architecture\n\nAt its core, Transframe is simply an RPC library. What makes it special is its ability to operate in different contexts using different *interfaces*. Under the hood, the iframe interface uses `window.postMessage` and `window.addEventListener('message', ...)`, while the background script interface uses the `Browser.runtime` api. If you wanted to, you could implement another interface to enable Transframe to work in another context. We haven't done it yet, but theoretically we could make a websocket interface 👀.\n\nHere's a high-level diagram for those visual folks:\n\n![High level Transframe diagram](./transframe.png)\n\n## Contexts\n\nHere are different contexts that transframe can operate in. This is a non-exhaustive list, mainly because the iframe interface can be cleverly configured in lots of ways with the `providerWindow` option.\n\nThe following lists will be notated as \"consumer -> provider\".\n\n### Iframe\n\n> All of these can also work in reverse by correctly configuring the `providerWindow` option.\n\n- Iframe -> Parent webpage\n- Nested iframe -> Parent webpage\n- Nested iframe -> Parent iframe\n- Popup -> Popup opener webpage\n- Webpage -> Browser extension content script\n\n### Background script (browser extensions)\n> Due to how this interface was implemented, the background script must always be the provider. Under the hood, it's using [this api](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port#:~:text=Content%20script%20to%20background%20script) (Content Script to Background Script).\n- Content script -> Background script\n\n## Configuring iframe consumers\n\nI mentioned above that the iframe interface can be configured in lots of different contexts using the `providerWindow` option. This is done when creating an iframe consumer.\n\n```typescript\nconst transframeConsumer = createIframeConsumer({\n  providerWindow: window.parent\n});\n```\n\nBy default, it uses `window.top` as the provider window. This means that iframes and nested iframes will communicate with the top-most webpage. With the above code, nested iframes would communicate with the iframe just above it.\n\nHere's a table that shows how to set `providerWindow` for different contexts:\n\n| Context | `providerWindow` |\n| ------- | ---------------- |\n| Iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent iframe | `window.parent` |\n| Popup -> Popup opener webpage | `window.opener` |\n| Webpage -> Browser extension content script | `window` |\n\n## Namespaces\n\nIn a given context, it's possible to have multiple Transframe APIs. To avoid collisions and errors between these APIs, it's a best practice to always specify a namespace.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  namespace: 'my-api'\n});\n\n// consumer\ncreateIframeConsumer({\n  namespace: 'my-api'\n});\n```\n\n## Security\n\nTransframe has a few security features to help you ensure that only the intended consumers and providers are communicating with each other.\n\n### Frame registration (iframe interface)\n\nIf you want to ensure that only certain iframes can use your API, you can use the `strictMode` option when creating an iframe provider and subesquently register frames that will be able to use your api.\n\n```typescript\n// provider\nconst provider = createIframeProvider({\n  api,\n  strictMode: true\n});\n\n// get a reference to the iframe you want to register\nconst iframe = document.getElementById('my-iframe');\n\n// register the iframe\nprovider.registerFrame(iframe);\n```\n\nIn this case, only the iframe with the id \"my-iframe\" will be able to use your API. If any other iframe tries to use it, it will fail.\n\nRegistering frames also causes `_context.fromId` to be defined in calls to your API methods, so you can uniquely identify the iframe that called your API method. Check out [this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child) for a demonstration of this.\n\n### Origin verification (iframe interface)\n\nIf you want to ensure that only iframes from certain origins can use your API, you can use the `allowedOrigins` option when creating an iframe provider.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, only iframes from `https://my-website.com` will be able to use your API. If any other iframe tries to use it, it will fail.\n\nIf you want to ensure that your consumer is not connecting to a malicious provider, you can use the `allowedOrigins` option when creating an iframe consumer.\n\n```typescript\n// consumer\ncreateIframeConsumer({\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, the consumer will only send messages to origins specified in `allowedOrigins`. Under the hood, it's passing the origins you specify to `window.postMessage` (see the [docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#syntax)).\n\n### Content scripts -> Background scripts\n\nDue to how the background script interface was implemented, content scripts will only ever be able to communicate with background scripts in the same extension. So you can be sure that only content scripts that you write will be able to communicate with your background script.","readmeFilename":"README.md","gitHead":"536ebbeaf1a13da015fbdd48454ae69d7c91cf12","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-gmsQAEp8UqEX2yPLUpivHDTsibbsamkldewYdGaD7Mpizhc/R6BZ7sAqhbQ57VA5eCxi3LJ8YfFWZUOUY2y+tw==","shasum":"4d05463e101f8dc70d51ecef93cf2198838fbf3c","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.3-alpha.8.tgz","fileCount":132,"unpackedSize":206682,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBwMoVhghXeoJ2fhCxJyQhSHMvWkav04mLBq5fWFnfAqAiBfj1BcpqjEq678Io6CZfpdCPl9Di0HeuwvY/CCKSfoWQ=="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.3-alpha.8_1710823431434_0.49262767630116766"},"_hasShrinkwrap":false},"0.1.3-alpha.9":{"name":"@trufflehq/transframe","version":"0.1.3-alpha.9","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview":{"import":"./dist/interfaces/react-native-webview/index.mjs","require":"./dist/interfaces/react-native-webview/index.js","types":"./dist/interfaces/react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","@types/react":"^18.0.0","react-native-webview":"^13.8.1","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"react":"^18.0.0","react-native-webview":"^13.8.1","webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-webview":{"optional":true},"webextension-polyfill":{"optional":true}},"_id":"@trufflehq/transframe@0.1.3-alpha.9","readme":"# Transframe\n\nHave you ever needed to implement communication with an iframe? Or maybe you're\nbuilding a browser extension and you need to communicate between your content\nscript and your background script. You probably went on MDN or Stack Overflow\nand found all the different ways of communicating (`window.postMessage`,\n`chrome.runtime.sendMessage`, etc). You probably started using those and came up\nwith some janky method of serializing and deserializing messages that have weird\nand inconsistent structures because you're just trying to get your app to work.\nWhen you're all done, the communication mechanism you built becomes the most\nfragile part of your app.\n\nIf this happened to you, look no further! Transframe has you covered. Transframe\nallows you to easily create cross \"frame\" APIs!\n\n(hence the name \"transframe\")\n\nTruffle uses Transframe as the communication mechansim for the\n[Truffle Extension](https://truffle.vip/extension). If you're not familiar with\nit, you should check it out. It's super cool :p\n\nBefore I bore you with all of the details, let's see how you can get started\nright away.\n\n## Getting started\n\nTo get started, install Transframe with your favorite package manager.\n\n```bash\n$ npm install @trufflehq/transframe\n$ yarn add @trufflehq/transframe\n```\n\nWith every Transframe setup, there are two sides: a _provider_ and and a\n_consumer_. A _provider_ provides an API that a _consumer_ can consume. Let's\ntake a look at how to set this up.\n\nScript in parent page:\n\n```typescript\nimport {\n  createIframeProvider,\n  createIframeApi\n} from \"@trufflehq/transframe/iframe\";\n\ncreateIframeProvider({\n  api: createIframeApi({\n    sayHello() {\n      return \"Hello!\";\n    },\n  }),\n});\n```\n\nNow for the script in the page to be iframed:\n\n```typescript\nimport { createIframeConsumer } from \"@trufflehq/transframe/iframe\";\n\nconst transframeConsumer = createIframeConsumer();\nconst api = transframeConsumer.api;\n\nconst messageFromParent = await api.sayHello();\nconsole.log(\"Message from parent:\", messageFromParent);\n// Output: Message from parent: Hello!\n```\n\nCongrats! You've implemented your first Transframe API and interacted with it.\n\n### Passing args\n\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    sum(_context, a: number, b: number) {\n      return a + b;\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconst onePlusTwo = await consumer.api.sum(1, 2); // 3\n```\n\n> The `_context` parameter contains information about the call to the API method. For the iframe interface, it contains a `message` property that is forwarded from `window.addEventListener` (see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#the_dispatched_event) for more details). `_context` is always the first parameter to API methods (though you will probably seldom use it).\n\n### Callbacks\n\nYou can also pass callbacks to your API methods.\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    subscribe(_context, callback: (iterations: number) => void) {\n      let iterations = 0;\n\n      setInterval(() => {\n        callback(iterations);\n        iterations++;\n      }, 1000);\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconsumer.api.subscribe((iterations: number) => {\n  console.log(`I've been called ${iterations} times.`);\n});\n\n// Output:\n// I've been called 0 times.\n// I've been called 1 times.\n// I've been called 2 times.\n// ...\n```\n\nIf you're interested in diving deeper, check out\n[this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child).\n\n\n## Architecture\n\nAt its core, Transframe is simply an RPC library. What makes it special is its ability to operate in different contexts using different *interfaces*. Under the hood, the iframe interface uses `window.postMessage` and `window.addEventListener('message', ...)`, while the background script interface uses the `Browser.runtime` api. If you wanted to, you could implement another interface to enable Transframe to work in another context. We haven't done it yet, but theoretically we could make a websocket interface 👀.\n\nHere's a high-level diagram for those visual folks:\n\n![High level Transframe diagram](./transframe.png)\n\n## Contexts\n\nHere are different contexts that transframe can operate in. This is a non-exhaustive list, mainly because the iframe interface can be cleverly configured in lots of ways with the `providerWindow` option.\n\nThe following lists will be notated as \"consumer -> provider\".\n\n### Iframe\n\n> All of these can also work in reverse by correctly configuring the `providerWindow` option.\n\n- Iframe -> Parent webpage\n- Nested iframe -> Parent webpage\n- Nested iframe -> Parent iframe\n- Popup -> Popup opener webpage\n- Webpage -> Browser extension content script\n\n### Background script (browser extensions)\n> Due to how this interface was implemented, the background script must always be the provider. Under the hood, it's using [this api](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port#:~:text=Content%20script%20to%20background%20script) (Content Script to Background Script).\n- Content script -> Background script\n\n## Configuring iframe consumers\n\nI mentioned above that the iframe interface can be configured in lots of different contexts using the `providerWindow` option. This is done when creating an iframe consumer.\n\n```typescript\nconst transframeConsumer = createIframeConsumer({\n  providerWindow: window.parent\n});\n```\n\nBy default, it uses `window.top` as the provider window. This means that iframes and nested iframes will communicate with the top-most webpage. With the above code, nested iframes would communicate with the iframe just above it.\n\nHere's a table that shows how to set `providerWindow` for different contexts:\n\n| Context | `providerWindow` |\n| ------- | ---------------- |\n| Iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent iframe | `window.parent` |\n| Popup -> Popup opener webpage | `window.opener` |\n| Webpage -> Browser extension content script | `window` |\n\n## Namespaces\n\nIn a given context, it's possible to have multiple Transframe APIs. To avoid collisions and errors between these APIs, it's a best practice to always specify a namespace.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  namespace: 'my-api'\n});\n\n// consumer\ncreateIframeConsumer({\n  namespace: 'my-api'\n});\n```\n\n## Security\n\nTransframe has a few security features to help you ensure that only the intended consumers and providers are communicating with each other.\n\n### Frame registration (iframe interface)\n\nIf you want to ensure that only certain iframes can use your API, you can use the `strictMode` option when creating an iframe provider and subesquently register frames that will be able to use your api.\n\n```typescript\n// provider\nconst provider = createIframeProvider({\n  api,\n  strictMode: true\n});\n\n// get a reference to the iframe you want to register\nconst iframe = document.getElementById('my-iframe');\n\n// register the iframe\nprovider.registerFrame(iframe);\n```\n\nIn this case, only the iframe with the id \"my-iframe\" will be able to use your API. If any other iframe tries to use it, it will fail.\n\nRegistering frames also causes `_context.fromId` to be defined in calls to your API methods, so you can uniquely identify the iframe that called your API method. Check out [this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child) for a demonstration of this.\n\n### Origin verification (iframe interface)\n\nIf you want to ensure that only iframes from certain origins can use your API, you can use the `allowedOrigins` option when creating an iframe provider.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, only iframes from `https://my-website.com` will be able to use your API. If any other iframe tries to use it, it will fail.\n\nIf you want to ensure that your consumer is not connecting to a malicious provider, you can use the `allowedOrigins` option when creating an iframe consumer.\n\n```typescript\n// consumer\ncreateIframeConsumer({\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, the consumer will only send messages to origins specified in `allowedOrigins`. Under the hood, it's passing the origins you specify to `window.postMessage` (see the [docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#syntax)).\n\n### Content scripts -> Background scripts\n\nDue to how the background script interface was implemented, content scripts will only ever be able to communicate with background scripts in the same extension. So you can be sure that only content scripts that you write will be able to communicate with your background script.","readmeFilename":"README.md","gitHead":"536ebbeaf1a13da015fbdd48454ae69d7c91cf12","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-mJznEDmqK88MCrr0JZtHywL+Oe0u1cCRcirtyIrYVEZjHuB8XPtOwzc1bvbjcYhq6uWiKEwa1+w5WOdK8HVxAg==","shasum":"4a14c90ef416e2413bafd554edbaaf5972d586ff","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.3-alpha.9.tgz","fileCount":132,"unpackedSize":207160,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA9VtzqPsSHkJQEPMoeOSCDd0JI0gc/KuMfGWQCaueWUAiBpvH1zVVNNl6Z5Jc6oqa0ptNxVRuqWH3ZWkr2geRA4ag=="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.3-alpha.9_1710879283424_0.5832667087831231"},"_hasShrinkwrap":false},"0.1.4":{"name":"@trufflehq/transframe","version":"0.1.4","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview":{"import":"./dist/interfaces/react-native-webview/index.mjs","require":"./dist/interfaces/react-native-webview/index.js","types":"./dist/interfaces/react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","@types/react":"^18.0.0","react-native-webview":"^13.8.1","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"react":"^18.0.0","react-native-webview":"^13.8.1","webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-webview":{"optional":true},"webextension-polyfill":{"optional":true}},"_id":"@trufflehq/transframe@0.1.4","readme":"# Transframe\n\nHave you ever needed to implement communication with an iframe? Or maybe you're\nbuilding a browser extension and you need to communicate between your content\nscript and your background script. You probably went on MDN or Stack Overflow\nand found all the different ways of communicating (`window.postMessage`,\n`chrome.runtime.sendMessage`, etc). You probably started using those and came up\nwith some janky method of serializing and deserializing messages that have weird\nand inconsistent structures because you're just trying to get your app to work.\nWhen you're all done, the communication mechanism you built becomes the most\nfragile part of your app.\n\nIf this happened to you, look no further! Transframe has you covered. Transframe\nallows you to easily create cross \"frame\" APIs!\n\n(hence the name \"transframe\")\n\nTruffle uses Transframe as the communication mechansim for the\n[Truffle Extension](https://truffle.vip/extension). If you're not familiar with\nit, you should check it out. It's super cool :p\n\nBefore I bore you with all of the details, let's see how you can get started\nright away.\n\n## Getting started\n\nTo get started, install Transframe with your favorite package manager.\n\n```bash\n$ npm install @trufflehq/transframe\n$ yarn add @trufflehq/transframe\n```\n\nWith every Transframe setup, there are two sides: a _provider_ and and a\n_consumer_. A _provider_ provides an API that a _consumer_ can consume. Let's\ntake a look at how to set this up.\n\nScript in parent page:\n\n```typescript\nimport {\n  createIframeProvider,\n  createIframeApi\n} from \"@trufflehq/transframe/iframe\";\n\ncreateIframeProvider({\n  api: createIframeApi({\n    sayHello() {\n      return \"Hello!\";\n    },\n  }),\n});\n```\n\nNow for the script in the page to be iframed:\n\n```typescript\nimport { createIframeConsumer } from \"@trufflehq/transframe/iframe\";\n\nconst transframeConsumer = createIframeConsumer();\nconst api = transframeConsumer.api;\n\nconst messageFromParent = await api.sayHello();\nconsole.log(\"Message from parent:\", messageFromParent);\n// Output: Message from parent: Hello!\n```\n\nCongrats! You've implemented your first Transframe API and interacted with it.\n\n### Passing args\n\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    sum(_context, a: number, b: number) {\n      return a + b;\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconst onePlusTwo = await consumer.api.sum(1, 2); // 3\n```\n\n> The `_context` parameter contains information about the call to the API method. For the iframe interface, it contains a `message` property that is forwarded from `window.addEventListener` (see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#the_dispatched_event) for more details). `_context` is always the first parameter to API methods (though you will probably seldom use it).\n\n### Callbacks\n\nYou can also pass callbacks to your API methods.\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    subscribe(_context, callback: (iterations: number) => void) {\n      let iterations = 0;\n\n      setInterval(() => {\n        callback(iterations);\n        iterations++;\n      }, 1000);\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconsumer.api.subscribe((iterations: number) => {\n  console.log(`I've been called ${iterations} times.`);\n});\n\n// Output:\n// I've been called 0 times.\n// I've been called 1 times.\n// I've been called 2 times.\n// ...\n```\n\nIf you're interested in diving deeper, check out\n[this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child).\n\n\n## Architecture\n\nAt its core, Transframe is simply an RPC library. What makes it special is its ability to operate in different contexts using different *interfaces*. Under the hood, the iframe interface uses `window.postMessage` and `window.addEventListener('message', ...)`, while the background script interface uses the `Browser.runtime` api. If you wanted to, you could implement another interface to enable Transframe to work in another context. We haven't done it yet, but theoretically we could make a websocket interface 👀.\n\nHere's a high-level diagram for those visual folks:\n\n![High level Transframe diagram](./transframe.png)\n\n## Contexts\n\nHere are different contexts that transframe can operate in. This is a non-exhaustive list, mainly because the iframe interface can be cleverly configured in lots of ways with the `providerWindow` option.\n\nThe following lists will be notated as \"consumer -> provider\".\n\n### Iframe\n\n> All of these can also work in reverse by correctly configuring the `providerWindow` option.\n\n- Iframe -> Parent webpage\n- Nested iframe -> Parent webpage\n- Nested iframe -> Parent iframe\n- Popup -> Popup opener webpage\n- Webpage -> Browser extension content script\n\n### Background script (browser extensions)\n> Due to how this interface was implemented, the background script must always be the provider. Under the hood, it's using [this api](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port#:~:text=Content%20script%20to%20background%20script) (Content Script to Background Script).\n- Content script -> Background script\n\n## Configuring iframe consumers\n\nI mentioned above that the iframe interface can be configured in lots of different contexts using the `providerWindow` option. This is done when creating an iframe consumer.\n\n```typescript\nconst transframeConsumer = createIframeConsumer({\n  providerWindow: window.parent\n});\n```\n\nBy default, it uses `window.top` as the provider window. This means that iframes and nested iframes will communicate with the top-most webpage. With the above code, nested iframes would communicate with the iframe just above it.\n\nHere's a table that shows how to set `providerWindow` for different contexts:\n\n| Context | `providerWindow` |\n| ------- | ---------------- |\n| Iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent iframe | `window.parent` |\n| Popup -> Popup opener webpage | `window.opener` |\n| Webpage -> Browser extension content script | `window` |\n\n## Namespaces\n\nIn a given context, it's possible to have multiple Transframe APIs. To avoid collisions and errors between these APIs, it's a best practice to always specify a namespace.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  namespace: 'my-api'\n});\n\n// consumer\ncreateIframeConsumer({\n  namespace: 'my-api'\n});\n```\n\n## Security\n\nTransframe has a few security features to help you ensure that only the intended consumers and providers are communicating with each other.\n\n### Frame registration (iframe interface)\n\nIf you want to ensure that only certain iframes can use your API, you can use the `strictMode` option when creating an iframe provider and subesquently register frames that will be able to use your api.\n\n```typescript\n// provider\nconst provider = createIframeProvider({\n  api,\n  strictMode: true\n});\n\n// get a reference to the iframe you want to register\nconst iframe = document.getElementById('my-iframe');\n\n// register the iframe\nprovider.registerFrame(iframe);\n```\n\nIn this case, only the iframe with the id \"my-iframe\" will be able to use your API. If any other iframe tries to use it, it will fail.\n\nRegistering frames also causes `_context.fromId` to be defined in calls to your API methods, so you can uniquely identify the iframe that called your API method. Check out [this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child) for a demonstration of this.\n\n### Origin verification (iframe interface)\n\nIf you want to ensure that only iframes from certain origins can use your API, you can use the `allowedOrigins` option when creating an iframe provider.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, only iframes from `https://my-website.com` will be able to use your API. If any other iframe tries to use it, it will fail.\n\nIf you want to ensure that your consumer is not connecting to a malicious provider, you can use the `allowedOrigins` option when creating an iframe consumer.\n\n```typescript\n// consumer\ncreateIframeConsumer({\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, the consumer will only send messages to origins specified in `allowedOrigins`. Under the hood, it's passing the origins you specify to `window.postMessage` (see the [docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#syntax)).\n\n### Content scripts -> Background scripts\n\nDue to how the background script interface was implemented, content scripts will only ever be able to communicate with background scripts in the same extension. So you can be sure that only content scripts that you write will be able to communicate with your background script.","readmeFilename":"README.md","gitHead":"536ebbeaf1a13da015fbdd48454ae69d7c91cf12","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-VAGGw4iuv9LX/jdLG0KIdxzFnKTHq/vu48S4HWEL+vdhUCbBHSOsmBpihXykzHMb4UxXvx1DKrYsUq5sep/lxg==","shasum":"16781059a1a6033d58dde0e33e2dcdf7bb1506e8","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.4.tgz","fileCount":132,"unpackedSize":209969,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF2N+RD6V1ZFL+6+IFjZZd946NYy4O55842hq4VubiKEAiEAoQDla3P9rV3IvcpUSNdpLe89YhJQFYIXsOndmABE2e0="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.4_1711176827371_0.9916879848519908"},"_hasShrinkwrap":false},"0.1.5":{"name":"@trufflehq/transframe","version":"0.1.5","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview":{"import":"./dist/interfaces/react-native-webview/index.mjs","require":"./dist/interfaces/react-native-webview/index.js","types":"./dist/interfaces/react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","@types/react":"^18.0.0","react-native-webview":"^13.8.1","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"react":"^18.0.0","react-native-webview":"^13.8.1","webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-webview":{"optional":true},"webextension-polyfill":{"optional":true}},"_id":"@trufflehq/transframe@0.1.5","gitHead":"536ebbeaf1a13da015fbdd48454ae69d7c91cf12","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-fNFy8iw8S2s/T0tTILOZatZqxNqvWBzdTv9Enqx7/5TYpGHLtQm7P+88z+tPFDz6WhYzZm/SoyBVkNdkWRWRpg==","shasum":"8ed582bd150039e7ea9a2de2533dad4d9b98efa5","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.5.tgz","fileCount":132,"unpackedSize":209969,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCJPEyfTYqfOJKjVsHru3Xa1AKbYAtQaCDLnUMuILGJBQIhAMw6uQYrxM+e9PMaIfvxotVqZFLXlYirGiwlMzGQloJY"}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.5_1711176879879_0.556868793523152"},"_hasShrinkwrap":false},"0.1.5-alpha.0":{"name":"@trufflehq/transframe","version":"0.1.5-alpha.0","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview-to-web":{"import":"./dist/interfaces/react-native-webview-to-web/index.mjs","require":"./dist/interfaces/react-native-webview-to-web/index.js","types":"./dist/interfaces/react-native-webview-to-web/index.d.ts"},"./web-to-react-native-webview":{"import":"./dist/interfaces/web-to-react-native-webview/index.mjs","require":"./dist/interfaces/web-to-react-native-webview/index.js","types":"./dist/interfaces/web-to-react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","@types/react":"^18.0.0","react-native-webview":"^13.8.1","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"react":"^18.0.0","react-native-webview":"^13.8.1","webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-webview":{"optional":true},"webextension-polyfill":{"optional":true}},"_id":"@trufflehq/transframe@0.1.5-alpha.0","readme":"# Transframe\n\nHave you ever needed to implement communication with an iframe? Or maybe you're\nbuilding a browser extension and you need to communicate between your content\nscript and your background script. You probably went on MDN or Stack Overflow\nand found all the different ways of communicating (`window.postMessage`,\n`chrome.runtime.sendMessage`, etc). You probably started using those and came up\nwith some janky method of serializing and deserializing messages that have weird\nand inconsistent structures because you're just trying to get your app to work.\nWhen you're all done, the communication mechanism you built becomes the most\nfragile part of your app.\n\nIf this happened to you, look no further! Transframe has you covered. Transframe\nallows you to easily create cross \"frame\" APIs!\n\n(hence the name \"transframe\")\n\nTruffle uses Transframe as the communication mechansim for the\n[Truffle Extension](https://truffle.vip/extension). If you're not familiar with\nit, you should check it out. It's super cool :p\n\nBefore I bore you with all of the details, let's see how you can get started\nright away.\n\n## Getting started\n\nTo get started, install Transframe with your favorite package manager.\n\n```bash\n$ npm install @trufflehq/transframe\n$ yarn add @trufflehq/transframe\n```\n\nWith every Transframe setup, there are two sides: a _provider_ and and a\n_consumer_. A _provider_ provides an API that a _consumer_ can consume. Let's\ntake a look at how to set this up.\n\nScript in parent page:\n\n```typescript\nimport {\n  createIframeProvider,\n  createIframeApi\n} from \"@trufflehq/transframe/iframe\";\n\ncreateIframeProvider({\n  api: createIframeApi({\n    sayHello() {\n      return \"Hello!\";\n    },\n  }),\n});\n```\n\nNow for the script in the page to be iframed:\n\n```typescript\nimport { createIframeConsumer } from \"@trufflehq/transframe/iframe\";\n\nconst transframeConsumer = createIframeConsumer();\nconst api = transframeConsumer.api;\n\nconst messageFromParent = await api.sayHello();\nconsole.log(\"Message from parent:\", messageFromParent);\n// Output: Message from parent: Hello!\n```\n\nCongrats! You've implemented your first Transframe API and interacted with it.\n\n### Passing args\n\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    sum(_context, a: number, b: number) {\n      return a + b;\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconst onePlusTwo = await consumer.api.sum(1, 2); // 3\n```\n\n> The `_context` parameter contains information about the call to the API method. For the iframe interface, it contains a `message` property that is forwarded from `window.addEventListener` (see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#the_dispatched_event) for more details). `_context` is always the first parameter to API methods (though you will probably seldom use it).\n\n### Callbacks\n\nYou can also pass callbacks to your API methods.\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    subscribe(_context, callback: (iterations: number) => void) {\n      let iterations = 0;\n\n      setInterval(() => {\n        callback(iterations);\n        iterations++;\n      }, 1000);\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconsumer.api.subscribe((iterations: number) => {\n  console.log(`I've been called ${iterations} times.`);\n});\n\n// Output:\n// I've been called 0 times.\n// I've been called 1 times.\n// I've been called 2 times.\n// ...\n```\n\nIf you're interested in diving deeper, check out\n[this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child).\n\n\n## Architecture\n\nAt its core, Transframe is simply an RPC library. What makes it special is its ability to operate in different contexts using different *interfaces*. Under the hood, the iframe interface uses `window.postMessage` and `window.addEventListener('message', ...)`, while the background script interface uses the `Browser.runtime` api. If you wanted to, you could implement another interface to enable Transframe to work in another context. We haven't done it yet, but theoretically we could make a websocket interface 👀.\n\nHere's a high-level diagram for those visual folks:\n\n![High level Transframe diagram](./transframe.png)\n\n## Contexts\n\nHere are different contexts that transframe can operate in. This is a non-exhaustive list, mainly because the iframe interface can be cleverly configured in lots of ways with the `providerWindow` option.\n\nThe following lists will be notated as \"consumer -> provider\".\n\n### Iframe\n\n> All of these can also work in reverse by correctly configuring the `providerWindow` option.\n\n- Iframe -> Parent webpage\n- Nested iframe -> Parent webpage\n- Nested iframe -> Parent iframe\n- Popup -> Popup opener webpage\n- Webpage -> Browser extension content script\n\n### Background script (browser extensions)\n> Due to how this interface was implemented, the background script must always be the provider. Under the hood, it's using [this api](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port#:~:text=Content%20script%20to%20background%20script) (Content Script to Background Script).\n- Content script -> Background script\n\n## Configuring iframe consumers\n\nI mentioned above that the iframe interface can be configured in lots of different contexts using the `providerWindow` option. This is done when creating an iframe consumer.\n\n```typescript\nconst transframeConsumer = createIframeConsumer({\n  providerWindow: window.parent\n});\n```\n\nBy default, it uses `window.top` as the provider window. This means that iframes and nested iframes will communicate with the top-most webpage. With the above code, nested iframes would communicate with the iframe just above it.\n\nHere's a table that shows how to set `providerWindow` for different contexts:\n\n| Context | `providerWindow` |\n| ------- | ---------------- |\n| Iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent iframe | `window.parent` |\n| Popup -> Popup opener webpage | `window.opener` |\n| Webpage -> Browser extension content script | `window` |\n\n## Namespaces\n\nIn a given context, it's possible to have multiple Transframe APIs. To avoid collisions and errors between these APIs, it's a best practice to always specify a namespace.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  namespace: 'my-api'\n});\n\n// consumer\ncreateIframeConsumer({\n  namespace: 'my-api'\n});\n```\n\n## Security\n\nTransframe has a few security features to help you ensure that only the intended consumers and providers are communicating with each other.\n\n### Frame registration (iframe interface)\n\nIf you want to ensure that only certain iframes can use your API, you can use the `strictMode` option when creating an iframe provider and subesquently register frames that will be able to use your api.\n\n```typescript\n// provider\nconst provider = createIframeProvider({\n  api,\n  strictMode: true\n});\n\n// get a reference to the iframe you want to register\nconst iframe = document.getElementById('my-iframe');\n\n// register the iframe\nprovider.registerFrame(iframe);\n```\n\nIn this case, only the iframe with the id \"my-iframe\" will be able to use your API. If any other iframe tries to use it, it will fail.\n\nRegistering frames also causes `_context.fromId` to be defined in calls to your API methods, so you can uniquely identify the iframe that called your API method. Check out [this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child) for a demonstration of this.\n\n### Origin verification (iframe interface)\n\nIf you want to ensure that only iframes from certain origins can use your API, you can use the `allowedOrigins` option when creating an iframe provider.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, only iframes from `https://my-website.com` will be able to use your API. If any other iframe tries to use it, it will fail.\n\nIf you want to ensure that your consumer is not connecting to a malicious provider, you can use the `allowedOrigins` option when creating an iframe consumer.\n\n```typescript\n// consumer\ncreateIframeConsumer({\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, the consumer will only send messages to origins specified in `allowedOrigins`. Under the hood, it's passing the origins you specify to `window.postMessage` (see the [docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#syntax)).\n\n### Content scripts -> Background scripts\n\nDue to how the background script interface was implemented, content scripts will only ever be able to communicate with background scripts in the same extension. So you can be sure that only content scripts that you write will be able to communicate with your background script.","readmeFilename":"README.md","gitHead":"5fed8d0ed7e2aeb0e75700c7a4a0091d383ddbee","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-MCZOJAHeP9OfTJc4VagctXItzKN0Mxj11WON0ACCDysiY+wz5EJbBfRuxlqnwv7XNwU6pSavYtDifZwuVtR7sw==","shasum":"67904a1202d0f020a478f544c98fd5ac76e61ac9","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.5-alpha.0.tgz","fileCount":161,"unpackedSize":255716,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF3sxVhhfyJ7nCypQ/zrWLWyPMFo+fdEHv0JteodcrCaAiAwMJNP/mJJ3UYuGl3zP8S34B21Wvz2tod7D7yL+9RP+g=="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.5-alpha.0_1711590256078_0.915007379224793"},"_hasShrinkwrap":false},"0.1.5-alpha.1":{"name":"@trufflehq/transframe","version":"0.1.5-alpha.1","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview-to-web":{"import":"./dist/interfaces/react-native-webview-to-web/index.mjs","require":"./dist/interfaces/react-native-webview-to-web/index.js","types":"./dist/interfaces/react-native-webview-to-web/index.d.ts"},"./web-to-react-native-webview":{"import":"./dist/interfaces/web-to-react-native-webview/index.mjs","require":"./dist/interfaces/web-to-react-native-webview/index.js","types":"./dist/interfaces/web-to-react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","@types/react":"^18.0.0","react-native-webview":"^13.8.1","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"react":"^18.0.0","react-native-webview":"^13.8.1","webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-webview":{"optional":true},"webextension-polyfill":{"optional":true}},"_id":"@trufflehq/transframe@0.1.5-alpha.1","readme":"# Transframe\n\nHave you ever needed to implement communication with an iframe? Or maybe you're\nbuilding a browser extension and you need to communicate between your content\nscript and your background script. You probably went on MDN or Stack Overflow\nand found all the different ways of communicating (`window.postMessage`,\n`chrome.runtime.sendMessage`, etc). You probably started using those and came up\nwith some janky method of serializing and deserializing messages that have weird\nand inconsistent structures because you're just trying to get your app to work.\nWhen you're all done, the communication mechanism you built becomes the most\nfragile part of your app.\n\nIf this happened to you, look no further! Transframe has you covered. Transframe\nallows you to easily create cross \"frame\" APIs!\n\n(hence the name \"transframe\")\n\nTruffle uses Transframe as the communication mechansim for the\n[Truffle Extension](https://truffle.vip/extension). If you're not familiar with\nit, you should check it out. It's super cool :p\n\nBefore I bore you with all of the details, let's see how you can get started\nright away.\n\n## Getting started\n\nTo get started, install Transframe with your favorite package manager.\n\n```bash\n$ npm install @trufflehq/transframe\n$ yarn add @trufflehq/transframe\n```\n\nWith every Transframe setup, there are two sides: a _provider_ and and a\n_consumer_. A _provider_ provides an API that a _consumer_ can consume. Let's\ntake a look at how to set this up.\n\nScript in parent page:\n\n```typescript\nimport {\n  createIframeProvider,\n  createIframeApi\n} from \"@trufflehq/transframe/iframe\";\n\ncreateIframeProvider({\n  api: createIframeApi({\n    sayHello() {\n      return \"Hello!\";\n    },\n  }),\n});\n```\n\nNow for the script in the page to be iframed:\n\n```typescript\nimport { createIframeConsumer } from \"@trufflehq/transframe/iframe\";\n\nconst transframeConsumer = createIframeConsumer();\nconst api = transframeConsumer.api;\n\nconst messageFromParent = await api.sayHello();\nconsole.log(\"Message from parent:\", messageFromParent);\n// Output: Message from parent: Hello!\n```\n\nCongrats! You've implemented your first Transframe API and interacted with it.\n\n### Passing args\n\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    sum(_context, a: number, b: number) {\n      return a + b;\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconst onePlusTwo = await consumer.api.sum(1, 2); // 3\n```\n\n> The `_context` parameter contains information about the call to the API method. For the iframe interface, it contains a `message` property that is forwarded from `window.addEventListener` (see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#the_dispatched_event) for more details). `_context` is always the first parameter to API methods (though you will probably seldom use it).\n\n### Callbacks\n\nYou can also pass callbacks to your API methods.\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    subscribe(_context, callback: (iterations: number) => void) {\n      let iterations = 0;\n\n      setInterval(() => {\n        callback(iterations);\n        iterations++;\n      }, 1000);\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconsumer.api.subscribe((iterations: number) => {\n  console.log(`I've been called ${iterations} times.`);\n});\n\n// Output:\n// I've been called 0 times.\n// I've been called 1 times.\n// I've been called 2 times.\n// ...\n```\n\nIf you're interested in diving deeper, check out\n[this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child).\n\n\n## Architecture\n\nAt its core, Transframe is simply an RPC library. What makes it special is its ability to operate in different contexts using different *interfaces*. Under the hood, the iframe interface uses `window.postMessage` and `window.addEventListener('message', ...)`, while the background script interface uses the `Browser.runtime` api. If you wanted to, you could implement another interface to enable Transframe to work in another context. We haven't done it yet, but theoretically we could make a websocket interface 👀.\n\nHere's a high-level diagram for those visual folks:\n\n![High level Transframe diagram](./transframe.png)\n\n## Contexts\n\nHere are different contexts that transframe can operate in. This is a non-exhaustive list, mainly because the iframe interface can be cleverly configured in lots of ways with the `providerWindow` option.\n\nThe following lists will be notated as \"consumer -> provider\".\n\n### Iframe\n\n> All of these can also work in reverse by correctly configuring the `providerWindow` option.\n\n- Iframe -> Parent webpage\n- Nested iframe -> Parent webpage\n- Nested iframe -> Parent iframe\n- Popup -> Popup opener webpage\n- Webpage -> Browser extension content script\n\n### Background script (browser extensions)\n> Due to how this interface was implemented, the background script must always be the provider. Under the hood, it's using [this api](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port#:~:text=Content%20script%20to%20background%20script) (Content Script to Background Script).\n- Content script -> Background script\n\n## Configuring iframe consumers\n\nI mentioned above that the iframe interface can be configured in lots of different contexts using the `providerWindow` option. This is done when creating an iframe consumer.\n\n```typescript\nconst transframeConsumer = createIframeConsumer({\n  providerWindow: window.parent\n});\n```\n\nBy default, it uses `window.top` as the provider window. This means that iframes and nested iframes will communicate with the top-most webpage. With the above code, nested iframes would communicate with the iframe just above it.\n\nHere's a table that shows how to set `providerWindow` for different contexts:\n\n| Context | `providerWindow` |\n| ------- | ---------------- |\n| Iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent iframe | `window.parent` |\n| Popup -> Popup opener webpage | `window.opener` |\n| Webpage -> Browser extension content script | `window` |\n\n## Namespaces\n\nIn a given context, it's possible to have multiple Transframe APIs. To avoid collisions and errors between these APIs, it's a best practice to always specify a namespace.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  namespace: 'my-api'\n});\n\n// consumer\ncreateIframeConsumer({\n  namespace: 'my-api'\n});\n```\n\n## Security\n\nTransframe has a few security features to help you ensure that only the intended consumers and providers are communicating with each other.\n\n### Frame registration (iframe interface)\n\nIf you want to ensure that only certain iframes can use your API, you can use the `strictMode` option when creating an iframe provider and subesquently register frames that will be able to use your api.\n\n```typescript\n// provider\nconst provider = createIframeProvider({\n  api,\n  strictMode: true\n});\n\n// get a reference to the iframe you want to register\nconst iframe = document.getElementById('my-iframe');\n\n// register the iframe\nprovider.registerFrame(iframe);\n```\n\nIn this case, only the iframe with the id \"my-iframe\" will be able to use your API. If any other iframe tries to use it, it will fail.\n\nRegistering frames also causes `_context.fromId` to be defined in calls to your API methods, so you can uniquely identify the iframe that called your API method. Check out [this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child) for a demonstration of this.\n\n### Origin verification (iframe interface)\n\nIf you want to ensure that only iframes from certain origins can use your API, you can use the `allowedOrigins` option when creating an iframe provider.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, only iframes from `https://my-website.com` will be able to use your API. If any other iframe tries to use it, it will fail.\n\nIf you want to ensure that your consumer is not connecting to a malicious provider, you can use the `allowedOrigins` option when creating an iframe consumer.\n\n```typescript\n// consumer\ncreateIframeConsumer({\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, the consumer will only send messages to origins specified in `allowedOrigins`. Under the hood, it's passing the origins you specify to `window.postMessage` (see the [docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#syntax)).\n\n### Content scripts -> Background scripts\n\nDue to how the background script interface was implemented, content scripts will only ever be able to communicate with background scripts in the same extension. So you can be sure that only content scripts that you write will be able to communicate with your background script.","readmeFilename":"README.md","gitHead":"5fed8d0ed7e2aeb0e75700c7a4a0091d383ddbee","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-83sxPmPT5OpyMw1iTSKLdfwt5eVktaaqQ9dnXn2OWigCSoX58fBFIodVAeUTWS9fNhgvY8GxhSuNHY3soM+UYQ==","shasum":"aea96d46e0e189a45bea3c88ca351ad1f412290c","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.5-alpha.1.tgz","fileCount":163,"unpackedSize":256314,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCCd/DxNInFVTz8mlJ6cpXgMMur8T5GV6uLfNZVnN9DmAIgeIqcFoasz3JjygK8zwUZOmDO5FrU7mLoPeyLLPDyw2k="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.5-alpha.1_1711590699225_0.6801575033124794"},"_hasShrinkwrap":false},"0.1.6":{"name":"@trufflehq/transframe","version":"0.1.6","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview-to-web":{"import":"./dist/interfaces/react-native-webview-to-web/index.mjs","require":"./dist/interfaces/react-native-webview-to-web/index.js","types":"./dist/interfaces/react-native-webview-to-web/index.d.ts"},"./web-to-react-native-webview":{"import":"./dist/interfaces/web-to-react-native-webview/index.mjs","require":"./dist/interfaces/web-to-react-native-webview/index.js","types":"./dist/interfaces/web-to-react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","@types/react":"^18.0.0","react-native-webview":"^13.8.1","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"react":"^18.0.0","react-native-webview":"^13.8.1","webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-webview":{"optional":true},"webextension-polyfill":{"optional":true}},"_id":"@trufflehq/transframe@0.1.6","gitHead":"5fed8d0ed7e2aeb0e75700c7a4a0091d383ddbee","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-oN26d80Zqs0wzvqOe6bu5rzrWKCq8KGGQ0eERc2KEY2Ql33LEOvAC5BPVwlPKwOIxrgSX0N6/1krnDS1hVKDAg==","shasum":"5df4c9abac7071732fcd533fa6240e75ba5e343a","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.6.tgz","fileCount":163,"unpackedSize":256762,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCIL7PpSZLeaEL+IIjmyr2c9oeDRSWPHg3ZCvGF250zhAIgN+mCZbRbzWcgmrwkzaO+gHDGaryOk5kL83feaM5Cbxk="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.6_1711757697663_0.12836179036455375"},"_hasShrinkwrap":false},"0.1.7":{"name":"@trufflehq/transframe","version":"0.1.7","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview-to-web":{"import":"./dist/interfaces/react-native-webview-to-web/index.mjs","require":"./dist/interfaces/react-native-webview-to-web/index.js","types":"./dist/interfaces/react-native-webview-to-web/index.d.ts"},"./web-to-react-native-webview":{"import":"./dist/interfaces/web-to-react-native-webview/index.mjs","require":"./dist/interfaces/web-to-react-native-webview/index.js","types":"./dist/interfaces/web-to-react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","@types/react":"^18.0.0","react-native-webview":"^13.8.1","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"react":"^18.0.0","react-native-webview":"^13.8.1","webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-webview":{"optional":true},"webextension-polyfill":{"optional":true}},"_id":"@trufflehq/transframe@0.1.7","gitHead":"7ce95508b2ea6a9409c5417ab67f8899a5df8934","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-vWSS0Y0C8m6mxyq9e/oXd1wwwgSot+FkPmqVcQaEdLYqSFZUjncN6ex6bNxMdUtncn+Tdf5WSB0a7nJipDWkfQ==","shasum":"75fcc828b8119b6e949aaec1bdab996c64d1a90f","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.7.tgz","fileCount":163,"unpackedSize":255906,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDO1cgMHOQSHyL3jwBWTB4iB47z/AcqjztX3jc2xLs0hgIgHB1g0y4ksq7yDQcUqBGCT5LIELmhj9dJzhVEixMyIPg="}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.7_1712206524444_0.6750746938481247"},"_hasShrinkwrap":false},"0.1.8":{"name":"@trufflehq/transframe","version":"0.1.8","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview-to-web":{"import":"./dist/interfaces/react-native-webview-to-web/index.mjs","require":"./dist/interfaces/react-native-webview-to-web/index.js","types":"./dist/interfaces/react-native-webview-to-web/index.d.ts"},"./web-to-react-native-webview":{"import":"./dist/interfaces/web-to-react-native-webview/index.mjs","require":"./dist/interfaces/web-to-react-native-webview/index.js","types":"./dist/interfaces/web-to-react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","@types/react":"^18.0.0","react-native-webview":"^13.8.1","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"react":"^18.0.0","react-native-webview":"^13.8.1","webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-webview":{"optional":true},"webextension-polyfill":{"optional":true}},"_id":"@trufflehq/transframe@0.1.8","gitHead":"bc0b304a5fd4d544c8c6c156973cc599c929e0a9","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-kazDpJGwIB/LvUcR0ibZkFCin1Az11+aggq+3DWP8IAbfz+BUeDJNN5H7FbE8AyWvyhv0r5JI2Mh0lf0X/xLXw==","shasum":"daf86099c247e7e7b19b5c7f8bf8916af727178e","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.8.tgz","fileCount":163,"unpackedSize":257642,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDkmbNtDr609uQzOwilkQmsKmPxS4mQq2es+GYBxr2WhwIhAPcUq4MUGKD1MquR7UVtH0w0tu3ln3sBYmy7T/+PFhH8"}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.8_1714586562937_0.6170456570256302"},"_hasShrinkwrap":false},"0.1.9":{"name":"@trufflehq/transframe","version":"0.1.9","description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"publishConfig":{"access":"public"},"main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{"./package.json":"./package.json",".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"},"./iframe":{"import":"./dist/interfaces/iframe/index.mjs","require":"./dist/interfaces/iframe/index.js","types":"./dist/interfaces/iframe/index.d.ts"},"./background-script":{"import":"./dist/interfaces/background-script/index.mjs","require":"./dist/interfaces/background-script/index.js","types":"./dist/interfaces/background-script/index.d.ts"},"./react-native-webview-to-web":{"import":"./dist/interfaces/react-native-webview-to-web/index.mjs","require":"./dist/interfaces/react-native-webview-to-web/index.js","types":"./dist/interfaces/react-native-webview-to-web/index.d.ts"},"./web-to-react-native-webview":{"import":"./dist/interfaces/web-to-react-native-webview/index.mjs","require":"./dist/interfaces/web-to-react-native-webview/index.js","types":"./dist/interfaces/web-to-react-native-webview/index.d.ts"}},"sideEffects":["./dist/chunk*.mjs"],"scripts":{"clean":"rm -rf dist","build:esm":"tsc -p tsconfig/tsconfig.esm.json","build:cjs":"tsc -p tsconfig/tsconfig.cjs.json","build":"tsup","watch":"npm run watch:cjs","watch:esm":"tsc -p tsconfig/tsconfig.esm.json --watch","watch:cjs":"tsc -p tsconfig/tsconfig.cjs.json --watch","test":"jest"},"devDependencies":{"@types/jest":"^29.2.6","@types/webextension-polyfill":"^0.10.0","@types/react":"^18.0.0","react-native-webview":"^13.8.1","esbuild-plugin-file-path-extensions":"^1.0.0","jest":"^29.3.1","ts-jest":"^29.0.5","tslib":"^2.5.0","tsup":"^6.7.0","typescript":"^4.9.4"},"peerDependencies":{"react":"^18.0.0","react-native-webview":"^13.8.1","webextension-polyfill":"^0.10.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-webview":{"optional":true},"webextension-polyfill":{"optional":true}},"_id":"@trufflehq/transframe@0.1.9","gitHead":"bc0b304a5fd4d544c8c6c156973cc599c929e0a9","bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"},"_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-Db+/2BU0JofRAVTQaonIDnt4bYsgjrg5Q9V7M7Ddf+0+Y4gWjI+i0putkaYqwm9uXQbC4s4K5qfdT734dkyLFg==","shasum":"0cc2c3343ec247267162b1368efa83955d32d4c5","tarball":"https://registry.npmjs.org/@trufflehq/transframe/-/transframe-0.1.9.tgz","fileCount":163,"unpackedSize":257760,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCVVhEiDxGtlQ0zOPpDIrGU1dDHRTqiw8jL7Lpg20HSBgIhAPqZv8n16zJO7sdWnXt66MRzXgTmXHxnje2Z7L48jf9v"}]},"_npmUser":{"name":"austintruffle","email":"austin@truffle.vip"},"directories":{},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/transframe_0.1.9_1714602982102_0.1212670062951291"},"_hasShrinkwrap":false}},"time":{"created":"2023-02-06T22:32:05.010Z","0.0.1":"2023-02-06T22:32:05.221Z","modified":"2024-05-01T22:36:22.547Z","0.0.2":"2023-02-06T22:35:16.623Z","0.0.3":"2023-02-06T22:38:58.749Z","0.0.4":"2023-02-07T02:18:57.272Z","0.0.5":"2023-02-07T02:22:57.504Z","0.0.6":"2023-02-07T17:44:40.250Z","0.0.7":"2023-02-08T00:07:37.795Z","0.0.8":"2023-02-08T18:22:25.347Z","0.0.9":"2023-02-08T18:35:55.776Z","0.0.10":"2023-02-08T18:56:07.351Z","0.0.11":"2023-02-09T17:46:57.845Z","0.0.12":"2023-02-10T05:10:42.814Z","0.0.13":"2023-02-14T20:11:31.803Z","0.0.14":"2023-02-14T22:20:59.861Z","0.0.15":"2023-02-14T23:27:51.668Z","0.0.16":"2023-02-15T00:46:56.415Z","0.0.17":"2023-02-15T00:48:37.679Z","0.0.18":"2023-02-15T07:17:39.062Z","0.0.19":"2023-02-16T03:12:02.972Z","0.0.20":"2023-02-16T03:17:29.345Z","0.0.21":"2023-02-16T05:57:53.501Z","0.0.22":"2023-03-17T05:52:06.707Z","0.0.23":"2023-03-17T06:23:53.716Z","0.0.24":"2023-03-17T06:30:01.214Z","0.0.25":"2023-03-20T22:45:14.143Z","0.0.26":"2023-03-22T19:00:22.810Z","0.0.27":"2023-03-22T19:04:07.396Z","0.0.28":"2023-03-22T21:22:23.918Z","0.0.29":"2023-03-22T22:59:21.411Z","0.0.30":"2023-03-22T23:23:18.429Z","0.0.31":"2023-03-23T00:30:32.287Z","0.0.32":"2023-03-23T17:30:37.367Z","0.0.33":"2023-03-27T23:13:44.011Z","0.0.34":"2023-03-27T23:26:17.190Z","0.0.35":"2023-03-28T05:12:05.427Z","0.0.36":"2023-03-28T05:24:47.582Z","0.0.37":"2023-03-28T19:19:24.719Z","0.0.38":"2023-04-30T00:15:55.690Z","0.0.39":"2023-06-01T07:00:27.810Z","0.0.40":"2023-06-01T07:05:01.748Z","0.0.41":"2023-06-01T07:06:57.982Z","0.0.42":"2023-07-18T03:07:26.973Z","0.0.43":"2023-07-18T03:57:09.919Z","0.0.44":"2023-07-18T04:17:04.575Z","0.1.0":"2023-07-28T03:07:43.325Z","0.1.1":"2024-01-10T05:05:40.220Z","0.1.2":"2024-01-10T06:11:10.759Z","0.1.3-alpha.0":"2024-03-19T00:15:51.776Z","0.1.3-alpha.1":"2024-03-19T00:22:12.509Z","0.1.3-alpha.2":"2024-03-19T00:37:11.105Z","0.1.3-alpha.3":"2024-03-19T00:45:57.850Z","0.1.3-alpha.4":"2024-03-19T03:05:50.939Z","0.1.3-alpha.5":"2024-03-19T03:26:29.904Z","0.1.3-alpha.6":"2024-03-19T04:29:43.477Z","0.1.3-alpha.7":"2024-03-19T04:42:10.978Z","0.1.3-alpha.8":"2024-03-19T04:43:51.603Z","0.1.3-alpha.9":"2024-03-19T20:14:43.732Z","0.1.4":"2024-03-23T06:53:47.583Z","0.1.5":"2024-03-23T06:54:40.064Z","0.1.5-alpha.0":"2024-03-28T01:44:16.247Z","0.1.5-alpha.1":"2024-03-28T01:51:39.444Z","0.1.6":"2024-03-30T00:14:57.873Z","0.1.7":"2024-04-04T04:55:24.698Z","0.1.8":"2024-05-01T18:02:43.162Z","0.1.9":"2024-05-01T22:36:22.297Z"},"maintainers":[{"name":"faytruffle","email":"afay@truffle.vip"},{"name":"austintruffle","email":"austin@truffle.vip"},{"name":"carterhimmel","email":"carter@truffle.vip"},{"name":"fyko","email":"carter@elhnet.net"}],"description":"A library for creating apis for frames","keywords":["truffle"],"author":{"name":"Spore Labs, Inc."},"license":"MIT","readme":"# Transframe\n\nHave you ever needed to implement communication with an iframe? Or maybe you're\nbuilding a browser extension and you need to communicate between your content\nscript and your background script. You probably went on MDN or Stack Overflow\nand found all the different ways of communicating (`window.postMessage`,\n`chrome.runtime.sendMessage`, etc). You probably started using those and came up\nwith some janky method of serializing and deserializing messages that have weird\nand inconsistent structures because you're just trying to get your app to work.\nWhen you're all done, the communication mechanism you built becomes the most\nfragile part of your app.\n\nIf this happened to you, look no further! Transframe has you covered. Transframe\nallows you to easily create cross \"frame\" APIs!\n\n(hence the name \"transframe\")\n\nTruffle uses Transframe as the communication mechansim for the\n[Truffle Extension](https://truffle.vip/extension). If you're not familiar with\nit, you should check it out. It's super cool :p\n\nBefore I bore you with all of the details, let's see how you can get started\nright away.\n\n## Getting started\n\nTo get started, install Transframe with your favorite package manager.\n\n```bash\n$ npm install @trufflehq/transframe\n$ yarn add @trufflehq/transframe\n```\n\nWith every Transframe setup, there are two sides: a _provider_ and and a\n_consumer_. A _provider_ provides an API that a _consumer_ can consume. Let's\ntake a look at how to set this up.\n\nScript in parent page:\n\n```typescript\nimport {\n  createIframeProvider,\n  createIframeApi\n} from \"@trufflehq/transframe/iframe\";\n\ncreateIframeProvider({\n  api: createIframeApi({\n    sayHello() {\n      return \"Hello!\";\n    },\n  }),\n});\n```\n\nNow for the script in the page to be iframed:\n\n```typescript\nimport { createIframeConsumer } from \"@trufflehq/transframe/iframe\";\n\nconst transframeConsumer = createIframeConsumer();\nconst api = transframeConsumer.api;\n\nconst messageFromParent = await api.sayHello();\nconsole.log(\"Message from parent:\", messageFromParent);\n// Output: Message from parent: Hello!\n```\n\nCongrats! You've implemented your first Transframe API and interacted with it.\n\n### Passing args\n\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    sum(_context, a: number, b: number) {\n      return a + b;\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconst onePlusTwo = await consumer.api.sum(1, 2); // 3\n```\n\n> The `_context` parameter contains information about the call to the API method. For the iframe interface, it contains a `message` property that is forwarded from `window.addEventListener` (see the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#the_dispatched_event) for more details). `_context` is always the first parameter to API methods (though you will probably seldom use it).\n\n### Callbacks\n\nYou can also pass callbacks to your API methods.\n```typescript\n// provider script\ncreateIframeProvider({\n  api: createIframeApi({\n    subscribe(_context, callback: (iterations: number) => void) {\n      let iterations = 0;\n\n      setInterval(() => {\n        callback(iterations);\n        iterations++;\n      }, 1000);\n    }\n  })\n});\n\n// consumer script\nconst consumer = createIframeConsumer();\nconsumer.api.subscribe((iterations: number) => {\n  console.log(`I've been called ${iterations} times.`);\n});\n\n// Output:\n// I've been called 0 times.\n// I've been called 1 times.\n// I've been called 2 times.\n// ...\n```\n\nIf you're interested in diving deeper, check out\n[this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child).\n\n\n## Architecture\n\nAt its core, Transframe is simply an RPC library. What makes it special is its ability to operate in different contexts using different *interfaces*. Under the hood, the iframe interface uses `window.postMessage` and `window.addEventListener('message', ...)`, while the background script interface uses the `Browser.runtime` api. If you wanted to, you could implement another interface to enable Transframe to work in another context. We haven't done it yet, but theoretically we could make a websocket interface 👀.\n\nHere's a high-level diagram for those visual folks:\n\n![High level Transframe diagram](./transframe.png)\n\n## Contexts\n\nHere are different contexts that transframe can operate in. This is a non-exhaustive list, mainly because the iframe interface can be cleverly configured in lots of ways with the `providerWindow` option.\n\nThe following lists will be notated as \"consumer -> provider\".\n\n### Iframe\n\n> All of these can also work in reverse by correctly configuring the `providerWindow` option.\n\n- Iframe -> Parent webpage\n- Nested iframe -> Parent webpage\n- Nested iframe -> Parent iframe\n- Popup -> Popup opener webpage\n- Webpage -> Browser extension content script\n\n### Background script (browser extensions)\n> Due to how this interface was implemented, the background script must always be the provider. Under the hood, it's using [this api](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port#:~:text=Content%20script%20to%20background%20script) (Content Script to Background Script).\n- Content script -> Background script\n\n## Configuring iframe consumers\n\nI mentioned above that the iframe interface can be configured in lots of different contexts using the `providerWindow` option. This is done when creating an iframe consumer.\n\n```typescript\nconst transframeConsumer = createIframeConsumer({\n  providerWindow: window.parent\n});\n```\n\nBy default, it uses `window.top` as the provider window. This means that iframes and nested iframes will communicate with the top-most webpage. With the above code, nested iframes would communicate with the iframe just above it.\n\nHere's a table that shows how to set `providerWindow` for different contexts:\n\n| Context | `providerWindow` |\n| ------- | ---------------- |\n| Iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent webpage | `undefined` |\n| Nested iframe -> Parent iframe | `window.parent` |\n| Popup -> Popup opener webpage | `window.opener` |\n| Webpage -> Browser extension content script | `window` |\n\n## Namespaces\n\nIn a given context, it's possible to have multiple Transframe APIs. To avoid collisions and errors between these APIs, it's a best practice to always specify a namespace.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  namespace: 'my-api'\n});\n\n// consumer\ncreateIframeConsumer({\n  namespace: 'my-api'\n});\n```\n\n## Security\n\nTransframe has a few security features to help you ensure that only the intended consumers and providers are communicating with each other.\n\n### Frame registration (iframe interface)\n\nIf you want to ensure that only certain iframes can use your API, you can use the `strictMode` option when creating an iframe provider and subesquently register frames that will be able to use your api.\n\n```typescript\n// provider\nconst provider = createIframeProvider({\n  api,\n  strictMode: true\n});\n\n// get a reference to the iframe you want to register\nconst iframe = document.getElementById('my-iframe');\n\n// register the iframe\nprovider.registerFrame(iframe);\n```\n\nIn this case, only the iframe with the id \"my-iframe\" will be able to use your API. If any other iframe tries to use it, it will fail.\n\nRegistering frames also causes `_context.fromId` to be defined in calls to your API methods, so you can uniquely identify the iframe that called your API method. Check out [this example](https://github.com/trufflehq/truffle-packages/tree/master/npm/transframe/examples/multi-child) for a demonstration of this.\n\n### Origin verification (iframe interface)\n\nIf you want to ensure that only iframes from certain origins can use your API, you can use the `allowedOrigins` option when creating an iframe provider.\n\n```typescript\n// provider\ncreateIframeProvider({\n  api,\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, only iframes from `https://my-website.com` will be able to use your API. If any other iframe tries to use it, it will fail.\n\nIf you want to ensure that your consumer is not connecting to a malicious provider, you can use the `allowedOrigins` option when creating an iframe consumer.\n\n```typescript\n// consumer\ncreateIframeConsumer({\n  allowedOrigins: ['https://my-website.com']\n});\n```\n\nIn this case, the consumer will only send messages to origins specified in `allowedOrigins`. Under the hood, it's passing the origins you specify to `window.postMessage` (see the [docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#syntax)).\n\n### Content scripts -> Background scripts\n\nDue to how the background script interface was implemented, content scripts will only ever be able to communicate with background scripts in the same extension. So you can be sure that only content scripts that you write will be able to communicate with your background script.","readmeFilename":"README.md","homepage":"https://github.com/trufflehq/truffle-packages/blob/master/npm/transframe/README.md","repository":{"type":"git","url":"git+https://github.com/trufflehq/truffle-packages.git","directory":"npm/transframe"},"bugs":{"url":"https://github.com/trufflehq/truffle-packages/issues"}}