@metamask/snaps-controllers 5.0.1 → 6.0.1

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.
Files changed (532) hide show
  1. package/CHANGELOG.md +18 -1
  2. package/dist/chunk-36YC4Z3T.mjs +109 -0
  3. package/dist/chunk-36YC4Z3T.mjs.map +1 -0
  4. package/dist/chunk-3RNW7OKG.mjs +1 -0
  5. package/dist/chunk-3RNW7OKG.mjs.map +1 -0
  6. package/dist/chunk-43ODL57R.js +39 -0
  7. package/dist/chunk-43ODL57R.js.map +1 -0
  8. package/dist/chunk-4HVWEABQ.mjs +9 -0
  9. package/dist/chunk-4HVWEABQ.mjs.map +1 -0
  10. package/dist/chunk-4LGL4A3M.js +105 -0
  11. package/dist/chunk-4LGL4A3M.js.map +1 -0
  12. package/dist/chunk-4URGXJP7.js +1 -0
  13. package/dist/chunk-4URGXJP7.js.map +1 -0
  14. package/dist/chunk-5R4ENIDN.mjs +2307 -0
  15. package/dist/chunk-5R4ENIDN.mjs.map +1 -0
  16. package/dist/chunk-5YBORD3A.js +19 -0
  17. package/dist/chunk-5YBORD3A.js.map +1 -0
  18. package/dist/chunk-6EZSNS4O.mjs +59 -0
  19. package/dist/chunk-6EZSNS4O.mjs.map +1 -0
  20. package/dist/chunk-6GMWL4JR.mjs +92 -0
  21. package/dist/chunk-6GMWL4JR.mjs.map +1 -0
  22. package/dist/chunk-6N6KZYVD.js +12 -0
  23. package/dist/chunk-6N6KZYVD.js.map +1 -0
  24. package/dist/chunk-6NYC5VNK.mjs +354 -0
  25. package/dist/chunk-6NYC5VNK.mjs.map +1 -0
  26. package/dist/chunk-6XGUJ27X.js +72 -0
  27. package/dist/chunk-6XGUJ27X.js.map +1 -0
  28. package/dist/chunk-6YVCFPP6.mjs +58 -0
  29. package/dist/chunk-6YVCFPP6.mjs.map +1 -0
  30. package/dist/chunk-7JY5VENP.js +273 -0
  31. package/dist/chunk-7JY5VENP.js.map +1 -0
  32. package/dist/chunk-7PZECZV3.mjs +38 -0
  33. package/dist/chunk-7PZECZV3.mjs.map +1 -0
  34. package/dist/chunk-7WOG63YY.js +40 -0
  35. package/dist/chunk-7WOG63YY.js.map +1 -0
  36. package/dist/chunk-7Y6P5FRN.js +60 -0
  37. package/dist/chunk-7Y6P5FRN.js.map +1 -0
  38. package/dist/chunk-A6WJEA3C.js +1 -0
  39. package/dist/chunk-A6WJEA3C.js.map +1 -0
  40. package/dist/chunk-AP7CJ6DA.js +47 -0
  41. package/dist/chunk-AP7CJ6DA.js.map +1 -0
  42. package/dist/chunk-B3UTLNYS.mjs +48 -0
  43. package/dist/chunk-B3UTLNYS.mjs.map +1 -0
  44. package/dist/chunk-B67RDBZ4.mjs +40 -0
  45. package/dist/chunk-B67RDBZ4.mjs.map +1 -0
  46. package/dist/chunk-B7R3EWM3.mjs +1 -0
  47. package/dist/chunk-B7R3EWM3.mjs.map +1 -0
  48. package/dist/chunk-BAEXVO3U.mjs +1 -0
  49. package/dist/chunk-BAEXVO3U.mjs.map +1 -0
  50. package/dist/chunk-BO2ZDPWV.js +59 -0
  51. package/dist/chunk-BO2ZDPWV.js.map +1 -0
  52. package/dist/chunk-C4D6GBMY.js +71 -0
  53. package/dist/chunk-C4D6GBMY.js.map +1 -0
  54. package/dist/chunk-D74XJG2L.js +1 -0
  55. package/dist/chunk-D74XJG2L.js.map +1 -0
  56. package/dist/chunk-DSQYZGBH.mjs +273 -0
  57. package/dist/chunk-DSQYZGBH.mjs.map +1 -0
  58. package/dist/chunk-ESQPQNEF.mjs +1 -0
  59. package/dist/chunk-ESQPQNEF.mjs.map +1 -0
  60. package/dist/chunk-EXN2TFDJ.js +38 -0
  61. package/dist/chunk-EXN2TFDJ.js.map +1 -0
  62. package/dist/chunk-FX5AADOV.mjs +1 -0
  63. package/dist/chunk-FX5AADOV.mjs.map +1 -0
  64. package/dist/chunk-FZY2Z5NP.js +38 -0
  65. package/dist/chunk-FZY2Z5NP.js.map +1 -0
  66. package/dist/chunk-G66GQJS6.js +1 -0
  67. package/dist/chunk-G66GQJS6.js.map +1 -0
  68. package/dist/chunk-G7U6WKWS.mjs +1 -0
  69. package/dist/chunk-G7U6WKWS.mjs.map +1 -0
  70. package/dist/chunk-HOY6NKQR.js +1 -0
  71. package/dist/chunk-HOY6NKQR.js.map +1 -0
  72. package/dist/chunk-HWJE3SDW.mjs +1 -0
  73. package/dist/chunk-HWJE3SDW.mjs.map +1 -0
  74. package/dist/chunk-IABOI7TW.mjs +1 -0
  75. package/dist/chunk-IABOI7TW.mjs.map +1 -0
  76. package/dist/chunk-IGC4E7PI.mjs +71 -0
  77. package/dist/chunk-IGC4E7PI.mjs.map +1 -0
  78. package/dist/chunk-IMBPDTVN.mjs +72 -0
  79. package/dist/chunk-IMBPDTVN.mjs.map +1 -0
  80. package/dist/chunk-J4PGHMLL.js +38 -0
  81. package/dist/chunk-J4PGHMLL.js.map +1 -0
  82. package/dist/chunk-JAUAKTUL.js +1 -0
  83. package/dist/chunk-JAUAKTUL.js.map +1 -0
  84. package/dist/chunk-JDHKH5YU.js +354 -0
  85. package/dist/chunk-JDHKH5YU.js.map +1 -0
  86. package/dist/chunk-JW7WBUL7.js +1 -0
  87. package/dist/chunk-JW7WBUL7.js.map +1 -0
  88. package/dist/chunk-K276CM3B.mjs +197 -0
  89. package/dist/chunk-K276CM3B.mjs.map +1 -0
  90. package/dist/chunk-KBVG3CL2.js +58 -0
  91. package/dist/chunk-KBVG3CL2.js.map +1 -0
  92. package/dist/chunk-KCMULJ2M.mjs +1 -0
  93. package/dist/chunk-KCMULJ2M.mjs.map +1 -0
  94. package/dist/chunk-KF4PCKG7.mjs +74 -0
  95. package/dist/chunk-KF4PCKG7.mjs.map +1 -0
  96. package/dist/chunk-KLK7ZRMH.js +55 -0
  97. package/dist/chunk-KLK7ZRMH.js.map +1 -0
  98. package/dist/chunk-LWBPKSU2.js +48 -0
  99. package/dist/chunk-LWBPKSU2.js.map +1 -0
  100. package/dist/chunk-MYWDTEX2.js +283 -0
  101. package/dist/chunk-MYWDTEX2.js.map +1 -0
  102. package/dist/chunk-NC5PBDKD.mjs +47 -0
  103. package/dist/chunk-NC5PBDKD.mjs.map +1 -0
  104. package/dist/chunk-NOLPMHXS.js +101 -0
  105. package/dist/chunk-NOLPMHXS.js.map +1 -0
  106. package/dist/chunk-NXZVKBSV.js +9 -0
  107. package/dist/chunk-NXZVKBSV.js.map +1 -0
  108. package/dist/chunk-OHMCPTOI.js +1 -0
  109. package/dist/chunk-OHMCPTOI.js.map +1 -0
  110. package/dist/chunk-OIEUL55W.js +1 -0
  111. package/dist/chunk-OIEUL55W.js.map +1 -0
  112. package/dist/chunk-P7Y6MIZW.mjs +7 -0
  113. package/dist/chunk-P7Y6MIZW.mjs.map +1 -0
  114. package/dist/chunk-PGKMKSAR.mjs +105 -0
  115. package/dist/chunk-PGKMKSAR.mjs.map +1 -0
  116. package/dist/chunk-PXECEHH7.mjs +39 -0
  117. package/dist/chunk-PXECEHH7.mjs.map +1 -0
  118. package/dist/chunk-Q2ON6SMV.js +197 -0
  119. package/dist/chunk-Q2ON6SMV.js.map +1 -0
  120. package/dist/chunk-QL3QGUTM.mjs +1 -0
  121. package/dist/chunk-QL3QGUTM.mjs.map +1 -0
  122. package/dist/chunk-RDBT3ZJQ.js +92 -0
  123. package/dist/chunk-RDBT3ZJQ.js.map +1 -0
  124. package/dist/chunk-RIU3ZIXZ.mjs +55 -0
  125. package/dist/chunk-RIU3ZIXZ.mjs.map +1 -0
  126. package/dist/chunk-RU67JKBV.mjs +12 -0
  127. package/dist/chunk-RU67JKBV.mjs.map +1 -0
  128. package/dist/chunk-TG6OXBLR.js +1 -0
  129. package/dist/chunk-TG6OXBLR.js.map +1 -0
  130. package/dist/chunk-TMWMIQV4.js +1 -0
  131. package/dist/chunk-TMWMIQV4.js.map +1 -0
  132. package/dist/chunk-U6T2MPXT.js +74 -0
  133. package/dist/chunk-U6T2MPXT.js.map +1 -0
  134. package/dist/chunk-U74FML7Z.mjs +1 -0
  135. package/dist/chunk-U74FML7Z.mjs.map +1 -0
  136. package/dist/chunk-V6NFZ47P.mjs +1 -0
  137. package/dist/chunk-V6NFZ47P.mjs.map +1 -0
  138. package/dist/chunk-VNOCJWOK.js +1 -0
  139. package/dist/chunk-VNOCJWOK.js.map +1 -0
  140. package/dist/chunk-VOZOZKRC.mjs +101 -0
  141. package/dist/chunk-VOZOZKRC.mjs.map +1 -0
  142. package/dist/chunk-WEY7ICES.js +1 -0
  143. package/dist/chunk-WEY7ICES.js.map +1 -0
  144. package/dist/chunk-WKQRCGUW.mjs +331 -0
  145. package/dist/chunk-WKQRCGUW.mjs.map +1 -0
  146. package/dist/chunk-XE5IWVNV.js +109 -0
  147. package/dist/chunk-XE5IWVNV.js.map +1 -0
  148. package/dist/chunk-XWDEGRM5.js +331 -0
  149. package/dist/chunk-XWDEGRM5.js.map +1 -0
  150. package/dist/chunk-YIQM6ZKA.mjs +19 -0
  151. package/dist/chunk-YIQM6ZKA.mjs.map +1 -0
  152. package/dist/chunk-YRZVIDCF.mjs +38 -0
  153. package/dist/chunk-YRZVIDCF.mjs.map +1 -0
  154. package/dist/chunk-YYPUPKQY.js +7 -0
  155. package/dist/chunk-YYPUPKQY.js.map +1 -0
  156. package/dist/chunk-ZAMIT33L.js +2307 -0
  157. package/dist/chunk-ZAMIT33L.js.map +1 -0
  158. package/dist/chunk-ZETJVFUS.mjs +283 -0
  159. package/dist/chunk-ZETJVFUS.mjs.map +1 -0
  160. package/dist/chunk-ZQAGLOXD.mjs +1 -0
  161. package/dist/chunk-ZQAGLOXD.mjs.map +1 -0
  162. package/dist/chunk-ZRS2VVUV.mjs +38 -0
  163. package/dist/chunk-ZRS2VVUV.mjs.map +1 -0
  164. package/dist/chunk-ZVOYOZFT.mjs +60 -0
  165. package/dist/chunk-ZVOYOZFT.mjs.map +1 -0
  166. package/dist/cronjob/CronjobController.js +41 -0
  167. package/dist/cronjob/CronjobController.js.map +1 -0
  168. package/dist/cronjob/CronjobController.mjs +41 -0
  169. package/dist/cronjob/CronjobController.mjs.map +1 -0
  170. package/dist/cronjob/index.js +41 -0
  171. package/dist/cronjob/index.js.map +1 -0
  172. package/dist/cronjob/index.mjs +41 -0
  173. package/dist/cronjob/index.mjs.map +1 -0
  174. package/dist/fsm.js +10 -0
  175. package/dist/fsm.js.map +1 -0
  176. package/dist/fsm.mjs +10 -0
  177. package/dist/fsm.mjs.map +1 -0
  178. package/dist/index.js +118 -0
  179. package/dist/index.js.map +1 -0
  180. package/dist/index.mjs +118 -0
  181. package/dist/index.mjs.map +1 -0
  182. package/dist/interface/SnapInterfaceController.js +9 -0
  183. package/dist/interface/SnapInterfaceController.js.map +1 -0
  184. package/dist/interface/SnapInterfaceController.mjs +9 -0
  185. package/dist/interface/SnapInterfaceController.mjs.map +1 -0
  186. package/dist/interface/index.js +10 -0
  187. package/dist/interface/index.js.map +1 -0
  188. package/dist/interface/index.mjs +10 -0
  189. package/dist/interface/index.mjs.map +1 -0
  190. package/dist/interface/utils.js +14 -0
  191. package/dist/interface/utils.js.map +1 -0
  192. package/dist/interface/utils.mjs +14 -0
  193. package/dist/interface/utils.mjs.map +1 -0
  194. package/dist/logging.js +8 -0
  195. package/dist/logging.js.map +1 -0
  196. package/dist/logging.mjs +8 -0
  197. package/dist/logging.mjs.map +1 -0
  198. package/dist/node.js +128 -0
  199. package/dist/node.js.map +1 -0
  200. package/dist/node.mjs +128 -0
  201. package/dist/node.mjs.map +1 -0
  202. package/dist/react-native.js +125 -0
  203. package/dist/react-native.js.map +1 -0
  204. package/dist/react-native.mjs +125 -0
  205. package/dist/react-native.mjs.map +1 -0
  206. package/dist/services/AbstractExecutionService.js +13 -0
  207. package/dist/services/AbstractExecutionService.js.map +1 -0
  208. package/dist/services/AbstractExecutionService.mjs +13 -0
  209. package/dist/services/AbstractExecutionService.mjs.map +1 -0
  210. package/dist/services/ExecutionService.js +2 -0
  211. package/dist/services/ExecutionService.js.map +1 -0
  212. package/dist/services/ExecutionService.mjs +2 -0
  213. package/dist/services/ExecutionService.mjs.map +1 -0
  214. package/dist/services/ProxyPostMessageStream.js +8 -0
  215. package/dist/services/ProxyPostMessageStream.js.map +1 -0
  216. package/dist/services/ProxyPostMessageStream.mjs +8 -0
  217. package/dist/services/ProxyPostMessageStream.mjs.map +1 -0
  218. package/dist/services/browser.js +40 -0
  219. package/dist/services/browser.js.map +1 -0
  220. package/dist/services/browser.mjs +40 -0
  221. package/dist/services/browser.mjs.map +1 -0
  222. package/dist/services/iframe/IframeExecutionService.js +12 -0
  223. package/dist/services/iframe/IframeExecutionService.js.map +1 -0
  224. package/dist/services/iframe/IframeExecutionService.mjs +12 -0
  225. package/dist/services/iframe/IframeExecutionService.mjs.map +1 -0
  226. package/dist/services/iframe/index.js +13 -0
  227. package/dist/services/iframe/index.js.map +1 -0
  228. package/dist/services/iframe/index.mjs +13 -0
  229. package/dist/services/iframe/index.mjs.map +1 -0
  230. package/dist/services/index.js +35 -0
  231. package/dist/services/index.js.map +1 -0
  232. package/dist/services/index.mjs +35 -0
  233. package/dist/services/index.mjs.map +1 -0
  234. package/dist/services/node-js/NodeProcessExecutionService.js +22 -0
  235. package/dist/services/node-js/NodeProcessExecutionService.js.map +1 -0
  236. package/dist/services/node-js/NodeProcessExecutionService.mjs +22 -0
  237. package/dist/services/node-js/NodeProcessExecutionService.mjs.map +1 -0
  238. package/dist/services/node-js/NodeThreadExecutionService.js +22 -0
  239. package/dist/services/node-js/NodeThreadExecutionService.js.map +1 -0
  240. package/dist/services/node-js/NodeThreadExecutionService.mjs +22 -0
  241. package/dist/services/node-js/NodeThreadExecutionService.mjs.map +1 -0
  242. package/dist/services/node-js/index.js +27 -0
  243. package/dist/services/node-js/index.js.map +1 -0
  244. package/dist/services/node-js/index.mjs +27 -0
  245. package/dist/services/node-js/index.mjs.map +1 -0
  246. package/dist/services/node.js +45 -0
  247. package/dist/services/node.js.map +1 -0
  248. package/dist/services/node.mjs +45 -0
  249. package/dist/services/node.mjs.map +1 -0
  250. package/dist/services/offscreen/OffscreenExecutionService.js +14 -0
  251. package/dist/services/offscreen/OffscreenExecutionService.js.map +1 -0
  252. package/dist/services/offscreen/OffscreenExecutionService.mjs +14 -0
  253. package/dist/services/offscreen/OffscreenExecutionService.mjs.map +1 -0
  254. package/dist/services/offscreen/index.js +15 -0
  255. package/dist/services/offscreen/index.js.map +1 -0
  256. package/dist/services/offscreen/index.mjs +15 -0
  257. package/dist/services/offscreen/index.mjs.map +1 -0
  258. package/dist/services/proxy/ProxyExecutionService.js +13 -0
  259. package/dist/services/proxy/ProxyExecutionService.js.map +1 -0
  260. package/dist/services/proxy/ProxyExecutionService.mjs +13 -0
  261. package/dist/services/proxy/ProxyExecutionService.mjs.map +1 -0
  262. package/dist/services/react-native.js +42 -0
  263. package/dist/services/react-native.js.map +1 -0
  264. package/dist/services/react-native.mjs +42 -0
  265. package/dist/services/react-native.mjs.map +1 -0
  266. package/dist/services/webview/WebViewExecutionService.js +15 -0
  267. package/dist/services/webview/WebViewExecutionService.js.map +1 -0
  268. package/dist/services/webview/WebViewExecutionService.mjs +15 -0
  269. package/dist/services/webview/WebViewExecutionService.mjs.map +1 -0
  270. package/dist/services/webview/WebViewMessageStream.js +8 -0
  271. package/dist/services/webview/WebViewMessageStream.js.map +1 -0
  272. package/dist/services/webview/WebViewMessageStream.mjs +8 -0
  273. package/dist/services/webview/WebViewMessageStream.mjs.map +1 -0
  274. package/dist/services/webview/index.js +16 -0
  275. package/dist/services/webview/index.js.map +1 -0
  276. package/dist/services/webview/index.mjs +16 -0
  277. package/dist/services/webview/index.mjs.map +1 -0
  278. package/dist/services/webworker/WebWorkerExecutionService.js +15 -0
  279. package/dist/services/webworker/WebWorkerExecutionService.js.map +1 -0
  280. package/dist/services/webworker/WebWorkerExecutionService.mjs +15 -0
  281. package/dist/services/webworker/WebWorkerExecutionService.mjs.map +1 -0
  282. package/dist/services/webworker/index.js +16 -0
  283. package/dist/services/webworker/index.js.map +1 -0
  284. package/dist/services/webworker/index.mjs +16 -0
  285. package/dist/services/webworker/index.mjs.map +1 -0
  286. package/dist/snaps/RequestQueue.js +8 -0
  287. package/dist/snaps/RequestQueue.js.map +1 -0
  288. package/dist/snaps/RequestQueue.mjs +8 -0
  289. package/dist/snaps/RequestQueue.mjs.map +1 -0
  290. package/dist/snaps/SnapController.js +30 -0
  291. package/dist/snaps/SnapController.js.map +1 -0
  292. package/dist/snaps/SnapController.mjs +30 -0
  293. package/dist/snaps/SnapController.mjs.map +1 -0
  294. package/dist/snaps/Timer.js +8 -0
  295. package/dist/snaps/Timer.js.map +1 -0
  296. package/dist/snaps/Timer.mjs +8 -0
  297. package/dist/snaps/Timer.mjs.map +1 -0
  298. package/dist/snaps/constants.js +8 -0
  299. package/dist/snaps/constants.js.map +1 -0
  300. package/dist/snaps/constants.mjs +8 -0
  301. package/dist/snaps/constants.mjs.map +1 -0
  302. package/dist/snaps/index.js +63 -0
  303. package/dist/snaps/index.js.map +1 -0
  304. package/dist/snaps/index.mjs +63 -0
  305. package/dist/snaps/index.mjs.map +1 -0
  306. package/dist/snaps/location/http.js +8 -0
  307. package/dist/snaps/location/http.js.map +1 -0
  308. package/dist/snaps/location/http.mjs +8 -0
  309. package/dist/snaps/location/http.mjs.map +1 -0
  310. package/dist/snaps/location/index.js +31 -0
  311. package/dist/snaps/location/index.js.map +1 -0
  312. package/dist/snaps/location/index.mjs +31 -0
  313. package/dist/snaps/location/index.mjs.map +1 -0
  314. package/dist/snaps/location/local.js +9 -0
  315. package/dist/snaps/location/local.js.map +1 -0
  316. package/dist/snaps/location/local.mjs +9 -0
  317. package/dist/snaps/location/local.mjs.map +1 -0
  318. package/dist/snaps/location/location.js +11 -0
  319. package/dist/snaps/location/location.js.map +1 -0
  320. package/dist/snaps/location/location.mjs +11 -0
  321. package/dist/snaps/location/location.mjs.map +1 -0
  322. package/dist/snaps/location/npm.js +18 -0
  323. package/dist/snaps/location/npm.js.map +1 -0
  324. package/dist/snaps/location/npm.mjs +18 -0
  325. package/dist/snaps/location/npm.mjs.map +1 -0
  326. package/dist/snaps/registry/index.js +13 -0
  327. package/dist/snaps/registry/index.js.map +1 -0
  328. package/dist/snaps/registry/index.mjs +13 -0
  329. package/dist/snaps/registry/index.mjs.map +1 -0
  330. package/dist/snaps/registry/json.js +9 -0
  331. package/dist/snaps/registry/json.js.map +1 -0
  332. package/dist/snaps/registry/json.mjs +9 -0
  333. package/dist/snaps/registry/json.mjs.map +1 -0
  334. package/dist/snaps/registry/registry.js +8 -0
  335. package/dist/snaps/registry/registry.js.map +1 -0
  336. package/dist/snaps/registry/registry.mjs +8 -0
  337. package/dist/snaps/registry/registry.mjs.map +1 -0
  338. package/dist/snaps/selectors.js +8 -0
  339. package/dist/snaps/selectors.js.map +1 -0
  340. package/dist/snaps/selectors.mjs +8 -0
  341. package/dist/snaps/selectors.mjs.map +1 -0
  342. package/dist/tsconfig.build.tsbuildinfo +1 -0
  343. package/dist/types/node.d.ts +2 -0
  344. package/dist/types/react-native.d.ts +2 -0
  345. package/dist/types/services/index.d.ts +0 -2
  346. package/dist/types/services/node.d.ts +2 -0
  347. package/dist/types/services/react-native.d.ts +2 -0
  348. package/dist/types/utils.d.ts +1 -1
  349. package/dist/types/vendor/global.d.js +1 -0
  350. package/dist/types/vendor/global.d.js.map +1 -0
  351. package/dist/types/vendor/global.d.mjs +1 -0
  352. package/dist/types/vendor/global.d.mjs.map +1 -0
  353. package/dist/types/vendor/readable-stream.d.js +1 -0
  354. package/dist/types/vendor/readable-stream.d.js.map +1 -0
  355. package/dist/types/vendor/readable-stream.d.mjs +1 -0
  356. package/dist/types/vendor/readable-stream.d.mjs.map +1 -0
  357. package/dist/types/vendor/zlib.d.js +1 -0
  358. package/dist/types/vendor/zlib.d.js.map +1 -0
  359. package/dist/types/vendor/zlib.d.mjs +1 -0
  360. package/dist/types/vendor/zlib.d.mjs.map +1 -0
  361. package/dist/utils.js +21 -0
  362. package/dist/utils.js.map +1 -0
  363. package/dist/utils.mjs +21 -0
  364. package/dist/utils.mjs.map +1 -0
  365. package/package.json +31 -22
  366. package/dist/cjs/cronjob/CronjobController.js +0 -296
  367. package/dist/cjs/cronjob/CronjobController.js.map +0 -1
  368. package/dist/cjs/cronjob/index.js +0 -20
  369. package/dist/cjs/cronjob/index.js.map +0 -1
  370. package/dist/cjs/fsm.js +0 -69
  371. package/dist/cjs/fsm.js.map +0 -1
  372. package/dist/cjs/index.js +0 -24
  373. package/dist/cjs/index.js.map +0 -1
  374. package/dist/cjs/interface/SnapInterfaceController.js +0 -166
  375. package/dist/cjs/interface/SnapInterfaceController.js.map +0 -1
  376. package/dist/cjs/interface/index.js +0 -20
  377. package/dist/cjs/interface/index.js.map +0 -1
  378. package/dist/cjs/interface/utils.js +0 -59
  379. package/dist/cjs/interface/utils.js.map +0 -1
  380. package/dist/cjs/logging.js +0 -15
  381. package/dist/cjs/logging.js.map +0 -1
  382. package/dist/cjs/services/AbstractExecutionService.js +0 -387
  383. package/dist/cjs/services/AbstractExecutionService.js.map +0 -1
  384. package/dist/cjs/services/ExecutionService.js +0 -7
  385. package/dist/cjs/services/ExecutionService.js.map +0 -1
  386. package/dist/cjs/services/ProxyPostMessageStream.js +0 -109
  387. package/dist/cjs/services/ProxyPostMessageStream.js.map +0 -1
  388. package/dist/cjs/services/browser.js +0 -33
  389. package/dist/cjs/services/browser.js.map +0 -1
  390. package/dist/cjs/services/iframe/IframeExecutionService.js +0 -54
  391. package/dist/cjs/services/iframe/IframeExecutionService.js.map +0 -1
  392. package/dist/cjs/services/iframe/index.js +0 -20
  393. package/dist/cjs/services/iframe/index.js.map +0 -1
  394. package/dist/cjs/services/index.js +0 -33
  395. package/dist/cjs/services/index.js.map +0 -1
  396. package/dist/cjs/services/node/NodeProcessExecutionService.js +0 -42
  397. package/dist/cjs/services/node/NodeProcessExecutionService.js.map +0 -1
  398. package/dist/cjs/services/node/NodeThreadExecutionService.js +0 -43
  399. package/dist/cjs/services/node/NodeThreadExecutionService.js.map +0 -1
  400. package/dist/cjs/services/node/index.js +0 -21
  401. package/dist/cjs/services/node/index.js.map +0 -1
  402. package/dist/cjs/services/offscreen/OffscreenExecutionService.js +0 -96
  403. package/dist/cjs/services/offscreen/OffscreenExecutionService.js.map +0 -1
  404. package/dist/cjs/services/offscreen/index.js +0 -20
  405. package/dist/cjs/services/offscreen/index.js.map +0 -1
  406. package/dist/cjs/services/proxy/ProxyExecutionService.js +0 -110
  407. package/dist/cjs/services/proxy/ProxyExecutionService.js.map +0 -1
  408. package/dist/cjs/services/webview/WebViewExecutionService.js +0 -99
  409. package/dist/cjs/services/webview/WebViewExecutionService.js.map +0 -1
  410. package/dist/cjs/services/webview/WebViewMessageStream.js +0 -127
  411. package/dist/cjs/services/webview/WebViewMessageStream.js.map +0 -1
  412. package/dist/cjs/services/webview/index.js +0 -20
  413. package/dist/cjs/services/webview/index.js.map +0 -1
  414. package/dist/cjs/services/webworker/WebWorkerExecutionService.js +0 -148
  415. package/dist/cjs/services/webworker/WebWorkerExecutionService.js.map +0 -1
  416. package/dist/cjs/services/webworker/index.js +0 -20
  417. package/dist/cjs/services/webworker/index.js.map +0 -1
  418. package/dist/cjs/snaps/RequestQueue.js +0 -63
  419. package/dist/cjs/snaps/RequestQueue.js.map +0 -1
  420. package/dist/cjs/snaps/SnapController.js +0 -1968
  421. package/dist/cjs/snaps/SnapController.js.map +0 -1
  422. package/dist/cjs/snaps/Timer.js +0 -117
  423. package/dist/cjs/snaps/Timer.js.map +0 -1
  424. package/dist/cjs/snaps/constants.js +0 -25
  425. package/dist/cjs/snaps/constants.js.map +0 -1
  426. package/dist/cjs/snaps/index.js +0 -23
  427. package/dist/cjs/snaps/index.js.map +0 -1
  428. package/dist/cjs/snaps/location/http.js +0 -106
  429. package/dist/cjs/snaps/location/http.js.map +0 -1
  430. package/dist/cjs/snaps/location/index.js +0 -23
  431. package/dist/cjs/snaps/location/index.js.map +0 -1
  432. package/dist/cjs/snaps/location/local.js +0 -93
  433. package/dist/cjs/snaps/location/local.js.map +0 -1
  434. package/dist/cjs/snaps/location/location.js +0 -34
  435. package/dist/cjs/snaps/location/location.js.map +0 -1
  436. package/dist/cjs/snaps/location/npm.js +0 -389
  437. package/dist/cjs/snaps/location/npm.js.map +0 -1
  438. package/dist/cjs/snaps/registry/index.js +0 -21
  439. package/dist/cjs/snaps/registry/index.js.map +0 -1
  440. package/dist/cjs/snaps/registry/json.js +0 -311
  441. package/dist/cjs/snaps/registry/json.js.map +0 -1
  442. package/dist/cjs/snaps/registry/registry.js +0 -18
  443. package/dist/cjs/snaps/registry/registry.js.map +0 -1
  444. package/dist/cjs/snaps/selectors.js +0 -13
  445. package/dist/cjs/snaps/selectors.js.map +0 -1
  446. package/dist/cjs/utils.js +0 -111
  447. package/dist/cjs/utils.js.map +0 -1
  448. package/dist/esm/cronjob/CronjobController.js +0 -281
  449. package/dist/esm/cronjob/CronjobController.js.map +0 -1
  450. package/dist/esm/cronjob/index.js +0 -3
  451. package/dist/esm/cronjob/index.js.map +0 -1
  452. package/dist/esm/fsm.js +0 -70
  453. package/dist/esm/fsm.js.map +0 -1
  454. package/dist/esm/index.js +0 -7
  455. package/dist/esm/index.js.map +0 -1
  456. package/dist/esm/interface/SnapInterfaceController.js +0 -158
  457. package/dist/esm/interface/SnapInterfaceController.js.map +0 -1
  458. package/dist/esm/interface/index.js +0 -3
  459. package/dist/esm/interface/index.js.map +0 -1
  460. package/dist/esm/interface/utils.js +0 -62
  461. package/dist/esm/interface/utils.js.map +0 -1
  462. package/dist/esm/logging.js +0 -10
  463. package/dist/esm/logging.js.map +0 -1
  464. package/dist/esm/services/AbstractExecutionService.js +0 -370
  465. package/dist/esm/services/AbstractExecutionService.js.map +0 -1
  466. package/dist/esm/services/ExecutionService.js +0 -4
  467. package/dist/esm/services/ExecutionService.js.map +0 -1
  468. package/dist/esm/services/ProxyPostMessageStream.js +0 -102
  469. package/dist/esm/services/ProxyPostMessageStream.js.map +0 -1
  470. package/dist/esm/services/browser.js +0 -10
  471. package/dist/esm/services/browser.js.map +0 -1
  472. package/dist/esm/services/iframe/IframeExecutionService.js +0 -44
  473. package/dist/esm/services/iframe/IframeExecutionService.js.map +0 -1
  474. package/dist/esm/services/iframe/index.js +0 -3
  475. package/dist/esm/services/iframe/index.js.map +0 -1
  476. package/dist/esm/services/index.js +0 -10
  477. package/dist/esm/services/index.js.map +0 -1
  478. package/dist/esm/services/node/NodeProcessExecutionService.js +0 -32
  479. package/dist/esm/services/node/NodeProcessExecutionService.js.map +0 -1
  480. package/dist/esm/services/node/NodeThreadExecutionService.js +0 -34
  481. package/dist/esm/services/node/NodeThreadExecutionService.js.map +0 -1
  482. package/dist/esm/services/node/index.js +0 -4
  483. package/dist/esm/services/node/index.js.map +0 -1
  484. package/dist/esm/services/offscreen/OffscreenExecutionService.js +0 -86
  485. package/dist/esm/services/offscreen/OffscreenExecutionService.js.map +0 -1
  486. package/dist/esm/services/offscreen/index.js +0 -3
  487. package/dist/esm/services/offscreen/index.js.map +0 -1
  488. package/dist/esm/services/proxy/ProxyExecutionService.js +0 -100
  489. package/dist/esm/services/proxy/ProxyExecutionService.js.map +0 -1
  490. package/dist/esm/services/webview/WebViewExecutionService.js +0 -89
  491. package/dist/esm/services/webview/WebViewExecutionService.js.map +0 -1
  492. package/dist/esm/services/webview/WebViewMessageStream.js +0 -119
  493. package/dist/esm/services/webview/WebViewMessageStream.js.map +0 -1
  494. package/dist/esm/services/webview/index.js +0 -3
  495. package/dist/esm/services/webview/index.js.map +0 -1
  496. package/dist/esm/services/webworker/WebWorkerExecutionService.js +0 -130
  497. package/dist/esm/services/webworker/WebWorkerExecutionService.js.map +0 -1
  498. package/dist/esm/services/webworker/index.js +0 -3
  499. package/dist/esm/services/webworker/index.js.map +0 -1
  500. package/dist/esm/snaps/RequestQueue.js +0 -53
  501. package/dist/esm/snaps/RequestQueue.js.map +0 -1
  502. package/dist/esm/snaps/SnapController.js +0 -1947
  503. package/dist/esm/snaps/SnapController.js.map +0 -1
  504. package/dist/esm/snaps/Timer.js +0 -107
  505. package/dist/esm/snaps/Timer.js.map +0 -1
  506. package/dist/esm/snaps/constants.js +0 -16
  507. package/dist/esm/snaps/constants.js.map +0 -1
  508. package/dist/esm/snaps/index.js +0 -6
  509. package/dist/esm/snaps/index.js.map +0 -1
  510. package/dist/esm/snaps/location/http.js +0 -96
  511. package/dist/esm/snaps/location/http.js.map +0 -1
  512. package/dist/esm/snaps/location/index.js +0 -6
  513. package/dist/esm/snaps/location/index.js.map +0 -1
  514. package/dist/esm/snaps/location/local.js +0 -83
  515. package/dist/esm/snaps/location/local.js.map +0 -1
  516. package/dist/esm/snaps/location/location.js +0 -30
  517. package/dist/esm/snaps/location/location.js.map +0 -1
  518. package/dist/esm/snaps/location/npm.js +0 -373
  519. package/dist/esm/snaps/location/npm.js.map +0 -1
  520. package/dist/esm/snaps/registry/index.js +0 -4
  521. package/dist/esm/snaps/registry/index.js.map +0 -1
  522. package/dist/esm/snaps/registry/json.js +0 -301
  523. package/dist/esm/snaps/registry/json.js.map +0 -1
  524. package/dist/esm/snaps/registry/registry.js +0 -8
  525. package/dist/esm/snaps/registry/registry.js.map +0 -1
  526. package/dist/esm/snaps/selectors.js +0 -3
  527. package/dist/esm/snaps/selectors.js.map +0 -1
  528. package/dist/esm/utils.js +0 -132
  529. package/dist/esm/utils.js.map +0 -1
  530. /package/dist/types/services/{node → node-js}/NodeProcessExecutionService.d.ts +0 -0
  531. /package/dist/types/services/{node → node-js}/NodeThreadExecutionService.d.ts +0 -0
  532. /package/dist/types/services/{node → node-js}/index.d.ts +0 -0
