@metamask/snaps-execution-environments 4.0.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -1
- package/dist/browserify/iframe/bundle.js +4 -4
- package/dist/browserify/iframe/index.html +201 -110
- package/dist/browserify/node-process/bundle.js +204 -113
- package/dist/browserify/node-thread/bundle.js +204 -113
- package/dist/browserify/webview/bundle.js +4 -4
- package/dist/browserify/webview/index.html +201 -110
- package/dist/browserify/worker-executor/bundle.js +205 -114
- package/dist/browserify/worker-pool/bundle.js +4 -4
- package/dist/browserify/worker-pool/index.html +201 -110
- package/dist/chunk-26EFJQDW.mjs +49 -0
- package/dist/chunk-26EFJQDW.mjs.map +1 -0
- package/dist/chunk-4NOF6TN6.js +51 -0
- package/dist/chunk-4NOF6TN6.js.map +1 -0
- package/dist/chunk-5DIRYAYO.js +30 -0
- package/dist/chunk-5DIRYAYO.js.map +1 -0
- package/dist/chunk-5RKYO2Y5.js +33 -0
- package/dist/chunk-5RKYO2Y5.js.map +1 -0
- package/dist/chunk-6GHFAQ54.mjs +44 -0
- package/dist/chunk-6GHFAQ54.mjs.map +1 -0
- package/dist/chunk-A7NJQLUA.mjs +32 -0
- package/dist/chunk-A7NJQLUA.mjs.map +1 -0
- package/dist/chunk-AJFPA6MI.js +81 -0
- package/dist/chunk-AJFPA6MI.js.map +1 -0
- package/dist/chunk-AQNACKO6.js +1 -0
- package/dist/chunk-AQNACKO6.js.map +1 -0
- package/dist/chunk-AZCRNZ5W.js +49 -0
- package/dist/chunk-AZCRNZ5W.js.map +1 -0
- package/dist/chunk-B3ASGNVQ.mjs +45 -0
- package/dist/chunk-B3ASGNVQ.mjs.map +1 -0
- package/dist/chunk-BE4YFFMX.js +49 -0
- package/dist/chunk-BE4YFFMX.js.map +1 -0
- package/dist/chunk-BOCIYCLE.mjs +30 -0
- package/dist/chunk-BOCIYCLE.mjs.map +1 -0
- package/dist/chunk-CCBKFCGG.js +147 -0
- package/dist/chunk-CCBKFCGG.js.map +1 -0
- package/dist/chunk-CINBMYIQ.mjs +183 -0
- package/dist/chunk-CINBMYIQ.mjs.map +1 -0
- package/dist/chunk-EBECHU6M.js +92 -0
- package/dist/chunk-EBECHU6M.js.map +1 -0
- package/dist/chunk-ETXAWW65.mjs +86 -0
- package/dist/chunk-ETXAWW65.mjs.map +1 -0
- package/dist/chunk-EXN2TFDJ.js +38 -0
- package/dist/chunk-EXN2TFDJ.js.map +1 -0
- package/dist/chunk-FNRATYYY.mjs +24 -0
- package/dist/chunk-FNRATYYY.mjs.map +1 -0
- package/dist/chunk-FQBU72MW.mjs +16 -0
- package/dist/chunk-FQBU72MW.mjs.map +1 -0
- package/dist/chunk-G3NCGVCC.mjs +33 -0
- package/dist/chunk-G3NCGVCC.mjs.map +1 -0
- package/dist/chunk-GH6FPDY5.mjs +147 -0
- package/dist/chunk-GH6FPDY5.mjs.map +1 -0
- package/dist/chunk-HSZIPZHO.js +183 -0
- package/dist/chunk-HSZIPZHO.js.map +1 -0
- package/dist/chunk-IU54VPNO.js +67 -0
- package/dist/chunk-IU54VPNO.js.map +1 -0
- package/dist/chunk-IXYNAYMQ.js +33 -0
- package/dist/chunk-IXYNAYMQ.js.map +1 -0
- package/dist/chunk-IY3CYGH7.js +44 -0
- package/dist/chunk-IY3CYGH7.js.map +1 -0
- package/dist/chunk-KQNKD7G5.mjs +40 -0
- package/dist/chunk-KQNKD7G5.mjs.map +1 -0
- package/dist/chunk-KWFB2KH2.mjs +73 -0
- package/dist/chunk-KWFB2KH2.mjs.map +1 -0
- package/dist/chunk-L4G6IIWG.js +484 -0
- package/dist/chunk-L4G6IIWG.js.map +1 -0
- package/dist/chunk-L5U2LMZR.js +26 -0
- package/dist/chunk-L5U2LMZR.js.map +1 -0
- package/dist/chunk-LGC7HQR4.js +32 -0
- package/dist/chunk-LGC7HQR4.js.map +1 -0
- package/dist/chunk-LX5LQXYU.js +16 -0
- package/dist/chunk-LX5LQXYU.js.map +1 -0
- package/dist/chunk-M2OYI2NS.js +108 -0
- package/dist/chunk-M2OYI2NS.js.map +1 -0
- package/dist/chunk-MOWPAP2K.mjs +92 -0
- package/dist/chunk-MOWPAP2K.mjs.map +1 -0
- package/dist/chunk-N7URTBJV.js +73 -0
- package/dist/chunk-N7URTBJV.js.map +1 -0
- package/dist/chunk-OW4IXJ5J.mjs +484 -0
- package/dist/chunk-OW4IXJ5J.mjs.map +1 -0
- package/dist/chunk-OWG545LQ.js +45 -0
- package/dist/chunk-OWG545LQ.js.map +1 -0
- package/dist/chunk-QYFJ2LLW.js +86 -0
- package/dist/chunk-QYFJ2LLW.js.map +1 -0
- package/dist/chunk-RCPCISJD.mjs +16 -0
- package/dist/chunk-RCPCISJD.mjs.map +1 -0
- package/dist/chunk-RDFGQYG6.mjs +147 -0
- package/dist/chunk-RDFGQYG6.mjs.map +1 -0
- package/dist/chunk-RO347OMD.js +16 -0
- package/dist/chunk-RO347OMD.js.map +1 -0
- package/dist/chunk-RWBJNNGH.js +24 -0
- package/dist/chunk-RWBJNNGH.js.map +1 -0
- package/dist/chunk-S7LRB72P.js +38 -0
- package/dist/chunk-S7LRB72P.js.map +1 -0
- package/dist/chunk-SWINKAMI.js +147 -0
- package/dist/chunk-SWINKAMI.js.map +1 -0
- package/dist/chunk-TVV27HGP.mjs +81 -0
- package/dist/chunk-TVV27HGP.mjs.map +1 -0
- package/dist/chunk-TWF4RAXL.mjs +49 -0
- package/dist/chunk-TWF4RAXL.mjs.map +1 -0
- package/dist/chunk-VL3VNUT4.mjs +12 -0
- package/dist/chunk-VL3VNUT4.mjs.map +1 -0
- package/dist/chunk-VZS2LXDP.mjs +108 -0
- package/dist/chunk-VZS2LXDP.mjs.map +1 -0
- package/dist/chunk-WA7K3P4D.js +40 -0
- package/dist/chunk-WA7K3P4D.js.map +1 -0
- package/dist/chunk-XBKAIK2K.mjs +67 -0
- package/dist/chunk-XBKAIK2K.mjs.map +1 -0
- package/dist/chunk-XGCWN6ZD.mjs +262 -0
- package/dist/chunk-XGCWN6ZD.mjs.map +1 -0
- package/dist/chunk-XKY46YTJ.js +12 -0
- package/dist/chunk-XKY46YTJ.js.map +1 -0
- package/dist/chunk-XL5BQOEI.mjs +33 -0
- package/dist/chunk-XL5BQOEI.mjs.map +1 -0
- package/dist/chunk-XMCETCVM.js +48 -0
- package/dist/chunk-XMCETCVM.js.map +1 -0
- package/dist/chunk-XYRWHY3K.mjs +51 -0
- package/dist/chunk-XYRWHY3K.mjs.map +1 -0
- package/dist/chunk-Y7IEFWZU.mjs +26 -0
- package/dist/chunk-Y7IEFWZU.mjs.map +1 -0
- package/dist/chunk-YC3HWHJV.mjs +48 -0
- package/dist/chunk-YC3HWHJV.mjs.map +1 -0
- package/dist/chunk-YMAK7TUO.mjs +1 -0
- package/dist/chunk-YMAK7TUO.mjs.map +1 -0
- package/dist/chunk-YRZVIDCF.mjs +38 -0
- package/dist/chunk-YRZVIDCF.mjs.map +1 -0
- package/dist/chunk-Z7FBBBME.mjs +38 -0
- package/dist/chunk-Z7FBBBME.mjs.map +1 -0
- package/dist/chunk-ZMDJRC2Z.js +262 -0
- package/dist/chunk-ZMDJRC2Z.js.map +1 -0
- package/dist/common/BaseSnapExecutor.js +26 -0
- package/dist/common/BaseSnapExecutor.js.map +1 -0
- package/dist/common/BaseSnapExecutor.mjs +26 -0
- package/dist/common/BaseSnapExecutor.mjs.map +1 -0
- package/dist/common/commands.js +11 -0
- package/dist/common/commands.js.map +1 -0
- package/dist/common/commands.mjs +11 -0
- package/dist/common/commands.mjs.map +1 -0
- package/dist/common/endowments/commonEndowmentFactory.js +20 -0
- package/dist/common/endowments/commonEndowmentFactory.js.map +1 -0
- package/dist/common/endowments/commonEndowmentFactory.mjs +20 -0
- package/dist/common/endowments/commonEndowmentFactory.mjs.map +1 -0
- package/dist/common/endowments/console.js +13 -0
- package/dist/common/endowments/console.js.map +1 -0
- package/dist/common/endowments/console.mjs +13 -0
- package/dist/common/endowments/console.mjs.map +1 -0
- package/dist/common/endowments/crypto.js +11 -0
- package/dist/common/endowments/crypto.js.map +1 -0
- package/dist/common/endowments/crypto.mjs +11 -0
- package/dist/common/endowments/crypto.mjs.map +1 -0
- package/dist/common/endowments/date.js +9 -0
- package/dist/common/endowments/date.js.map +1 -0
- package/dist/common/endowments/date.mjs +9 -0
- package/dist/common/endowments/date.mjs.map +1 -0
- package/dist/common/endowments/index.js +21 -0
- package/dist/common/endowments/index.js.map +1 -0
- package/dist/common/endowments/index.mjs +21 -0
- package/dist/common/endowments/index.mjs.map +1 -0
- package/dist/common/endowments/interval.js +8 -0
- package/dist/common/endowments/interval.js.map +1 -0
- package/dist/common/endowments/interval.mjs +8 -0
- package/dist/common/endowments/interval.mjs.map +1 -0
- package/dist/common/endowments/math.js +10 -0
- package/dist/common/endowments/math.js.map +1 -0
- package/dist/common/endowments/math.mjs +10 -0
- package/dist/common/endowments/math.mjs.map +1 -0
- package/dist/common/endowments/network.js +10 -0
- package/dist/common/endowments/network.js.map +1 -0
- package/dist/common/endowments/network.mjs +10 -0
- package/dist/common/endowments/network.mjs.map +1 -0
- package/dist/common/endowments/textDecoder.js +8 -0
- package/dist/common/endowments/textDecoder.js.map +1 -0
- package/dist/common/endowments/textDecoder.mjs +8 -0
- package/dist/common/endowments/textDecoder.mjs.map +1 -0
- package/dist/common/endowments/textEncoder.js +8 -0
- package/dist/common/endowments/textEncoder.js.map +1 -0
- package/dist/common/endowments/textEncoder.mjs +8 -0
- package/dist/common/endowments/textEncoder.mjs.map +1 -0
- package/dist/common/endowments/timeout.js +8 -0
- package/dist/common/endowments/timeout.js.map +1 -0
- package/dist/common/endowments/timeout.mjs +8 -0
- package/dist/common/endowments/timeout.mjs.map +1 -0
- package/dist/common/globalEvents.js +11 -0
- package/dist/common/globalEvents.js.map +1 -0
- package/dist/common/globalEvents.mjs +11 -0
- package/dist/common/globalEvents.mjs.map +1 -0
- package/dist/common/globalObject.js +10 -0
- package/dist/common/globalObject.js.map +1 -0
- package/dist/common/globalObject.mjs +10 -0
- package/dist/common/globalObject.mjs.map +1 -0
- package/dist/common/lockdown/lockdown-events.js +8 -0
- package/dist/common/lockdown/lockdown-events.js.map +1 -0
- package/dist/common/lockdown/lockdown-events.mjs +8 -0
- package/dist/common/lockdown/lockdown-events.mjs.map +1 -0
- package/dist/common/lockdown/lockdown-more.js +8 -0
- package/dist/common/lockdown/lockdown-more.js.map +1 -0
- package/dist/common/lockdown/lockdown-more.mjs +8 -0
- package/dist/common/lockdown/lockdown-more.mjs.map +1 -0
- package/dist/common/lockdown/lockdown.js +22 -0
- package/dist/common/lockdown/lockdown.js.map +1 -0
- package/dist/common/lockdown/lockdown.mjs +22 -0
- package/dist/common/lockdown/lockdown.mjs.map +1 -0
- package/dist/common/sortParams.js +8 -0
- package/dist/common/sortParams.js.map +1 -0
- package/dist/common/sortParams.mjs +8 -0
- package/dist/common/sortParams.mjs.map +1 -0
- package/dist/common/utils.js +21 -0
- package/dist/common/utils.js.map +1 -0
- package/dist/common/utils.mjs +21 -0
- package/dist/common/utils.mjs.map +1 -0
- package/dist/common/validation.js +38 -0
- package/dist/common/validation.js.map +1 -0
- package/dist/common/validation.mjs +38 -0
- package/dist/common/validation.mjs.map +1 -0
- package/dist/globals.d.js +1 -0
- package/dist/globals.d.js.map +1 -0
- package/dist/globals.d.mjs +1 -0
- package/dist/globals.d.mjs.map +1 -0
- package/dist/iframe/IFrameSnapExecutor.js +27 -0
- package/dist/iframe/IFrameSnapExecutor.js.map +1 -0
- package/dist/iframe/IFrameSnapExecutor.mjs +27 -0
- package/dist/iframe/IFrameSnapExecutor.mjs.map +1 -0
- package/dist/iframe/index.js +35 -0
- package/dist/iframe/index.js.map +1 -0
- package/dist/iframe/index.mjs +35 -0
- package/dist/iframe/index.mjs.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +9 -0
- package/dist/index.mjs.map +1 -0
- package/dist/logging.js +8 -0
- package/dist/logging.js.map +1 -0
- package/dist/logging.mjs +8 -0
- package/dist/logging.mjs.map +1 -0
- package/dist/node-process/ChildProcessSnapExecutor.js +27 -0
- package/dist/node-process/ChildProcessSnapExecutor.js.map +1 -0
- package/dist/node-process/ChildProcessSnapExecutor.mjs +27 -0
- package/dist/node-process/ChildProcessSnapExecutor.mjs.map +1 -0
- package/dist/node-process/index.js +31 -0
- package/dist/node-process/index.js.map +1 -0
- package/dist/node-process/index.mjs +31 -0
- package/dist/node-process/index.mjs.map +1 -0
- package/dist/node-thread/ThreadSnapExecutor.js +27 -0
- package/dist/node-thread/ThreadSnapExecutor.js.map +1 -0
- package/dist/node-thread/ThreadSnapExecutor.mjs +27 -0
- package/dist/node-thread/ThreadSnapExecutor.mjs.map +1 -0
- package/dist/node-thread/index.js +31 -0
- package/dist/node-thread/index.js.map +1 -0
- package/dist/node-thread/index.mjs +31 -0
- package/dist/node-thread/index.mjs.map +1 -0
- package/dist/proxy/ProxySnapExecutor.js +8 -0
- package/dist/proxy/ProxySnapExecutor.js.map +1 -0
- package/dist/proxy/ProxySnapExecutor.mjs +8 -0
- package/dist/proxy/ProxySnapExecutor.mjs.map +1 -0
- package/dist/proxy/index.js +9 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/index.mjs +9 -0
- package/dist/proxy/index.mjs.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/types/common/utils.d.ts +7 -0
- package/dist/types/vendor/global.d.js +1 -0
- package/dist/types/vendor/global.d.js.map +1 -0
- package/dist/types/vendor/global.d.mjs +1 -0
- package/dist/types/vendor/global.d.mjs.map +1 -0
- package/dist/types/vendor/readable-stream.d.js +1 -0
- package/dist/types/vendor/readable-stream.d.js.map +1 -0
- package/dist/types/vendor/readable-stream.d.mjs +1 -0
- package/dist/types/vendor/readable-stream.d.mjs.map +1 -0
- package/dist/webview/WebViewExecutorStream.js +8 -0
- package/dist/webview/WebViewExecutorStream.js.map +1 -0
- package/dist/webview/WebViewExecutorStream.mjs +8 -0
- package/dist/webview/WebViewExecutorStream.mjs.map +1 -0
- package/dist/webview/index.js +26 -0
- package/dist/webview/index.js.map +1 -0
- package/dist/webview/index.mjs +26 -0
- package/dist/webview/index.mjs.map +1 -0
- package/dist/webworker/executor/WebWorkerSnapExecutor.js +27 -0
- package/dist/webworker/executor/WebWorkerSnapExecutor.js.map +1 -0
- package/dist/webworker/executor/WebWorkerSnapExecutor.mjs +27 -0
- package/dist/webworker/executor/WebWorkerSnapExecutor.mjs.map +1 -0
- package/dist/webworker/executor/index.js +35 -0
- package/dist/webworker/executor/index.js.map +1 -0
- package/dist/webworker/executor/index.mjs +35 -0
- package/dist/webworker/executor/index.mjs.map +1 -0
- package/dist/webworker/pool/WebWorkerPool.js +8 -0
- package/dist/webworker/pool/WebWorkerPool.js.map +1 -0
- package/dist/webworker/pool/WebWorkerPool.mjs +8 -0
- package/dist/webworker/pool/WebWorkerPool.mjs.map +1 -0
- package/dist/webworker/pool/index.js +16 -0
- package/dist/webworker/pool/index.js.map +1 -0
- package/dist/webworker/pool/index.mjs +16 -0
- package/dist/webworker/pool/index.mjs.map +1 -0
- package/package.json +29 -22
- package/dist/cjs/common/BaseSnapExecutor.js +0 -496
- package/dist/cjs/common/BaseSnapExecutor.js.map +0 -1
- package/dist/cjs/common/commands.js +0 -102
- package/dist/cjs/common/commands.js.map +0 -1
- package/dist/cjs/common/endowments/commonEndowmentFactory.js +0 -147
- package/dist/cjs/common/endowments/commonEndowmentFactory.js.map +0 -1
- package/dist/cjs/common/endowments/console.js +0 -134
- package/dist/cjs/common/endowments/console.js.map +0 -1
- package/dist/cjs/common/endowments/crypto.js +0 -44
- package/dist/cjs/common/endowments/crypto.js.map +0 -1
- package/dist/cjs/common/endowments/date.js +0 -53
- package/dist/cjs/common/endowments/date.js.map +0 -1
- package/dist/cjs/common/endowments/index.js +0 -93
- package/dist/cjs/common/endowments/index.js.map +0 -1
- package/dist/cjs/common/endowments/interval.js +0 -62
- package/dist/cjs/common/endowments/interval.js.map +0 -1
- package/dist/cjs/common/endowments/math.js +0 -67
- package/dist/cjs/common/endowments/math.js.map +0 -1
- package/dist/cjs/common/endowments/network.js +0 -303
- package/dist/cjs/common/endowments/network.js.map +0 -1
- package/dist/cjs/common/endowments/textDecoder.js +0 -28
- package/dist/cjs/common/endowments/textDecoder.js.map +0 -1
- package/dist/cjs/common/endowments/textEncoder.js +0 -28
- package/dist/cjs/common/endowments/textEncoder.js.map +0 -1
- package/dist/cjs/common/endowments/timeout.js +0 -64
- package/dist/cjs/common/endowments/timeout.js.map +0 -1
- package/dist/cjs/common/globalEvents.js +0 -40
- package/dist/cjs/common/globalEvents.js.map +0 -1
- package/dist/cjs/common/globalObject.js +0 -53
- package/dist/cjs/common/globalObject.js.map +0 -1
- package/dist/cjs/common/lockdown/lockdown-events.js +0 -74
- package/dist/cjs/common/lockdown/lockdown-events.js.map +0 -1
- package/dist/cjs/common/lockdown/lockdown-more.js +0 -73
- package/dist/cjs/common/lockdown/lockdown-more.js.map +0 -1
- package/dist/cjs/common/lockdown/lockdown.js +0 -30
- package/dist/cjs/common/lockdown/lockdown.js.map +0 -1
- package/dist/cjs/common/sortParams.js +0 -26
- package/dist/cjs/common/sortParams.js.map +0 -1
- package/dist/cjs/common/utils.js +0 -128
- package/dist/cjs/common/utils.js.map +0 -1
- package/dist/cjs/common/validation.js +0 -149
- package/dist/cjs/common/validation.js.map +0 -1
- package/dist/cjs/iframe/IFrameSnapExecutor.js +0 -50
- package/dist/cjs/iframe/IFrameSnapExecutor.js.map +0 -1
- package/dist/cjs/iframe/index.js +0 -13
- package/dist/cjs/iframe/index.js.map +0 -1
- package/dist/cjs/index.js +0 -20
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/logging.js +0 -15
- package/dist/cjs/logging.js.map +0 -1
- package/dist/cjs/node-process/ChildProcessSnapExecutor.js +0 -39
- package/dist/cjs/node-process/ChildProcessSnapExecutor.js.map +0 -1
- package/dist/cjs/node-process/index.js +0 -11
- package/dist/cjs/node-process/index.js.map +0 -1
- package/dist/cjs/node-thread/ThreadSnapExecutor.js +0 -39
- package/dist/cjs/node-thread/ThreadSnapExecutor.js.map +0 -1
- package/dist/cjs/node-thread/index.js +0 -11
- package/dist/cjs/node-thread/index.js.map +0 -1
- package/dist/cjs/proxy/ProxySnapExecutor.js +0 -183
- package/dist/cjs/proxy/ProxySnapExecutor.js.map +0 -1
- package/dist/cjs/proxy/index.js +0 -20
- package/dist/cjs/proxy/index.js.map +0 -1
- package/dist/cjs/webview/WebViewExecutorStream.js +0 -121
- package/dist/cjs/webview/WebViewExecutorStream.js.map +0 -1
- package/dist/cjs/webview/index.js +0 -19
- package/dist/cjs/webview/index.js.map +0 -1
- package/dist/cjs/webworker/executor/WebWorkerSnapExecutor.js +0 -45
- package/dist/cjs/webworker/executor/WebWorkerSnapExecutor.js.map +0 -1
- package/dist/cjs/webworker/executor/index.js +0 -13
- package/dist/cjs/webworker/executor/index.js.map +0 -1
- package/dist/cjs/webworker/pool/WebWorkerPool.js +0 -248
- package/dist/cjs/webworker/pool/WebWorkerPool.js.map +0 -1
- package/dist/cjs/webworker/pool/index.js +0 -13
- package/dist/cjs/webworker/pool/index.js.map +0 -1
- package/dist/esm/common/BaseSnapExecutor.js +0 -486
- package/dist/esm/common/BaseSnapExecutor.js.map +0 -1
- package/dist/esm/common/commands.js +0 -101
- package/dist/esm/common/commands.js.map +0 -1
- package/dist/esm/common/endowments/commonEndowmentFactory.js +0 -132
- package/dist/esm/common/endowments/commonEndowmentFactory.js.map +0 -1
- package/dist/esm/common/endowments/console.js +0 -116
- package/dist/esm/common/endowments/console.js.map +0 -1
- package/dist/esm/common/endowments/crypto.js +0 -26
- package/dist/esm/common/endowments/crypto.js.map +0 -1
- package/dist/esm/common/endowments/date.js +0 -43
- package/dist/esm/common/endowments/date.js.map +0 -1
- package/dist/esm/common/endowments/index.js +0 -92
- package/dist/esm/common/endowments/index.js.map +0 -1
- package/dist/esm/common/endowments/interval.js +0 -52
- package/dist/esm/common/endowments/interval.js.map +0 -1
- package/dist/esm/common/endowments/math.js +0 -57
- package/dist/esm/common/endowments/math.js.map +0 -1
- package/dist/esm/common/endowments/network.js +0 -293
- package/dist/esm/common/endowments/network.js.map +0 -1
- package/dist/esm/common/endowments/textDecoder.js +0 -18
- package/dist/esm/common/endowments/textDecoder.js.map +0 -1
- package/dist/esm/common/endowments/textEncoder.js +0 -18
- package/dist/esm/common/endowments/textEncoder.js.map +0 -1
- package/dist/esm/common/endowments/timeout.js +0 -54
- package/dist/esm/common/endowments/timeout.js.map +0 -1
- package/dist/esm/common/globalEvents.js +0 -36
- package/dist/esm/common/globalEvents.js.map +0 -1
- package/dist/esm/common/globalObject.js +0 -36
- package/dist/esm/common/globalObject.js.map +0 -1
- package/dist/esm/common/lockdown/lockdown-events.js +0 -66
- package/dist/esm/common/lockdown/lockdown-events.js.map +0 -1
- package/dist/esm/common/lockdown/lockdown-more.js +0 -82
- package/dist/esm/common/lockdown/lockdown-more.js.map +0 -1
- package/dist/esm/common/lockdown/lockdown.js +0 -24
- package/dist/esm/common/lockdown/lockdown.js.map +0 -1
- package/dist/esm/common/sortParams.js +0 -29
- package/dist/esm/common/sortParams.js.map +0 -1
- package/dist/esm/common/utils.js +0 -128
- package/dist/esm/common/utils.js.map +0 -1
- package/dist/esm/common/validation.js +0 -127
- package/dist/esm/common/validation.js.map +0 -1
- package/dist/esm/iframe/IFrameSnapExecutor.js +0 -35
- package/dist/esm/iframe/IFrameSnapExecutor.js.map +0 -1
- package/dist/esm/iframe/index.js +0 -9
- package/dist/esm/iframe/index.js.map +0 -1
- package/dist/esm/index.js +0 -3
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/logging.js +0 -10
- package/dist/esm/logging.js.map +0 -1
- package/dist/esm/node-process/ChildProcessSnapExecutor.js +0 -24
- package/dist/esm/node-process/ChildProcessSnapExecutor.js.map +0 -1
- package/dist/esm/node-process/index.js +0 -7
- package/dist/esm/node-process/index.js.map +0 -1
- package/dist/esm/node-thread/ThreadSnapExecutor.js +0 -24
- package/dist/esm/node-thread/ThreadSnapExecutor.js.map +0 -1
- package/dist/esm/node-thread/index.js +0 -7
- package/dist/esm/node-thread/index.js.map +0 -1
- package/dist/esm/proxy/ProxySnapExecutor.js +0 -181
- package/dist/esm/proxy/ProxySnapExecutor.js.map +0 -1
- package/dist/esm/proxy/index.js +0 -3
- package/dist/esm/proxy/index.js.map +0 -1
- package/dist/esm/webview/WebViewExecutorStream.js +0 -111
- package/dist/esm/webview/WebViewExecutorStream.js.map +0 -1
- package/dist/esm/webview/index.js +0 -15
- package/dist/esm/webview/index.js.map +0 -1
- package/dist/esm/webworker/executor/WebWorkerSnapExecutor.js +0 -30
- package/dist/esm/webworker/executor/WebWorkerSnapExecutor.js.map +0 -1
- package/dist/esm/webworker/executor/index.js +0 -9
- package/dist/esm/webworker/executor/index.js.map +0 -1
- package/dist/esm/webworker/pool/WebWorkerPool.js +0 -245
- package/dist/esm/webworker/pool/WebWorkerPool.js.map +0 -1
- package/dist/esm/webworker/pool/index.js +0 -9
- package/dist/esm/webworker/pool/index.js.map +0 -1
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__privateAdd,
|
|
3
|
+
__privateGet,
|
|
4
|
+
__privateMethod,
|
|
5
|
+
__privateSet
|
|
6
|
+
} from "./chunk-YRZVIDCF.mjs";
|
|
7
|
+
|
|
8
|
+
// src/proxy/ProxySnapExecutor.ts
|
|
9
|
+
import { WindowPostMessageStream } from "@metamask/post-message-stream";
|
|
10
|
+
import packageJson from "@metamask/snaps-execution-environments/package.json";
|
|
11
|
+
import { createWindow, logError } from "@metamask/snaps-utils";
|
|
12
|
+
import { assert } from "@metamask/utils";
|
|
13
|
+
var IFRAME_URL = `https://execution.metamask.io/iframe/${packageJson.version}/index.html`;
|
|
14
|
+
var _stream, _frameUrl, _onData, onData_fn, _initializeJob, initializeJob_fn, _terminateJob, terminateJob_fn;
|
|
15
|
+
var _ProxySnapExecutor = class _ProxySnapExecutor {
|
|
16
|
+
constructor(stream, frameUrl) {
|
|
17
|
+
/**
|
|
18
|
+
* Handle an incoming message from a `ProxyExecutionService`. This
|
|
19
|
+
* assumes that the message contains a `jobId` property, and a JSON-RPC
|
|
20
|
+
* request in the `data` property.
|
|
21
|
+
*
|
|
22
|
+
* @param data - The message data.
|
|
23
|
+
* @param data.data - The JSON-RPC request.
|
|
24
|
+
* @param data.jobId - The job ID.
|
|
25
|
+
*/
|
|
26
|
+
__privateAdd(this, _onData);
|
|
27
|
+
/**
|
|
28
|
+
* Create a new iframe and set up a stream to communicate with it.
|
|
29
|
+
*
|
|
30
|
+
* @param jobId - The job ID.
|
|
31
|
+
*/
|
|
32
|
+
__privateAdd(this, _initializeJob);
|
|
33
|
+
/**
|
|
34
|
+
* Terminate the job with the given ID. This will close the iframe and delete
|
|
35
|
+
* the job from the internal job map.
|
|
36
|
+
*
|
|
37
|
+
* @param jobId - The job ID.
|
|
38
|
+
*/
|
|
39
|
+
__privateAdd(this, _terminateJob);
|
|
40
|
+
__privateAdd(this, _stream, void 0);
|
|
41
|
+
__privateAdd(this, _frameUrl, void 0);
|
|
42
|
+
this.jobs = {};
|
|
43
|
+
__privateSet(this, _stream, stream);
|
|
44
|
+
__privateGet(this, _stream).on("data", __privateMethod(this, _onData, onData_fn).bind(this));
|
|
45
|
+
__privateSet(this, _frameUrl, frameUrl);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Initialize the executor with the given stream. This is a wrapper around the
|
|
49
|
+
* constructor.
|
|
50
|
+
*
|
|
51
|
+
* @param stream - The stream to use for communication.
|
|
52
|
+
* @param frameUrl - An optional URL for the iframe to use.
|
|
53
|
+
* @returns The initialized executor.
|
|
54
|
+
*/
|
|
55
|
+
static initialize(stream, frameUrl = IFRAME_URL) {
|
|
56
|
+
return new _ProxySnapExecutor(stream, frameUrl);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
_stream = new WeakMap();
|
|
60
|
+
_frameUrl = new WeakMap();
|
|
61
|
+
_onData = new WeakSet();
|
|
62
|
+
onData_fn = function(data) {
|
|
63
|
+
const { jobId, data: request } = data;
|
|
64
|
+
if (!this.jobs[jobId]) {
|
|
65
|
+
__privateMethod(this, _initializeJob, initializeJob_fn).call(this, jobId).then(() => {
|
|
66
|
+
__privateMethod(this, _onData, onData_fn).call(this, data);
|
|
67
|
+
}).catch((error) => {
|
|
68
|
+
logError("[Worker] Error initializing job:", error);
|
|
69
|
+
});
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (request.method === "terminateJob") {
|
|
73
|
+
__privateMethod(this, _terminateJob, terminateJob_fn).call(this, jobId);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
this.jobs[jobId].stream.write(request);
|
|
77
|
+
};
|
|
78
|
+
_initializeJob = new WeakSet();
|
|
79
|
+
initializeJob_fn = async function(jobId) {
|
|
80
|
+
const window = await createWindow(__privateGet(this, _frameUrl), jobId);
|
|
81
|
+
const jobStream = new WindowPostMessageStream({
|
|
82
|
+
name: "parent",
|
|
83
|
+
target: "child",
|
|
84
|
+
targetWindow: window,
|
|
85
|
+
// iframe's internal window
|
|
86
|
+
targetOrigin: "*"
|
|
87
|
+
});
|
|
88
|
+
jobStream.on("data", (data) => {
|
|
89
|
+
__privateGet(this, _stream).write({ data, jobId });
|
|
90
|
+
});
|
|
91
|
+
this.jobs[jobId] = { id: jobId, window, stream: jobStream };
|
|
92
|
+
return this.jobs[jobId];
|
|
93
|
+
};
|
|
94
|
+
_terminateJob = new WeakSet();
|
|
95
|
+
terminateJob_fn = function(jobId) {
|
|
96
|
+
assert(this.jobs[jobId], `Job "${jobId}" not found.`);
|
|
97
|
+
const iframe = document.getElementById(jobId);
|
|
98
|
+
assert(iframe, `Iframe with ID "${jobId}" not found.`);
|
|
99
|
+
iframe.remove();
|
|
100
|
+
this.jobs[jobId].stream.destroy();
|
|
101
|
+
delete this.jobs[jobId];
|
|
102
|
+
};
|
|
103
|
+
var ProxySnapExecutor = _ProxySnapExecutor;
|
|
104
|
+
|
|
105
|
+
export {
|
|
106
|
+
ProxySnapExecutor
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=chunk-VZS2LXDP.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/proxy/ProxySnapExecutor.ts"],"sourcesContent":["import type { BasePostMessageStream } from '@metamask/post-message-stream';\nimport { WindowPostMessageStream } from '@metamask/post-message-stream';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport packageJson from '@metamask/snaps-execution-environments/package.json';\nimport { createWindow, logError } from '@metamask/snaps-utils';\nimport type { JsonRpcRequest } from '@metamask/utils';\nimport { assert } from '@metamask/utils';\n\ntype ExecutorJob = {\n id: string;\n window: Window;\n stream: WindowPostMessageStream;\n};\n\nconst IFRAME_URL = `https://execution.metamask.io/iframe/${packageJson.version}/index.html`;\n\n/**\n * A \"proxy\" snap executor that uses a level of indirection to execute snaps.\n *\n * Useful for multiple execution environments.\n *\n * This is not a traditional snap executor, as it does not execute snaps itself.\n * Instead, it creates an iframe window for each snap execution, and sends the\n * snap execution request to the iframe window. The iframe window is responsible\n * for executing the snap.\n *\n * This executor is persisted between snap executions. The executor essentially\n * acts as a proxy between the client and the iframe execution environment.\n */\nexport class ProxySnapExecutor {\n readonly #stream: BasePostMessageStream;\n\n readonly #frameUrl: string;\n\n readonly jobs: Record<string, ExecutorJob> = {};\n\n /**\n * Initialize the executor with the given stream. This is a wrapper around the\n * constructor.\n *\n * @param stream - The stream to use for communication.\n * @param frameUrl - An optional URL for the iframe to use.\n * @returns The initialized executor.\n */\n static initialize(stream: BasePostMessageStream, frameUrl = IFRAME_URL) {\n return new ProxySnapExecutor(stream, frameUrl);\n }\n\n constructor(stream: BasePostMessageStream, frameUrl: string) {\n this.#stream = stream;\n this.#stream.on('data', this.#onData.bind(this));\n this.#frameUrl = frameUrl;\n }\n\n /**\n * Handle an incoming message from a `ProxyExecutionService`. This\n * assumes that the message contains a `jobId` property, and a JSON-RPC\n * request in the `data` property.\n *\n * @param data - The message data.\n * @param data.data - The JSON-RPC request.\n * @param data.jobId - The job ID.\n */\n #onData(data: { data: JsonRpcRequest; jobId: string }) {\n const { jobId, data: request } = data;\n\n if (!this.jobs[jobId]) {\n // This ensures that a job is initialized before it is used. To avoid\n // code duplication, we call the `#onData` method again, which will\n // run the rest of the logic after initialization.\n this.#initializeJob(jobId)\n .then(() => {\n this.#onData(data);\n })\n .catch((error) => {\n logError('[Worker] Error initializing job:', error);\n });\n\n return;\n }\n\n // This is a method specific to the `OffscreenSnapExecutor`, as the service\n // itself does not have access to the iframes directly.\n if (request.method === 'terminateJob') {\n this.#terminateJob(jobId);\n return;\n }\n\n this.jobs[jobId].stream.write(request);\n }\n\n /**\n * Create a new iframe and set up a stream to communicate with it.\n *\n * @param jobId - The job ID.\n */\n async #initializeJob(jobId: string): Promise<ExecutorJob> {\n const window = await createWindow(this.#frameUrl, jobId);\n const jobStream = new WindowPostMessageStream({\n name: 'parent',\n target: 'child',\n targetWindow: window, // iframe's internal window\n targetOrigin: '*',\n });\n\n // Write messages from the iframe to the parent, wrapped with the job ID.\n jobStream.on('data', (data) => {\n this.#stream.write({ data, jobId });\n });\n\n this.jobs[jobId] = { id: jobId, window, stream: jobStream };\n return this.jobs[jobId];\n }\n\n /**\n * Terminate the job with the given ID. This will close the iframe and delete\n * the job from the internal job map.\n *\n * @param jobId - The job ID.\n */\n #terminateJob(jobId: string) {\n assert(this.jobs[jobId], `Job \"${jobId}\" not found.`);\n\n const iframe = document.getElementById(jobId);\n assert(iframe, `Iframe with ID \"${jobId}\" not found.`);\n\n iframe.remove();\n this.jobs[jobId].stream.destroy();\n delete this.jobs[jobId];\n }\n}\n"],"mappings":";;;;;;;;AACA,SAAS,+BAA+B;AAExC,OAAO,iBAAiB;AACxB,SAAS,cAAc,gBAAgB;AAEvC,SAAS,cAAc;AAQvB,IAAM,aAAa,wCAAwC,YAAY,OAAO;AAd9E;AA6BO,IAAM,qBAAN,MAAM,mBAAkB;AAAA,EAmB7B,YAAY,QAA+B,UAAkB;AAe7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAM;AAwBN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1FA,uBAAS,SAAT;AAEA,uBAAS,WAAT;AAEA,SAAS,OAAoC,CAAC;AAe5C,uBAAK,SAAU;AACf,uBAAK,SAAQ,GAAG,QAAQ,sBAAK,oBAAQ,KAAK,IAAI,CAAC;AAC/C,uBAAK,WAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EARA,OAAO,WAAW,QAA+B,WAAW,YAAY;AACtE,WAAO,IAAI,mBAAkB,QAAQ,QAAQ;AAAA,EAC/C;AAoFF;AApGW;AAEA;AA+BT;AAAA,YAAO,SAAC,MAA+C;AACrD,QAAM,EAAE,OAAO,MAAM,QAAQ,IAAI;AAEjC,MAAI,CAAC,KAAK,KAAK,KAAK,GAAG;AAIrB,0BAAK,kCAAL,WAAoB,OACjB,KAAK,MAAM;AACV,4BAAK,oBAAL,WAAa;AAAA,IACf,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,eAAS,oCAAoC,KAAK;AAAA,IACpD,CAAC;AAEH;AAAA,EACF;AAIA,MAAI,QAAQ,WAAW,gBAAgB;AACrC,0BAAK,gCAAL,WAAmB;AACnB;AAAA,EACF;AAEA,OAAK,KAAK,KAAK,EAAE,OAAO,MAAM,OAAO;AACvC;AAOM;AAAA,mBAAc,eAAC,OAAqC;AACxD,QAAM,SAAS,MAAM,aAAa,mBAAK,YAAW,KAAK;AACvD,QAAM,YAAY,IAAI,wBAAwB;AAAA,IAC5C,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,cAAc;AAAA;AAAA,IACd,cAAc;AAAA,EAChB,CAAC;AAGD,YAAU,GAAG,QAAQ,CAAC,SAAS;AAC7B,uBAAK,SAAQ,MAAM,EAAE,MAAM,MAAM,CAAC;AAAA,EACpC,CAAC;AAED,OAAK,KAAK,KAAK,IAAI,EAAE,IAAI,OAAO,QAAQ,QAAQ,UAAU;AAC1D,SAAO,KAAK,KAAK,KAAK;AACxB;AAQA;AAAA,kBAAa,SAAC,OAAe;AAC3B,SAAO,KAAK,KAAK,KAAK,GAAG,QAAQ,KAAK,cAAc;AAEpD,QAAM,SAAS,SAAS,eAAe,KAAK;AAC5C,SAAO,QAAQ,mBAAmB,KAAK,cAAc;AAErD,SAAO,OAAO;AACd,OAAK,KAAK,KAAK,EAAE,OAAO,QAAQ;AAChC,SAAO,KAAK,KAAK,KAAK;AACxB;AApGK,IAAM,oBAAN;","names":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
2
|
+
|
|
3
|
+
var _chunkL4G6IIWGjs = require('./chunk-L4G6IIWG.js');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _chunkXKY46YTJjs = require('./chunk-XKY46YTJ.js');
|
|
7
|
+
|
|
8
|
+
// src/webworker/executor/WebWorkerSnapExecutor.ts
|
|
9
|
+
var _objectmultiplex = require('@metamask/object-multiplex'); var _objectmultiplex2 = _interopRequireDefault(_objectmultiplex);
|
|
10
|
+
var _postmessagestream = require('@metamask/post-message-stream');
|
|
11
|
+
var _snapsutils = require('@metamask/snaps-utils');
|
|
12
|
+
var _readablestream = require('readable-stream');
|
|
13
|
+
var WebWorkerSnapExecutor = class _WebWorkerSnapExecutor extends _chunkL4G6IIWGjs.BaseSnapExecutor {
|
|
14
|
+
/**
|
|
15
|
+
* Initialize the WebWorkerSnapExecutor. This creates a post message stream
|
|
16
|
+
* from and to the parent window, for two-way communication with the iframe.
|
|
17
|
+
*
|
|
18
|
+
* @param stream - The stream to use for communication.
|
|
19
|
+
* @returns An instance of `WebWorkerSnapExecutor`, with the initialized post
|
|
20
|
+
* message streams.
|
|
21
|
+
*/
|
|
22
|
+
static initialize(stream = new (0, _postmessagestream.WebWorkerPostMessageStream)()) {
|
|
23
|
+
_chunkXKY46YTJjs.log.call(void 0, "Worker: Connecting to parent.");
|
|
24
|
+
const mux = new (0, _objectmultiplex2.default)();
|
|
25
|
+
_readablestream.pipeline.call(void 0, stream, mux, stream, (error) => {
|
|
26
|
+
if (error) {
|
|
27
|
+
_snapsutils.logError.call(void 0, `Parent stream failure, closing worker.`, error);
|
|
28
|
+
}
|
|
29
|
+
self.close();
|
|
30
|
+
});
|
|
31
|
+
const commandStream = mux.createStream(_snapsutils.SNAP_STREAM_NAMES.COMMAND);
|
|
32
|
+
const rpcStream = mux.createStream(_snapsutils.SNAP_STREAM_NAMES.JSON_RPC);
|
|
33
|
+
return new _WebWorkerSnapExecutor(commandStream, rpcStream);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
exports.WebWorkerSnapExecutor = WebWorkerSnapExecutor;
|
|
40
|
+
//# sourceMappingURL=chunk-WA7K3P4D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/webworker/executor/WebWorkerSnapExecutor.ts"],"names":[],"mappings":";;;;;;;;AAAA,OAAO,qBAAqB;AAE5B,SAAS,kCAAkC;AAC3C,SAAS,UAAU,yBAAyB;AAC5C,SAAS,gBAAgB;AAKlB,IAAM,wBAAN,MAAM,+BAA8B,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS1D,OAAO,WACL,SAAgC,IAAI,2BAA2B,GAC/D;AACA,QAAI,+BAA+B;AAEnC,UAAM,MAAM,IAAI,gBAAgB;AAChC,aAAS,QAAQ,KAAK,QAAQ,CAAC,UAAU;AACvC,UAAI,OAAO;AACT,iBAAS,0CAA0C,KAAK;AAAA,MAC1D;AACA,WAAK,MAAM;AAAA,IACb,CAAC;AAED,UAAM,gBAAgB,IAAI,aAAa,kBAAkB,OAAO;AAChE,UAAM,YAAY,IAAI,aAAa,kBAAkB,QAAQ;AAE7D,WAAO,IAAI,uBAAsB,eAAe,SAAS;AAAA,EAC3D;AACF","sourcesContent":["import ObjectMultiplex from '@metamask/object-multiplex';\nimport type { BasePostMessageStream } from '@metamask/post-message-stream';\nimport { WebWorkerPostMessageStream } from '@metamask/post-message-stream';\nimport { logError, SNAP_STREAM_NAMES } from '@metamask/snaps-utils';\nimport { pipeline } from 'readable-stream';\n\nimport { BaseSnapExecutor } from '../../common/BaseSnapExecutor';\nimport { log } from '../../logging';\n\nexport class WebWorkerSnapExecutor extends BaseSnapExecutor {\n /**\n * Initialize the WebWorkerSnapExecutor. This creates a post message stream\n * from and to the parent window, for two-way communication with the iframe.\n *\n * @param stream - The stream to use for communication.\n * @returns An instance of `WebWorkerSnapExecutor`, with the initialized post\n * message streams.\n */\n static initialize(\n stream: BasePostMessageStream = new WebWorkerPostMessageStream(),\n ) {\n log('Worker: Connecting to parent.');\n\n const mux = new ObjectMultiplex();\n pipeline(stream, mux, stream, (error) => {\n if (error) {\n logError(`Parent stream failure, closing worker.`, error);\n }\n self.close();\n });\n\n const commandStream = mux.createStream(SNAP_STREAM_NAMES.COMMAND);\n const rpcStream = mux.createStream(SNAP_STREAM_NAMES.JSON_RPC);\n\n return new WebWorkerSnapExecutor(commandStream, rpcStream);\n }\n}\n"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import {
|
|
2
|
+
commonEndowmentFactory_default
|
|
3
|
+
} from "./chunk-ETXAWW65.mjs";
|
|
4
|
+
import {
|
|
5
|
+
rootRealmGlobal
|
|
6
|
+
} from "./chunk-Y7IEFWZU.mjs";
|
|
7
|
+
|
|
8
|
+
// src/common/endowments/index.ts
|
|
9
|
+
import { rpcErrors } from "@metamask/rpc-errors";
|
|
10
|
+
import { logWarning } from "@metamask/snaps-utils";
|
|
11
|
+
import { hasProperty } from "@metamask/utils";
|
|
12
|
+
var registeredEndowments = commonEndowmentFactory_default();
|
|
13
|
+
var endowmentFactories = registeredEndowments.reduce((factories, builder) => {
|
|
14
|
+
builder.names.forEach((name) => {
|
|
15
|
+
factories.set(name, builder.factory);
|
|
16
|
+
});
|
|
17
|
+
return factories;
|
|
18
|
+
}, /* @__PURE__ */ new Map());
|
|
19
|
+
function createEndowments({
|
|
20
|
+
snap,
|
|
21
|
+
ethereum,
|
|
22
|
+
snapId,
|
|
23
|
+
endowments,
|
|
24
|
+
notify
|
|
25
|
+
}) {
|
|
26
|
+
const attenuatedEndowments = {};
|
|
27
|
+
const result = endowments.reduce(
|
|
28
|
+
({ allEndowments, teardowns }, endowmentName) => {
|
|
29
|
+
if (endowmentFactories.has(endowmentName)) {
|
|
30
|
+
if (!hasProperty(attenuatedEndowments, endowmentName)) {
|
|
31
|
+
const { teardownFunction, ...endowment } = endowmentFactories.get(
|
|
32
|
+
endowmentName
|
|
33
|
+
)({ snapId, notify });
|
|
34
|
+
Object.assign(attenuatedEndowments, endowment);
|
|
35
|
+
if (teardownFunction) {
|
|
36
|
+
teardowns.push(teardownFunction);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
allEndowments[endowmentName] = attenuatedEndowments[endowmentName];
|
|
40
|
+
} else if (endowmentName === "ethereum") {
|
|
41
|
+
allEndowments[endowmentName] = ethereum;
|
|
42
|
+
} else if (endowmentName in rootRealmGlobal) {
|
|
43
|
+
logWarning(`Access to unhardened global ${endowmentName}.`);
|
|
44
|
+
const globalValue = rootRealmGlobal[endowmentName];
|
|
45
|
+
allEndowments[endowmentName] = globalValue;
|
|
46
|
+
} else {
|
|
47
|
+
throw rpcErrors.internal(`Unknown endowment: "${endowmentName}".`);
|
|
48
|
+
}
|
|
49
|
+
return { allEndowments, teardowns };
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
allEndowments: { snap },
|
|
53
|
+
teardowns: []
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
const teardown = async () => {
|
|
57
|
+
await Promise.all(
|
|
58
|
+
result.teardowns.map((teardownFunction) => teardownFunction())
|
|
59
|
+
);
|
|
60
|
+
};
|
|
61
|
+
return { endowments: result.allEndowments, teardown };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export {
|
|
65
|
+
createEndowments
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=chunk-XBKAIK2K.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/common/endowments/index.ts"],"sourcesContent":["import type { StreamProvider } from '@metamask/providers';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type { SnapsProvider } from '@metamask/snaps-sdk';\nimport { logWarning } from '@metamask/snaps-utils';\nimport { hasProperty } from '@metamask/utils';\n\nimport type { NotifyFunction } from '../BaseSnapExecutor';\nimport { rootRealmGlobal } from '../globalObject';\nimport type { EndowmentFactoryOptions } from './commonEndowmentFactory';\nimport buildCommonEndowments from './commonEndowmentFactory';\n\ntype EndowmentFactoryResult = {\n /**\n * A function that performs any necessary teardown when the snap becomes idle.\n *\n * NOTE:** The endowments are not reconstructed if the snap is re-invoked\n * before being terminated, so the teardown operation must not render the\n * endowments unusable; it should simply restore the endowments to their\n * original state.\n */\n teardownFunction?: () => Promise<void> | void;\n [key: string]: unknown;\n};\n\n/**\n * Retrieve consolidated endowment factories for common endowments.\n */\nconst registeredEndowments = buildCommonEndowments();\n\n/**\n * A map of endowment names to their factory functions. Some endowments share\n * the same factory function, but we only call each factory once for each snap.\n * See {@link createEndowments} for details.\n */\nconst endowmentFactories = registeredEndowments.reduce((factories, builder) => {\n builder.names.forEach((name) => {\n factories.set(name, builder.factory);\n });\n return factories;\n}, new Map<string, (options?: EndowmentFactoryOptions) => EndowmentFactoryResult>());\n\n/**\n * Gets the endowments for a particular Snap. Some endowments, like `setTimeout`\n * and `clearTimeout`, must be attenuated so that they can only affect behavior\n * within the Snap's own realm. Therefore, we use factory functions to create\n * such attenuated / modified endowments. Otherwise, the value that's on the\n * root realm global will be used.\n *\n * @param options - An options bag.\n * @param options.snap - The Snaps global API object.\n * @param options.ethereum - The Snap's EIP-1193 provider object.\n * @param options.snapId - The id of the snap that will use the created endowments.\n * @param options.endowments - The list of endowments to provide to the snap.\n * @param options.notify - A reference to the notify function of the snap executor.\n * @returns An object containing the Snap's endowments.\n */\nexport function createEndowments({\n snap,\n ethereum,\n snapId,\n endowments,\n notify,\n}: {\n snap: SnapsProvider;\n ethereum: StreamProvider;\n snapId: string;\n endowments: string[];\n notify: NotifyFunction;\n}): { endowments: Record<string, unknown>; teardown: () => Promise<void> } {\n const attenuatedEndowments: Record<string, unknown> = {};\n\n // TODO: All endowments should be hardened to prevent covert communication\n // channels. Hardening the returned objects breaks tests elsewhere in the\n // monorepo, so further research is needed.\n const result = endowments.reduce<{\n allEndowments: Record<string, unknown>;\n teardowns: (() => Promise<void> | void)[];\n }>(\n ({ allEndowments, teardowns }, endowmentName) => {\n // First, check if the endowment has a factory, and default to that.\n if (endowmentFactories.has(endowmentName)) {\n if (!hasProperty(attenuatedEndowments, endowmentName)) {\n // Call the endowment factory for the current endowment. If the factory\n // creates multiple endowments, they will all be assigned to the\n // `attenuatedEndowments` object, but will only be passed on to the snap\n // if explicitly listed among its endowment.\n // This may not have an actual use case, but, safety first.\n\n // We just confirmed that endowmentFactories has the specified key.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const { teardownFunction, ...endowment } = endowmentFactories.get(\n endowmentName,\n )!({ snapId, notify });\n Object.assign(attenuatedEndowments, endowment);\n if (teardownFunction) {\n teardowns.push(teardownFunction);\n }\n }\n allEndowments[endowmentName] = attenuatedEndowments[endowmentName];\n } else if (endowmentName === 'ethereum') {\n // Special case for adding the EIP-1193 provider.\n allEndowments[endowmentName] = ethereum;\n } else if (endowmentName in rootRealmGlobal) {\n logWarning(`Access to unhardened global ${endowmentName}.`);\n // If the endowment doesn't have a factory, just use whatever is on the\n // global object.\n const globalValue = (rootRealmGlobal as Record<string, unknown>)[\n endowmentName\n ];\n allEndowments[endowmentName] = globalValue;\n } else {\n // If we get to this point, we've been passed an endowment that doesn't\n // exist in our current environment.\n throw rpcErrors.internal(`Unknown endowment: \"${endowmentName}\".`);\n }\n return { allEndowments, teardowns };\n },\n {\n allEndowments: { snap },\n teardowns: [],\n },\n );\n\n const teardown = async () => {\n await Promise.all(\n result.teardowns.map((teardownFunction) => teardownFunction()),\n );\n };\n return { endowments: result.allEndowments, teardown };\n}\n"],"mappings":";;;;;;;;AACA,SAAS,iBAAiB;AAE1B,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAuB5B,IAAM,uBAAuB,+BAAsB;AAOnD,IAAM,qBAAqB,qBAAqB,OAAO,CAAC,WAAW,YAAY;AAC7E,UAAQ,MAAM,QAAQ,CAAC,SAAS;AAC9B,cAAU,IAAI,MAAM,QAAQ,OAAO;AAAA,EACrC,CAAC;AACD,SAAO;AACT,GAAG,oBAAI,IAA2E,CAAC;AAiB5E,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAM2E;AACzE,QAAM,uBAAgD,CAAC;AAKvD,QAAM,SAAS,WAAW;AAAA,IAIxB,CAAC,EAAE,eAAe,UAAU,GAAG,kBAAkB;AAE/C,UAAI,mBAAmB,IAAI,aAAa,GAAG;AACzC,YAAI,CAAC,YAAY,sBAAsB,aAAa,GAAG;AASrD,gBAAM,EAAE,kBAAkB,GAAG,UAAU,IAAI,mBAAmB;AAAA,YAC5D;AAAA,UACF,EAAG,EAAE,QAAQ,OAAO,CAAC;AACrB,iBAAO,OAAO,sBAAsB,SAAS;AAC7C,cAAI,kBAAkB;AACpB,sBAAU,KAAK,gBAAgB;AAAA,UACjC;AAAA,QACF;AACA,sBAAc,aAAa,IAAI,qBAAqB,aAAa;AAAA,MACnE,WAAW,kBAAkB,YAAY;AAEvC,sBAAc,aAAa,IAAI;AAAA,MACjC,WAAW,iBAAiB,iBAAiB;AAC3C,mBAAW,+BAA+B,aAAa,GAAG;AAG1D,cAAM,cAAe,gBACnB,aACF;AACA,sBAAc,aAAa,IAAI;AAAA,MACjC,OAAO;AAGL,cAAM,UAAU,SAAS,uBAAuB,aAAa,IAAI;AAAA,MACnE;AACA,aAAO,EAAE,eAAe,UAAU;AAAA,IACpC;AAAA,IACA;AAAA,MACE,eAAe,EAAE,KAAK;AAAA,MACtB,WAAW,CAAC;AAAA,IACd;AAAA,EACF;AAEA,QAAM,WAAW,YAAY;AAC3B,UAAM,QAAQ;AAAA,MACZ,OAAO,UAAU,IAAI,CAAC,qBAAqB,iBAAiB,CAAC;AAAA,IAC/D;AAAA,EACF;AACA,SAAO,EAAE,YAAY,OAAO,eAAe,SAAS;AACtD;","names":[]}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import {
|
|
2
|
+
withTeardown
|
|
3
|
+
} from "./chunk-GH6FPDY5.mjs";
|
|
4
|
+
import {
|
|
5
|
+
__privateAdd,
|
|
6
|
+
__privateGet,
|
|
7
|
+
__privateSet
|
|
8
|
+
} from "./chunk-YRZVIDCF.mjs";
|
|
9
|
+
|
|
10
|
+
// src/common/endowments/network.ts
|
|
11
|
+
import { assert } from "@metamask/utils";
|
|
12
|
+
var _teardownRef, _ogResponse, _onStart, _onFinish;
|
|
13
|
+
var _ResponseWrapper = class _ResponseWrapper {
|
|
14
|
+
constructor(ogResponse, teardownRef, onStart, onFinish) {
|
|
15
|
+
__privateAdd(this, _teardownRef, void 0);
|
|
16
|
+
__privateAdd(this, _ogResponse, void 0);
|
|
17
|
+
__privateAdd(this, _onStart, void 0);
|
|
18
|
+
__privateAdd(this, _onFinish, void 0);
|
|
19
|
+
__privateSet(this, _ogResponse, ogResponse);
|
|
20
|
+
__privateSet(this, _teardownRef, teardownRef);
|
|
21
|
+
__privateSet(this, _onStart, onStart);
|
|
22
|
+
__privateSet(this, _onFinish, onFinish);
|
|
23
|
+
}
|
|
24
|
+
get body() {
|
|
25
|
+
return __privateGet(this, _ogResponse).body;
|
|
26
|
+
}
|
|
27
|
+
get bodyUsed() {
|
|
28
|
+
return __privateGet(this, _ogResponse).bodyUsed;
|
|
29
|
+
}
|
|
30
|
+
get headers() {
|
|
31
|
+
return __privateGet(this, _ogResponse).headers;
|
|
32
|
+
}
|
|
33
|
+
get ok() {
|
|
34
|
+
return __privateGet(this, _ogResponse).ok;
|
|
35
|
+
}
|
|
36
|
+
get redirected() {
|
|
37
|
+
return __privateGet(this, _ogResponse).redirected;
|
|
38
|
+
}
|
|
39
|
+
get status() {
|
|
40
|
+
return __privateGet(this, _ogResponse).status;
|
|
41
|
+
}
|
|
42
|
+
get statusText() {
|
|
43
|
+
return __privateGet(this, _ogResponse).statusText;
|
|
44
|
+
}
|
|
45
|
+
get type() {
|
|
46
|
+
return __privateGet(this, _ogResponse).type;
|
|
47
|
+
}
|
|
48
|
+
get url() {
|
|
49
|
+
return __privateGet(this, _ogResponse).url;
|
|
50
|
+
}
|
|
51
|
+
async text() {
|
|
52
|
+
return await withTeardown(
|
|
53
|
+
(async () => {
|
|
54
|
+
await __privateGet(this, _onStart).call(this);
|
|
55
|
+
try {
|
|
56
|
+
return await __privateGet(this, _ogResponse).text();
|
|
57
|
+
} finally {
|
|
58
|
+
await __privateGet(this, _onFinish).call(this);
|
|
59
|
+
}
|
|
60
|
+
})(),
|
|
61
|
+
__privateGet(this, _teardownRef)
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
async arrayBuffer() {
|
|
65
|
+
return await withTeardown(
|
|
66
|
+
(async () => {
|
|
67
|
+
await __privateGet(this, _onStart).call(this);
|
|
68
|
+
try {
|
|
69
|
+
return await __privateGet(this, _ogResponse).arrayBuffer();
|
|
70
|
+
} finally {
|
|
71
|
+
await __privateGet(this, _onFinish).call(this);
|
|
72
|
+
}
|
|
73
|
+
})(),
|
|
74
|
+
__privateGet(this, _teardownRef)
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
async blob() {
|
|
78
|
+
return await withTeardown(
|
|
79
|
+
(async () => {
|
|
80
|
+
await __privateGet(this, _onStart).call(this);
|
|
81
|
+
try {
|
|
82
|
+
return await __privateGet(this, _ogResponse).blob();
|
|
83
|
+
} finally {
|
|
84
|
+
await __privateGet(this, _onFinish).call(this);
|
|
85
|
+
}
|
|
86
|
+
})(),
|
|
87
|
+
__privateGet(this, _teardownRef)
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
clone() {
|
|
91
|
+
const newResponse = __privateGet(this, _ogResponse).clone();
|
|
92
|
+
return new _ResponseWrapper(
|
|
93
|
+
newResponse,
|
|
94
|
+
__privateGet(this, _teardownRef),
|
|
95
|
+
__privateGet(this, _onStart),
|
|
96
|
+
__privateGet(this, _onFinish)
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
async formData() {
|
|
100
|
+
return await withTeardown(
|
|
101
|
+
(async () => {
|
|
102
|
+
await __privateGet(this, _onStart).call(this);
|
|
103
|
+
try {
|
|
104
|
+
return await __privateGet(this, _ogResponse).formData();
|
|
105
|
+
} finally {
|
|
106
|
+
await __privateGet(this, _onFinish).call(this);
|
|
107
|
+
}
|
|
108
|
+
})(),
|
|
109
|
+
__privateGet(this, _teardownRef)
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
async json() {
|
|
113
|
+
return await withTeardown(
|
|
114
|
+
(async () => {
|
|
115
|
+
await __privateGet(this, _onStart).call(this);
|
|
116
|
+
try {
|
|
117
|
+
return await __privateGet(this, _ogResponse).json();
|
|
118
|
+
} finally {
|
|
119
|
+
await __privateGet(this, _onFinish).call(this);
|
|
120
|
+
}
|
|
121
|
+
})(),
|
|
122
|
+
__privateGet(this, _teardownRef)
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
_teardownRef = new WeakMap();
|
|
127
|
+
_ogResponse = new WeakMap();
|
|
128
|
+
_onStart = new WeakMap();
|
|
129
|
+
_onFinish = new WeakMap();
|
|
130
|
+
var ResponseWrapper = _ResponseWrapper;
|
|
131
|
+
var createNetwork = ({ notify } = {}) => {
|
|
132
|
+
assert(notify, "Notify must be passed to network endowment factory");
|
|
133
|
+
const openConnections = /* @__PURE__ */ new Set();
|
|
134
|
+
const teardownRef = { lastTeardown: 0 };
|
|
135
|
+
const cleanup = new FinalizationRegistry(
|
|
136
|
+
/* istanbul ignore next: can't test garbage collection without modifying node parameters */
|
|
137
|
+
(callback) => callback()
|
|
138
|
+
);
|
|
139
|
+
const _fetch = async (input, init) => {
|
|
140
|
+
const abortController = new AbortController();
|
|
141
|
+
if (init?.signal !== null && init?.signal !== void 0) {
|
|
142
|
+
const originalSignal = init.signal;
|
|
143
|
+
originalSignal.addEventListener(
|
|
144
|
+
"abort",
|
|
145
|
+
() => {
|
|
146
|
+
abortController.abort(originalSignal.reason);
|
|
147
|
+
},
|
|
148
|
+
{ once: true }
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
let started = false;
|
|
152
|
+
const onStart = async () => {
|
|
153
|
+
if (!started) {
|
|
154
|
+
started = true;
|
|
155
|
+
await notify({
|
|
156
|
+
method: "OutboundRequest",
|
|
157
|
+
params: { source: "fetch" }
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
let finished = false;
|
|
162
|
+
const onFinish = async () => {
|
|
163
|
+
if (!finished) {
|
|
164
|
+
finished = true;
|
|
165
|
+
await notify({
|
|
166
|
+
method: "OutboundResponse",
|
|
167
|
+
params: { source: "fetch" }
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
let res;
|
|
172
|
+
let openFetchConnection;
|
|
173
|
+
return await withTeardown(
|
|
174
|
+
(async () => {
|
|
175
|
+
try {
|
|
176
|
+
await notify({
|
|
177
|
+
method: "OutboundRequest",
|
|
178
|
+
params: { source: "fetch" }
|
|
179
|
+
});
|
|
180
|
+
const fetchPromise = fetch(input, {
|
|
181
|
+
...init,
|
|
182
|
+
signal: abortController.signal
|
|
183
|
+
});
|
|
184
|
+
openFetchConnection = {
|
|
185
|
+
cancel: async () => {
|
|
186
|
+
abortController.abort();
|
|
187
|
+
try {
|
|
188
|
+
await fetchPromise;
|
|
189
|
+
} catch {
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
openConnections.add(openFetchConnection);
|
|
194
|
+
res = new ResponseWrapper(
|
|
195
|
+
await fetchPromise,
|
|
196
|
+
teardownRef,
|
|
197
|
+
onStart,
|
|
198
|
+
onFinish
|
|
199
|
+
);
|
|
200
|
+
} finally {
|
|
201
|
+
if (openFetchConnection !== void 0) {
|
|
202
|
+
openConnections.delete(openFetchConnection);
|
|
203
|
+
}
|
|
204
|
+
await notify({
|
|
205
|
+
method: "OutboundResponse",
|
|
206
|
+
params: { source: "fetch" }
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
if (res.body !== null) {
|
|
210
|
+
const body = new WeakRef(res.body);
|
|
211
|
+
const openBodyConnection = {
|
|
212
|
+
cancel: (
|
|
213
|
+
/* istanbul ignore next: see it.todo('can be torn down during body read') test */
|
|
214
|
+
async () => {
|
|
215
|
+
try {
|
|
216
|
+
await body.deref()?.cancel();
|
|
217
|
+
} catch {
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
)
|
|
221
|
+
};
|
|
222
|
+
openConnections.add(openBodyConnection);
|
|
223
|
+
cleanup.register(
|
|
224
|
+
res.body,
|
|
225
|
+
/* istanbul ignore next: can't test garbage collection without modifying node parameters */
|
|
226
|
+
() => openConnections.delete(openBodyConnection)
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
return harden(res);
|
|
230
|
+
})(),
|
|
231
|
+
teardownRef
|
|
232
|
+
);
|
|
233
|
+
};
|
|
234
|
+
const teardownFunction = async () => {
|
|
235
|
+
teardownRef.lastTeardown += 1;
|
|
236
|
+
const promises = [];
|
|
237
|
+
openConnections.forEach(({ cancel }) => promises.push(cancel()));
|
|
238
|
+
openConnections.clear();
|
|
239
|
+
await Promise.all(promises);
|
|
240
|
+
};
|
|
241
|
+
return {
|
|
242
|
+
fetch: harden(_fetch),
|
|
243
|
+
// Request, Headers and Response are the endowments injected alongside fetch
|
|
244
|
+
// only when 'endowment:network-access' permission is requested,
|
|
245
|
+
// therefore these are hardened as part of fetch dependency injection within its factory.
|
|
246
|
+
// These endowments are not (and should never be) available by default.
|
|
247
|
+
Request: harden(Request),
|
|
248
|
+
Headers: harden(Headers),
|
|
249
|
+
Response: harden(Response),
|
|
250
|
+
teardownFunction
|
|
251
|
+
};
|
|
252
|
+
};
|
|
253
|
+
var endowmentModule = {
|
|
254
|
+
names: ["fetch", "Request", "Headers", "Response"],
|
|
255
|
+
factory: createNetwork
|
|
256
|
+
};
|
|
257
|
+
var network_default = endowmentModule;
|
|
258
|
+
|
|
259
|
+
export {
|
|
260
|
+
network_default
|
|
261
|
+
};
|
|
262
|
+
//# sourceMappingURL=chunk-XGCWN6ZD.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/common/endowments/network.ts"],"sourcesContent":["import { assert } from '@metamask/utils';\n\nimport { withTeardown } from '../utils';\nimport type { EndowmentFactoryOptions } from './commonEndowmentFactory';\n\n/**\n * This class wraps a Response object.\n * That way, a teardown process can stop any processes left.\n */\nclass ResponseWrapper implements Response {\n readonly #teardownRef: { lastTeardown: number };\n\n #ogResponse: Response;\n\n #onStart: () => Promise<void>;\n\n #onFinish: () => Promise<void>;\n\n constructor(\n ogResponse: Response,\n teardownRef: { lastTeardown: number },\n onStart: () => Promise<void>,\n onFinish: () => Promise<void>,\n ) {\n this.#ogResponse = ogResponse;\n this.#teardownRef = teardownRef;\n this.#onStart = onStart;\n this.#onFinish = onFinish;\n }\n\n get body(): ReadableStream<Uint8Array> | null {\n return this.#ogResponse.body;\n }\n\n get bodyUsed() {\n return this.#ogResponse.bodyUsed;\n }\n\n get headers() {\n return this.#ogResponse.headers;\n }\n\n get ok() {\n return this.#ogResponse.ok;\n }\n\n get redirected() {\n return this.#ogResponse.redirected;\n }\n\n get status() {\n return this.#ogResponse.status;\n }\n\n get statusText() {\n return this.#ogResponse.statusText;\n }\n\n get type() {\n return this.#ogResponse.type;\n }\n\n get url() {\n return this.#ogResponse.url;\n }\n\n async text() {\n return await withTeardown<string>(\n (async () => {\n await this.#onStart();\n try {\n return await this.#ogResponse.text();\n } finally {\n await this.#onFinish();\n }\n })(),\n this.#teardownRef,\n );\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n return await withTeardown<ArrayBuffer>(\n (async () => {\n await this.#onStart();\n try {\n return await this.#ogResponse.arrayBuffer();\n } finally {\n await this.#onFinish();\n }\n })(),\n this.#teardownRef,\n );\n }\n\n async blob(): Promise<Blob> {\n return await withTeardown<Blob>(\n (async () => {\n await this.#onStart();\n try {\n return await this.#ogResponse.blob();\n } finally {\n await this.#onFinish();\n }\n })(),\n this.#teardownRef,\n );\n }\n\n clone(): Response {\n const newResponse = this.#ogResponse.clone();\n return new ResponseWrapper(\n newResponse,\n this.#teardownRef,\n this.#onStart,\n this.#onFinish,\n );\n }\n\n async formData(): Promise<FormData> {\n return await withTeardown<FormData>(\n (async () => {\n await this.#onStart();\n try {\n return await this.#ogResponse.formData();\n } finally {\n await this.#onFinish();\n }\n })(),\n this.#teardownRef,\n );\n }\n\n async json(): Promise<any> {\n return await withTeardown(\n (async () => {\n await this.#onStart();\n try {\n return await this.#ogResponse.json();\n } finally {\n await this.#onFinish();\n }\n })(),\n this.#teardownRef,\n );\n }\n}\n\n/**\n * Create a network endowment, consisting of a `fetch` function.\n * This allows us to provide a teardown function, so that we can cancel\n * any pending requests, connections, streams, etc. that may be open when a snap\n * is terminated.\n *\n * This wraps the original implementation of `fetch`,\n * to ensure that a bad actor cannot get access to the original function, thus\n * potentially preventing the network requests from being torn down.\n *\n * @param options - An options bag.\n * @param options.notify - A reference to the notify function of the snap executor.\n * @returns An object containing a wrapped `fetch`\n * function, as well as a teardown function.\n */\nconst createNetwork = ({ notify }: EndowmentFactoryOptions = {}) => {\n assert(notify, 'Notify must be passed to network endowment factory');\n // Open fetch calls or open body streams\n const openConnections = new Set<{ cancel: () => Promise<void> }>();\n // Track last teardown count\n const teardownRef = { lastTeardown: 0 };\n\n // Remove items from openConnections after they were garbage collected\n const cleanup = new FinalizationRegistry<() => void>(\n /* istanbul ignore next: can't test garbage collection without modifying node parameters */\n (callback) => callback(),\n );\n\n const _fetch: typeof fetch = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n const abortController = new AbortController();\n if (init?.signal !== null && init?.signal !== undefined) {\n const originalSignal = init.signal;\n // Merge abort controllers\n originalSignal.addEventListener(\n 'abort',\n () => {\n abortController.abort((originalSignal as any).reason);\n },\n { once: true },\n );\n }\n\n let started = false;\n const onStart = async () => {\n if (!started) {\n started = true;\n await notify({\n method: 'OutboundRequest',\n params: { source: 'fetch' },\n });\n }\n };\n\n let finished = false;\n const onFinish = async () => {\n if (!finished) {\n finished = true;\n await notify({\n method: 'OutboundResponse',\n params: { source: 'fetch' },\n });\n }\n };\n\n let res: Response;\n let openFetchConnection: { cancel: () => Promise<void> } | undefined;\n return await withTeardown(\n (async () => {\n try {\n await notify({\n method: 'OutboundRequest',\n params: { source: 'fetch' },\n });\n const fetchPromise = fetch(input, {\n ...init,\n signal: abortController.signal,\n });\n\n openFetchConnection = {\n cancel: async () => {\n abortController.abort();\n try {\n await fetchPromise;\n } catch {\n /* do nothing */\n }\n },\n };\n openConnections.add(openFetchConnection);\n\n res = new ResponseWrapper(\n await fetchPromise,\n teardownRef,\n onStart,\n onFinish,\n );\n } finally {\n if (openFetchConnection !== undefined) {\n openConnections.delete(openFetchConnection);\n }\n await notify({\n method: 'OutboundResponse',\n params: { source: 'fetch' },\n });\n }\n\n if (res.body !== null) {\n const body = new WeakRef<ReadableStream>(res.body);\n\n const openBodyConnection = {\n cancel:\n /* istanbul ignore next: see it.todo('can be torn down during body read') test */\n async () => {\n try {\n await body.deref()?.cancel();\n } catch {\n /* do nothing */\n }\n },\n };\n openConnections.add(openBodyConnection);\n cleanup.register(\n res.body,\n /* istanbul ignore next: can't test garbage collection without modifying node parameters */\n () => openConnections.delete(openBodyConnection),\n );\n }\n return harden(res);\n })(),\n teardownRef,\n );\n };\n\n const teardownFunction = async () => {\n teardownRef.lastTeardown += 1;\n const promises: Promise<void>[] = [];\n openConnections.forEach(({ cancel }) => promises.push(cancel()));\n openConnections.clear();\n await Promise.all(promises);\n };\n\n return {\n fetch: harden(_fetch),\n // Request, Headers and Response are the endowments injected alongside fetch\n // only when 'endowment:network-access' permission is requested,\n // therefore these are hardened as part of fetch dependency injection within its factory.\n // These endowments are not (and should never be) available by default.\n Request: harden(Request),\n Headers: harden(Headers),\n Response: harden(Response),\n teardownFunction,\n };\n};\n\nconst endowmentModule = {\n names: ['fetch', 'Request', 'Headers', 'Response'] as const,\n factory: createNetwork,\n};\nexport default endowmentModule;\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/logging.ts
|
|
2
|
+
var _snapsutils = require('@metamask/snaps-utils');
|
|
3
|
+
var _utils = require('@metamask/utils');
|
|
4
|
+
var log = _utils.createModuleLogger.call(void 0,
|
|
5
|
+
_snapsutils.snapsLogger,
|
|
6
|
+
"snaps-execution-environments"
|
|
7
|
+
);
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
exports.log = log;
|
|
12
|
+
//# sourceMappingURL=chunk-XKY46YTJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/logging.ts"],"names":[],"mappings":";AAAA,SAAS,mBAAmB;AAC5B,SAAS,0BAA0B;AAQ5B,IAAM,MAAM;AAAA,EACjB;AAAA,EACA;AACF","sourcesContent":["import { snapsLogger } from '@metamask/snaps-utils';\nimport { createModuleLogger } from '@metamask/utils';\n\n/**\n * A logging function specific to this package. The log messages don't show up\n * by default, but they can be enabled by setting the environment variable:\n * - `DEBUG=metamask:snaps:snaps-execution-environments`, or\n * - `DEBUG=metamask:snaps:*` to enable all logs from `@metamask/snaps-*`.\n */\nexport const log = createModuleLogger(\n snapsLogger,\n 'snaps-execution-environments',\n);\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BaseSnapExecutor
|
|
3
|
+
} from "./chunk-OW4IXJ5J.mjs";
|
|
4
|
+
import {
|
|
5
|
+
log
|
|
6
|
+
} from "./chunk-VL3VNUT4.mjs";
|
|
7
|
+
|
|
8
|
+
// src/node-process/ChildProcessSnapExecutor.ts
|
|
9
|
+
import ObjectMultiplex from "@metamask/object-multiplex";
|
|
10
|
+
import { ProcessMessageStream } from "@metamask/post-message-stream";
|
|
11
|
+
import { logError, SNAP_STREAM_NAMES } from "@metamask/snaps-utils";
|
|
12
|
+
import { pipeline } from "readable-stream";
|
|
13
|
+
var ChildProcessSnapExecutor = class _ChildProcessSnapExecutor extends BaseSnapExecutor {
|
|
14
|
+
static initialize() {
|
|
15
|
+
log("Worker: Connecting to parent.");
|
|
16
|
+
const parentStream = new ProcessMessageStream();
|
|
17
|
+
const mux = new ObjectMultiplex();
|
|
18
|
+
pipeline(parentStream, mux, parentStream, (error) => {
|
|
19
|
+
if (error) {
|
|
20
|
+
logError(`Parent stream failure, closing worker.`, error);
|
|
21
|
+
}
|
|
22
|
+
self.close();
|
|
23
|
+
});
|
|
24
|
+
const commandStream = mux.createStream(SNAP_STREAM_NAMES.COMMAND);
|
|
25
|
+
const rpcStream = mux.createStream(SNAP_STREAM_NAMES.JSON_RPC);
|
|
26
|
+
return new _ChildProcessSnapExecutor(commandStream, rpcStream);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export {
|
|
31
|
+
ChildProcessSnapExecutor
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=chunk-XL5BQOEI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/node-process/ChildProcessSnapExecutor.ts"],"sourcesContent":["import ObjectMultiplex from '@metamask/object-multiplex';\nimport { ProcessMessageStream } from '@metamask/post-message-stream';\nimport { logError, SNAP_STREAM_NAMES } from '@metamask/snaps-utils';\nimport { pipeline } from 'readable-stream';\n\nimport { BaseSnapExecutor } from '../common/BaseSnapExecutor';\nimport { log } from '../logging';\n\nexport class ChildProcessSnapExecutor extends BaseSnapExecutor {\n static initialize() {\n log('Worker: Connecting to parent.');\n\n const parentStream = new ProcessMessageStream();\n const mux = new ObjectMultiplex();\n pipeline(parentStream, mux as any, parentStream, (error) => {\n if (error) {\n logError(`Parent stream failure, closing worker.`, error);\n }\n self.close();\n });\n\n const commandStream = mux.createStream(SNAP_STREAM_NAMES.COMMAND);\n const rpcStream = mux.createStream(SNAP_STREAM_NAMES.JSON_RPC) as any;\n return new ChildProcessSnapExecutor(commandStream, rpcStream);\n }\n}\n"],"mappings":";;;;;;;;AAAA,OAAO,qBAAqB;AAC5B,SAAS,4BAA4B;AACrC,SAAS,UAAU,yBAAyB;AAC5C,SAAS,gBAAgB;AAKlB,IAAM,2BAAN,MAAM,kCAAiC,iBAAiB;AAAA,EAC7D,OAAO,aAAa;AAClB,QAAI,+BAA+B;AAEnC,UAAM,eAAe,IAAI,qBAAqB;AAC9C,UAAM,MAAM,IAAI,gBAAgB;AAChC,aAAS,cAAc,KAAY,cAAc,CAAC,UAAU;AAC1D,UAAI,OAAO;AACT,iBAAS,0CAA0C,KAAK;AAAA,MAC1D;AACA,WAAK,MAAM;AAAA,IACb,CAAC;AAED,UAAM,gBAAgB,IAAI,aAAa,kBAAkB,OAAO;AAChE,UAAM,YAAY,IAAI,aAAa,kBAAkB,QAAQ;AAC7D,WAAO,IAAI,0BAAyB,eAAe,SAAS;AAAA,EAC9D;AACF;","names":[]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/common/endowments/timeout.ts
|
|
2
|
+
var _rpcerrors = require('@metamask/rpc-errors');
|
|
3
|
+
var MINIMUM_TIMEOUT = 10;
|
|
4
|
+
var createTimeout = () => {
|
|
5
|
+
const registeredHandles = /* @__PURE__ */ new Map();
|
|
6
|
+
const _setTimeout = (handler, timeout) => {
|
|
7
|
+
if (typeof handler !== "function") {
|
|
8
|
+
throw _rpcerrors.rpcErrors.internal(
|
|
9
|
+
`The timeout handler must be a function. Received: ${typeof handler}.`
|
|
10
|
+
);
|
|
11
|
+
}
|
|
12
|
+
harden(handler);
|
|
13
|
+
const handle = Object.freeze(/* @__PURE__ */ Object.create(null));
|
|
14
|
+
const platformHandle = setTimeout(() => {
|
|
15
|
+
registeredHandles.delete(handle);
|
|
16
|
+
handler();
|
|
17
|
+
}, Math.max(MINIMUM_TIMEOUT, _nullishCoalesce(timeout, () => ( 0))));
|
|
18
|
+
registeredHandles.set(handle, platformHandle);
|
|
19
|
+
return handle;
|
|
20
|
+
};
|
|
21
|
+
const _clearTimeout = (handle) => {
|
|
22
|
+
const platformHandle = registeredHandles.get(handle);
|
|
23
|
+
if (platformHandle !== void 0) {
|
|
24
|
+
clearTimeout(platformHandle);
|
|
25
|
+
registeredHandles.delete(handle);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const teardownFunction = () => {
|
|
29
|
+
for (const handle of registeredHandles.keys()) {
|
|
30
|
+
_clearTimeout(handle);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
setTimeout: harden(_setTimeout),
|
|
35
|
+
clearTimeout: harden(_clearTimeout),
|
|
36
|
+
teardownFunction
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
var endowmentModule = {
|
|
40
|
+
names: ["setTimeout", "clearTimeout"],
|
|
41
|
+
factory: createTimeout
|
|
42
|
+
};
|
|
43
|
+
var timeout_default = endowmentModule;
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
exports.timeout_default = timeout_default;
|
|
48
|
+
//# sourceMappingURL=chunk-XMCETCVM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/common/endowments/timeout.ts"],"names":[],"mappings":";AAAA,SAAS,iBAAiB;AAE1B,IAAM,kBAAkB;AAYxB,IAAM,gBAAgB,MAAM;AAC1B,QAAM,oBAAoB,oBAAI,IAAsB;AACpD,QAAM,cAAc,CAAC,SAAuB,YAA8B;AACxE,QAAI,OAAO,YAAY,YAAY;AACjC,YAAM,UAAU;AAAA,QACd,qDAAqD,OAAO,OAAO;AAAA,MACrE;AAAA,IACF;AACA,WAAO,OAAO;AACd,UAAM,SAAS,OAAO,OAAO,uBAAO,OAAO,IAAI,CAAC;AAChD,UAAM,iBAAiB,WAAW,MAAM;AACtC,wBAAkB,OAAO,MAAM;AAC/B,cAAQ;AAAA,IACV,GAAG,KAAK,IAAI,iBAAiB,WAAW,CAAC,CAAC;AAE1C,sBAAkB,IAAI,QAAQ,cAAc;AAC5C,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,CAAC,WAA0B;AAC/C,UAAM,iBAAiB,kBAAkB,IAAI,MAAM;AACnD,QAAI,mBAAmB,QAAW;AAChC,mBAAa,cAAqB;AAClC,wBAAkB,OAAO,MAAM;AAAA,IACjC;AAAA,EACF;AAEA,QAAM,mBAAmB,MAAY;AACnC,eAAW,UAAU,kBAAkB,KAAK,GAAG;AAC7C,oBAAc,MAAM;AAAA,IACtB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY,OAAO,WAAW;AAAA,IAC9B,cAAc,OAAO,aAAa;AAAA,IAClC;AAAA,EACF;AACF;AAEA,IAAM,kBAAkB;AAAA,EACtB,OAAO,CAAC,cAAc,cAAc;AAAA,EACpC,SAAS;AACX;AACA,IAAO,kBAAQ","sourcesContent":["import { rpcErrors } from '@metamask/rpc-errors';\n\nconst MINIMUM_TIMEOUT = 10;\n\n/**\n * Creates a pair of `setTimeout` and `clearTimeout` functions attenuated such\n * that:\n * - `setTimeout` throws if its \"handler\" parameter is not a function.\n * - `clearTimeout` only clears timeouts created by its sibling `setTimeout`,\n * or else no-ops.\n *\n * @returns An object with the attenuated `setTimeout` and `clearTimeout`\n * functions.\n */\nconst createTimeout = () => {\n const registeredHandles = new Map<unknown, unknown>();\n const _setTimeout = (handler: TimerHandler, timeout?: number): unknown => {\n if (typeof handler !== 'function') {\n throw rpcErrors.internal(\n `The timeout handler must be a function. Received: ${typeof handler}.`,\n );\n }\n harden(handler);\n const handle = Object.freeze(Object.create(null));\n const platformHandle = setTimeout(() => {\n registeredHandles.delete(handle);\n handler();\n }, Math.max(MINIMUM_TIMEOUT, timeout ?? 0));\n\n registeredHandles.set(handle, platformHandle);\n return handle;\n };\n\n const _clearTimeout = (handle: unknown): void => {\n const platformHandle = registeredHandles.get(handle);\n if (platformHandle !== undefined) {\n clearTimeout(platformHandle as any);\n registeredHandles.delete(handle);\n }\n };\n\n const teardownFunction = (): void => {\n for (const handle of registeredHandles.keys()) {\n _clearTimeout(handle);\n }\n };\n\n return {\n setTimeout: harden(_setTimeout),\n clearTimeout: harden(_clearTimeout),\n teardownFunction,\n } as const;\n};\n\nconst endowmentModule = {\n names: ['setTimeout', 'clearTimeout'] as const,\n factory: createTimeout,\n};\nexport default endowmentModule;\n"]}
|