@@ -1,1968 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- function _export(target, all) {
6
- for(var name in all)Object.defineProperty(target, name, {
7
- enumerable: true,
8
- get: all[name]
9
- });
10
- }
11
- _export(exports, {
12
- controllerName: function() {
13
- return controllerName;
14
- },
15
- SNAP_APPROVAL_INSTALL: function() {
16
- return SNAP_APPROVAL_INSTALL;
17
- },
18
- SNAP_APPROVAL_UPDATE: function() {
19
- return SNAP_APPROVAL_UPDATE;
20
- },
21
- SNAP_APPROVAL_RESULT: function() {
22
- return SNAP_APPROVAL_RESULT;
23
- },
24
- SnapController: function() {
25
- return SnapController;
26
- }
27
- });
28
- const _basecontroller = require("@metamask/base-controller");
29
- const _permissioncontroller = require("@metamask/permission-controller");
30
- const _rpcerrors = require("@metamask/rpc-errors");
31
- const _snapsrpcmethods = require("@metamask/snaps-rpc-methods");
32
- const _snapssdk = require("@metamask/snaps-sdk");
33
- const _snapsutils = require("@metamask/snaps-utils");
34
- const _utils = require("@metamask/utils");
35
- const _fsm = require("@xstate/fsm");
36
- const _nanoid = require("nanoid");
37
- const _fsm1 = require("../fsm");
38
- const _logging = require("../logging");
39
- const _utils1 = require("../utils");
40
- const _constants = require("./constants");
41
- const _location = require("./location");
42
- const _registry = require("./registry");
43
- const _RequestQueue = require("./RequestQueue");
44
- const _Timer = require("./Timer");
45
- function _check_private_redeclaration(obj, privateCollection) {
46
- if (privateCollection.has(obj)) {
47
- throw new TypeError("Cannot initialize the same private elements twice on an object");
48
- }
49
- }
50
- function _class_apply_descriptor_get(receiver, descriptor) {
51
- if (descriptor.get) {
52
- return descriptor.get.call(receiver);
53
- }
54
- return descriptor.value;
55
- }
56
- function _class_apply_descriptor_set(receiver, descriptor, value) {
57
- if (descriptor.set) {
58
- descriptor.set.call(receiver, value);
59
- } else {
60
- if (!descriptor.writable) {
61
- throw new TypeError("attempted to set read only private field");
62
- }
63
- descriptor.value = value;
64
- }
65
- }
66
- function _class_extract_field_descriptor(receiver, privateMap, action) {
67
- if (!privateMap.has(receiver)) {
68
- throw new TypeError("attempted to " + action + " private field on non-instance");
69
- }
70
- return privateMap.get(receiver);
71
- }
72
- function _class_private_field_get(receiver, privateMap) {
73
- var descriptor = _class_extract_field_descriptor(receiver, privateMap, "get");
74
- return _class_apply_descriptor_get(receiver, descriptor);
75
- }
76
- function _class_private_field_init(obj, privateMap, value) {
77
- _check_private_redeclaration(obj, privateMap);
78
- privateMap.set(obj, value);
79
- }
80
- function _class_private_field_set(receiver, privateMap, value) {
81
- var descriptor = _class_extract_field_descriptor(receiver, privateMap, "set");
82
- _class_apply_descriptor_set(receiver, descriptor, value);
83
- return value;
84
- }
85
- function _class_private_method_get(receiver, privateSet, fn) {
86
- if (!privateSet.has(receiver)) {
87
- throw new TypeError("attempted to get private field on non-instance");
88
- }
89
- return fn;
90
- }
91
- function _class_private_method_init(obj, privateSet) {
92
- _check_private_redeclaration(obj, privateSet);
93
- privateSet.add(obj);
94
- }
95
- function _define_property(obj, key, value) {
96
- if (key in obj) {
97
- Object.defineProperty(obj, key, {
98
- value: value,
99
- enumerable: true,
100
- configurable: true,
101
- writable: true
102
- });
103
- } else {
104
- obj[key] = value;
105
- }
106
- return obj;
107
- }
108
- const controllerName = 'SnapController';
109
- const SNAP_APPROVAL_INSTALL = 'wallet_installSnap';
110
- const SNAP_APPROVAL_UPDATE = 'wallet_updateSnap';
111
- const SNAP_APPROVAL_RESULT = 'wallet_installSnapResult';
112
- const TRUNCATED_SNAP_PROPERTIES = new Set([
113
- 'initialPermissions',
114
- 'id',
115
- 'version',
116
- 'enabled',
117
- 'blocked'
118
- ]);
119
- const defaultState = {
120
- snaps: {},
121
- snapStates: {},
122
- unencryptedSnapStates: {}
123
- };
124
- /**
125
- * Truncates the properties of a snap to only ones that are easily serializable.
126
- *
127
- * @param snap - The snap to truncate.
128
- * @returns Object with serializable snap properties.
129
- */ function truncateSnap(snap) {
130
- const truncatedSnap = Object.keys(snap).reduce((serialized, key)=>{
131
- if (TRUNCATED_SNAP_PROPERTIES.has(key)) {
132
- serialized[key] = snap[key];
133
- }
134
- return serialized;
135
- }, {});
136
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
137
- return truncatedSnap;
138
- }
139
- const name = 'SnapController';
140
- var _closeAllConnections = /*#__PURE__*/ new WeakMap(), _dynamicPermissions = /*#__PURE__*/ new WeakMap(), _environmentEndowmentPermissions = /*#__PURE__*/ new WeakMap(), _excludedPermissions = /*#__PURE__*/ new WeakMap(), _featureFlags = /*#__PURE__*/ new WeakMap(), _fetchFunction = /*#__PURE__*/ new WeakMap(), _idleTimeCheckInterval = /*#__PURE__*/ new WeakMap(), _maxIdleTime = /*#__PURE__*/ new WeakMap(), _detectSnapLocation = /*#__PURE__*/ new WeakMap(), _snapsRuntimeData = /*#__PURE__*/ new WeakMap(), _rollbackSnapshots = /*#__PURE__*/ new WeakMap(), _timeoutForLastRequestStatus = /*#__PURE__*/ new WeakMap(), _statusMachine = /*#__PURE__*/ new WeakMap(), /**
141
- * We track status of a Snap using a finite-state-machine.
142
- * It keeps track of whether the snap is started / stopped / etc.
143
- *
144
- * @see {@link SnapController.transition} for interacting with the machine.
145
- */ // We initialize the machine in the instance because the status is currently tightly coupled
146
- // with the SnapController - the guard checks for enabled status inside the SnapController state.
147
- // In the future, side-effects could be added to the machine during transitions.
148
- _initializeStateMachine = /*#__PURE__*/ new WeakSet(), /**
149
- * Constructor helper for registering the controller's messaging system
150
- * actions.
151
- */ _registerMessageHandlers = /*#__PURE__*/ new WeakSet(), _handlePreinstalledSnaps = /*#__PURE__*/ new WeakSet(), _pollForLastRequestStatus = /*#__PURE__*/ new WeakSet(), _blockSnap = /*#__PURE__*/ new WeakSet(), /**
152
- * Unblocks a snap so that it can be enabled and started again. Emits
153
- * {@link SnapUnblocked}. Does nothing if the snap is not installed or already
154
- * unblocked.
155
- *
156
- * @param snapId - The id of the snap to unblock.
157
- */ _unblockSnap = /*#__PURE__*/ new WeakSet(), _assertIsInstallAllowed = /*#__PURE__*/ new WeakSet(), _stopSnapsLastRequestPastMax = /*#__PURE__*/ new WeakSet(), /**
158
- * Transitions between states using `snapStatusStateMachineConfig` as the template to figure out
159
- * the next state. This transition function uses a very minimal subset of XState conventions:
160
- * - supports initial state
161
- * - .on supports raw event target string
162
- * - .on supports {target, cond} object
163
- * - the arguments for `cond` is the `SerializedSnap` instead of Xstate convention of `(event,
164
- * context) => boolean`
165
- *
166
- * @param snapId - The id of the snap to transition.
167
- * @param event - The event enum to use to transition.
168
- */ _transition = /*#__PURE__*/ new WeakSet(), _terminateSnap = /*#__PURE__*/ new WeakSet(), _handleInitialConnections = /*#__PURE__*/ new WeakSet(), _addSnapToSubject = /*#__PURE__*/ new WeakSet(), /**
169
- * Removes a snap's permission (caveat) from all subjects.
170
- *
171
- * @param snapId - The id of the Snap.
172
- */ _removeSnapFromSubjects = /*#__PURE__*/ new WeakSet(), /**
173
- * Safely revokes all permissions granted to a Snap.
174
- *
175
- * @param snapId - The snap ID.
176
- */ _revokeAllSnapPermissions = /*#__PURE__*/ new WeakSet(), _createApproval = /*#__PURE__*/ new WeakSet(), _updateApproval = /*#__PURE__*/ new WeakSet(), _resolveAllowlistVersion = /*#__PURE__*/ new WeakSet(), _add = /*#__PURE__*/ new WeakSet(), _startSnap = /*#__PURE__*/ new WeakSet(), _getEndowments = /*#__PURE__*/ new WeakSet(), /**
177
- * Sets a snap in state. Called when a snap is installed or updated. Performs
178
- * various validation checks on the received arguments, and will throw if
179
- * validation fails.
180
- *
181
- * The snap will be enabled and unblocked by the time this method returns,
182
- * regardless of its previous state.
183
- *
184
- * See {@link SnapController.add} and {@link SnapController.updateSnap} for
185
- * usage.
186
- *
187
- * @param args - The add snap args.
188
- * @returns The resulting snap object.
189
- */ _set = /*#__PURE__*/ new WeakSet(), _validateSnapPermissions = /*#__PURE__*/ new WeakSet(), /**
190
- * Determine the execution timeout for a given handler permission.
191
- *
192
- * If no permission is specified or the permission itself has no execution timeout defined
193
- * the constructor argument `maxRequestTime` will be used.
194
- *
195
- * @param permission - An optional permission constraint for the handler being called.
196
- * @returns The execution timeout for the given handler.
197
- */ _getExecutionTimeout = /*#__PURE__*/ new WeakSet(), /**
198
- * Gets the RPC message handler for the given snap.
199
- *
200
- * @param snapId - The id of the Snap whose message handler to get.
201
- * @returns The RPC handler for the given snap.
202
- */ _getRpcRequestHandler = /*#__PURE__*/ new WeakSet(), _createInterface = /*#__PURE__*/ new WeakSet(), _assertInterfaceExists = /*#__PURE__*/ new WeakSet(), _transformSnapRpcRequestResult = /*#__PURE__*/ new WeakSet(), _assertSnapRpcRequestResult = /*#__PURE__*/ new WeakSet(), _executeWithTimeout = /*#__PURE__*/ new WeakSet(), _recordSnapRpcRequestStart = /*#__PURE__*/ new WeakSet(), _recordSnapRpcRequestFinish = /*#__PURE__*/ new WeakSet(), /**
203
- * Retrieves the rollback snapshot of a snap.
204
- *
205
- * @param snapId - The snap id.
206
- * @returns A `RollbackSnapshot` or `undefined` if one doesn't exist.
207
- */ _getRollbackSnapshot = /*#__PURE__*/ new WeakSet(), /**
208
- * Creates a `RollbackSnapshot` that is used to help ensure
209
- * atomicity in multiple snap updates.
210
- *
211
- * @param snapId - The snap id.
212
- * @throws {@link Error}. If the snap exists before creation or if creation fails.
213
- * @returns A `RollbackSnapshot`.
214
- */ _createRollbackSnapshot = /*#__PURE__*/ new WeakSet(), _rollbackSnap = /*#__PURE__*/ new WeakSet(), _rollbackSnaps = /*#__PURE__*/ new WeakSet(), _getRuntime = /*#__PURE__*/ new WeakSet(), _getRuntimeExpect = /*#__PURE__*/ new WeakSet(), _setupRuntime = /*#__PURE__*/ new WeakSet(), _calculatePermissionsChange = /*#__PURE__*/ new WeakSet(), /**
215
- * Updates the permissions for a snap following an install, update or rollback.
216
- *
217
- * Grants newly requested permissions and revokes unused/revoked permissions.
218
- *
219
- * @param args - An options bag.
220
- * @param args.snapId - The snap ID.
221
- * @param args.newPermissions - New permissions to be granted.
222
- * @param args.unusedPermissions - Unused permissions to be revoked.
223
- * @param args.requestData - Optional request data from an approval.
224
- */ _updatePermissions = /*#__PURE__*/ new WeakSet(), /**
225
- * Checks if a snap will pass version validation checks
226
- * with the new version range that is requested. The first
227
- * check that is done is to check if the existing snap version
228
- * falls inside the requested range. If it does, we want to return
229
- * false because we do not care to create a rollback snapshot in
230
- * that scenario. The second check is to ensure that the current
231
- * snap version is not greater than all possible versions in
232
- * the requested version range. If it is, then we also want
233
- * to return false in that scenario.
234
- *
235
- * @param snapId - The snap id.
236
- * @param newVersionRange - The new version range being requsted.
237
- * @returns `true` if validation checks pass and `false` if they do not.
238
- */ _isValidUpdate = /*#__PURE__*/ new WeakSet(), _callLifecycleHook = /*#__PURE__*/ new WeakSet();
239
- class SnapController extends _basecontroller.BaseController {
240
- /**
241
- * Checks all installed snaps against the block list and
242
- * blocks/unblocks snaps as appropriate. See {@link SnapController.blockSnap}
243
- * for more information.
244
- */ async updateBlockedSnaps() {
245
- await this.messagingSystem.call('SnapsRegistry:update');
246
- const blockedSnaps = await this.messagingSystem.call('SnapsRegistry:get', Object.values(this.state.snaps).reduce((blockListArg, snap)=>{
247
- blockListArg[snap.id] = {
248
- version: snap.version,
249
- checksum: snap.manifest.source.shasum
250
- };
251
- return blockListArg;
252
- }, {}));
253
- await Promise.all(Object.entries(blockedSnaps).map(async ([snapId, { status, reason }])=>{
254
- if (status === _registry.SnapsRegistryStatus.Blocked) {
255
- return _class_private_method_get(this, _blockSnap, blockSnap).call(this, snapId, reason);
256
- }
257
- return _class_private_method_get(this, _unblockSnap, unblockSnap).call(this, snapId);
258
- }));
259
- }
260
- _onUnhandledSnapError(snapId, _error) {
261
- this.stopSnap(snapId, _snapsutils.SnapStatusEvents.Crash).catch((stopSnapError)=>{
262
- // TODO: Decide how to handle errors.
263
- (0, _snapsutils.logError)(stopSnapError);
264
- });
265
- }
266
- _onOutboundRequest(snapId) {
267
- const runtime = _class_private_method_get(this, _getRuntimeExpect, getRuntimeExpect).call(this, snapId);
268
- // Ideally we would only pause the pending request that is making the outbound request
269
- // but right now we don't have a way to know which request initiated the outbound request
270
- runtime.pendingInboundRequests.filter((pendingRequest)=>pendingRequest.timer.status === 'running').forEach((pendingRequest)=>pendingRequest.timer.pause());
271
- runtime.pendingOutboundRequests += 1;
272
- }
273
- _onOutboundResponse(snapId) {
274
- const runtime = _class_private_method_get(this, _getRuntimeExpect, getRuntimeExpect).call(this, snapId);
275
- runtime.pendingOutboundRequests -= 1;
276
- if (runtime.pendingOutboundRequests === 0) {
277
- runtime.pendingInboundRequests.filter((pendingRequest)=>pendingRequest.timer.status === 'paused').forEach((pendingRequest)=>pendingRequest.timer.resume());
278
- }
279
- }
280
- /**
281
- * Starts the given snap. Throws an error if no such snap exists
282
- * or if it is already running.
283
- *
284
- * @param snapId - The id of the Snap to start.
285
- */ async startSnap(snapId) {
286
- const snap = this.state.snaps[snapId];
287
- if (snap.enabled === false) {
288
- throw new Error(`Snap "${snapId}" is disabled.`);
289
- }
290
- await _class_private_method_get(this, _startSnap, startSnap).call(this, {
291
- snapId,
292
- sourceCode: snap.sourceCode
293
- });
294
- }
295
- /**
296
- * Enables the given snap. A snap can only be started if it is enabled. A snap
297
- * can only be enabled if it isn't blocked.
298
- *
299
- * @param snapId - The id of the Snap to enable.
300
- */ enableSnap(snapId) {
301
- this.getExpect(snapId);
302
- if (this.state.snaps[snapId].blocked) {
303
- throw new Error(`Snap "${snapId}" is blocked and cannot be enabled.`);
304
- }
305
- this.update((state)=>{
306
- state.snaps[snapId].enabled = true;
307
- });
308
- this.messagingSystem.publish('SnapController:snapEnabled', this.getTruncatedExpect(snapId));
309
- }
310
- /**
311
- * Disables the given snap. A snap can only be started if it is enabled.
312
- *
313
- * @param snapId - The id of the Snap to disable.
314
- * @returns A promise that resolves once the snap has been disabled.
315
- */ async disableSnap(snapId) {
316
- if (!this.has(snapId)) {
317
- throw new Error(`Snap "${snapId}" not found.`);
318
- }
319
- this.update((state)=>{
320
- state.snaps[snapId].enabled = false;
321
- });
322
- if (this.isRunning(snapId)) {
323
- await this.stopSnap(snapId, _snapsutils.SnapStatusEvents.Stop);
324
- }
325
- this.messagingSystem.publish('SnapController:snapDisabled', this.getTruncatedExpect(snapId));
326
- }
327
- /**
328
- * Stops the given snap, removes all hooks, closes all connections, and
329
- * terminates its worker.
330
- *
331
- * @param snapId - The id of the Snap to stop.
332
- * @param statusEvent - The Snap status event that caused the snap to be
333
- * stopped.
334
- */ async stopSnap(snapId, statusEvent = _snapsutils.SnapStatusEvents.Stop) {
335
- const runtime = _class_private_method_get(this, _getRuntime, getRuntime).call(this, snapId);
336
- if (!runtime) {
337
- throw new Error(`The snap "${snapId}" is not running.`);
338
- }
339
- // Reset request tracking
340
- runtime.lastRequest = null;
341
- runtime.pendingInboundRequests = [];
342
- runtime.pendingOutboundRequests = 0;
343
- try {
344
- if (this.isRunning(snapId)) {
345
- _class_private_field_get(this, _closeAllConnections)?.call(this, snapId);
346
- await _class_private_method_get(this, _terminateSnap, terminateSnap).call(this, snapId);
347
- }
348
- } finally{
349
- if (this.isRunning(snapId)) {
350
- _class_private_method_get(this, _transition, transition).call(this, snapId, statusEvent);
351
- }
352
- }
353
- }
354
- /**
355
- * Returns whether the given snap is running.
356
- * Throws an error if the snap doesn't exist.
357
- *
358
- * @param snapId - The id of the Snap to check.
359
- * @returns `true` if the snap is running, otherwise `false`.
360
- */ isRunning(snapId) {
361
- return this.getExpect(snapId).status === 'running';
362
- }
363
- /**
364
- * Returns whether the given snap has been added to state.
365
- *
366
- * @param snapId - The id of the Snap to check for.
367
- * @returns `true` if the snap exists in the controller state, otherwise `false`.
368
- */ has(snapId) {
369
- return Boolean(this.get(snapId));
370
- }
371
- /**
372
- * Gets the snap with the given id if it exists, including all data.
373
- * This should not be used if the snap is to be serializable, as e.g.
374
- * the snap sourceCode may be quite large.
375
- *
376
- * @param snapId - The id of the Snap to get.
377
- * @returns The entire snap object from the controller state.
378
- */ get(snapId) {
379
- return this.state.snaps[snapId];
380
- }
381
- /**
382
- * Gets the snap with the given id, throws if doesn't.
383
- * This should not be used if the snap is to be serializable, as e.g.
384
- * the snap sourceCode may be quite large.
385
- *
386
- * @see {@link SnapController.get}
387
- * @throws {@link Error}. If the snap doesn't exist
388
- * @param snapId - The id of the snap to get.
389
- * @returns The entire snap object.
390
- */ getExpect(snapId) {
391
- const snap = this.get(snapId);
392
- (0, _utils.assert)(snap !== undefined, new Error(`Snap "${snapId}" not found.`));
393
- return snap;
394
- }
395
- /**
396
- * Gets the snap with the given id if it exists, excluding any
397
- * non-serializable or expensive-to-serialize data.
398
- *
399
- * @param snapId - The id of the Snap to get.
400
- * @returns A truncated version of the snap state, that is less expensive to serialize.
401
- */ // TODO(ritave): this.get returns undefined, this.getTruncated returns null
402
- getTruncated(snapId) {
403
- const snap = this.get(snapId);
404
- return snap ? truncateSnap(snap) : null;
405
- }
406
- /**
407
- * Gets the snap with the given id, throw if it doesn't exist.
408
- *
409
- * @throws {@link Error}. If snap doesn't exist
410
- * @param snapId - The id of the snap to get.
411
- * @returns A truncated version of the snap state, that is less expensive to serialize.
412
- */ getTruncatedExpect(snapId) {
413
- return truncateSnap(this.getExpect(snapId));
414
- }
415
- /**
416
- * Updates the own state of the snap with the given id.
417
- * This is distinct from the state MetaMask uses to manage snaps.
418
- *
419
- * @param snapId - The id of the Snap whose state should be updated.
420
- * @param newSnapState - The new state of the snap.
421
- * @param encrypted - A flag to indicate whether to use encrypted storage or not.
422
- */ updateSnapState(snapId, newSnapState, encrypted) {
423
- this.update((state)=>{
424
- if (encrypted) {
425
- state.snapStates[snapId] = newSnapState;
426
- } else {
427
- state.unencryptedSnapStates[snapId] = newSnapState;
428
- }
429
- });
430
- }
431
- /**
432
- * Clears the state of the snap with the given id.
433
- * This is distinct from the state MetaMask uses to manage snaps.
434
- *
435
- * @param snapId - The id of the Snap whose state should be cleared.
436
- * @param encrypted - A flag to indicate whether to use encrypted storage or not.
437
- */ clearSnapState(snapId, encrypted) {
438
- this.update((state)=>{
439
- if (encrypted) {
440
- state.snapStates[snapId] = null;
441
- } else {
442
- state.unencryptedSnapStates[snapId] = null;
443
- }
444
- });
445
- }
446
- /**
447
- * Gets the own state of the snap with the given id.
448
- * This is distinct from the state MetaMask uses to manage snaps.
449
- *
450
- * @param snapId - The id of the Snap whose state to get.
451
- * @param encrypted - A flag to indicate whether to use encrypted storage or not.
452
- * @returns The requested snap state or null if no state exists.
453
- */ getSnapState(snapId, encrypted) {
454
- const state = encrypted ? this.state.snapStates[snapId] : this.state.unencryptedSnapStates[snapId];
455
- return state ?? null;
456
- }
457
- /**
458
- * Gets a static auxiliary snap file in a chosen file encoding.
459
- *
460
- * @param snapId - The id of the Snap whose state to get.
461
- * @param path - The path to the requested file.
462
- * @param encoding - An optional requested file encoding.
463
- * @returns The file requested in the chosen file encoding or null if the file is not found.
464
- */ async getSnapFile(snapId, path, encoding = _snapssdk.AuxiliaryFileEncoding.Base64) {
465
- const snap = this.getExpect(snapId);
466
- const normalizedPath = (0, _snapsutils.normalizeRelative)(path);
467
- const value = snap.auxiliaryFiles?.find((file)=>file.path === normalizedPath)?.value;
468
- if (!value) {
469
- return null;
470
- }
471
- return (0, _snapsutils.encodeAuxiliaryFile)(value, encoding);
472
- }
473
- /**
474
- * Completely clear the controller's state: delete all associated data,
475
- * handlers, event listeners, and permissions; tear down all snap providers.
476
- */ async clearState() {
477
- const snapIds = Object.keys(this.state.snaps);
478
- if (_class_private_field_get(this, _closeAllConnections)) {
479
- snapIds.forEach((snapId)=>{
480
- _class_private_field_get(this, _closeAllConnections)?.call(this, snapId);
481
- });
482
- }
483
- await this.messagingSystem.call('ExecutionService:terminateAllSnaps');
484
- snapIds.forEach((snapId)=>_class_private_method_get(this, _revokeAllSnapPermissions, revokeAllSnapPermissions).call(this, snapId));
485
- this.update((state)=>{
486
- state.snaps = {};
487
- state.snapStates = {};
488
- });
489
- }
490
- /**
491
- * Removes the given snap from state, and clears all associated handlers
492
- * and listeners.
493
- *
494
- * @param snapId - The id of the Snap.
495
- * @returns A promise that resolves once the snap has been removed.
496
- */ async removeSnap(snapId) {
497
- return this.removeSnaps([
498
- snapId
499
- ]);
500
- }
501
- /**
502
- * Stops the given snaps, removes them from state, and clears all associated
503
- * permissions, handlers, and listeners.
504
- *
505
- * @param snapIds - The ids of the Snaps.
506
- */ async removeSnaps(snapIds) {
507
- if (!Array.isArray(snapIds)) {
508
- throw new Error('Expected array of snap ids.');
509
- }
510
- snapIds.forEach((snapId)=>{
511
- const snap = this.getExpect(snapId);
512
- (0, _utils.assert)(snap.removable !== false, `${snapId} is not removable.`);
513
- });
514
- await Promise.all(snapIds.map(async (snapId)=>{
515
- const snap = this.getExpect(snapId);
516
- const truncated = this.getTruncatedExpect(snapId);
517
- // Disable the snap and revoke all of its permissions before deleting
518
- // it. This ensures that the snap will not be restarted or otherwise
519
- // affect the host environment while we are deleting it.
520
- await this.disableSnap(snapId);
521
- _class_private_method_get(this, _revokeAllSnapPermissions, revokeAllSnapPermissions).call(this, snapId);
522
- _class_private_method_get(this, _removeSnapFromSubjects, removeSnapFromSubjects).call(this, snapId);
523
- _class_private_field_get(this, _snapsRuntimeData).delete(snapId);
524
- this.update((state)=>{
525
- delete state.snaps[snapId];
526
- delete state.snapStates[snapId];
527
- });
528
- // If the snap has been fully installed before, also emit snapUninstalled.
529
- if (snap.status !== _snapsutils.SnapStatus.Installing) {
530
- this.messagingSystem.publish(`SnapController:snapUninstalled`, truncated);
531
- }
532
- }));
533
- }
534
- /**
535
- * Removes a snap's permission (caveat) from the specified subject.
536
- *
537
- * @param origin - The origin from which to remove the snap.
538
- * @param snapId - The id of the snap to remove.
539
- */ removeSnapFromSubject(origin, snapId) {
540
- const subjectPermissions = this.messagingSystem.call('PermissionController:getPermissions', origin);
541
- const snapIdsCaveat = subjectPermissions?.[_snapsrpcmethods.WALLET_SNAP_PERMISSION_KEY]?.caveats?.find((caveat)=>caveat.type === _snapsutils.SnapCaveatType.SnapIds);
542
- if (!snapIdsCaveat) {
543
- return;
544
- }
545
- const caveatHasSnap = Boolean(snapIdsCaveat.value?.[snapId]);
546
- if (caveatHasSnap) {
547
- const newCaveatValue = {
548
- ...snapIdsCaveat.value
549
- };
550
- delete newCaveatValue[snapId];
551
- if (Object.keys(newCaveatValue).length > 0) {
552
- this.messagingSystem.call('PermissionController:updateCaveat', origin, _snapsrpcmethods.WALLET_SNAP_PERMISSION_KEY, _snapsutils.SnapCaveatType.SnapIds, newCaveatValue);
553
- } else {
554
- this.messagingSystem.call('PermissionController:revokePermissions', {
555
- [origin]: [
556
- _snapsrpcmethods.WALLET_SNAP_PERMISSION_KEY
557
- ]
558
- });
559
- }
560
- }
561
- }
562
- /**
563
- * Checks if a list of permissions are dynamic and allowed to be revoked, if they are they will all be revoked.
564
- *
565
- * @param snapId - The snap ID.
566
- * @param permissionNames - The names of the permissions.
567
- * @throws If non-dynamic permissions are passed.
568
- */ revokeDynamicSnapPermissions(snapId, permissionNames) {
569
- (0, _utils.assert)(permissionNames.every((permissionName)=>_class_private_field_get(this, _dynamicPermissions).includes(permissionName)), 'Non-dynamic permissions cannot be revoked');
570
- this.messagingSystem.call('PermissionController:revokePermissions', {
571
- [snapId]: permissionNames
572
- });
573
- }
574
- /**
575
- * Handles incrementing the activeReferences counter.
576
- *
577
- * @param snapId - The snap id of the snap that was referenced.
578
- */ incrementActiveReferences(snapId) {
579
- const runtime = _class_private_method_get(this, _getRuntimeExpect, getRuntimeExpect).call(this, snapId);
580
- runtime.activeReferences += 1;
581
- }
582
- /**
583
- * Handles decrement the activeReferences counter.
584
- *
585
- * @param snapId - The snap id of the snap that was referenced..
586
- */ decrementActiveReferences(snapId) {
587
- const runtime = _class_private_method_get(this, _getRuntimeExpect, getRuntimeExpect).call(this, snapId);
588
- (0, _utils.assert)(runtime.activeReferences > 0, 'SnapController reference management is in an invalid state.');
589
- runtime.activeReferences -= 1;
590
- }
591
- /**
592
- * Gets all snaps in their truncated format.
593
- *
594
- * @returns All installed snaps in their truncated format.
595
- */ getAllSnaps() {
596
- return Object.values(this.state.snaps).map(truncateSnap);
597
- }
598
- /**
599
- * Gets the serialized permitted snaps of the given origin, if any.
600
- *
601
- * @param origin - The origin whose permitted snaps to retrieve.
602
- * @returns The serialized permitted snaps for the origin.
603
- */ getPermittedSnaps(origin) {
604
- const permissions = this.messagingSystem.call('PermissionController:getPermissions', origin) ?? {};
605
- const snaps = permissions[_snapsrpcmethods.WALLET_SNAP_PERMISSION_KEY]?.caveats?.find((caveat)=>caveat.type === _snapsutils.SnapCaveatType.SnapIds)?.value ?? {};
606
- return Object.keys(snaps).reduce((permittedSnaps, snapId)=>{
607
- const snap = this.get(snapId);
608
- const truncatedSnap = this.getTruncated(snapId);
609
- if (truncatedSnap && snap?.status !== _snapsutils.SnapStatus.Installing) {
610
- permittedSnaps[snapId] = truncatedSnap;
611
- }
612
- return permittedSnaps;
613
- }, {});
614
- }
615
- /**
616
- * Installs the snaps requested by the given origin, returning the snap
617
- * object if the origin is permitted to install it, and an authorization error
618
- * otherwise.
619
- *
620
- * @param origin - The origin that requested to install the snaps.
621
- * @param requestedSnaps - The snaps to install.
622
- * @returns An object of snap ids and snap objects, or errors if a
623
- * snap couldn't be installed.
624
- */ async installSnaps(origin, requestedSnaps) {
625
- const result = {};
626
- const snapIds = Object.keys(requestedSnaps);
627
- const pendingUpdates = [];
628
- const pendingInstalls = [];
629
- try {
630
- for (const [snapId, { version: rawVersion }] of Object.entries(requestedSnaps)){
631
- (0, _snapsutils.assertIsValidSnapId)(snapId);
632
- const [error, version] = (0, _snapsutils.resolveVersionRange)(rawVersion);
633
- if (error) {
634
- throw _rpcerrors.rpcErrors.invalidParams(`The "version" field must be a valid SemVer version range if specified. Received: "${rawVersion}".`);
635
- }
636
- const location = _class_private_field_get(this, _detectSnapLocation).call(this, snapId, {
637
- versionRange: version,
638
- fetch: _class_private_field_get(this, _fetchFunction),
639
- allowLocal: _class_private_field_get(this, _featureFlags).allowLocalSnaps,
640
- resolveVersion: async (range)=>_class_private_field_get(this, _featureFlags).requireAllowlist ? await _class_private_method_get(this, _resolveAllowlistVersion, resolveAllowlistVersion).call(this, snapId, range) : range
641
- });
642
- // Existing snaps may need to be updated, unless they should be re-installed (e.g. local snaps)
643
- // Everything else is treated as an install
644
- const isUpdate = this.has(snapId) && !location.shouldAlwaysReload;
645
- if (isUpdate && _class_private_method_get(this, _isValidUpdate, isValidUpdate).call(this, snapId, version)) {
646
- const existingSnap = this.getExpect(snapId);
647
- pendingUpdates.push({
648
- snapId,
649
- oldVersion: existingSnap.version
650
- });
651
- let rollbackSnapshot = _class_private_method_get(this, _getRollbackSnapshot, getRollbackSnapshot).call(this, snapId);
652
- if (rollbackSnapshot === undefined) {
653
- rollbackSnapshot = _class_private_method_get(this, _createRollbackSnapshot, createRollbackSnapshot).call(this, snapId);
654
- rollbackSnapshot.newVersion = version;
655
- } else {
656
- throw new Error('This snap is already being updated.');
657
- }
658
- } else if (!isUpdate) {
659
- pendingInstalls.push(snapId);
660
- }
661
- result[snapId] = await this.processRequestedSnap(origin, snapId, location, version);
662
- }
663
- // Once we finish all installs / updates, emit events.
664
- pendingInstalls.forEach((snapId)=>this.messagingSystem.publish(`SnapController:snapInstalled`, this.getTruncatedExpect(snapId), origin));
665
- pendingUpdates.forEach(({ snapId, oldVersion })=>this.messagingSystem.publish(`SnapController:snapUpdated`, this.getTruncatedExpect(snapId), oldVersion, origin));
666
- snapIds.forEach((snapId)=>_class_private_field_get(this, _rollbackSnapshots).delete(snapId));
667
- } catch (error) {
668
- const installed = pendingInstalls.filter((snapId)=>this.has(snapId));
669
- await this.removeSnaps(installed);
670
- const snapshottedSnaps = [
671
- ..._class_private_field_get(this, _rollbackSnapshots).keys()
672
- ];
673
- const snapsToRollback = pendingUpdates.map(({ snapId })=>snapId).filter((snapId)=>snapshottedSnaps.includes(snapId));
674
- await _class_private_method_get(this, _rollbackSnaps, rollbackSnaps).call(this, snapsToRollback);
675
- throw error;
676
- }
677
- return result;
678
- }
679
- /**
680
- * Adds, authorizes, and runs the given snap with a snap provider.
681
- * Results from this method should be efficiently serializable.
682
- *
683
- * @param origin - The origin requesting the snap.
684
- * @param snapId - The id of the snap.
685
- * @param location - The location implementation of the snap.
686
- * @param versionRange - The semver range of the snap to install.
687
- * @returns The resulting snap object, or an error if something went wrong.
688
- */ async processRequestedSnap(origin, snapId, location, versionRange) {
689
- const existingSnap = this.getTruncated(snapId);
690
- // For devX we always re-install local snaps.
691
- if (existingSnap && !location.shouldAlwaysReload) {
692
- if ((0, _utils.satisfiesVersionRange)(existingSnap.version, versionRange)) {
693
- return existingSnap;
694
- }
695
- return await this.updateSnap(origin, snapId, location, versionRange, // Since we are requesting an update from within processRequestedSnap,
696
- // we disable the emitting of the snapUpdated event and rely on the caller
697
- // to publish this event after the update is complete.
698
- // This is necessary as installSnaps may be installing multiple snaps
699
- // and we don't want to emit events prematurely.
700
- false);
701
- }
702
- let pendingApproval = _class_private_method_get(this, _createApproval, createApproval).call(this, {
703
- origin,
704
- snapId,
705
- type: SNAP_APPROVAL_INSTALL
706
- });
707
- this.messagingSystem.publish('SnapController:snapInstallStarted', snapId, origin, false);
708
- // Existing snaps must be stopped before overwriting
709
- if (existingSnap && this.isRunning(snapId)) {
710
- await this.stopSnap(snapId, _snapsutils.SnapStatusEvents.Stop);
711
- }
712
- // Existing snaps that should be re-installed should not maintain their existing permissions
713
- if (existingSnap && location.shouldAlwaysReload) {
714
- _class_private_method_get(this, _revokeAllSnapPermissions, revokeAllSnapPermissions).call(this, snapId);
715
- }
716
- try {
717
- const { sourceCode } = await _class_private_method_get(this, _add, add).call(this, {
718
- origin,
719
- id: snapId,
720
- location,
721
- versionRange
722
- });
723
- await this.authorize(snapId, pendingApproval);
724
- pendingApproval = _class_private_method_get(this, _createApproval, createApproval).call(this, {
725
- origin,
726
- snapId,
727
- type: SNAP_APPROVAL_RESULT
728
- });
729
- await _class_private_method_get(this, _startSnap, startSnap).call(this, {
730
- snapId,
731
- sourceCode
732
- });
733
- const truncated = this.getTruncatedExpect(snapId);
734
- _class_private_method_get(this, _updateApproval, updateApproval).call(this, pendingApproval.id, {
735
- loading: false,
736
- type: SNAP_APPROVAL_INSTALL
737
- });
738
- return truncated;
739
- } catch (error) {
740
- (0, _snapsutils.logError)(`Error when adding ${snapId}.`, error);
741
- const errorString = error instanceof Error ? error.message : error.toString();
742
- _class_private_method_get(this, _updateApproval, updateApproval).call(this, pendingApproval.id, {
743
- loading: false,
744
- type: SNAP_APPROVAL_INSTALL,
745
- error: errorString
746
- });
747
- this.messagingSystem.publish('SnapController:snapInstallFailed', snapId, origin, false, errorString);
748
- throw error;
749
- }
750
- }
751
- /**
752
- * Updates an installed snap. The flow is similar to
753
- * {@link SnapController.installSnaps}. The user will be asked if they want
754
- * to update, then approve any permission changes, and finally the snap will
755
- * be restarted.
756
- *
757
- * The update will fail if the user rejects any prompt or if the new version
758
- * of the snap is blocked.
759
- *
760
- * If the original version of the snap was blocked and the update succeeded,
761
- * the snap will be unblocked and enabled before it is restarted.
762
- *
763
- * @param origin - The origin requesting the snap update.
764
- * @param snapId - The id of the Snap to be updated.
765
- * @param location - The location implementation of the snap.
766
- * @param newVersionRange - A semver version range in which the maximum version will be chosen.
767
- * @param emitEvent - An optional boolean flag to indicate whether this update should emit an event.
768
- * @returns The snap metadata if updated, `null` otherwise.
769
- */ async updateSnap(origin, snapId, location, newVersionRange = _snapsutils.DEFAULT_REQUESTED_SNAP_VERSION, emitEvent = true) {
770
- if (!(0, _utils.isValidSemVerRange)(newVersionRange)) {
771
- throw new Error(`Received invalid snap version range: "${newVersionRange}".`);
772
- }
773
- let pendingApproval = _class_private_method_get(this, _createApproval, createApproval).call(this, {
774
- origin,
775
- snapId,
776
- type: SNAP_APPROVAL_UPDATE
777
- });
778
- try {
779
- this.messagingSystem.publish('SnapController:snapInstallStarted', snapId, origin, true);
780
- const snap = this.getExpect(snapId);
781
- const oldManifest = snap.manifest;
782
- const newSnap = await (0, _utils1.fetchSnap)(snapId, location);
783
- const { sourceCode: sourceCodeFile, manifest: manifestFile } = newSnap;
784
- const manifest = manifestFile.result;
785
- const newVersion = manifest.version;
786
- if (!(0, _utils.gtVersion)(newVersion, snap.version)) {
787
- throw _rpcerrors.rpcErrors.invalidParams(`Snap "${snapId}@${snap.version}" is already installed. Couldn't update to a version inside requested "${newVersionRange}" range.`);
788
- }
789
- if (!(0, _utils.satisfiesVersionRange)(newVersion, newVersionRange)) {
790
- throw new Error(`Version mismatch. Manifest for "${snapId}" specifies version "${newVersion}" which doesn't satisfy requested version range "${newVersionRange}".`);
791
- }
792
- await _class_private_method_get(this, _assertIsInstallAllowed, assertIsInstallAllowed).call(this, snapId, {
793
- version: newVersion,
794
- checksum: manifest.source.shasum,
795
- permissions: manifest.initialPermissions
796
- });
797
- const processedPermissions = (0, _snapsrpcmethods.processSnapPermissions)(manifest.initialPermissions);
798
- _class_private_method_get(this, _validateSnapPermissions, validateSnapPermissions).call(this, processedPermissions);
799
- const { newPermissions, unusedPermissions, approvedPermissions } = _class_private_method_get(this, _calculatePermissionsChange, calculatePermissionsChange).call(this, snapId, processedPermissions);
800
- _class_private_method_get(this, _updateApproval, updateApproval).call(this, pendingApproval.id, {
801
- permissions: newPermissions,
802
- newVersion: manifest.version,
803
- newPermissions,
804
- approvedPermissions,
805
- unusedPermissions,
806
- loading: false
807
- });
808
- const { permissions: approvedNewPermissions, ...requestData } = await pendingApproval.promise;
809
- pendingApproval = _class_private_method_get(this, _createApproval, createApproval).call(this, {
810
- origin,
811
- snapId,
812
- type: SNAP_APPROVAL_RESULT
813
- });
814
- if (this.isRunning(snapId)) {
815
- await this.stopSnap(snapId, _snapsutils.SnapStatusEvents.Stop);
816
- }
817
- _class_private_method_get(this, _transition, transition).call(this, snapId, _snapsutils.SnapStatusEvents.Update);
818
- _class_private_method_get(this, _set, set).call(this, {
819
- origin,
820
- id: snapId,
821
- files: newSnap,
822
- isUpdate: true
823
- });
824
- _class_private_method_get(this, _updatePermissions, updatePermissions).call(this, {
825
- snapId,
826
- unusedPermissions,
827
- newPermissions: approvedNewPermissions,
828
- requestData
829
- });
830
- if (manifest.initialConnections) {
831
- _class_private_method_get(this, _handleInitialConnections, handleInitialConnections).call(this, snapId, oldManifest.initialConnections ?? null, manifest.initialConnections);
832
- }
833
- const rollbackSnapshot = _class_private_method_get(this, _getRollbackSnapshot, getRollbackSnapshot).call(this, snapId);
834
- if (rollbackSnapshot !== undefined) {
835
- rollbackSnapshot.permissions.revoked = unusedPermissions;
836
- rollbackSnapshot.permissions.granted = approvedNewPermissions;
837
- rollbackSnapshot.permissions.requestData = requestData;
838
- }
839
- const sourceCode = sourceCodeFile.toString();
840
- (0, _utils.assert)(typeof sourceCode === 'string' && sourceCode.length > 0, `Invalid source code for snap "${snapId}".`);
841
- try {
842
- await _class_private_method_get(this, _startSnap, startSnap).call(this, {
843
- snapId,
844
- sourceCode
845
- });
846
- } catch {
847
- throw new Error(`Snap ${snapId} crashed with updated source code.`);
848
- }
849
- const truncatedSnap = this.getTruncatedExpect(snapId);
850
- if (emitEvent) {
851
- this.messagingSystem.publish('SnapController:snapUpdated', truncatedSnap, snap.version, origin);
852
- }
853
- _class_private_method_get(this, _updateApproval, updateApproval).call(this, pendingApproval.id, {
854
- loading: false,
855
- type: SNAP_APPROVAL_UPDATE
856
- });
857
- return truncatedSnap;
858
- } catch (error) {
859
- (0, _snapsutils.logError)(`Error when updating ${snapId},`, error);
860
- const errorString = error instanceof Error ? error.message : error.toString();
861
- _class_private_method_get(this, _updateApproval, updateApproval).call(this, pendingApproval.id, {
862
- loading: false,
863
- error: errorString,
864
- type: SNAP_APPROVAL_UPDATE
865
- });
866
- this.messagingSystem.publish('SnapController:snapInstallFailed', snapId, origin, true, errorString);
867
- throw error;
868
- }
869
- }
870
- /**
871
- * Get metadata for the given snap ID.
872
- *
873
- * @param snapId - The ID of the snap to get metadata for.
874
- * @returns The metadata for the given snap ID, or `null` if the snap is not
875
- * verified.
876
- */ async getRegistryMetadata(snapId) {
877
- return await this.messagingSystem.call('SnapsRegistry:getMetadata', snapId);
878
- }
879
- /**
880
- * Initiates a request for the given snap's initial permissions.
881
- * Must be called in order. See processRequestedSnap.
882
- *
883
- * This function is not hash private yet because of tests.
884
- *
885
- * @param snapId - The id of the Snap.
886
- * @param pendingApproval - Pending approval to update.
887
- * @returns The snap's approvedPermissions.
888
- */ async authorize(snapId, pendingApproval) {
889
- (0, _logging.log)(`Authorizing snap: ${snapId}`);
890
- const snapsState = this.state.snaps;
891
- const snap = snapsState[snapId];
892
- const { initialPermissions } = snap;
893
- try {
894
- const processedPermissions = (0, _snapsrpcmethods.processSnapPermissions)(initialPermissions);
895
- _class_private_method_get(this, _validateSnapPermissions, validateSnapPermissions).call(this, processedPermissions);
896
- _class_private_method_get(this, _updateApproval, updateApproval).call(this, pendingApproval.id, {
897
- loading: false,
898
- permissions: processedPermissions
899
- });
900
- const { permissions: approvedPermissions, ...requestData } = await pendingApproval.promise;
901
- _class_private_method_get(this, _updatePermissions, updatePermissions).call(this, {
902
- snapId,
903
- newPermissions: approvedPermissions,
904
- requestData
905
- });
906
- if (snap.manifest.initialConnections) {
907
- _class_private_method_get(this, _handleInitialConnections, handleInitialConnections).call(this, snapId, null, snap.manifest.initialConnections);
908
- }
909
- } finally{
910
- const runtime = _class_private_method_get(this, _getRuntimeExpect, getRuntimeExpect).call(this, snapId);
911
- runtime.installPromise = null;
912
- }
913
- }
914
- destroy() {
915
- super.destroy();
916
- if (_class_private_field_get(this, _timeoutForLastRequestStatus)) {
917
- clearTimeout(_class_private_field_get(this, _timeoutForLastRequestStatus));
918
- }
919
- /* eslint-disable @typescript-eslint/unbound-method */ this.messagingSystem.unsubscribe('ExecutionService:unhandledError', this._onUnhandledSnapError);
920
- this.messagingSystem.unsubscribe('ExecutionService:outboundRequest', this._onOutboundRequest);
921
- this.messagingSystem.unsubscribe('ExecutionService:outboundResponse', this._onOutboundResponse);
922
- this.messagingSystem.clearEventSubscriptions('SnapController:snapInstalled');
923
- this.messagingSystem.clearEventSubscriptions('SnapController:snapUpdated');
924
- /* eslint-enable @typescript-eslint/unbound-method */ }
925
- /**
926
- * Passes a JSON-RPC request object to the RPC handler function of a snap.
927
- *
928
- * @param options - A bag of options.
929
- * @param options.snapId - The ID of the recipient snap.
930
- * @param options.origin - The origin of the RPC request.
931
- * @param options.handler - The handler to trigger on the snap for the request.
932
- * @param options.request - The JSON-RPC request object.
933
- * @returns The result of the JSON-RPC request.
934
- */ async handleRequest({ snapId, origin, handler: handlerType, request: rawRequest }) {
935
- const request = {
936
- jsonrpc: '2.0',
937
- id: (0, _nanoid.nanoid)(),
938
- ...rawRequest
939
- };
940
- (0, _utils.assertIsJsonRpcRequest)(request);
941
- const permissionName = _snapsrpcmethods.handlerEndowments[handlerType];
942
- (0, _utils.assert)(typeof permissionName === 'string' || permissionName === null, "'permissionName' must be either a string or null.");
943
- const permissions = this.messagingSystem.call('PermissionController:getPermissions', snapId);
944
- // If permissionName is null, the handler does not require a permission.
945
- if (permissionName !== null && (!permissions || !(0, _utils.hasProperty)(permissions, permissionName))) {
946
- throw new Error(`Snap "${snapId}" is not permitted to use "${permissionName}".`);
947
- }
948
- const handlerPermissions = permissionName ? permissions[permissionName] : undefined;
949
- if (permissionName === _snapsrpcmethods.SnapEndowments.Rpc || permissionName === _snapsrpcmethods.SnapEndowments.Keyring) {
950
- (0, _utils.assert)(handlerPermissions);
951
- const subject = this.messagingSystem.call('SubjectMetadataController:getSubjectMetadata', origin);
952
- const origins = permissionName === _snapsrpcmethods.SnapEndowments.Rpc ? (0, _snapsrpcmethods.getRpcCaveatOrigins)(handlerPermissions) : (0, _snapsrpcmethods.getKeyringCaveatOrigins)(handlerPermissions);
953
- (0, _utils.assert)(origins);
954
- if (!(0, _snapsutils.isOriginAllowed)(origins, subject?.subjectType ?? _permissioncontroller.SubjectType.Website, origin)) {
955
- throw new Error(`Snap "${snapId}" is not permitted to handle requests from "${origin}".`);
956
- }
957
- }
958
- const handler = _class_private_method_get(this, _getRpcRequestHandler, getRpcRequestHandler).call(this, snapId);
959
- if (!handler) {
960
- throw new Error(`Snap RPC message handler not found for snap "${snapId}".`);
961
- }
962
- const timeout = _class_private_method_get(this, _getExecutionTimeout, getExecutionTimeout).call(this, handlerPermissions);
963
- return handler({
964
- origin,
965
- handler: handlerType,
966
- request,
967
- timeout
968
- });
969
- }
970
- constructor({ closeAllConnections, messenger, state, dynamicPermissions = [
971
- 'eth_accounts'
972
- ], environmentEndowmentPermissions = [], excludedPermissions = {}, idleTimeCheckInterval = (0, _utils.inMilliseconds)(5, _utils.Duration.Second), maxIdleTime = (0, _utils.inMilliseconds)(30, _utils.Duration.Second), maxRequestTime = (0, _utils.inMilliseconds)(60, _utils.Duration.Second), fetchFunction = globalThis.fetch.bind(globalThis), featureFlags = {}, detectSnapLocation: detectSnapLocationFunction = _location.detectSnapLocation, preinstalledSnaps }){
973
- super({
974
- messenger,
975
- metadata: {
976
- snapStates: {
977
- persist: true,
978
- anonymous: false
979
- },
980
- unencryptedSnapStates: {
981
- persist: true,
982
- anonymous: false
983
- },
984
- snaps: {
985
- persist: (snaps)=>{
986
- return Object.values(snaps)// We should not persist snaps that are in the installing state,
987
- // since they haven't completed installation and would be unusable
988
- .filter((snap)=>snap.status !== _snapsutils.SnapStatus.Installing).map((snap)=>{
989
- return {
990
- ...snap,
991
- // At the time state is rehydrated, no snap will be running.
992
- status: _snapsutils.SnapStatus.Stopped
993
- };
994
- }).reduce((memo, snap)=>{
995
- memo[snap.id] = snap;
996
- return memo;
997
- }, {});
998
- },
999
- anonymous: false
1000
- }
1001
- },
1002
- name,
1003
- state: {
1004
- ...defaultState,
1005
- ...state
1006
- }
1007
- });
1008
- _class_private_method_init(this, _initializeStateMachine);
1009
- _class_private_method_init(this, _registerMessageHandlers);
1010
- _class_private_method_init(this, _handlePreinstalledSnaps);
1011
- _class_private_method_init(this, _pollForLastRequestStatus);
1012
- /**
1013
- * Blocks an installed snap and prevents it from being started again. Emits
1014
- * {@link SnapBlocked}. Does nothing if the snap is not installed.
1015
- *
1016
- * @param snapId - The snap to block.
1017
- * @param blockedSnapInfo - Information detailing why the snap is blocked.
1018
- */ _class_private_method_init(this, _blockSnap);
1019
- _class_private_method_init(this, _unblockSnap);
1020
- _class_private_method_init(this, _assertIsInstallAllowed);
1021
- _class_private_method_init(this, _stopSnapsLastRequestPastMax);
1022
- _class_private_method_init(this, _transition);
1023
- /**
1024
- * Terminates the specified snap and emits the `snapTerminated` event.
1025
- *
1026
- * @param snapId - The snap to terminate.
1027
- */ _class_private_method_init(this, _terminateSnap);
1028
- _class_private_method_init(this, _handleInitialConnections);
1029
- _class_private_method_init(this, _addSnapToSubject);
1030
- _class_private_method_init(this, _removeSnapFromSubjects);
1031
- _class_private_method_init(this, _revokeAllSnapPermissions);
1032
- _class_private_method_init(this, _createApproval);
1033
- _class_private_method_init(this, _updateApproval);
1034
- _class_private_method_init(this, _resolveAllowlistVersion);
1035
- /**
1036
- * Returns a promise representing the complete installation of the requested snap.
1037
- * If the snap is already being installed, the previously pending promise will be returned.
1038
- *
1039
- * @param args - Object containing the snap id and either the URL of the snap's manifest,
1040
- * or the snap's manifest and source code. The object may also optionally contain a target
1041
- * version.
1042
- * @returns The resulting snap object.
1043
- */ _class_private_method_init(this, _add);
1044
- _class_private_method_init(this, _startSnap);
1045
- /**
1046
- * Gets the names of all endowments that will be added to the Snap's
1047
- * Compartment when it executes. These should be the names of global
1048
- * JavaScript APIs accessible in the root realm of the execution environment.
1049
- *
1050
- * Throws an error if the endowment getter for a permission returns a truthy
1051
- * value that is not an array of strings.
1052
- *
1053
- * @param snapId - The id of the snap whose SES endowments to get.
1054
- * @returns An array of the names of the endowments.
1055
- */ _class_private_method_init(this, _getEndowments);
1056
- _class_private_method_init(this, _set);
1057
- _class_private_method_init(this, _validateSnapPermissions);
1058
- _class_private_method_init(this, _getExecutionTimeout);
1059
- _class_private_method_init(this, _getRpcRequestHandler);
1060
- /**
1061
- * Create a dynamic interface in the SnapInterfaceController.
1062
- *
1063
- * @param snapId - The snap ID.
1064
- * @param content - The initial interface content.
1065
- * @returns An identifier that can be used to identify the interface.
1066
- */ _class_private_method_init(this, _createInterface);
1067
- _class_private_method_init(this, _assertInterfaceExists);
1068
- /**
1069
- * Transform a RPC request result if necessary.
1070
- *
1071
- * @param snapId - The snap ID of the snap that produced the result.
1072
- * @param handlerType - The handler type that produced the result.
1073
- * @param result - The result.
1074
- * @returns The transformed result if applicable, otherwise the original result.
1075
- */ _class_private_method_init(this, _transformSnapRpcRequestResult);
1076
- /**
1077
- * Assert that the returned result of a Snap RPC call is the expected shape.
1078
- *
1079
- * @param snapId - The snap ID.
1080
- * @param handlerType - The handler type of the RPC Request.
1081
- * @param result - The result of the RPC request.
1082
- */ _class_private_method_init(this, _assertSnapRpcRequestResult);
1083
- /**
1084
- * Awaits the specified promise and rejects if the promise doesn't resolve
1085
- * before the timeout.
1086
- *
1087
- * @param promise - The promise to await.
1088
- * @param timer - An optional timer object to control the timeout.
1089
- * @returns The result of the promise or rejects if the promise times out.
1090
- * @template PromiseValue - The value of the Promise.
1091
- */ _class_private_method_init(this, _executeWithTimeout);
1092
- _class_private_method_init(this, _recordSnapRpcRequestStart);
1093
- _class_private_method_init(this, _recordSnapRpcRequestFinish);
1094
- _class_private_method_init(this, _getRollbackSnapshot);
1095
- _class_private_method_init(this, _createRollbackSnapshot);
1096
- /**
1097
- * Rolls back a snap to its previous state, permissions
1098
- * and source code based on the `RollbackSnapshot` that
1099
- * is captured during the update process. After rolling back,
1100
- * the function also emits an event indicating that the
1101
- * snap has been rolled back and it clears the snapshot
1102
- * for that snap.
1103
- *
1104
- * @param snapId - The snap id.
1105
- * @throws {@link Error}. If a snapshot does not exist.
1106
- */ _class_private_method_init(this, _rollbackSnap);
1107
- /**
1108
- * Iterates through an array of snap ids
1109
- * and calls `rollbackSnap` on them.
1110
- *
1111
- * @param snapIds - An array of snap ids.
1112
- */ _class_private_method_init(this, _rollbackSnaps);
1113
- _class_private_method_init(this, _getRuntime);
1114
- _class_private_method_init(this, _getRuntimeExpect);
1115
- _class_private_method_init(this, _setupRuntime);
1116
- _class_private_method_init(this, _calculatePermissionsChange);
1117
- _class_private_method_init(this, _updatePermissions);
1118
- _class_private_method_init(this, _isValidUpdate);
1119
- /**
1120
- * Call a lifecycle hook on a snap, if the snap has the
1121
- * `endowment:lifecycle-hooks` permission. If the snap does not have the
1122
- * permission, nothing happens.
1123
- *
1124
- * @param snapId - The snap ID.
1125
- * @param handler - The lifecycle hook to call. This should be one of the
1126
- * supported lifecycle hooks.
1127
- * @private
1128
- */ _class_private_method_init(this, _callLifecycleHook);
1129
- _class_private_field_init(this, _closeAllConnections, {
1130
- writable: true,
1131
- value: void 0
1132
- });
1133
- _class_private_field_init(this, _dynamicPermissions, {
1134
- writable: true,
1135
- value: void 0
1136
- });
1137
- _class_private_field_init(this, _environmentEndowmentPermissions, {
1138
- writable: true,
1139
- value: void 0
1140
- });
1141
- _class_private_field_init(this, _excludedPermissions, {
1142
- writable: true,
1143
- value: void 0
1144
- });
1145
- _class_private_field_init(this, _featureFlags, {
1146
- writable: true,
1147
- value: void 0
1148
- });
1149
- _class_private_field_init(this, _fetchFunction, {
1150
- writable: true,
1151
- value: void 0
1152
- });
1153
- _class_private_field_init(this, _idleTimeCheckInterval, {
1154
- writable: true,
1155
- value: void 0
1156
- });
1157
- _class_private_field_init(this, _maxIdleTime, {
1158
- writable: true,
1159
- value: void 0
1160
- });
1161
- // This property cannot be hash private yet because of tests.
1162
- _define_property(this, "maxRequestTime", void 0);
1163
- _class_private_field_init(this, _detectSnapLocation, {
1164
- writable: true,
1165
- value: void 0
1166
- });
1167
- _class_private_field_init(this, _snapsRuntimeData, {
1168
- writable: true,
1169
- value: void 0
1170
- });
1171
- _class_private_field_init(this, _rollbackSnapshots, {
1172
- writable: true,
1173
- value: void 0
1174
- });
1175
- _class_private_field_init(this, _timeoutForLastRequestStatus, {
1176
- writable: true,
1177
- value: void 0
1178
- });
1179
- _class_private_field_init(this, _statusMachine, {
1180
- writable: true,
1181
- value: void 0
1182
- });
1183
- _class_private_field_set(this, _closeAllConnections, closeAllConnections);
1184
- _class_private_field_set(this, _dynamicPermissions, dynamicPermissions);
1185
- _class_private_field_set(this, _environmentEndowmentPermissions, environmentEndowmentPermissions);
1186
- _class_private_field_set(this, _excludedPermissions, excludedPermissions);
1187
- _class_private_field_set(this, _featureFlags, featureFlags);
1188
- _class_private_field_set(this, _fetchFunction, fetchFunction);
1189
- _class_private_field_set(this, _idleTimeCheckInterval, idleTimeCheckInterval);
1190
- _class_private_field_set(this, _maxIdleTime, maxIdleTime);
1191
- this.maxRequestTime = maxRequestTime;
1192
- _class_private_field_set(this, _detectSnapLocation, detectSnapLocationFunction);
1193
- this._onUnhandledSnapError = this._onUnhandledSnapError.bind(this);
1194
- this._onOutboundRequest = this._onOutboundRequest.bind(this);
1195
- this._onOutboundResponse = this._onOutboundResponse.bind(this);
1196
- _class_private_field_set(this, _rollbackSnapshots, new Map());
1197
- _class_private_field_set(this, _snapsRuntimeData, new Map());
1198
- _class_private_method_get(this, _pollForLastRequestStatus, pollForLastRequestStatus).call(this);
1199
- /* eslint-disable @typescript-eslint/unbound-method */ this.messagingSystem.subscribe('ExecutionService:unhandledError', this._onUnhandledSnapError);
1200
- this.messagingSystem.subscribe('ExecutionService:outboundRequest', this._onOutboundRequest);
1201
- this.messagingSystem.subscribe('ExecutionService:outboundResponse', this._onOutboundResponse);
1202
- /* eslint-enable @typescript-eslint/unbound-method */ this.messagingSystem.subscribe('SnapController:snapInstalled', ({ id })=>{
1203
- _class_private_method_get(this, _callLifecycleHook, callLifecycleHook).call(this, id, _snapsutils.HandlerType.OnInstall).catch((error)=>{
1204
- (0, _snapsutils.logError)(`Error when calling \`onInstall\` lifecycle hook for snap "${id}": ${(0, _snapssdk.getErrorMessage)(error)}`);
1205
- });
1206
- });
1207
- this.messagingSystem.subscribe('SnapController:snapUpdated', ({ id })=>{
1208
- _class_private_method_get(this, _callLifecycleHook, callLifecycleHook).call(this, id, _snapsutils.HandlerType.OnUpdate).catch((error)=>{
1209
- (0, _snapsutils.logError)(`Error when calling \`onUpdate\` lifecycle hook for snap "${id}": ${(0, _snapssdk.getErrorMessage)(error)}`);
1210
- });
1211
- });
1212
- _class_private_method_get(this, _initializeStateMachine, initializeStateMachine).call(this);
1213
- _class_private_method_get(this, _registerMessageHandlers, registerMessageHandlers).call(this);
1214
- if (preinstalledSnaps) {
1215
- _class_private_method_get(this, _handlePreinstalledSnaps, handlePreinstalledSnaps).call(this, preinstalledSnaps);
1216
- }
1217
- Object.values(this.state?.snaps ?? {}).forEach((snap)=>_class_private_method_get(this, _setupRuntime, setupRuntime).call(this, snap.id));
1218
- }
1219
- }
1220
- function initializeStateMachine() {
1221
- const disableGuard = ({ snapId })=>{
1222
- return this.getExpect(snapId).enabled;
1223
- };
1224
- const statusConfig = {
1225
- initial: _snapsutils.SnapStatus.Installing,
1226
- states: {
1227
- [_snapsutils.SnapStatus.Installing]: {
1228
- on: {
1229
- [_snapsutils.SnapStatusEvents.Start]: {
1230
- target: _snapsutils.SnapStatus.Running,
1231
- cond: disableGuard
1232
- }
1233
- }
1234
- },
1235
- [_snapsutils.SnapStatus.Updating]: {
1236
- on: {
1237
- [_snapsutils.SnapStatusEvents.Start]: {
1238
- target: _snapsutils.SnapStatus.Running,
1239
- cond: disableGuard
1240
- },
1241
- [_snapsutils.SnapStatusEvents.Stop]: _snapsutils.SnapStatus.Stopped
1242
- }
1243
- },
1244
- [_snapsutils.SnapStatus.Running]: {
1245
- on: {
1246
- [_snapsutils.SnapStatusEvents.Stop]: _snapsutils.SnapStatus.Stopped,
1247
- [_snapsutils.SnapStatusEvents.Crash]: _snapsutils.SnapStatus.Crashed
1248
- }
1249
- },
1250
- [_snapsutils.SnapStatus.Stopped]: {
1251
- on: {
1252
- [_snapsutils.SnapStatusEvents.Start]: {
1253
- target: _snapsutils.SnapStatus.Running,
1254
- cond: disableGuard
1255
- },
1256
- [_snapsutils.SnapStatusEvents.Update]: _snapsutils.SnapStatus.Updating
1257
- }
1258
- },
1259
- [_snapsutils.SnapStatus.Crashed]: {
1260
- on: {
1261
- [_snapsutils.SnapStatusEvents.Start]: {
1262
- target: _snapsutils.SnapStatus.Running,
1263
- cond: disableGuard
1264
- },
1265
- [_snapsutils.SnapStatusEvents.Update]: _snapsutils.SnapStatus.Updating
1266
- }
1267
- }
1268
- }
1269
- };
1270
- _class_private_field_set(this, _statusMachine, (0, _fsm.createMachine)(statusConfig));
1271
- (0, _fsm1.validateMachine)(_class_private_field_get(this, _statusMachine));
1272
- }
1273
- function registerMessageHandlers() {
1274
- this.messagingSystem.registerActionHandler(`${controllerName}:clearSnapState`, (...args)=>this.clearSnapState(...args));
1275
- this.messagingSystem.registerActionHandler(`${controllerName}:get`, (...args)=>this.get(...args));
1276
- this.messagingSystem.registerActionHandler(`${controllerName}:getSnapState`, (...args)=>this.getSnapState(...args));
1277
- this.messagingSystem.registerActionHandler(`${controllerName}:handleRequest`, async (...args)=>this.handleRequest(...args));
1278
- this.messagingSystem.registerActionHandler(`${controllerName}:has`, (...args)=>this.has(...args));
1279
- this.messagingSystem.registerActionHandler(`${controllerName}:updateBlockedSnaps`, async ()=>this.updateBlockedSnaps());
1280
- this.messagingSystem.registerActionHandler(`${controllerName}:updateSnapState`, (...args)=>this.updateSnapState(...args));
1281
- this.messagingSystem.registerActionHandler(`${controllerName}:enable`, (...args)=>this.enableSnap(...args));
1282
- this.messagingSystem.registerActionHandler(`${controllerName}:disable`, async (...args)=>this.disableSnap(...args));
1283
- this.messagingSystem.registerActionHandler(`${controllerName}:remove`, async (...args)=>this.removeSnap(...args));
1284
- this.messagingSystem.registerActionHandler(`${controllerName}:getPermitted`, (...args)=>this.getPermittedSnaps(...args));
1285
- this.messagingSystem.registerActionHandler(`${controllerName}:install`, async (...args)=>this.installSnaps(...args));
1286
- this.messagingSystem.registerActionHandler(`${controllerName}:getAll`, (...args)=>this.getAllSnaps(...args));
1287
- this.messagingSystem.registerActionHandler(`${controllerName}:incrementActiveReferences`, (...args)=>this.incrementActiveReferences(...args));
1288
- this.messagingSystem.registerActionHandler(`${controllerName}:decrementActiveReferences`, (...args)=>this.decrementActiveReferences(...args));
1289
- this.messagingSystem.registerActionHandler(`${controllerName}:getRegistryMetadata`, async (...args)=>this.getRegistryMetadata(...args));
1290
- this.messagingSystem.registerActionHandler(`${controllerName}:disconnectOrigin`, (...args)=>this.removeSnapFromSubject(...args));
1291
- this.messagingSystem.registerActionHandler(`${controllerName}:revokeDynamicPermissions`, (...args)=>this.revokeDynamicSnapPermissions(...args));
1292
- this.messagingSystem.registerActionHandler(`${controllerName}:getFile`, async (...args)=>this.getSnapFile(...args));
1293
- }
1294
- function handlePreinstalledSnaps(preinstalledSnaps) {
1295
- for (const { snapId, manifest, files, removable } of preinstalledSnaps){
1296
- const existingSnap = this.get(snapId);
1297
- const isAlreadyInstalled = existingSnap !== undefined;
1298
- const isUpdate = isAlreadyInstalled && (0, _utils.gtVersion)(manifest.version, existingSnap.version);
1299
- // Disallow downgrades and overwriting non preinstalled snaps
1300
- if (isAlreadyInstalled && (!isUpdate || existingSnap.preinstalled !== true)) {
1301
- continue;
1302
- }
1303
- const manifestFile = new _snapsutils.VirtualFile({
1304
- path: _snapsutils.NpmSnapFileNames.Manifest,
1305
- value: JSON.stringify(manifest),
1306
- result: manifest
1307
- });
1308
- const virtualFiles = files.map(({ path, value })=>new _snapsutils.VirtualFile({
1309
- value,
1310
- path
1311
- }));
1312
- const { filePath, iconPath } = manifest.source.location.npm;
1313
- const sourceCode = virtualFiles.find((file)=>file.path === filePath);
1314
- const svgIcon = iconPath ? virtualFiles.find((file)=>file.path === iconPath) : undefined;
1315
- (0, _utils.assert)(sourceCode, 'Source code not provided for preinstalled snap.');
1316
- (0, _utils.assert)(!iconPath || iconPath && svgIcon, 'Icon not provided for preinstalled snap.');
1317
- (0, _utils.assert)(manifest.source.files === undefined, 'Auxiliary files are not currently supported for preinstalled snaps.');
1318
- const localizationFiles = manifest.source.locales?.map((path)=>virtualFiles.find((file)=>file.path === path)) ?? [];
1319
- const validatedLocalizationFiles = (0, _snapsutils.getValidatedLocalizationFiles)(localizationFiles.filter(Boolean));
1320
- (0, _utils.assert)(localizationFiles.length === validatedLocalizationFiles.length, 'Missing localization files for preinstalled snap.');
1321
- const filesObject = {
1322
- manifest: manifestFile,
1323
- sourceCode,
1324
- svgIcon,
1325
- auxiliaryFiles: [],
1326
- localizationFiles: validatedLocalizationFiles
1327
- };
1328
- // Add snap to the SnapController state
1329
- _class_private_method_get(this, _set, set).call(this, {
1330
- id: snapId,
1331
- origin: 'metamask',
1332
- files: filesObject,
1333
- removable,
1334
- preinstalled: true
1335
- });
1336
- // Setup permissions
1337
- const processedPermissions = (0, _snapsrpcmethods.processSnapPermissions)(manifest.initialPermissions);
1338
- _class_private_method_get(this, _validateSnapPermissions, validateSnapPermissions).call(this, processedPermissions);
1339
- const { newPermissions, unusedPermissions } = _class_private_method_get(this, _calculatePermissionsChange, calculatePermissionsChange).call(this, snapId, processedPermissions);
1340
- _class_private_method_get(this, _updatePermissions, updatePermissions).call(this, {
1341
- snapId,
1342
- newPermissions,
1343
- unusedPermissions
1344
- });
1345
- // Set status
1346
- this.update((state)=>{
1347
- state.snaps[snapId].status = _snapsutils.SnapStatus.Stopped;
1348
- });
1349
- }
1350
- }
1351
- function pollForLastRequestStatus() {
1352
- _class_private_field_set(this, _timeoutForLastRequestStatus, setTimeout(()=>{
1353
- _class_private_method_get(this, _stopSnapsLastRequestPastMax, stopSnapsLastRequestPastMax).call(this).catch((error)=>{
1354
- // TODO: Decide how to handle errors.
1355
- (0, _snapsutils.logError)(error);
1356
- });
1357
- _class_private_method_get(this, _pollForLastRequestStatus, pollForLastRequestStatus).call(this);
1358
- }, _class_private_field_get(this, _idleTimeCheckInterval)));
1359
- }
1360
- async function blockSnap(snapId, blockedSnapInfo) {
1361
- if (!this.has(snapId)) {
1362
- return;
1363
- }
1364
- try {
1365
- this.update((state)=>{
1366
- state.snaps[snapId].blocked = true;
1367
- state.snaps[snapId].blockInformation = blockedSnapInfo;
1368
- });
1369
- await this.disableSnap(snapId);
1370
- } catch (error) {
1371
- (0, _snapsutils.logError)(`Encountered error when stopping blocked snap "${snapId}".`, error);
1372
- }
1373
- this.messagingSystem.publish(`${controllerName}:snapBlocked`, snapId, blockedSnapInfo);
1374
- }
1375
- function unblockSnap(snapId) {
1376
- if (!this.has(snapId) || !this.state.snaps[snapId].blocked) {
1377
- return;
1378
- }
1379
- this.update((state)=>{
1380
- state.snaps[snapId].blocked = false;
1381
- delete state.snaps[snapId].blockInformation;
1382
- });
1383
- this.messagingSystem.publish(`${controllerName}:snapUnblocked`, snapId);
1384
- }
1385
- async function assertIsInstallAllowed(snapId, snapInfo) {
1386
- const results = await this.messagingSystem.call('SnapsRegistry:get', {
1387
- [snapId]: snapInfo
1388
- });
1389
- const result = results[snapId];
1390
- if (result.status === _registry.SnapsRegistryStatus.Blocked) {
1391
- throw new Error(`Cannot install version "${snapInfo.version}" of snap "${snapId}": The version is blocked. ${result.reason?.explanation ?? ''}`);
1392
- }
1393
- const isAllowlistingRequired = Object.keys(snapInfo.permissions).some((permission)=>!_constants.ALLOWED_PERMISSIONS.includes(permission));
1394
- if (_class_private_field_get(this, _featureFlags).requireAllowlist && isAllowlistingRequired && result.status !== _registry.SnapsRegistryStatus.Verified) {
1395
- throw new Error(`Cannot install version "${snapInfo.version}" of snap "${snapId}": The snap is not on the allowlist.`);
1396
- }
1397
- }
1398
- async function stopSnapsLastRequestPastMax() {
1399
- const entries = [
1400
- ..._class_private_field_get(this, _snapsRuntimeData).entries()
1401
- ];
1402
- return Promise.all(entries.filter(([_snapId, runtime])=>runtime.activeReferences === 0 && runtime.pendingInboundRequests.length === 0 && runtime.lastRequest && _class_private_field_get(this, _maxIdleTime) && (0, _utils.timeSince)(runtime.lastRequest) > _class_private_field_get(this, _maxIdleTime)).map(async ([snapId])=>this.stopSnap(snapId, _snapsutils.SnapStatusEvents.Stop)));
1403
- }
1404
- function transition(snapId, event) {
1405
- const { interpreter } = _class_private_method_get(this, _getRuntimeExpect, getRuntimeExpect).call(this, snapId);
1406
- interpreter.send(event);
1407
- this.update((state)=>{
1408
- state.snaps[snapId].status = interpreter.state.value;
1409
- });
1410
- }
1411
- async function terminateSnap(snapId) {
1412
- await this.messagingSystem.call('ExecutionService:terminateSnap', snapId);
1413
- this.messagingSystem.publish('SnapController:snapTerminated', this.getTruncatedExpect(snapId));
1414
- }
1415
- function handleInitialConnections(snapId, previousInitialConnections, initialConnections) {
1416
- if (previousInitialConnections) {
1417
- const revokedInitialConnections = (0, _utils1.setDiff)(previousInitialConnections, initialConnections);
1418
- for (const origin of Object.keys(revokedInitialConnections)){
1419
- this.removeSnapFromSubject(origin, snapId);
1420
- }
1421
- }
1422
- for (const origin of Object.keys(initialConnections)){
1423
- _class_private_method_get(this, _addSnapToSubject, addSnapToSubject).call(this, origin, snapId);
1424
- }
1425
- }
1426
- function addSnapToSubject(origin, snapId) {
1427
- const subjectPermissions = this.messagingSystem.call('PermissionController:getPermissions', origin);
1428
- const existingCaveat = subjectPermissions?.[_snapsrpcmethods.WALLET_SNAP_PERMISSION_KEY]?.caveats?.find((caveat)=>caveat.type === _snapsutils.SnapCaveatType.SnapIds);
1429
- const subjectHasSnap = Boolean((existingCaveat?.value)?.[snapId]);
1430
- // If the subject is already connected to the snap, this is a no-op.
1431
- if (subjectHasSnap) {
1432
- return;
1433
- }
1434
- // If an existing caveat exists, we add the snap to that.
1435
- if (existingCaveat) {
1436
- this.messagingSystem.call('PermissionController:updateCaveat', origin, _snapsrpcmethods.WALLET_SNAP_PERMISSION_KEY, _snapsutils.SnapCaveatType.SnapIds, {
1437
- ...existingCaveat,
1438
- [snapId]: {}
1439
- });
1440
- return;
1441
- }
1442
- const approvedPermissions = {
1443
- [_snapsrpcmethods.WALLET_SNAP_PERMISSION_KEY]: {
1444
- caveats: [
1445
- {
1446
- type: _snapsutils.SnapCaveatType.SnapIds,
1447
- value: {
1448
- [snapId]: {}
1449
- }
1450
- }
1451
- ]
1452
- }
1453
- };
1454
- this.messagingSystem.call('PermissionController:grantPermissions', {
1455
- approvedPermissions,
1456
- subject: {
1457
- origin
1458
- }
1459
- });
1460
- }
1461
- function removeSnapFromSubjects(snapId) {
1462
- const subjects = this.messagingSystem.call('PermissionController:getSubjectNames');
1463
- for (const subject of subjects){
1464
- this.removeSnapFromSubject(subject, snapId);
1465
- }
1466
- }
1467
- function revokeAllSnapPermissions(snapId) {
1468
- if (this.messagingSystem.call('PermissionController:hasPermissions', snapId)) {
1469
- this.messagingSystem.call('PermissionController:revokeAllPermissions', snapId);
1470
- }
1471
- }
1472
- function createApproval({ origin, snapId, type }) {
1473
- const id = (0, _nanoid.nanoid)();
1474
- const promise = this.messagingSystem.call('ApprovalController:addRequest', {
1475
- origin,
1476
- id,
1477
- type,
1478
- requestData: {
1479
- // Mirror previous installation metadata
1480
- metadata: {
1481
- id,
1482
- origin: snapId,
1483
- dappOrigin: origin
1484
- },
1485
- snapId
1486
- },
1487
- requestState: {
1488
- loading: true
1489
- }
1490
- }, true);
1491
- return {
1492
- id,
1493
- promise
1494
- };
1495
- }
1496
- function updateApproval(id, requestState) {
1497
- try {
1498
- this.messagingSystem.call('ApprovalController:updateRequestState', {
1499
- id,
1500
- requestState
1501
- });
1502
- } catch {
1503
- // Do nothing
1504
- }
1505
- }
1506
- async function resolveAllowlistVersion(snapId, versionRange) {
1507
- return await this.messagingSystem.call('SnapsRegistry:resolveVersion', snapId, versionRange);
1508
- }
1509
- async function add(args) {
1510
- const { id: snapId, location, versionRange } = args;
1511
- _class_private_method_get(this, _setupRuntime, setupRuntime).call(this, snapId);
1512
- const runtime = _class_private_method_get(this, _getRuntimeExpect, getRuntimeExpect).call(this, snapId);
1513
- if (!runtime.installPromise) {
1514
- (0, _logging.log)(`Adding snap: ${snapId}`);
1515
- // If fetching and setting the snap succeeds, this property will be set
1516
- // to null in the authorize() method.
1517
- runtime.installPromise = (async ()=>{
1518
- const fetchedSnap = await (0, _utils1.fetchSnap)(snapId, location);
1519
- const manifest = fetchedSnap.manifest.result;
1520
- if (!(0, _utils.satisfiesVersionRange)(manifest.version, versionRange)) {
1521
- throw new Error(`Version mismatch. Manifest for "${snapId}" specifies version "${manifest.version}" which doesn't satisfy requested version range "${versionRange}".`);
1522
- }
1523
- await _class_private_method_get(this, _assertIsInstallAllowed, assertIsInstallAllowed).call(this, snapId, {
1524
- version: manifest.version,
1525
- checksum: manifest.source.shasum,
1526
- permissions: manifest.initialPermissions
1527
- });
1528
- return _class_private_method_get(this, _set, set).call(this, {
1529
- ...args,
1530
- files: fetchedSnap,
1531
- id: snapId
1532
- });
1533
- })();
1534
- }
1535
- try {
1536
- return await runtime.installPromise;
1537
- } catch (error) {
1538
- // Reset promise so users can retry installation in case the problem is
1539
- // temporary.
1540
- runtime.installPromise = null;
1541
- throw error;
1542
- }
1543
- }
1544
- async function startSnap(snapData) {
1545
- const { snapId } = snapData;
1546
- if (this.isRunning(snapId)) {
1547
- throw new Error(`Snap "${snapId}" is already started.`);
1548
- }
1549
- try {
1550
- const runtime = _class_private_method_get(this, _getRuntimeExpect, getRuntimeExpect).call(this, snapId);
1551
- const result = await _class_private_method_get(this, _executeWithTimeout, executeWithTimeout).call(this, this.messagingSystem.call('ExecutionService:executeSnap', {
1552
- ...snapData,
1553
- endowments: await _class_private_method_get(this, _getEndowments, getEndowments).call(this, snapId)
1554
- }));
1555
- _class_private_method_get(this, _transition, transition).call(this, snapId, _snapsutils.SnapStatusEvents.Start);
1556
- // We treat the initialization of the snap as the first request, for idle timing purposes.
1557
- runtime.lastRequest = Date.now();
1558
- return result;
1559
- } catch (error) {
1560
- await _class_private_method_get(this, _terminateSnap, terminateSnap).call(this, snapId);
1561
- throw error;
1562
- }
1563
- }
1564
- async function getEndowments(snapId) {
1565
- let allEndowments = [];
1566
- for (const permissionName of _class_private_field_get(this, _environmentEndowmentPermissions)){
1567
- if (this.messagingSystem.call('PermissionController:hasPermission', snapId, permissionName)) {
1568
- const endowments = await this.messagingSystem.call('PermissionController:getEndowments', snapId, permissionName);
1569
- if (endowments) {
1570
- // We don't have any guarantees about the type of the endowments
1571
- // value, so we have to guard at runtime.
1572
- if (!Array.isArray(endowments) || endowments.some((value)=>typeof value !== 'string')) {
1573
- throw new Error('Expected an array of string endowment names.');
1574
- }
1575
- allEndowments = allEndowments.concat(endowments);
1576
- }
1577
- }
1578
- }
1579
- const dedupedEndowments = [
1580
- ...new Set([
1581
- ..._snapsutils.DEFAULT_ENDOWMENTS,
1582
- ...allEndowments
1583
- ])
1584
- ];
1585
- if (dedupedEndowments.length < // This is a bug in TypeScript: https://github.com/microsoft/TypeScript/issues/48313
1586
- // eslint-disable-next-line @typescript-eslint/restrict-plus-operands
1587
- _snapsutils.DEFAULT_ENDOWMENTS.length + allEndowments.length) {
1588
- (0, _snapsutils.logError)(`Duplicate endowments found for ${snapId}. Default endowments should not be requested.`, allEndowments);
1589
- }
1590
- return dedupedEndowments;
1591
- }
1592
- function set(args) {
1593
- const { id: snapId, origin, files, isUpdate = false, removable, preinstalled } = args;
1594
- const { manifest, sourceCode: sourceCodeFile, svgIcon, auxiliaryFiles: rawAuxiliaryFiles, localizationFiles } = files;
1595
- (0, _snapsutils.assertIsSnapManifest)(manifest.result);
1596
- const { version } = manifest.result;
1597
- const sourceCode = sourceCodeFile.toString();
1598
- (0, _utils.assert)(typeof sourceCode === 'string' && sourceCode.length > 0, `Invalid source code for snap "${snapId}".`);
1599
- const auxiliaryFiles = rawAuxiliaryFiles.map((file)=>{
1600
- (0, _utils.assert)(typeof file.data.base64 === 'string');
1601
- return {
1602
- path: file.path,
1603
- value: file.data.base64
1604
- };
1605
- });
1606
- const snapsState = this.state.snaps;
1607
- const existingSnap = snapsState[snapId];
1608
- const previousVersionHistory = existingSnap?.versionHistory ?? [];
1609
- const versionHistory = [
1610
- ...previousVersionHistory,
1611
- {
1612
- version,
1613
- date: Date.now(),
1614
- origin
1615
- }
1616
- ];
1617
- const localizedFiles = localizationFiles.map((file)=>file.result);
1618
- const snap = {
1619
- // Restore relevant snap state if it exists
1620
- ...existingSnap,
1621
- // Note that the snap will be unblocked and enabled, regardless of its
1622
- // previous state.
1623
- blocked: false,
1624
- enabled: true,
1625
- removable,
1626
- preinstalled,
1627
- id: snapId,
1628
- initialPermissions: manifest.result.initialPermissions,
1629
- manifest: manifest.result,
1630
- status: _class_private_field_get(this, _statusMachine).config.initial,
1631
- sourceCode,
1632
- version,
1633
- versionHistory,
1634
- auxiliaryFiles,
1635
- localizationFiles: localizedFiles
1636
- };
1637
- // If the snap was blocked, it isn't any longer
1638
- delete snap.blockInformation;
1639
- // store the snap back in state
1640
- const { inversePatches } = this.update((state)=>{
1641
- state.snaps[snapId] = snap;
1642
- });
1643
- // checking for isUpdate here as this function is also used in
1644
- // the install flow, we do not care to create snapshots for installs
1645
- if (isUpdate) {
1646
- const rollbackSnapshot = _class_private_method_get(this, _getRollbackSnapshot, getRollbackSnapshot).call(this, snapId);
1647
- if (rollbackSnapshot !== undefined) {
1648
- rollbackSnapshot.statePatches = inversePatches;
1649
- }
1650
- }
1651
- // In case the Snap uses a localized manifest, we need to get the
1652
- // proposed name from the localized manifest.
1653
- const { proposedName } = (0, _snapsutils.getLocalizedSnapManifest)(manifest.result, 'en', localizedFiles);
1654
- this.messagingSystem.call('SubjectMetadataController:addSubjectMetadata', {
1655
- subjectType: _permissioncontroller.SubjectType.Snap,
1656
- name: proposedName,
1657
- origin: snap.id,
1658
- version,
1659
- svgIcon: svgIcon?.toString() ?? null
1660
- });
1661
- return {
1662
- ...snap,
1663
- sourceCode
1664
- };
1665
- }
1666
- function validateSnapPermissions(processedPermissions) {
1667
- const permissionKeys = Object.keys(processedPermissions);
1668
- const handlerPermissions = Array.from(new Set(Object.values(_snapsrpcmethods.handlerEndowments)));
1669
- (0, _utils.assert)(permissionKeys.some((key)=>handlerPermissions.includes(key)), `A snap must request at least one of the following permissions: ${handlerPermissions.filter((handler)=>handler !== null).join(', ')}.`);
1670
- const excludedPermissionErrors = permissionKeys.reduce((errors, permission)=>{
1671
- if ((0, _utils.hasProperty)(_class_private_field_get(this, _excludedPermissions), permission)) {
1672
- errors.push(_class_private_field_get(this, _excludedPermissions)[permission]);
1673
- }
1674
- return errors;
1675
- }, []);
1676
- (0, _utils.assert)(excludedPermissionErrors.length === 0, `One or more permissions are not allowed:\n${excludedPermissionErrors.join('\n')}`);
1677
- }
1678
- function getExecutionTimeout(permission) {
1679
- return (0, _snapsrpcmethods.getMaxRequestTimeCaveat)(permission) ?? this.maxRequestTime;
1680
- }
1681
- function getRpcRequestHandler(snapId) {
1682
- const runtime = _class_private_method_get(this, _getRuntimeExpect, getRuntimeExpect).call(this, snapId);
1683
- const existingHandler = runtime.rpcHandler;
1684
- if (existingHandler) {
1685
- return existingHandler;
1686
- }
1687
- const requestQueue = new _RequestQueue.RequestQueue(5);
1688
- // We need to set up this promise map to map snapIds to their respective startPromises,
1689
- // because otherwise we would lose context on the correct startPromise.
1690
- const startPromises = new Map();
1691
- const rpcHandler = async ({ origin, handler: handlerType, request, timeout })=>{
1692
- if (this.state.snaps[snapId].enabled === false) {
1693
- throw new Error(`Snap "${snapId}" is disabled.`);
1694
- }
1695
- if (this.state.snaps[snapId].status === _snapsutils.SnapStatus.Installing) {
1696
- throw new Error(`Snap "${snapId}" is currently being installed. Please try again later.`);
1697
- }
1698
- if (!this.isRunning(snapId)) {
1699
- let localStartPromise = startPromises.get(snapId);
1700
- if (!localStartPromise) {
1701
- localStartPromise = this.startSnap(snapId);
1702
- startPromises.set(snapId, localStartPromise);
1703
- } else if (requestQueue.get(origin) >= requestQueue.maxQueueSize) {
1704
- throw new Error('Exceeds maximum number of requests waiting to be resolved, please try again.');
1705
- }
1706
- requestQueue.increment(origin);
1707
- try {
1708
- await localStartPromise;
1709
- } finally{
1710
- requestQueue.decrement(origin);
1711
- // Only delete startPromise for a snap if its value hasn't changed
1712
- if (startPromises.get(snapId) === localStartPromise) {
1713
- startPromises.delete(snapId);
1714
- }
1715
- }
1716
- }
1717
- const timer = new _Timer.Timer(timeout);
1718
- _class_private_method_get(this, _recordSnapRpcRequestStart, recordSnapRpcRequestStart).call(this, snapId, request.id, timer);
1719
- const handleRpcRequestPromise = this.messagingSystem.call('ExecutionService:handleRpcRequest', snapId, {
1720
- origin,
1721
- handler: handlerType,
1722
- request
1723
- });
1724
- // This will either get the result or reject due to the timeout.
1725
- try {
1726
- const result = await _class_private_method_get(this, _executeWithTimeout, executeWithTimeout).call(this, handleRpcRequestPromise, timer);
1727
- await _class_private_method_get(this, _assertSnapRpcRequestResult, assertSnapRpcRequestResult).call(this, snapId, handlerType, result);
1728
- return _class_private_method_get(this, _transformSnapRpcRequestResult, transformSnapRpcRequestResult).call(this, snapId, handlerType, result);
1729
- } catch (error) {
1730
- const [jsonRpcError, handled] = (0, _snapsutils.unwrapError)(error);
1731
- if (!handled) {
1732
- await this.stopSnap(snapId, _snapsutils.SnapStatusEvents.Crash);
1733
- }
1734
- throw jsonRpcError;
1735
- } finally{
1736
- _class_private_method_get(this, _recordSnapRpcRequestFinish, recordSnapRpcRequestFinish).call(this, snapId, request.id);
1737
- }
1738
- };
1739
- runtime.rpcHandler = rpcHandler;
1740
- return rpcHandler;
1741
- }
1742
- async function createInterface(snapId, content) {
1743
- return this.messagingSystem.call('SnapInterfaceController:createInterface', snapId, content);
1744
- }
1745
- function assertInterfaceExists(snapId, id) {
1746
- // This will throw if the interface isn't accessible, but we assert nevertheless.
1747
- (0, _utils.assert)(this.messagingSystem.call('SnapInterfaceController:getInterface', snapId, id));
1748
- }
1749
- async function transformSnapRpcRequestResult(snapId, handlerType, result) {
1750
- switch(handlerType){
1751
- case _snapsutils.HandlerType.OnTransaction:
1752
- case _snapsutils.HandlerType.OnSignature:
1753
- case _snapsutils.HandlerType.OnHomePage:
1754
- {
1755
- // Since this type has been asserted earlier we can cast
1756
- const castResult = result;
1757
- // If a handler returns static content, we turn it into a dynamic UI
1758
- if (castResult && (0, _utils.hasProperty)(castResult, 'content')) {
1759
- const { content, ...rest } = castResult;
1760
- const id = await _class_private_method_get(this, _createInterface, createInterface).call(this, snapId, content);
1761
- return {
1762
- ...rest,
1763
- id
1764
- };
1765
- }
1766
- return result;
1767
- }
1768
- default:
1769
- return result;
1770
- }
1771
- }
1772
- async function assertSnapRpcRequestResult(snapId, handlerType, result) {
1773
- switch(handlerType){
1774
- case _snapsutils.HandlerType.OnTransaction:
1775
- {
1776
- (0, _utils.assertStruct)(result, _snapsutils.OnTransactionResponseStruct);
1777
- if (result && (0, _utils.hasProperty)(result, 'id')) {
1778
- _class_private_method_get(this, _assertInterfaceExists, assertInterfaceExists).call(this, snapId, result.id);
1779
- }
1780
- break;
1781
- }
1782
- case _snapsutils.HandlerType.OnSignature:
1783
- {
1784
- (0, _utils.assertStruct)(result, _snapsutils.OnSignatureResponseStruct);
1785
- if (result && (0, _utils.hasProperty)(result, 'id')) {
1786
- _class_private_method_get(this, _assertInterfaceExists, assertInterfaceExists).call(this, snapId, result.id);
1787
- }
1788
- break;
1789
- }
1790
- case _snapsutils.HandlerType.OnHomePage:
1791
- {
1792
- (0, _utils.assertStruct)(result, _snapsutils.OnHomePageResponseStruct);
1793
- if (result && (0, _utils.hasProperty)(result, 'id')) {
1794
- _class_private_method_get(this, _assertInterfaceExists, assertInterfaceExists).call(this, snapId, result.id);
1795
- }
1796
- break;
1797
- }
1798
- case _snapsutils.HandlerType.OnNameLookup:
1799
- (0, _utils.assertStruct)(result, _snapsutils.OnNameLookupResponseStruct);
1800
- break;
1801
- default:
1802
- break;
1803
- }
1804
- }
1805
- async function executeWithTimeout(promise, timer) {
1806
- const result = await (0, _utils1.withTimeout)(promise, timer ?? this.maxRequestTime);
1807
- if (result === _utils1.hasTimedOut) {
1808
- throw new Error('The request timed out.');
1809
- }
1810
- return result;
1811
- }
1812
- function recordSnapRpcRequestStart(snapId, requestId, timer) {
1813
- const runtime = _class_private_method_get(this, _getRuntimeExpect, getRuntimeExpect).call(this, snapId);
1814
- runtime.pendingInboundRequests.push({
1815
- requestId,
1816
- timer
1817
- });
1818
- runtime.lastRequest = null;
1819
- }
1820
- function recordSnapRpcRequestFinish(snapId, requestId) {
1821
- const runtime = _class_private_method_get(this, _getRuntimeExpect, getRuntimeExpect).call(this, snapId);
1822
- runtime.pendingInboundRequests = runtime.pendingInboundRequests.filter((request)=>request.requestId !== requestId);
1823
- if (runtime.pendingInboundRequests.length === 0) {
1824
- runtime.lastRequest = Date.now();
1825
- }
1826
- }
1827
- function getRollbackSnapshot(snapId) {
1828
- return _class_private_field_get(this, _rollbackSnapshots).get(snapId);
1829
- }
1830
- function createRollbackSnapshot(snapId) {
1831
- (0, _utils.assert)(_class_private_field_get(this, _rollbackSnapshots).get(snapId) === undefined, new Error(`Snap "${snapId}" rollback snapshot already exists.`));
1832
- _class_private_field_get(this, _rollbackSnapshots).set(snapId, {
1833
- statePatches: [],
1834
- permissions: {},
1835
- newVersion: ''
1836
- });
1837
- const newRollbackSnapshot = _class_private_field_get(this, _rollbackSnapshots).get(snapId);
1838
- (0, _utils.assert)(newRollbackSnapshot !== undefined, new Error(`Snapshot creation failed for ${snapId}.`));
1839
- return newRollbackSnapshot;
1840
- }
1841
- async function rollbackSnap(snapId) {
1842
- const rollbackSnapshot = _class_private_method_get(this, _getRollbackSnapshot, getRollbackSnapshot).call(this, snapId);
1843
- if (!rollbackSnapshot) {
1844
- throw new Error('A snapshot does not exist for this snap.');
1845
- }
1846
- await this.stopSnap(snapId, _snapsutils.SnapStatusEvents.Stop);
1847
- // Always set to stopped even if it wasn't running initially
1848
- if (this.get(snapId)?.status !== _snapsutils.SnapStatus.Stopped) {
1849
- _class_private_method_get(this, _transition, transition).call(this, snapId, _snapsutils.SnapStatusEvents.Stop);
1850
- }
1851
- const { statePatches, permissions } = rollbackSnapshot;
1852
- if (statePatches?.length) {
1853
- this.applyPatches(statePatches);
1854
- }
1855
- // Reset snap status, as we may have been in another state when we stored state patches
1856
- // But now we are 100% in a stopped state
1857
- if (this.get(snapId)?.status !== _snapsutils.SnapStatus.Stopped) {
1858
- this.update((state)=>{
1859
- state.snaps[snapId].status = _snapsutils.SnapStatus.Stopped;
1860
- });
1861
- }
1862
- _class_private_method_get(this, _updatePermissions, updatePermissions).call(this, {
1863
- snapId,
1864
- unusedPermissions: permissions.granted,
1865
- newPermissions: permissions.revoked,
1866
- requestData: permissions.requestData
1867
- });
1868
- const truncatedSnap = this.getTruncatedExpect(snapId);
1869
- this.messagingSystem.publish('SnapController:snapRolledback', truncatedSnap, rollbackSnapshot.newVersion);
1870
- _class_private_field_get(this, _rollbackSnapshots).delete(snapId);
1871
- }
1872
- async function rollbackSnaps(snapIds) {
1873
- for (const snapId of snapIds){
1874
- await _class_private_method_get(this, _rollbackSnap, rollbackSnap).call(this, snapId);
1875
- }
1876
- }
1877
- function getRuntime(snapId) {
1878
- return _class_private_field_get(this, _snapsRuntimeData).get(snapId);
1879
- }
1880
- function getRuntimeExpect(snapId) {
1881
- const runtime = _class_private_method_get(this, _getRuntime, getRuntime).call(this, snapId);
1882
- (0, _utils.assert)(runtime !== undefined, new Error(`Snap "${snapId}" runtime data not found`));
1883
- return runtime;
1884
- }
1885
- function setupRuntime(snapId) {
1886
- if (_class_private_field_get(this, _snapsRuntimeData).has(snapId)) {
1887
- return;
1888
- }
1889
- const snap = this.get(snapId);
1890
- const interpreter = (0, _fsm.interpret)(_class_private_field_get(this, _statusMachine));
1891
- interpreter.start({
1892
- context: {
1893
- snapId
1894
- },
1895
- value: snap?.status ?? _class_private_field_get(this, _statusMachine).config.initial
1896
- });
1897
- (0, _fsm1.forceStrict)(interpreter);
1898
- _class_private_field_get(this, _snapsRuntimeData).set(snapId, {
1899
- lastRequest: null,
1900
- rpcHandler: null,
1901
- installPromise: null,
1902
- activeReferences: 0,
1903
- pendingInboundRequests: [],
1904
- pendingOutboundRequests: 0,
1905
- interpreter
1906
- });
1907
- }
1908
- function calculatePermissionsChange(snapId, desiredPermissionsSet) {
1909
- const oldPermissions = this.messagingSystem.call('PermissionController:getPermissions', snapId) ?? {};
1910
- const newPermissions = (0, _utils1.setDiff)(desiredPermissionsSet, oldPermissions);
1911
- // TODO(ritave): The assumption that these are unused only holds so long as we do not
1912
- // permit dynamic permission requests.
1913
- const unusedPermissions = (0, _utils1.setDiff)(oldPermissions, desiredPermissionsSet);
1914
- // It's a Set Intersection of oldPermissions and desiredPermissionsSet
1915
- // oldPermissions ∖ (oldPermissions ∖ desiredPermissionsSet) ⟺ oldPermissions ∩ desiredPermissionsSet
1916
- const approvedPermissions = (0, _utils1.setDiff)(oldPermissions, unusedPermissions);
1917
- return {
1918
- newPermissions,
1919
- unusedPermissions,
1920
- approvedPermissions
1921
- };
1922
- }
1923
- function updatePermissions({ snapId, unusedPermissions = {}, newPermissions = {}, requestData }) {
1924
- const unusedPermissionsKeys = Object.keys(unusedPermissions);
1925
- if ((0, _utils.isNonEmptyArray)(unusedPermissionsKeys)) {
1926
- this.messagingSystem.call('PermissionController:revokePermissions', {
1927
- [snapId]: unusedPermissionsKeys
1928
- });
1929
- }
1930
- if ((0, _utils.isNonEmptyArray)(Object.keys(newPermissions))) {
1931
- this.messagingSystem.call('PermissionController:grantPermissions', {
1932
- approvedPermissions: newPermissions,
1933
- subject: {
1934
- origin: snapId
1935
- },
1936
- requestData
1937
- });
1938
- }
1939
- }
1940
- function isValidUpdate(snapId, newVersionRange) {
1941
- const existingSnap = this.getExpect(snapId);
1942
- if ((0, _utils.satisfiesVersionRange)(existingSnap.version, newVersionRange)) {
1943
- return false;
1944
- }
1945
- if ((0, _utils.gtRange)(existingSnap.version, newVersionRange)) {
1946
- return false;
1947
- }
1948
- return true;
1949
- }
1950
- async function callLifecycleHook(snapId, handler) {
1951
- const permissionName = _snapsrpcmethods.handlerEndowments[handler];
1952
- (0, _utils.assert)(permissionName, 'Lifecycle hook must have an endowment.');
1953
- const hasPermission = this.messagingSystem.call('PermissionController:hasPermission', snapId, permissionName);
1954
- if (!hasPermission) {
1955
- return;
1956
- }
1957
- await this.handleRequest({
1958
- snapId,
1959
- handler,
1960
- origin: '',
1961
- request: {
1962
- jsonrpc: '2.0',
1963
- method: handler
1964
- }
1965
- });
1966
- }
1967
-
1968
- //# sourceMappingURL=SnapController.js.map