@metamask/snaps-controllers 9.5.0 → 9.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (716) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/dist/cronjob/CronjobController.cjs +255 -0
  3. package/dist/cronjob/CronjobController.cjs.map +1 -0
  4. package/dist/{types/cronjob/CronjobController.d.ts → cronjob/CronjobController.d.cts} +8 -7
  5. package/dist/cronjob/CronjobController.d.cts.map +1 -0
  6. package/dist/cronjob/CronjobController.d.mts +121 -0
  7. package/dist/cronjob/CronjobController.d.mts.map +1 -0
  8. package/dist/cronjob/CronjobController.mjs +249 -41
  9. package/dist/cronjob/CronjobController.mjs.map +1 -1
  10. package/dist/cronjob/index.cjs +18 -0
  11. package/dist/cronjob/index.cjs.map +1 -0
  12. package/dist/cronjob/index.d.cts +2 -0
  13. package/dist/cronjob/index.d.cts.map +1 -0
  14. package/dist/cronjob/index.d.mts +2 -0
  15. package/dist/cronjob/index.d.mts.map +1 -0
  16. package/dist/cronjob/index.mjs +1 -42
  17. package/dist/cronjob/index.mjs.map +1 -1
  18. package/dist/fsm.cjs +75 -0
  19. package/dist/fsm.cjs.map +1 -0
  20. package/dist/{types/fsm.d.ts → fsm.d.cts} +2 -1
  21. package/dist/fsm.d.cts.map +1 -0
  22. package/dist/fsm.d.mts +25 -0
  23. package/dist/fsm.d.mts.map +1 -0
  24. package/dist/fsm.mjs +69 -9
  25. package/dist/fsm.mjs.map +1 -1
  26. package/dist/index.cjs +23 -0
  27. package/dist/index.cjs.map +1 -0
  28. package/dist/index.d.cts +8 -0
  29. package/dist/index.d.cts.map +1 -0
  30. package/dist/index.d.mts +8 -0
  31. package/dist/index.d.mts.map +1 -0
  32. package/dist/index.mjs +6 -124
  33. package/dist/index.mjs.map +1 -1
  34. package/dist/insights/SnapInsightsController.cjs +182 -0
  35. package/dist/insights/SnapInsightsController.cjs.map +1 -0
  36. package/dist/{types/insights/SnapInsightsController.d.ts → insights/SnapInsightsController.d.cts} +8 -7
  37. package/dist/insights/SnapInsightsController.d.cts.map +1 -0
  38. package/dist/insights/SnapInsightsController.d.mts +38 -0
  39. package/dist/insights/SnapInsightsController.d.mts.map +1 -0
  40. package/dist/insights/SnapInsightsController.mjs +176 -23
  41. package/dist/insights/SnapInsightsController.mjs.map +1 -1
  42. package/dist/insights/index.cjs +18 -0
  43. package/dist/insights/index.cjs.map +1 -0
  44. package/dist/insights/index.d.cts +2 -0
  45. package/dist/insights/index.d.cts.map +1 -0
  46. package/dist/insights/index.d.mts +2 -0
  47. package/dist/insights/index.d.mts.map +1 -0
  48. package/dist/insights/index.mjs +1 -25
  49. package/dist/insights/index.mjs.map +1 -1
  50. package/dist/interface/SnapInterfaceController.cjs +176 -0
  51. package/dist/interface/SnapInterfaceController.cjs.map +1 -0
  52. package/dist/{types/interface/SnapInterfaceController.d.ts → interface/SnapInterfaceController.d.cts} +8 -7
  53. package/dist/interface/SnapInterfaceController.d.cts.map +1 -0
  54. package/dist/interface/SnapInterfaceController.d.mts +107 -0
  55. package/dist/interface/SnapInterfaceController.d.mts.map +1 -0
  56. package/dist/interface/SnapInterfaceController.mjs +170 -7
  57. package/dist/interface/SnapInterfaceController.mjs.map +1 -1
  58. package/dist/interface/index.cjs +18 -0
  59. package/dist/interface/index.cjs.map +1 -0
  60. package/dist/interface/index.d.cts +2 -0
  61. package/dist/interface/index.d.cts.map +1 -0
  62. package/dist/interface/index.d.mts +2 -0
  63. package/dist/interface/index.d.mts.map +1 -0
  64. package/dist/interface/index.mjs +1 -9
  65. package/dist/interface/index.mjs.map +1 -1
  66. package/dist/interface/utils.cjs +165 -0
  67. package/dist/interface/utils.cjs.map +1 -0
  68. package/dist/{types/interface/utils.d.ts → interface/utils.d.cts} +3 -2
  69. package/dist/interface/utils.d.cts.map +1 -0
  70. package/dist/interface/utils.d.mts +34 -0
  71. package/dist/interface/utils.d.mts.map +1 -0
  72. package/dist/interface/utils.mjs +157 -13
  73. package/dist/interface/utils.mjs.map +1 -1
  74. package/dist/logging.cjs +13 -0
  75. package/dist/logging.cjs.map +1 -0
  76. package/dist/{types/logging.d.ts → logging.d.cts} +1 -0
  77. package/dist/logging.d.cts.map +1 -0
  78. package/dist/logging.d.mts +9 -0
  79. package/dist/logging.d.mts.map +1 -0
  80. package/dist/logging.mjs +9 -7
  81. package/dist/logging.mjs.map +1 -1
  82. package/dist/node.cjs +20 -0
  83. package/dist/node.cjs.map +1 -0
  84. package/dist/node.d.cts +3 -0
  85. package/dist/node.d.cts.map +1 -0
  86. package/dist/node.d.mts +3 -0
  87. package/dist/node.d.mts.map +1 -0
  88. package/dist/node.mjs +3 -134
  89. package/dist/node.mjs.map +1 -1
  90. package/dist/react-native.cjs +20 -0
  91. package/dist/react-native.cjs.map +1 -0
  92. package/dist/react-native.d.cts +3 -0
  93. package/dist/react-native.d.cts.map +1 -0
  94. package/dist/react-native.d.mts +3 -0
  95. package/dist/react-native.d.mts.map +1 -0
  96. package/dist/react-native.mjs +3 -131
  97. package/dist/react-native.mjs.map +1 -1
  98. package/dist/services/AbstractExecutionService.cjs +348 -0
  99. package/dist/services/AbstractExecutionService.cjs.map +1 -0
  100. package/dist/{types/services/AbstractExecutionService.d.ts → services/AbstractExecutionService.d.cts} +8 -8
  101. package/dist/services/AbstractExecutionService.d.cts.map +1 -0
  102. package/dist/services/AbstractExecutionService.d.mts +131 -0
  103. package/dist/services/AbstractExecutionService.d.mts.map +1 -0
  104. package/dist/services/AbstractExecutionService.mjs +345 -11
  105. package/dist/services/AbstractExecutionService.mjs.map +1 -1
  106. package/dist/services/ExecutionService.cjs +4 -0
  107. package/dist/services/ExecutionService.cjs.map +1 -0
  108. package/dist/{types/services/ExecutionService.d.ts → services/ExecutionService.d.cts} +4 -3
  109. package/dist/services/ExecutionService.d.cts.map +1 -0
  110. package/dist/services/ExecutionService.d.mts +69 -0
  111. package/dist/services/ExecutionService.d.mts.map +1 -0
  112. package/dist/services/ExecutionService.mjs +2 -1
  113. package/dist/services/ExecutionService.mjs.map +1 -1
  114. package/dist/services/ProxyPostMessageStream.cjs +58 -0
  115. package/dist/services/ProxyPostMessageStream.cjs.map +1 -0
  116. package/dist/{types/services/ProxyPostMessageStream.d.ts → services/ProxyPostMessageStream.d.cts} +3 -2
  117. package/dist/services/ProxyPostMessageStream.d.cts.map +1 -0
  118. package/dist/services/ProxyPostMessageStream.d.mts +35 -0
  119. package/dist/services/ProxyPostMessageStream.d.mts.map +1 -0
  120. package/dist/services/ProxyPostMessageStream.mjs +53 -6
  121. package/dist/services/ProxyPostMessageStream.mjs.map +1 -1
  122. package/dist/services/browser.cjs +27 -0
  123. package/dist/services/browser.cjs.map +1 -0
  124. package/dist/services/browser.d.cts +8 -0
  125. package/dist/services/browser.d.cts.map +1 -0
  126. package/dist/services/browser.d.mts +8 -0
  127. package/dist/services/browser.d.mts.map +1 -0
  128. package/dist/services/browser.mjs +8 -39
  129. package/dist/services/browser.mjs.map +1 -1
  130. package/dist/services/iframe/IframeExecutionService.cjs +30 -0
  131. package/dist/services/iframe/IframeExecutionService.cjs.map +1 -0
  132. package/dist/{types/services/iframe/IframeExecutionService.d.ts → services/iframe/IframeExecutionService.d.cts} +4 -3
  133. package/dist/services/iframe/IframeExecutionService.d.cts.map +1 -0
  134. package/dist/services/iframe/IframeExecutionService.d.mts +17 -0
  135. package/dist/services/iframe/IframeExecutionService.d.mts.map +1 -0
  136. package/dist/services/iframe/IframeExecutionService.mjs +26 -11
  137. package/dist/services/iframe/IframeExecutionService.mjs.map +1 -1
  138. package/dist/services/iframe/index.cjs +18 -0
  139. package/dist/services/iframe/index.cjs.map +1 -0
  140. package/dist/services/iframe/index.d.cts +2 -0
  141. package/dist/services/iframe/index.d.cts.map +1 -0
  142. package/dist/services/iframe/index.d.mts +2 -0
  143. package/dist/services/iframe/index.d.mts.map +1 -0
  144. package/dist/services/iframe/index.mjs +1 -12
  145. package/dist/services/iframe/index.mjs.map +1 -1
  146. package/dist/services/index.cjs +25 -0
  147. package/dist/services/index.cjs.map +1 -0
  148. package/dist/services/index.d.cts +7 -0
  149. package/dist/services/index.d.cts.map +1 -0
  150. package/dist/services/index.d.mts +7 -0
  151. package/dist/services/index.d.mts.map +1 -0
  152. package/dist/services/index.mjs +6 -34
  153. package/dist/services/index.mjs.map +1 -1
  154. package/dist/services/node-js/NodeProcessExecutionService.cjs +30 -0
  155. package/dist/services/node-js/NodeProcessExecutionService.cjs.map +1 -0
  156. package/dist/{types/services/node-js/NodeProcessExecutionService.d.ts → services/node-js/NodeProcessExecutionService.d.cts} +5 -4
  157. package/dist/services/node-js/NodeProcessExecutionService.d.cts.map +1 -0
  158. package/dist/services/node-js/NodeProcessExecutionService.d.mts +13 -0
  159. package/dist/services/node-js/NodeProcessExecutionService.d.mts.map +1 -0
  160. package/dist/services/node-js/NodeProcessExecutionService.mjs +28 -21
  161. package/dist/services/node-js/NodeProcessExecutionService.mjs.map +1 -1
  162. package/dist/services/node-js/NodeThreadExecutionService.cjs +32 -0
  163. package/dist/services/node-js/NodeThreadExecutionService.cjs.map +1 -0
  164. package/dist/{types/services/node-js/NodeThreadExecutionService.d.ts → services/node-js/NodeThreadExecutionService.d.cts} +5 -4
  165. package/dist/services/node-js/NodeThreadExecutionService.d.cts.map +1 -0
  166. package/dist/services/node-js/NodeThreadExecutionService.d.mts +13 -0
  167. package/dist/services/node-js/NodeThreadExecutionService.d.mts.map +1 -0
  168. package/dist/services/node-js/NodeThreadExecutionService.mjs +30 -21
  169. package/dist/services/node-js/NodeThreadExecutionService.mjs.map +1 -1
  170. package/dist/services/node-js/index.cjs +19 -0
  171. package/dist/services/node-js/index.cjs.map +1 -0
  172. package/dist/services/node-js/index.d.cts +3 -0
  173. package/dist/services/node-js/index.d.cts.map +1 -0
  174. package/dist/services/node-js/index.d.mts +3 -0
  175. package/dist/services/node-js/index.d.mts.map +1 -0
  176. package/dist/services/node-js/index.mjs +2 -26
  177. package/dist/services/node-js/index.mjs.map +1 -1
  178. package/dist/services/node.cjs +19 -0
  179. package/dist/services/node.cjs.map +1 -0
  180. package/dist/services/node.d.cts +3 -0
  181. package/dist/services/node.d.cts.map +1 -0
  182. package/dist/services/node.d.mts +3 -0
  183. package/dist/services/node.d.mts.map +1 -0
  184. package/dist/services/node.mjs +2 -44
  185. package/dist/services/node.mjs.map +1 -1
  186. package/dist/services/offscreen/OffscreenExecutionService.cjs +56 -0
  187. package/dist/services/offscreen/OffscreenExecutionService.cjs.map +1 -0
  188. package/dist/{types/services/offscreen/OffscreenExecutionService.d.ts → services/offscreen/OffscreenExecutionService.d.cts} +4 -3
  189. package/dist/services/offscreen/OffscreenExecutionService.d.cts.map +1 -0
  190. package/dist/services/offscreen/OffscreenExecutionService.d.mts +33 -0
  191. package/dist/services/offscreen/OffscreenExecutionService.d.mts.map +1 -0
  192. package/dist/services/offscreen/OffscreenExecutionService.mjs +51 -12
  193. package/dist/services/offscreen/OffscreenExecutionService.mjs.map +1 -1
  194. package/dist/services/offscreen/index.cjs +18 -0
  195. package/dist/services/offscreen/index.cjs.map +1 -0
  196. package/dist/services/offscreen/index.d.cts +2 -0
  197. package/dist/services/offscreen/index.d.cts.map +1 -0
  198. package/dist/services/offscreen/index.d.mts +2 -0
  199. package/dist/services/offscreen/index.d.mts.map +1 -0
  200. package/dist/services/offscreen/index.mjs +1 -14
  201. package/dist/services/offscreen/index.mjs.map +1 -1
  202. package/dist/services/proxy/ProxyExecutionService.cjs +85 -0
  203. package/dist/services/proxy/ProxyExecutionService.cjs.map +1 -0
  204. package/dist/{types/services/proxy/ProxyExecutionService.d.ts → services/proxy/ProxyExecutionService.d.cts} +6 -4
  205. package/dist/services/proxy/ProxyExecutionService.d.cts.map +1 -0
  206. package/dist/services/proxy/ProxyExecutionService.d.mts +41 -0
  207. package/dist/services/proxy/ProxyExecutionService.d.mts.map +1 -0
  208. package/dist/services/proxy/ProxyExecutionService.mjs +79 -11
  209. package/dist/services/proxy/ProxyExecutionService.mjs.map +1 -1
  210. package/dist/services/react-native.cjs +19 -0
  211. package/dist/services/react-native.cjs.map +1 -0
  212. package/dist/services/react-native.d.cts +3 -0
  213. package/dist/services/react-native.d.cts.map +1 -0
  214. package/dist/services/react-native.d.mts +3 -0
  215. package/dist/services/react-native.d.mts.map +1 -0
  216. package/dist/services/react-native.mjs +2 -41
  217. package/dist/services/react-native.mjs.map +1 -1
  218. package/dist/services/webview/WebViewExecutionService.cjs +54 -0
  219. package/dist/services/webview/WebViewExecutionService.cjs.map +1 -0
  220. package/dist/{types/services/webview/WebViewExecutionService.d.ts → services/webview/WebViewExecutionService.d.cts} +6 -4
  221. package/dist/services/webview/WebViewExecutionService.d.cts.map +1 -0
  222. package/dist/services/webview/WebViewExecutionService.d.mts +22 -0
  223. package/dist/services/webview/WebViewExecutionService.d.mts.map +1 -0
  224. package/dist/services/webview/WebViewExecutionService.mjs +48 -13
  225. package/dist/services/webview/WebViewExecutionService.mjs.map +1 -1
  226. package/dist/services/webview/WebViewMessageStream.cjs +89 -0
  227. package/dist/services/webview/WebViewMessageStream.cjs.map +1 -0
  228. package/dist/{types/services/webview/WebViewMessageStream.d.ts → services/webview/WebViewMessageStream.d.cts} +3 -2
  229. package/dist/services/webview/WebViewMessageStream.d.cts.map +1 -0
  230. package/dist/services/webview/WebViewMessageStream.d.mts +33 -0
  231. package/dist/services/webview/WebViewMessageStream.d.mts.map +1 -0
  232. package/dist/services/webview/WebViewMessageStream.mjs +84 -6
  233. package/dist/services/webview/WebViewMessageStream.mjs.map +1 -1
  234. package/dist/services/webview/index.cjs +18 -0
  235. package/dist/services/webview/index.cjs.map +1 -0
  236. package/dist/services/webview/index.d.cts +2 -0
  237. package/dist/services/webview/index.d.cts.map +1 -0
  238. package/dist/services/webview/index.d.mts +2 -0
  239. package/dist/services/webview/index.d.mts.map +1 -0
  240. package/dist/services/webview/index.mjs +1 -15
  241. package/dist/services/webview/index.mjs.map +1 -1
  242. package/dist/services/webworker/WebWorkerExecutionService.cjs +101 -0
  243. package/dist/services/webworker/WebWorkerExecutionService.cjs.map +1 -0
  244. package/dist/{types/services/webworker/WebWorkerExecutionService.d.ts → services/webworker/WebWorkerExecutionService.d.cts} +5 -3
  245. package/dist/services/webworker/WebWorkerExecutionService.d.cts.map +1 -0
  246. package/dist/services/webworker/WebWorkerExecutionService.d.mts +47 -0
  247. package/dist/services/webworker/WebWorkerExecutionService.d.mts.map +1 -0
  248. package/dist/services/webworker/WebWorkerExecutionService.mjs +96 -13
  249. package/dist/services/webworker/WebWorkerExecutionService.mjs.map +1 -1
  250. package/dist/services/webworker/index.cjs +18 -0
  251. package/dist/services/webworker/index.cjs.map +1 -0
  252. package/dist/services/webworker/index.d.cts +2 -0
  253. package/dist/services/webworker/index.d.cts.map +1 -0
  254. package/dist/services/webworker/index.d.mts +2 -0
  255. package/dist/services/webworker/index.d.mts.map +1 -0
  256. package/dist/services/webworker/index.mjs +1 -15
  257. package/dist/services/webworker/index.mjs.map +1 -1
  258. package/dist/snaps/RequestQueue.cjs +44 -0
  259. package/dist/snaps/RequestQueue.cjs.map +1 -0
  260. package/dist/{types/snaps/RequestQueue.d.ts → snaps/RequestQueue.d.cts} +1 -0
  261. package/dist/snaps/RequestQueue.d.cts.map +1 -0
  262. package/dist/snaps/RequestQueue.d.mts +25 -0
  263. package/dist/snaps/RequestQueue.d.mts.map +1 -0
  264. package/dist/snaps/RequestQueue.mjs +39 -7
  265. package/dist/snaps/RequestQueue.mjs.map +1 -1
  266. package/dist/snaps/SnapController.cjs +1898 -0
  267. package/dist/snaps/SnapController.cjs.map +1 -0
  268. package/dist/{types/snaps/SnapController.d.ts → snaps/SnapController.d.cts} +34 -20
  269. package/dist/snaps/SnapController.d.cts.map +1 -0
  270. package/dist/snaps/SnapController.d.mts +668 -0
  271. package/dist/snaps/SnapController.d.mts.map +1 -0
  272. package/dist/snaps/SnapController.mjs +1892 -28
  273. package/dist/snaps/SnapController.mjs.map +1 -1
  274. package/dist/snaps/Timer.cjs +103 -0
  275. package/dist/snaps/Timer.cjs.map +1 -0
  276. package/dist/{types/snaps/Timer.d.ts → snaps/Timer.d.cts} +1 -0
  277. package/dist/snaps/Timer.d.cts.map +1 -0
  278. package/dist/snaps/Timer.d.mts +47 -0
  279. package/dist/snaps/Timer.d.mts.map +1 -0
  280. package/dist/snaps/Timer.mjs +98 -7
  281. package/dist/snaps/Timer.mjs.map +1 -1
  282. package/dist/snaps/constants.cjs +24 -0
  283. package/dist/snaps/constants.cjs.map +1 -0
  284. package/dist/{types/snaps/constants.d.ts → snaps/constants.d.cts} +1 -0
  285. package/dist/snaps/constants.d.cts.map +1 -0
  286. package/dist/snaps/constants.d.mts +8 -0
  287. package/dist/snaps/constants.d.mts.map +1 -0
  288. package/dist/snaps/constants.mjs +19 -8
  289. package/dist/snaps/constants.mjs.map +1 -1
  290. package/dist/snaps/index.cjs +21 -0
  291. package/dist/snaps/index.cjs.map +1 -0
  292. package/dist/snaps/index.d.cts +5 -0
  293. package/dist/snaps/index.d.cts.map +1 -0
  294. package/dist/snaps/index.d.mts +5 -0
  295. package/dist/snaps/index.d.mts.map +1 -0
  296. package/dist/snaps/index.mjs +4 -62
  297. package/dist/snaps/index.mjs.map +1 -1
  298. package/dist/snaps/location/http.cjs +75 -0
  299. package/dist/snaps/location/http.cjs.map +1 -0
  300. package/dist/{types/snaps/location/http.d.ts → snaps/location/http.d.cts} +4 -3
  301. package/dist/snaps/location/http.d.cts.map +1 -0
  302. package/dist/snaps/location/http.d.mts +23 -0
  303. package/dist/snaps/location/http.d.mts.map +1 -0
  304. package/dist/snaps/location/http.mjs +70 -7
  305. package/dist/snaps/location/http.mjs.map +1 -1
  306. package/dist/snaps/location/index.cjs +21 -0
  307. package/dist/snaps/location/index.cjs.map +1 -0
  308. package/dist/snaps/location/index.d.cts +5 -0
  309. package/dist/snaps/location/index.d.cts.map +1 -0
  310. package/dist/snaps/location/index.d.mts +5 -0
  311. package/dist/snaps/location/index.d.mts.map +1 -0
  312. package/dist/snaps/location/index.mjs +4 -30
  313. package/dist/snaps/location/index.mjs.map +1 -1
  314. package/dist/snaps/location/local.cjs +51 -0
  315. package/dist/snaps/location/local.cjs.map +1 -0
  316. package/dist/{types/snaps/location/local.d.ts → snaps/location/local.d.cts} +4 -3
  317. package/dist/snaps/location/local.d.cts.map +1 -0
  318. package/dist/snaps/location/local.d.mts +11 -0
  319. package/dist/snaps/location/local.d.mts.map +1 -0
  320. package/dist/snaps/location/local.mjs +45 -7
  321. package/dist/snaps/location/local.mjs.map +1 -1
  322. package/dist/snaps/location/location.cjs +34 -0
  323. package/dist/{chunk-ZKG6FRKN.mjs.map → snaps/location/location.cjs.map} +1 -1
  324. package/dist/{types/snaps/location/location.d.ts → snaps/location/location.d.cts} +4 -3
  325. package/dist/snaps/location/location.d.cts.map +1 -0
  326. package/dist/snaps/location/location.d.mts +45 -0
  327. package/dist/snaps/location/location.d.mts.map +1 -0
  328. package/dist/snaps/location/location.mjs +29 -10
  329. package/dist/snaps/location/location.mjs.map +1 -1
  330. package/dist/snaps/location/npm.cjs +335 -0
  331. package/dist/snaps/location/npm.cjs.map +1 -0
  332. package/dist/{types/snaps/location/npm.d.ts → snaps/location/npm.d.cts} +5 -4
  333. package/dist/snaps/location/npm.d.cts.map +1 -0
  334. package/dist/snaps/location/npm.d.mts +84 -0
  335. package/dist/snaps/location/npm.d.mts.map +1 -0
  336. package/dist/snaps/location/npm.mjs +331 -16
  337. package/dist/snaps/location/npm.mjs.map +1 -1
  338. package/dist/snaps/registry/index.cjs +19 -0
  339. package/dist/snaps/registry/index.cjs.map +1 -0
  340. package/dist/snaps/registry/index.d.cts +3 -0
  341. package/dist/snaps/registry/index.d.cts.map +1 -0
  342. package/dist/snaps/registry/index.d.mts +3 -0
  343. package/dist/snaps/registry/index.d.mts.map +1 -0
  344. package/dist/snaps/registry/index.mjs +2 -12
  345. package/dist/snaps/registry/index.mjs.map +1 -1
  346. package/dist/snaps/registry/json.cjs +224 -0
  347. package/dist/snaps/registry/json.cjs.map +1 -0
  348. package/dist/{types/snaps/registry/json.d.ts → snaps/registry/json.d.cts} +6 -5
  349. package/dist/snaps/registry/json.d.cts.map +1 -0
  350. package/dist/snaps/registry/json.d.mts +51 -0
  351. package/dist/snaps/registry/json.d.mts.map +1 -0
  352. package/dist/snaps/registry/json.mjs +219 -7
  353. package/dist/snaps/registry/json.mjs.map +1 -1
  354. package/dist/snaps/registry/registry.cjs +11 -0
  355. package/dist/snaps/registry/registry.cjs.map +1 -0
  356. package/dist/{types/snaps/registry/registry.d.ts → snaps/registry/registry.d.cts} +4 -3
  357. package/dist/snaps/registry/registry.d.cts.map +1 -0
  358. package/dist/snaps/registry/registry.d.mts +42 -0
  359. package/dist/snaps/registry/registry.d.mts.map +1 -0
  360. package/dist/snaps/registry/registry.mjs +7 -7
  361. package/dist/snaps/registry/registry.mjs.map +1 -1
  362. package/dist/snaps/selectors.cjs +6 -0
  363. package/dist/snaps/selectors.cjs.map +1 -0
  364. package/dist/snaps/selectors.d.cts +3 -0
  365. package/dist/snaps/selectors.d.cts.map +1 -0
  366. package/dist/snaps/selectors.d.mts +3 -0
  367. package/dist/snaps/selectors.d.mts.map +1 -0
  368. package/dist/snaps/selectors.mjs +1 -7
  369. package/dist/snaps/selectors.mjs.map +1 -1
  370. package/dist/types/controllers.cjs +4 -0
  371. package/dist/types/controllers.cjs.map +1 -0
  372. package/dist/types/{types/controllers.d.ts → controllers.d.cts} +3 -2
  373. package/dist/types/controllers.d.cts.map +1 -0
  374. package/dist/types/controllers.d.mts +132 -0
  375. package/dist/types/controllers.d.mts.map +1 -0
  376. package/dist/types/controllers.mjs +2 -1
  377. package/dist/types/controllers.mjs.map +1 -1
  378. package/dist/types/encryptor.cjs +3 -0
  379. package/dist/types/encryptor.cjs.map +1 -0
  380. package/dist/types/{types/encryptor.d.ts → encryptor.d.cts} +2 -1
  381. package/dist/types/encryptor.d.cts.map +1 -0
  382. package/dist/types/encryptor.d.mts +99 -0
  383. package/dist/types/encryptor.d.mts.map +1 -0
  384. package/dist/types/encryptor.mjs +1 -1
  385. package/dist/types/encryptor.mjs.map +1 -1
  386. package/dist/types/index.cjs +19 -0
  387. package/dist/types/index.cjs.map +1 -0
  388. package/dist/types/index.d.cts +3 -0
  389. package/dist/types/index.d.cts.map +1 -0
  390. package/dist/types/index.d.mts +3 -0
  391. package/dist/types/index.d.mts.map +1 -0
  392. package/dist/types/index.mjs +2 -2
  393. package/dist/types/index.mjs.map +1 -1
  394. package/dist/utils.cjs +174 -0
  395. package/dist/utils.cjs.map +1 -0
  396. package/dist/{types/utils.d.ts → utils.d.cts} +8 -14
  397. package/dist/utils.d.cts.map +1 -0
  398. package/dist/utils.d.mts +245 -0
  399. package/dist/utils.d.mts.map +1 -0
  400. package/dist/utils.mjs +167 -22
  401. package/dist/utils.mjs.map +1 -1
  402. package/package.json +42 -30
  403. package/react-native.d.ts +3 -1
  404. package/react-native.js +1 -1
  405. package/dist/chunk-272IFIK7.mjs +0 -1
  406. package/dist/chunk-272IFIK7.mjs.map +0 -1
  407. package/dist/chunk-2D5PGL7S.js +0 -253
  408. package/dist/chunk-2D5PGL7S.js.map +0 -1
  409. package/dist/chunk-2SRKMEUV.mjs +0 -92
  410. package/dist/chunk-2SRKMEUV.mjs.map +0 -1
  411. package/dist/chunk-2XQD4P2S.mjs +0 -1
  412. package/dist/chunk-2XQD4P2S.mjs.map +0 -1
  413. package/dist/chunk-36QDTCDZ.js +0 -276
  414. package/dist/chunk-36QDTCDZ.js.map +0 -1
  415. package/dist/chunk-3RNW7OKG.mjs +0 -1
  416. package/dist/chunk-3RNW7OKG.mjs.map +0 -1
  417. package/dist/chunk-3WWZDKQL.js +0 -40
  418. package/dist/chunk-3WWZDKQL.js.map +0 -1
  419. package/dist/chunk-4CA3O64H.js +0 -13
  420. package/dist/chunk-4CA3O64H.js.map +0 -1
  421. package/dist/chunk-4HVWEABQ.mjs +0 -9
  422. package/dist/chunk-4HVWEABQ.mjs.map +0 -1
  423. package/dist/chunk-4M2FX2AT.mjs +0 -26
  424. package/dist/chunk-4M2FX2AT.mjs.map +0 -1
  425. package/dist/chunk-4URGXJP7.js +0 -1
  426. package/dist/chunk-4URGXJP7.js.map +0 -1
  427. package/dist/chunk-6EZSNS4O.mjs +0 -59
  428. package/dist/chunk-6EZSNS4O.mjs.map +0 -1
  429. package/dist/chunk-6K4MATNG.js +0 -2548
  430. package/dist/chunk-6K4MATNG.js.map +0 -1
  431. package/dist/chunk-6WGCLJGC.mjs +0 -58
  432. package/dist/chunk-6WGCLJGC.mjs.map +0 -1
  433. package/dist/chunk-6Z4WDAVC.js +0 -48
  434. package/dist/chunk-6Z4WDAVC.js.map +0 -1
  435. package/dist/chunk-7BUNUNUC.js +0 -58
  436. package/dist/chunk-7BUNUNUC.js.map +0 -1
  437. package/dist/chunk-7Y6P5FRN.js +0 -60
  438. package/dist/chunk-7Y6P5FRN.js.map +0 -1
  439. package/dist/chunk-A6WJEA3C.js +0 -1
  440. package/dist/chunk-A6WJEA3C.js.map +0 -1
  441. package/dist/chunk-AP7CJ6DA.js +0 -47
  442. package/dist/chunk-AP7CJ6DA.js.map +0 -1
  443. package/dist/chunk-B6KTRDBK.js +0 -127
  444. package/dist/chunk-B6KTRDBK.js.map +0 -1
  445. package/dist/chunk-B7R3EWM3.mjs +0 -1
  446. package/dist/chunk-B7R3EWM3.mjs.map +0 -1
  447. package/dist/chunk-BAEXVO3U.mjs +0 -1
  448. package/dist/chunk-BAEXVO3U.mjs.map +0 -1
  449. package/dist/chunk-BAUQWPSP.mjs +0 -331
  450. package/dist/chunk-BAUQWPSP.mjs.map +0 -1
  451. package/dist/chunk-BO2ZDPWV.js +0 -59
  452. package/dist/chunk-BO2ZDPWV.js.map +0 -1
  453. package/dist/chunk-BOFPNIRX.js +0 -119
  454. package/dist/chunk-BOFPNIRX.js.map +0 -1
  455. package/dist/chunk-C4D6GBMY.js +0 -71
  456. package/dist/chunk-C4D6GBMY.js.map +0 -1
  457. package/dist/chunk-D66YLO7T.js +0 -38
  458. package/dist/chunk-D66YLO7T.js.map +0 -1
  459. package/dist/chunk-D74XJG2L.js +0 -1
  460. package/dist/chunk-D74XJG2L.js.map +0 -1
  461. package/dist/chunk-DSOZPX7I.js +0 -283
  462. package/dist/chunk-DSOZPX7I.js.map +0 -1
  463. package/dist/chunk-ESQPQNEF.mjs +0 -1
  464. package/dist/chunk-ESQPQNEF.mjs.map +0 -1
  465. package/dist/chunk-EXN2TFDJ.js +0 -38
  466. package/dist/chunk-EXN2TFDJ.js.map +0 -1
  467. package/dist/chunk-F3ZMDQ52.mjs +0 -276
  468. package/dist/chunk-F3ZMDQ52.mjs.map +0 -1
  469. package/dist/chunk-FX5AADOV.mjs +0 -1
  470. package/dist/chunk-FX5AADOV.mjs.map +0 -1
  471. package/dist/chunk-FZOI4WPB.js +0 -82
  472. package/dist/chunk-FZOI4WPB.js.map +0 -1
  473. package/dist/chunk-G66GQJS6.js +0 -1
  474. package/dist/chunk-G66GQJS6.js.map +0 -1
  475. package/dist/chunk-G7U6WKWS.mjs +0 -1
  476. package/dist/chunk-G7U6WKWS.mjs.map +0 -1
  477. package/dist/chunk-HLQQTAMM.mjs +0 -105
  478. package/dist/chunk-HLQQTAMM.mjs.map +0 -1
  479. package/dist/chunk-HOY6NKQR.js +0 -1
  480. package/dist/chunk-HOY6NKQR.js.map +0 -1
  481. package/dist/chunk-HP6S5IOB.js +0 -1
  482. package/dist/chunk-HP6S5IOB.js.map +0 -1
  483. package/dist/chunk-HULNFJMA.mjs +0 -108
  484. package/dist/chunk-HULNFJMA.mjs.map +0 -1
  485. package/dist/chunk-HWJE3SDW.mjs +0 -1
  486. package/dist/chunk-HWJE3SDW.mjs.map +0 -1
  487. package/dist/chunk-I25KLPIS.js +0 -273
  488. package/dist/chunk-I25KLPIS.js.map +0 -1
  489. package/dist/chunk-I5V56NYO.mjs +0 -273
  490. package/dist/chunk-I5V56NYO.mjs.map +0 -1
  491. package/dist/chunk-IABOI7TW.mjs +0 -1
  492. package/dist/chunk-IABOI7TW.mjs.map +0 -1
  493. package/dist/chunk-IDCWJJCQ.js +0 -1
  494. package/dist/chunk-IDCWJJCQ.js.map +0 -1
  495. package/dist/chunk-IGC4E7PI.mjs +0 -71
  496. package/dist/chunk-IGC4E7PI.mjs.map +0 -1
  497. package/dist/chunk-JAUAKTUL.js +0 -1
  498. package/dist/chunk-JAUAKTUL.js.map +0 -1
  499. package/dist/chunk-JQ54YYLU.js +0 -26
  500. package/dist/chunk-JQ54YYLU.js.map +0 -1
  501. package/dist/chunk-JW7WBUL7.js +0 -1
  502. package/dist/chunk-JW7WBUL7.js.map +0 -1
  503. package/dist/chunk-K3TNQEM5.js +0 -331
  504. package/dist/chunk-K3TNQEM5.js.map +0 -1
  505. package/dist/chunk-KCMULJ2M.mjs +0 -1
  506. package/dist/chunk-KCMULJ2M.mjs.map +0 -1
  507. package/dist/chunk-KELDSV7H.js +0 -39
  508. package/dist/chunk-KELDSV7H.js.map +0 -1
  509. package/dist/chunk-KRI4OKC3.mjs +0 -127
  510. package/dist/chunk-KRI4OKC3.mjs.map +0 -1
  511. package/dist/chunk-KYRKZ3RH.mjs +0 -38
  512. package/dist/chunk-KYRKZ3RH.mjs.map +0 -1
  513. package/dist/chunk-LDL6LJ3P.mjs +0 -38
  514. package/dist/chunk-LDL6LJ3P.mjs.map +0 -1
  515. package/dist/chunk-M7DWHPVM.js +0 -1
  516. package/dist/chunk-M7DWHPVM.js.map +0 -1
  517. package/dist/chunk-NC5PBDKD.mjs +0 -47
  518. package/dist/chunk-NC5PBDKD.mjs.map +0 -1
  519. package/dist/chunk-NXZVKBSV.js +0 -9
  520. package/dist/chunk-NXZVKBSV.js.map +0 -1
  521. package/dist/chunk-NZOUFWUN.mjs +0 -1
  522. package/dist/chunk-NZOUFWUN.mjs.map +0 -1
  523. package/dist/chunk-OHMCPTOI.js +0 -1
  524. package/dist/chunk-OHMCPTOI.js.map +0 -1
  525. package/dist/chunk-OIEUL55W.js +0 -1
  526. package/dist/chunk-OIEUL55W.js.map +0 -1
  527. package/dist/chunk-OVATPF5I.js +0 -58
  528. package/dist/chunk-OVATPF5I.js.map +0 -1
  529. package/dist/chunk-P66VIDFG.js +0 -105
  530. package/dist/chunk-P66VIDFG.js.map +0 -1
  531. package/dist/chunk-P7Y6MIZW.mjs +0 -7
  532. package/dist/chunk-P7Y6MIZW.mjs.map +0 -1
  533. package/dist/chunk-PYSDWIVK.js +0 -38
  534. package/dist/chunk-PYSDWIVK.js.map +0 -1
  535. package/dist/chunk-QL3QGUTM.mjs +0 -1
  536. package/dist/chunk-QL3QGUTM.mjs.map +0 -1
  537. package/dist/chunk-QRISQRFI.js +0 -399
  538. package/dist/chunk-QRISQRFI.js.map +0 -1
  539. package/dist/chunk-QWN3UOMA.mjs +0 -2548
  540. package/dist/chunk-QWN3UOMA.mjs.map +0 -1
  541. package/dist/chunk-RZ2NHZXH.js +0 -108
  542. package/dist/chunk-RZ2NHZXH.js.map +0 -1
  543. package/dist/chunk-TG6OXBLR.js +0 -1
  544. package/dist/chunk-TG6OXBLR.js.map +0 -1
  545. package/dist/chunk-TIURYSSR.js +0 -92
  546. package/dist/chunk-TIURYSSR.js.map +0 -1
  547. package/dist/chunk-TMWMIQV4.js +0 -1
  548. package/dist/chunk-TMWMIQV4.js.map +0 -1
  549. package/dist/chunk-TSDUJNOP.mjs +0 -399
  550. package/dist/chunk-TSDUJNOP.mjs.map +0 -1
  551. package/dist/chunk-U74FML7Z.mjs +0 -1
  552. package/dist/chunk-U74FML7Z.mjs.map +0 -1
  553. package/dist/chunk-UM4NFNEI.mjs +0 -48
  554. package/dist/chunk-UM4NFNEI.mjs.map +0 -1
  555. package/dist/chunk-V6NFZ47P.mjs +0 -1
  556. package/dist/chunk-V6NFZ47P.mjs.map +0 -1
  557. package/dist/chunk-VKMY6CKT.mjs +0 -39
  558. package/dist/chunk-VKMY6CKT.mjs.map +0 -1
  559. package/dist/chunk-VNOCJWOK.js +0 -1
  560. package/dist/chunk-VNOCJWOK.js.map +0 -1
  561. package/dist/chunk-WEY7ICES.js +0 -1
  562. package/dist/chunk-WEY7ICES.js.map +0 -1
  563. package/dist/chunk-WR7CVDEY.mjs +0 -58
  564. package/dist/chunk-WR7CVDEY.mjs.map +0 -1
  565. package/dist/chunk-XO7KDFBY.mjs +0 -119
  566. package/dist/chunk-XO7KDFBY.mjs.map +0 -1
  567. package/dist/chunk-XOSHP4J3.mjs +0 -82
  568. package/dist/chunk-XOSHP4J3.mjs.map +0 -1
  569. package/dist/chunk-YRZVIDCF.mjs +0 -38
  570. package/dist/chunk-YRZVIDCF.mjs.map +0 -1
  571. package/dist/chunk-YYPUPKQY.js +0 -7
  572. package/dist/chunk-YYPUPKQY.js.map +0 -1
  573. package/dist/chunk-Z4BUMSH3.mjs +0 -283
  574. package/dist/chunk-Z4BUMSH3.mjs.map +0 -1
  575. package/dist/chunk-Z5QWRDUN.mjs +0 -253
  576. package/dist/chunk-Z5QWRDUN.mjs.map +0 -1
  577. package/dist/chunk-ZKG6FRKN.mjs +0 -40
  578. package/dist/chunk-ZQAGLOXD.mjs +0 -1
  579. package/dist/chunk-ZQAGLOXD.mjs.map +0 -1
  580. package/dist/chunk-ZVOYOZFT.mjs +0 -60
  581. package/dist/chunk-ZVOYOZFT.mjs.map +0 -1
  582. package/dist/chunk-ZZD3HUNE.mjs +0 -13
  583. package/dist/chunk-ZZD3HUNE.mjs.map +0 -1
  584. package/dist/cronjob/CronjobController.js +0 -43
  585. package/dist/cronjob/CronjobController.js.map +0 -1
  586. package/dist/cronjob/index.js +0 -43
  587. package/dist/cronjob/index.js.map +0 -1
  588. package/dist/fsm.js +0 -10
  589. package/dist/fsm.js.map +0 -1
  590. package/dist/index.js +0 -125
  591. package/dist/index.js.map +0 -1
  592. package/dist/insights/SnapInsightsController.js +0 -25
  593. package/dist/insights/SnapInsightsController.js.map +0 -1
  594. package/dist/insights/index.js +0 -26
  595. package/dist/insights/index.js.map +0 -1
  596. package/dist/interface/SnapInterfaceController.js +0 -9
  597. package/dist/interface/SnapInterfaceController.js.map +0 -1
  598. package/dist/interface/index.js +0 -10
  599. package/dist/interface/index.js.map +0 -1
  600. package/dist/interface/utils.js +0 -14
  601. package/dist/interface/utils.js.map +0 -1
  602. package/dist/logging.js +0 -8
  603. package/dist/logging.js.map +0 -1
  604. package/dist/node.js +0 -135
  605. package/dist/node.js.map +0 -1
  606. package/dist/react-native.js +0 -132
  607. package/dist/react-native.js.map +0 -1
  608. package/dist/services/AbstractExecutionService.js +0 -13
  609. package/dist/services/AbstractExecutionService.js.map +0 -1
  610. package/dist/services/ExecutionService.js +0 -2
  611. package/dist/services/ExecutionService.js.map +0 -1
  612. package/dist/services/ProxyPostMessageStream.js +0 -8
  613. package/dist/services/ProxyPostMessageStream.js.map +0 -1
  614. package/dist/services/browser.js +0 -40
  615. package/dist/services/browser.js.map +0 -1
  616. package/dist/services/iframe/IframeExecutionService.js +0 -12
  617. package/dist/services/iframe/IframeExecutionService.js.map +0 -1
  618. package/dist/services/iframe/index.js +0 -13
  619. package/dist/services/iframe/index.js.map +0 -1
  620. package/dist/services/index.js +0 -35
  621. package/dist/services/index.js.map +0 -1
  622. package/dist/services/node-js/NodeProcessExecutionService.js +0 -22
  623. package/dist/services/node-js/NodeProcessExecutionService.js.map +0 -1
  624. package/dist/services/node-js/NodeThreadExecutionService.js +0 -22
  625. package/dist/services/node-js/NodeThreadExecutionService.js.map +0 -1
  626. package/dist/services/node-js/index.js +0 -27
  627. package/dist/services/node-js/index.js.map +0 -1
  628. package/dist/services/node.js +0 -45
  629. package/dist/services/node.js.map +0 -1
  630. package/dist/services/offscreen/OffscreenExecutionService.js +0 -14
  631. package/dist/services/offscreen/OffscreenExecutionService.js.map +0 -1
  632. package/dist/services/offscreen/index.js +0 -15
  633. package/dist/services/offscreen/index.js.map +0 -1
  634. package/dist/services/proxy/ProxyExecutionService.js +0 -13
  635. package/dist/services/proxy/ProxyExecutionService.js.map +0 -1
  636. package/dist/services/react-native.js +0 -42
  637. package/dist/services/react-native.js.map +0 -1
  638. package/dist/services/webview/WebViewExecutionService.js +0 -15
  639. package/dist/services/webview/WebViewExecutionService.js.map +0 -1
  640. package/dist/services/webview/WebViewMessageStream.js +0 -8
  641. package/dist/services/webview/WebViewMessageStream.js.map +0 -1
  642. package/dist/services/webview/index.js +0 -16
  643. package/dist/services/webview/index.js.map +0 -1
  644. package/dist/services/webworker/WebWorkerExecutionService.js +0 -15
  645. package/dist/services/webworker/WebWorkerExecutionService.js.map +0 -1
  646. package/dist/services/webworker/index.js +0 -16
  647. package/dist/services/webworker/index.js.map +0 -1
  648. package/dist/snaps/RequestQueue.js +0 -8
  649. package/dist/snaps/RequestQueue.js.map +0 -1
  650. package/dist/snaps/SnapController.js +0 -30
  651. package/dist/snaps/SnapController.js.map +0 -1
  652. package/dist/snaps/Timer.js +0 -8
  653. package/dist/snaps/Timer.js.map +0 -1
  654. package/dist/snaps/constants.js +0 -10
  655. package/dist/snaps/constants.js.map +0 -1
  656. package/dist/snaps/index.js +0 -63
  657. package/dist/snaps/index.js.map +0 -1
  658. package/dist/snaps/location/http.js +0 -8
  659. package/dist/snaps/location/http.js.map +0 -1
  660. package/dist/snaps/location/index.js +0 -31
  661. package/dist/snaps/location/index.js.map +0 -1
  662. package/dist/snaps/location/local.js +0 -9
  663. package/dist/snaps/location/local.js.map +0 -1
  664. package/dist/snaps/location/location.js +0 -11
  665. package/dist/snaps/location/location.js.map +0 -1
  666. package/dist/snaps/location/npm.js +0 -18
  667. package/dist/snaps/location/npm.js.map +0 -1
  668. package/dist/snaps/registry/index.js +0 -13
  669. package/dist/snaps/registry/index.js.map +0 -1
  670. package/dist/snaps/registry/json.js +0 -9
  671. package/dist/snaps/registry/json.js.map +0 -1
  672. package/dist/snaps/registry/registry.js +0 -8
  673. package/dist/snaps/registry/registry.js.map +0 -1
  674. package/dist/snaps/selectors.js +0 -8
  675. package/dist/snaps/selectors.js.map +0 -1
  676. package/dist/tsconfig.build.tsbuildinfo +0 -1
  677. package/dist/types/controllers.js +0 -2
  678. package/dist/types/controllers.js.map +0 -1
  679. package/dist/types/cronjob/index.d.ts +0 -1
  680. package/dist/types/encryptor.js +0 -2
  681. package/dist/types/encryptor.js.map +0 -1
  682. package/dist/types/index.d.ts +0 -7
  683. package/dist/types/index.js +0 -3
  684. package/dist/types/index.js.map +0 -1
  685. package/dist/types/insights/index.d.ts +0 -1
  686. package/dist/types/interface/index.d.ts +0 -1
  687. package/dist/types/node.d.ts +0 -2
  688. package/dist/types/react-native.d.ts +0 -2
  689. package/dist/types/services/browser.d.ts +0 -7
  690. package/dist/types/services/iframe/index.d.ts +0 -1
  691. package/dist/types/services/index.d.ts +0 -6
  692. package/dist/types/services/node-js/index.d.ts +0 -2
  693. package/dist/types/services/node.d.ts +0 -2
  694. package/dist/types/services/offscreen/index.d.ts +0 -1
  695. package/dist/types/services/react-native.d.ts +0 -2
  696. package/dist/types/services/webview/index.d.ts +0 -1
  697. package/dist/types/services/webworker/index.d.ts +0 -1
  698. package/dist/types/snaps/index.d.ts +0 -4
  699. package/dist/types/snaps/location/index.d.ts +0 -4
  700. package/dist/types/snaps/registry/index.d.ts +0 -2
  701. package/dist/types/snaps/selectors.d.ts +0 -2
  702. package/dist/types/types/index.d.ts +0 -2
  703. package/dist/types/vendor/global.d.js +0 -1
  704. package/dist/types/vendor/global.d.js.map +0 -1
  705. package/dist/types/vendor/global.d.mjs +0 -1
  706. package/dist/types/vendor/global.d.mjs.map +0 -1
  707. package/dist/types/vendor/readable-stream.d.js +0 -1
  708. package/dist/types/vendor/readable-stream.d.js.map +0 -1
  709. package/dist/types/vendor/readable-stream.d.mjs +0 -1
  710. package/dist/types/vendor/readable-stream.d.mjs.map +0 -1
  711. package/dist/types/vendor/zlib.d.js +0 -1
  712. package/dist/types/vendor/zlib.d.js.map +0 -1
  713. package/dist/types/vendor/zlib.d.mjs +0 -1
  714. package/dist/types/vendor/zlib.d.mjs.map +0 -1
  715. package/dist/utils.js +0 -23
  716. package/dist/utils.js.map +0 -1
@@ -1,2548 +0,0 @@
1
- import {
2
- detectSnapLocation
3
- } from "./chunk-ZKG6FRKN.mjs";
4
- import {
5
- RequestQueue
6
- } from "./chunk-NC5PBDKD.mjs";
7
- import {
8
- ALLOWED_PERMISSIONS,
9
- LEGACY_ENCRYPTION_KEY_DERIVATION_OPTIONS
10
- } from "./chunk-4M2FX2AT.mjs";
11
- import {
12
- forceStrict,
13
- validateMachine
14
- } from "./chunk-6EZSNS4O.mjs";
15
- import {
16
- log
17
- } from "./chunk-4HVWEABQ.mjs";
18
- import {
19
- fetchSnap,
20
- hasTimedOut,
21
- permissionsDiff,
22
- setDiff,
23
- withTimeout
24
- } from "./chunk-KRI4OKC3.mjs";
25
- import {
26
- Timer
27
- } from "./chunk-XO7KDFBY.mjs";
28
- import {
29
- __privateAdd,
30
- __privateGet,
31
- __privateMethod,
32
- __privateSet
33
- } from "./chunk-YRZVIDCF.mjs";
34
-
35
- // src/snaps/SnapController.ts
36
- import { BaseController } from "@metamask/base-controller";
37
- import { SubjectType } from "@metamask/permission-controller";
38
- import { rpcErrors } from "@metamask/rpc-errors";
39
- import {
40
- WALLET_SNAP_PERMISSION_KEY,
41
- getMaxRequestTimeCaveat,
42
- handlerEndowments,
43
- SnapEndowments,
44
- getKeyringCaveatOrigins,
45
- getRpcCaveatOrigins,
46
- processSnapPermissions,
47
- getEncryptionEntropy
48
- } from "@metamask/snaps-rpc-methods";
49
- import { AuxiliaryFileEncoding, getErrorMessage } from "@metamask/snaps-sdk";
50
- import {
51
- assertIsSnapManifest,
52
- assertIsValidSnapId,
53
- DEFAULT_ENDOWMENTS,
54
- DEFAULT_REQUESTED_SNAP_VERSION,
55
- encodeAuxiliaryFile,
56
- HandlerType,
57
- isOriginAllowed,
58
- logError,
59
- normalizeRelative,
60
- OnTransactionResponseStruct,
61
- OnSignatureResponseStruct,
62
- resolveVersionRange,
63
- SnapCaveatType,
64
- SnapStatus,
65
- SnapStatusEvents,
66
- unwrapError,
67
- OnHomePageResponseStruct,
68
- getValidatedLocalizationFiles,
69
- VirtualFile,
70
- NpmSnapFileNames,
71
- OnNameLookupResponseStruct,
72
- getLocalizedSnapManifest,
73
- parseJson,
74
- MAX_FILE_SIZE
75
- } from "@metamask/snaps-utils";
76
- import {
77
- assert,
78
- assertIsJsonRpcRequest,
79
- assertStruct,
80
- Duration,
81
- gtRange,
82
- gtVersion,
83
- hasProperty,
84
- inMilliseconds,
85
- isNonEmptyArray,
86
- isValidJson,
87
- isValidSemVerRange,
88
- satisfiesVersionRange,
89
- timeSince
90
- } from "@metamask/utils";
91
- import { createMachine, interpret } from "@xstate/fsm";
92
- import { nanoid } from "nanoid";
93
- var controllerName = "SnapController";
94
- var SNAP_APPROVAL_INSTALL = "wallet_installSnap";
95
- var SNAP_APPROVAL_UPDATE = "wallet_updateSnap";
96
- var SNAP_APPROVAL_RESULT = "wallet_installSnapResult";
97
- var TRUNCATED_SNAP_PROPERTIES = /* @__PURE__ */ new Set([
98
- "initialPermissions",
99
- "id",
100
- "version",
101
- "enabled",
102
- "blocked"
103
- ]);
104
- var defaultState = {
105
- snaps: {},
106
- snapStates: {},
107
- unencryptedSnapStates: {}
108
- };
109
- function truncateSnap(snap) {
110
- const truncatedSnap = Object.keys(snap).reduce(
111
- (serialized, key) => {
112
- if (TRUNCATED_SNAP_PROPERTIES.has(key)) {
113
- serialized[key] = snap[key];
114
- }
115
- return serialized;
116
- },
117
- {}
118
- );
119
- return truncatedSnap;
120
- }
121
- var name = "SnapController";
122
- var _closeAllConnections, _dynamicPermissions, _environmentEndowmentPermissions, _excludedPermissions, _featureFlags, _fetchFunction, _idleTimeCheckInterval, _maxIdleTime, _encryptor, _getMnemonic, _getFeatureFlags, _detectSnapLocation, _snapsRuntimeData, _rollbackSnapshots, _timeoutForLastRequestStatus, _statusMachine, _preinstalledSnaps, _initializeStateMachine, initializeStateMachine_fn, _registerMessageHandlers, registerMessageHandlers_fn, _handlePreinstalledSnaps, handlePreinstalledSnaps_fn, _pollForLastRequestStatus, pollForLastRequestStatus_fn, _blockSnap, blockSnap_fn, _unblockSnap, unblockSnap_fn, _assertIsInstallAllowed, assertIsInstallAllowed_fn, _assertCanInstallSnaps, assertCanInstallSnaps_fn, _assertCanUsePlatform, assertCanUsePlatform_fn, _stopSnapsLastRequestPastMax, stopSnapsLastRequestPastMax_fn, _transition, transition_fn, _terminateSnap, terminateSnap_fn, _getSnapEncryptionKey, getSnapEncryptionKey_fn, _decryptSnapState, decryptSnapState_fn, _encryptSnapState, encryptSnapState_fn, _handleInitialConnections, handleInitialConnections_fn, _addSnapToSubject, addSnapToSubject_fn, _removeSnapFromSubjects, removeSnapFromSubjects_fn, _revokeAllSnapPermissions, revokeAllSnapPermissions_fn, _createApproval, createApproval_fn, _updateApproval, updateApproval_fn, _resolveAllowlistVersion, resolveAllowlistVersion_fn, _add, add_fn, _startSnap, startSnap_fn, _getEndowments, getEndowments_fn, _set, set_fn, _validateSnapPermissions, validateSnapPermissions_fn, _getExecutionTimeout, getExecutionTimeout_fn, _getRpcRequestHandler, getRpcRequestHandler_fn, _createInterface, createInterface_fn, _assertInterfaceExists, assertInterfaceExists_fn, _transformSnapRpcRequestResult, transformSnapRpcRequestResult_fn, _assertSnapRpcRequestResult, assertSnapRpcRequestResult_fn, _recordSnapRpcRequestStart, recordSnapRpcRequestStart_fn, _recordSnapRpcRequestFinish, recordSnapRpcRequestFinish_fn, _getRollbackSnapshot, getRollbackSnapshot_fn, _createRollbackSnapshot, createRollbackSnapshot_fn, _rollbackSnap, rollbackSnap_fn, _rollbackSnaps, rollbackSnaps_fn, _getRuntime, getRuntime_fn, _getRuntimeExpect, getRuntimeExpect_fn, _setupRuntime, setupRuntime_fn, _calculatePermissionsChange, calculatePermissionsChange_fn, _isSubjectConnectedToSnap, isSubjectConnectedToSnap_fn, _calculateConnectionsChange, calculateConnectionsChange_fn, _updatePermissions, updatePermissions_fn, _isValidUpdate, isValidUpdate_fn, _callLifecycleHook, callLifecycleHook_fn;
123
- var SnapController = class extends BaseController {
124
- constructor({
125
- closeAllConnections,
126
- messenger,
127
- state,
128
- dynamicPermissions = ["eth_accounts"],
129
- environmentEndowmentPermissions = [],
130
- excludedPermissions = {},
131
- idleTimeCheckInterval = inMilliseconds(5, Duration.Second),
132
- maxIdleTime = inMilliseconds(30, Duration.Second),
133
- maxRequestTime = inMilliseconds(60, Duration.Second),
134
- fetchFunction = globalThis.fetch.bind(void 0),
135
- featureFlags = {},
136
- detectSnapLocation: detectSnapLocationFunction = detectSnapLocation,
137
- preinstalledSnaps = null,
138
- encryptor,
139
- getMnemonic,
140
- getFeatureFlags = () => ({})
141
- }) {
142
- super({
143
- messenger,
144
- metadata: {
145
- snapStates: {
146
- persist: true,
147
- anonymous: false
148
- },
149
- unencryptedSnapStates: {
150
- persist: true,
151
- anonymous: false
152
- },
153
- snaps: {
154
- persist: (snaps) => {
155
- return Object.values(snaps).filter((snap) => snap.status !== SnapStatus.Installing).map((snap) => {
156
- return {
157
- ...snap,
158
- // At the time state is rehydrated, no snap will be running.
159
- status: SnapStatus.Stopped
160
- };
161
- }).reduce((memo, snap) => {
162
- memo[snap.id] = snap;
163
- return memo;
164
- }, {});
165
- },
166
- anonymous: false
167
- }
168
- },
169
- name,
170
- state: {
171
- ...defaultState,
172
- ...state
173
- }
174
- });
175
- /**
176
- * We track status of a Snap using a finite-state-machine.
177
- * It keeps track of whether the snap is started / stopped / etc.
178
- *
179
- * @see {@link SnapController.transition} for interacting with the machine.
180
- */
181
- // We initialize the machine in the instance because the status is currently tightly coupled
182
- // with the SnapController - the guard checks for enabled status inside the SnapController state.
183
- // In the future, side-effects could be added to the machine during transitions.
184
- __privateAdd(this, _initializeStateMachine);
185
- /**
186
- * Constructor helper for registering the controller's messaging system
187
- * actions.
188
- */
189
- __privateAdd(this, _registerMessageHandlers);
190
- __privateAdd(this, _handlePreinstalledSnaps);
191
- __privateAdd(this, _pollForLastRequestStatus);
192
- /**
193
- * Blocks an installed snap and prevents it from being started again. Emits
194
- * {@link SnapBlocked}. Does nothing if the snap is not installed.
195
- *
196
- * @param snapId - The snap to block.
197
- * @param blockedSnapInfo - Information detailing why the snap is blocked.
198
- */
199
- __privateAdd(this, _blockSnap);
200
- /**
201
- * Unblocks a snap so that it can be enabled and started again. Emits
202
- * {@link SnapUnblocked}. Does nothing if the snap is not installed or already
203
- * unblocked.
204
- *
205
- * @param snapId - The id of the snap to unblock.
206
- */
207
- __privateAdd(this, _unblockSnap);
208
- __privateAdd(this, _assertIsInstallAllowed);
209
- /**
210
- * Asserts whether new Snaps are allowed to be installed.
211
- */
212
- __privateAdd(this, _assertCanInstallSnaps);
213
- /**
214
- * Asserts whether the Snaps platform is allowed to run.
215
- */
216
- __privateAdd(this, _assertCanUsePlatform);
217
- __privateAdd(this, _stopSnapsLastRequestPastMax);
218
- /**
219
- * Transitions between states using `snapStatusStateMachineConfig` as the template to figure out
220
- * the next state. This transition function uses a very minimal subset of XState conventions:
221
- * - supports initial state
222
- * - .on supports raw event target string
223
- * - .on supports {target, cond} object
224
- * - the arguments for `cond` is the `SerializedSnap` instead of Xstate convention of `(event,
225
- * context) => boolean`
226
- *
227
- * @param snapId - The id of the snap to transition.
228
- * @param event - The event enum to use to transition.
229
- */
230
- __privateAdd(this, _transition);
231
- /**
232
- * Terminates the specified snap and emits the `snapTerminated` event.
233
- *
234
- * @param snapId - The snap to terminate.
235
- */
236
- __privateAdd(this, _terminateSnap);
237
- /**
238
- * Generate an encryption key to be used for state encryption for a given Snap.
239
- *
240
- * @param options - An options bag.
241
- * @param options.snapId - The Snap ID.
242
- * @param options.salt - A salt to be used for the encryption key.
243
- * @param options.useCache - Whether to use caching or not.
244
- * @param options.keyMetadata - Optional metadata about how to derive the encryption key.
245
- * @returns An encryption key.
246
- */
247
- __privateAdd(this, _getSnapEncryptionKey);
248
- /**
249
- * Decrypt the encrypted state for a given Snap.
250
- *
251
- * @param snapId - The Snap ID.
252
- * @param state - The encrypted state as a string.
253
- * @returns A valid JSON object derived from the encrypted state.
254
- * @throws If the decryption fails or the decrypted state is not valid JSON.
255
- */
256
- __privateAdd(this, _decryptSnapState);
257
- /**
258
- * Encrypt a JSON state object for a given Snap.
259
- *
260
- * Note: This function does not assert the validity of the object,
261
- * please ensure only valid JSON is passed to it.
262
- *
263
- * @param snapId - The Snap ID.
264
- * @param state - The state object.
265
- * @returns A string containing the encrypted JSON object.
266
- */
267
- __privateAdd(this, _encryptSnapState);
268
- __privateAdd(this, _handleInitialConnections);
269
- __privateAdd(this, _addSnapToSubject);
270
- /**
271
- * Removes a snap's permission (caveat) from all subjects.
272
- *
273
- * @param snapId - The id of the Snap.
274
- */
275
- __privateAdd(this, _removeSnapFromSubjects);
276
- /**
277
- * Safely revokes all permissions granted to a Snap.
278
- *
279
- * @param snapId - The snap ID.
280
- */
281
- __privateAdd(this, _revokeAllSnapPermissions);
282
- __privateAdd(this, _createApproval);
283
- __privateAdd(this, _updateApproval);
284
- __privateAdd(this, _resolveAllowlistVersion);
285
- /**
286
- * Returns a promise representing the complete installation of the requested snap.
287
- * If the snap is already being installed, the previously pending promise will be returned.
288
- *
289
- * @param args - Object containing the snap id and either the URL of the snap's manifest,
290
- * or the snap's manifest and source code. The object may also optionally contain a target
291
- * version.
292
- * @returns The resulting snap object.
293
- */
294
- __privateAdd(this, _add);
295
- __privateAdd(this, _startSnap);
296
- /**
297
- * Gets the names of all endowments that will be added to the Snap's
298
- * Compartment when it executes. These should be the names of global
299
- * JavaScript APIs accessible in the root realm of the execution environment.
300
- *
301
- * Throws an error if the endowment getter for a permission returns a truthy
302
- * value that is not an array of strings.
303
- *
304
- * @param snapId - The id of the snap whose SES endowments to get.
305
- * @returns An array of the names of the endowments.
306
- */
307
- __privateAdd(this, _getEndowments);
308
- /**
309
- * Sets a snap in state. Called when a snap is installed or updated. Performs
310
- * various validation checks on the received arguments, and will throw if
311
- * validation fails.
312
- *
313
- * The snap will be enabled and unblocked by the time this method returns,
314
- * regardless of its previous state.
315
- *
316
- * See {@link SnapController.add} and {@link SnapController.updateSnap} for
317
- * usage.
318
- *
319
- * @param args - The add snap args.
320
- * @returns The resulting snap object.
321
- */
322
- __privateAdd(this, _set);
323
- __privateAdd(this, _validateSnapPermissions);
324
- /**
325
- * Determine the execution timeout for a given handler permission.
326
- *
327
- * If no permission is specified or the permission itself has no execution timeout defined
328
- * the constructor argument `maxRequestTime` will be used.
329
- *
330
- * @param permission - An optional permission constraint for the handler being called.
331
- * @returns The execution timeout for the given handler.
332
- */
333
- __privateAdd(this, _getExecutionTimeout);
334
- /**
335
- * Gets the RPC message handler for the given snap.
336
- *
337
- * @param snapId - The id of the Snap whose message handler to get.
338
- * @returns The RPC handler for the given snap.
339
- */
340
- __privateAdd(this, _getRpcRequestHandler);
341
- /**
342
- * Create a dynamic interface in the SnapInterfaceController.
343
- *
344
- * @param snapId - The snap ID.
345
- * @param content - The initial interface content.
346
- * @returns An identifier that can be used to identify the interface.
347
- */
348
- __privateAdd(this, _createInterface);
349
- __privateAdd(this, _assertInterfaceExists);
350
- /**
351
- * Transform a RPC request result if necessary.
352
- *
353
- * @param snapId - The snap ID of the snap that produced the result.
354
- * @param handlerType - The handler type that produced the result.
355
- * @param result - The result.
356
- * @returns The transformed result if applicable, otherwise the original result.
357
- */
358
- __privateAdd(this, _transformSnapRpcRequestResult);
359
- /**
360
- * Assert that the returned result of a Snap RPC call is the expected shape.
361
- *
362
- * @param snapId - The snap ID.
363
- * @param handlerType - The handler type of the RPC Request.
364
- * @param result - The result of the RPC request.
365
- */
366
- __privateAdd(this, _assertSnapRpcRequestResult);
367
- __privateAdd(this, _recordSnapRpcRequestStart);
368
- __privateAdd(this, _recordSnapRpcRequestFinish);
369
- /**
370
- * Retrieves the rollback snapshot of a snap.
371
- *
372
- * @param snapId - The snap id.
373
- * @returns A `RollbackSnapshot` or `undefined` if one doesn't exist.
374
- */
375
- __privateAdd(this, _getRollbackSnapshot);
376
- /**
377
- * Creates a `RollbackSnapshot` that is used to help ensure
378
- * atomicity in multiple snap updates.
379
- *
380
- * @param snapId - The snap id.
381
- * @throws {@link Error}. If the snap exists before creation or if creation fails.
382
- * @returns A `RollbackSnapshot`.
383
- */
384
- __privateAdd(this, _createRollbackSnapshot);
385
- /**
386
- * Rolls back a snap to its previous state, permissions
387
- * and source code based on the `RollbackSnapshot` that
388
- * is captured during the update process. After rolling back,
389
- * the function also emits an event indicating that the
390
- * snap has been rolled back and it clears the snapshot
391
- * for that snap.
392
- *
393
- * @param snapId - The snap id.
394
- * @throws {@link Error}. If a snapshot does not exist.
395
- */
396
- __privateAdd(this, _rollbackSnap);
397
- /**
398
- * Iterates through an array of snap ids
399
- * and calls `rollbackSnap` on them.
400
- *
401
- * @param snapIds - An array of snap ids.
402
- */
403
- __privateAdd(this, _rollbackSnaps);
404
- __privateAdd(this, _getRuntime);
405
- __privateAdd(this, _getRuntimeExpect);
406
- __privateAdd(this, _setupRuntime);
407
- __privateAdd(this, _calculatePermissionsChange);
408
- __privateAdd(this, _isSubjectConnectedToSnap);
409
- __privateAdd(this, _calculateConnectionsChange);
410
- /**
411
- * Updates the permissions for a snap following an install, update or rollback.
412
- *
413
- * Grants newly requested permissions and revokes unused/revoked permissions.
414
- *
415
- * @param args - An options bag.
416
- * @param args.snapId - The snap ID.
417
- * @param args.newPermissions - New permissions to be granted.
418
- * @param args.unusedPermissions - Unused permissions to be revoked.
419
- * @param args.requestData - Optional request data from an approval.
420
- */
421
- __privateAdd(this, _updatePermissions);
422
- /**
423
- * Checks if a snap will pass version validation checks
424
- * with the new version range that is requested. The first
425
- * check that is done is to check if the existing snap version
426
- * falls inside the requested range. If it does, we want to return
427
- * false because we do not care to create a rollback snapshot in
428
- * that scenario. The second check is to ensure that the current
429
- * snap version is not greater than all possible versions in
430
- * the requested version range. If it is, then we also want
431
- * to return false in that scenario.
432
- *
433
- * @param snapId - The snap id.
434
- * @param newVersionRange - The new version range being requested.
435
- * @returns `true` if validation checks pass and `false` if they do not.
436
- */
437
- __privateAdd(this, _isValidUpdate);
438
- /**
439
- * Call a lifecycle hook on a snap, if the snap has the
440
- * `endowment:lifecycle-hooks` permission. If the snap does not have the
441
- * permission, nothing happens.
442
- *
443
- * @param origin - The origin.
444
- * @param snapId - The snap ID.
445
- * @param handler - The lifecycle hook to call. This should be one of the
446
- * supported lifecycle hooks.
447
- * @private
448
- */
449
- __privateAdd(this, _callLifecycleHook);
450
- __privateAdd(this, _closeAllConnections, void 0);
451
- __privateAdd(this, _dynamicPermissions, void 0);
452
- __privateAdd(this, _environmentEndowmentPermissions, void 0);
453
- __privateAdd(this, _excludedPermissions, void 0);
454
- __privateAdd(this, _featureFlags, void 0);
455
- __privateAdd(this, _fetchFunction, void 0);
456
- __privateAdd(this, _idleTimeCheckInterval, void 0);
457
- __privateAdd(this, _maxIdleTime, void 0);
458
- __privateAdd(this, _encryptor, void 0);
459
- __privateAdd(this, _getMnemonic, void 0);
460
- __privateAdd(this, _getFeatureFlags, void 0);
461
- __privateAdd(this, _detectSnapLocation, void 0);
462
- __privateAdd(this, _snapsRuntimeData, void 0);
463
- __privateAdd(this, _rollbackSnapshots, void 0);
464
- __privateAdd(this, _timeoutForLastRequestStatus, void 0);
465
- __privateAdd(this, _statusMachine, void 0);
466
- __privateAdd(this, _preinstalledSnaps, void 0);
467
- __privateSet(this, _closeAllConnections, closeAllConnections);
468
- __privateSet(this, _dynamicPermissions, dynamicPermissions);
469
- __privateSet(this, _environmentEndowmentPermissions, environmentEndowmentPermissions);
470
- __privateSet(this, _excludedPermissions, excludedPermissions);
471
- __privateSet(this, _featureFlags, featureFlags);
472
- __privateSet(this, _fetchFunction, fetchFunction);
473
- __privateSet(this, _idleTimeCheckInterval, idleTimeCheckInterval);
474
- __privateSet(this, _maxIdleTime, maxIdleTime);
475
- this.maxRequestTime = maxRequestTime;
476
- __privateSet(this, _detectSnapLocation, detectSnapLocationFunction);
477
- __privateSet(this, _encryptor, encryptor);
478
- __privateSet(this, _getMnemonic, getMnemonic);
479
- __privateSet(this, _getFeatureFlags, getFeatureFlags);
480
- __privateSet(this, _preinstalledSnaps, preinstalledSnaps);
481
- this._onUnhandledSnapError = this._onUnhandledSnapError.bind(this);
482
- this._onOutboundRequest = this._onOutboundRequest.bind(this);
483
- this._onOutboundResponse = this._onOutboundResponse.bind(this);
484
- __privateSet(this, _rollbackSnapshots, /* @__PURE__ */ new Map());
485
- __privateSet(this, _snapsRuntimeData, /* @__PURE__ */ new Map());
486
- __privateMethod(this, _pollForLastRequestStatus, pollForLastRequestStatus_fn).call(this);
487
- this.messagingSystem.subscribe(
488
- "ExecutionService:unhandledError",
489
- this._onUnhandledSnapError
490
- );
491
- this.messagingSystem.subscribe(
492
- "ExecutionService:outboundRequest",
493
- this._onOutboundRequest
494
- );
495
- this.messagingSystem.subscribe(
496
- "ExecutionService:outboundResponse",
497
- this._onOutboundResponse
498
- );
499
- this.messagingSystem.subscribe(
500
- "SnapController:snapInstalled",
501
- ({ id }, origin) => {
502
- __privateMethod(this, _callLifecycleHook, callLifecycleHook_fn).call(this, origin, id, HandlerType.OnInstall).catch(
503
- (error) => {
504
- logError(
505
- `Error when calling \`onInstall\` lifecycle hook for snap "${id}": ${getErrorMessage(
506
- error
507
- )}`
508
- );
509
- }
510
- );
511
- }
512
- );
513
- this.messagingSystem.subscribe(
514
- "SnapController:snapUpdated",
515
- ({ id }, _oldVersion, origin) => {
516
- __privateMethod(this, _callLifecycleHook, callLifecycleHook_fn).call(this, origin, id, HandlerType.OnUpdate).catch(
517
- (error) => {
518
- logError(
519
- `Error when calling \`onUpdate\` lifecycle hook for snap "${id}": ${getErrorMessage(
520
- error
521
- )}`
522
- );
523
- }
524
- );
525
- }
526
- );
527
- __privateMethod(this, _initializeStateMachine, initializeStateMachine_fn).call(this);
528
- __privateMethod(this, _registerMessageHandlers, registerMessageHandlers_fn).call(this);
529
- if (__privateGet(this, _preinstalledSnaps)) {
530
- __privateMethod(this, _handlePreinstalledSnaps, handlePreinstalledSnaps_fn).call(this, __privateGet(this, _preinstalledSnaps));
531
- }
532
- Object.values(this.state?.snaps ?? {}).forEach(
533
- (snap) => __privateMethod(this, _setupRuntime, setupRuntime_fn).call(this, snap.id)
534
- );
535
- }
536
- /**
537
- * Checks all installed snaps against the block list and
538
- * blocks/unblocks snaps as appropriate. See {@link SnapController.blockSnap}
539
- * for more information.
540
- */
541
- async updateBlockedSnaps() {
542
- __privateMethod(this, _assertCanUsePlatform, assertCanUsePlatform_fn).call(this);
543
- await this.messagingSystem.call("SnapsRegistry:update");
544
- const blockedSnaps = await this.messagingSystem.call(
545
- "SnapsRegistry:get",
546
- Object.values(this.state.snaps).reduce(
547
- (blockListArg, snap) => {
548
- blockListArg[snap.id] = {
549
- version: snap.version,
550
- checksum: snap.manifest.source.shasum
551
- };
552
- return blockListArg;
553
- },
554
- {}
555
- )
556
- );
557
- await Promise.all(
558
- Object.entries(blockedSnaps).map(async ([snapId, { status, reason }]) => {
559
- if (status === 1 /* Blocked */) {
560
- return __privateMethod(this, _blockSnap, blockSnap_fn).call(this, snapId, reason);
561
- }
562
- return __privateMethod(this, _unblockSnap, unblockSnap_fn).call(this, snapId);
563
- })
564
- );
565
- }
566
- _onUnhandledSnapError(snapId, _error) {
567
- this.stopSnap(snapId, SnapStatusEvents.Crash).catch(
568
- (stopSnapError) => {
569
- logError(stopSnapError);
570
- }
571
- );
572
- }
573
- _onOutboundRequest(snapId) {
574
- const runtime = __privateMethod(this, _getRuntimeExpect, getRuntimeExpect_fn).call(this, snapId);
575
- runtime.pendingInboundRequests.filter((pendingRequest) => pendingRequest.timer.status === "running").forEach((pendingRequest) => pendingRequest.timer.pause());
576
- runtime.pendingOutboundRequests += 1;
577
- }
578
- _onOutboundResponse(snapId) {
579
- const runtime = __privateMethod(this, _getRuntimeExpect, getRuntimeExpect_fn).call(this, snapId);
580
- runtime.pendingOutboundRequests -= 1;
581
- if (runtime.pendingOutboundRequests === 0) {
582
- runtime.pendingInboundRequests.filter((pendingRequest) => pendingRequest.timer.status === "paused").forEach((pendingRequest) => pendingRequest.timer.resume());
583
- }
584
- }
585
- /**
586
- * Starts the given snap. Throws an error if no such snap exists
587
- * or if it is already running.
588
- *
589
- * @param snapId - The id of the Snap to start.
590
- */
591
- async startSnap(snapId) {
592
- __privateMethod(this, _assertCanUsePlatform, assertCanUsePlatform_fn).call(this);
593
- const snap = this.state.snaps[snapId];
594
- if (snap.enabled === false) {
595
- throw new Error(`Snap "${snapId}" is disabled.`);
596
- }
597
- await __privateMethod(this, _startSnap, startSnap_fn).call(this, {
598
- snapId,
599
- sourceCode: snap.sourceCode
600
- });
601
- }
602
- /**
603
- * Enables the given snap. A snap can only be started if it is enabled. A snap
604
- * can only be enabled if it isn't blocked.
605
- *
606
- * @param snapId - The id of the Snap to enable.
607
- */
608
- enableSnap(snapId) {
609
- this.getExpect(snapId);
610
- if (this.state.snaps[snapId].blocked) {
611
- throw new Error(`Snap "${snapId}" is blocked and cannot be enabled.`);
612
- }
613
- this.update((state) => {
614
- state.snaps[snapId].enabled = true;
615
- });
616
- this.messagingSystem.publish(
617
- "SnapController:snapEnabled",
618
- this.getTruncatedExpect(snapId)
619
- );
620
- }
621
- /**
622
- * Disables the given snap. A snap can only be started if it is enabled.
623
- *
624
- * @param snapId - The id of the Snap to disable.
625
- * @returns A promise that resolves once the snap has been disabled.
626
- */
627
- async disableSnap(snapId) {
628
- if (!this.has(snapId)) {
629
- throw new Error(`Snap "${snapId}" not found.`);
630
- }
631
- this.update((state) => {
632
- state.snaps[snapId].enabled = false;
633
- });
634
- if (this.isRunning(snapId)) {
635
- await this.stopSnap(snapId, SnapStatusEvents.Stop);
636
- }
637
- this.messagingSystem.publish(
638
- "SnapController:snapDisabled",
639
- this.getTruncatedExpect(snapId)
640
- );
641
- }
642
- /**
643
- * Stops the given snap, removes all hooks, closes all connections, and
644
- * terminates its worker.
645
- *
646
- * @param snapId - The id of the Snap to stop.
647
- * @param statusEvent - The Snap status event that caused the snap to be
648
- * stopped.
649
- */
650
- async stopSnap(snapId, statusEvent = SnapStatusEvents.Stop) {
651
- var _a;
652
- const runtime = __privateMethod(this, _getRuntime, getRuntime_fn).call(this, snapId);
653
- if (!runtime) {
654
- throw new Error(`The snap "${snapId}" is not running.`);
655
- }
656
- if (runtime.stopping) {
657
- return;
658
- }
659
- runtime.stopping = true;
660
- try {
661
- if (this.isRunning(snapId)) {
662
- (_a = __privateGet(this, _closeAllConnections)) == null ? void 0 : _a.call(this, snapId);
663
- await __privateMethod(this, _terminateSnap, terminateSnap_fn).call(this, snapId);
664
- }
665
- } finally {
666
- runtime.lastRequest = null;
667
- runtime.pendingInboundRequests = [];
668
- runtime.pendingOutboundRequests = 0;
669
- runtime.stopping = false;
670
- if (this.isRunning(snapId)) {
671
- __privateMethod(this, _transition, transition_fn).call(this, snapId, statusEvent);
672
- }
673
- }
674
- }
675
- /**
676
- * Returns whether the given snap is running.
677
- * Throws an error if the snap doesn't exist.
678
- *
679
- * @param snapId - The id of the Snap to check.
680
- * @returns `true` if the snap is running, otherwise `false`.
681
- */
682
- isRunning(snapId) {
683
- return this.getExpect(snapId).status === "running";
684
- }
685
- /**
686
- * Returns whether the given snap has been added to state.
687
- *
688
- * @param snapId - The id of the Snap to check for.
689
- * @returns `true` if the snap exists in the controller state, otherwise `false`.
690
- */
691
- has(snapId) {
692
- return Boolean(this.get(snapId));
693
- }
694
- /**
695
- * Gets the snap with the given id if it exists, including all data.
696
- * This should not be used if the snap is to be serializable, as e.g.
697
- * the snap sourceCode may be quite large.
698
- *
699
- * @param snapId - The id of the Snap to get.
700
- * @returns The entire snap object from the controller state.
701
- */
702
- get(snapId) {
703
- return this.state.snaps[snapId];
704
- }
705
- /**
706
- * Gets the snap with the given id, throws if doesn't.
707
- * This should not be used if the snap is to be serializable, as e.g.
708
- * the snap sourceCode may be quite large.
709
- *
710
- * @see {@link SnapController.get}
711
- * @throws {@link Error}. If the snap doesn't exist
712
- * @param snapId - The id of the snap to get.
713
- * @returns The entire snap object.
714
- */
715
- getExpect(snapId) {
716
- const snap = this.get(snapId);
717
- assert(snap !== void 0, new Error(`Snap "${snapId}" not found.`));
718
- return snap;
719
- }
720
- /**
721
- * Gets the snap with the given id if it exists, excluding any
722
- * non-serializable or expensive-to-serialize data.
723
- *
724
- * @param snapId - The id of the Snap to get.
725
- * @returns A truncated version of the snap state, that is less expensive to serialize.
726
- */
727
- // TODO(ritave): this.get returns undefined, this.getTruncated returns null
728
- getTruncated(snapId) {
729
- const snap = this.get(snapId);
730
- return snap ? truncateSnap(snap) : null;
731
- }
732
- /**
733
- * Gets the snap with the given id, throw if it doesn't exist.
734
- *
735
- * @throws {@link Error}. If snap doesn't exist
736
- * @param snapId - The id of the snap to get.
737
- * @returns A truncated version of the snap state, that is less expensive to serialize.
738
- */
739
- getTruncatedExpect(snapId) {
740
- return truncateSnap(this.getExpect(snapId));
741
- }
742
- /**
743
- * Updates the own state of the snap with the given id.
744
- * This is distinct from the state MetaMask uses to manage snaps.
745
- *
746
- * @param snapId - The id of the Snap whose state should be updated.
747
- * @param newSnapState - The new state of the snap.
748
- * @param encrypted - A flag to indicate whether to use encrypted storage or not.
749
- */
750
- async updateSnapState(snapId, newSnapState, encrypted) {
751
- if (encrypted) {
752
- const encryptedState = await __privateMethod(this, _encryptSnapState, encryptSnapState_fn).call(this, snapId, newSnapState);
753
- this.update((state) => {
754
- state.snapStates[snapId] = encryptedState;
755
- });
756
- } else {
757
- this.update((state) => {
758
- state.unencryptedSnapStates[snapId] = JSON.stringify(newSnapState);
759
- });
760
- }
761
- }
762
- /**
763
- * Clears the state of the snap with the given id.
764
- * This is distinct from the state MetaMask uses to manage snaps.
765
- *
766
- * @param snapId - The id of the Snap whose state should be cleared.
767
- * @param encrypted - A flag to indicate whether to use encrypted storage or not.
768
- */
769
- clearSnapState(snapId, encrypted) {
770
- this.update((state) => {
771
- if (encrypted) {
772
- state.snapStates[snapId] = null;
773
- } else {
774
- state.unencryptedSnapStates[snapId] = null;
775
- }
776
- });
777
- }
778
- /**
779
- * Gets the own state of the snap with the given id.
780
- * This is distinct from the state MetaMask uses to manage snaps.
781
- *
782
- * @param snapId - The id of the Snap whose state to get.
783
- * @param encrypted - A flag to indicate whether to use encrypted storage or not.
784
- * @returns The requested snap state or null if no state exists.
785
- */
786
- async getSnapState(snapId, encrypted) {
787
- const state = encrypted ? this.state.snapStates[snapId] : this.state.unencryptedSnapStates[snapId];
788
- if (state === null || state === void 0) {
789
- return null;
790
- }
791
- if (!encrypted) {
792
- return parseJson(state);
793
- }
794
- const decrypted = await __privateMethod(this, _decryptSnapState, decryptSnapState_fn).call(this, snapId, state);
795
- return decrypted;
796
- }
797
- /**
798
- * Gets a static auxiliary snap file in a chosen file encoding.
799
- *
800
- * @param snapId - The id of the Snap whose state to get.
801
- * @param path - The path to the requested file.
802
- * @param encoding - An optional requested file encoding.
803
- * @returns The file requested in the chosen file encoding or null if the file is not found.
804
- */
805
- async getSnapFile(snapId, path, encoding = AuxiliaryFileEncoding.Base64) {
806
- const snap = this.getExpect(snapId);
807
- const normalizedPath = normalizeRelative(path);
808
- const value = snap.auxiliaryFiles?.find(
809
- (file) => file.path === normalizedPath
810
- )?.value;
811
- if (!value) {
812
- return null;
813
- }
814
- const encoded = await encodeAuxiliaryFile(value, encoding);
815
- assert(
816
- encoded.length < MAX_FILE_SIZE,
817
- `Failed to encode static file to "${encoding}": Static files must be less than 64 MB when encoded.`
818
- );
819
- return encoded;
820
- }
821
- /**
822
- * Completely clear the controller's state: delete all associated data,
823
- * handlers, event listeners, and permissions; tear down all snap providers.
824
- */
825
- async clearState() {
826
- const snapIds = Object.keys(this.state.snaps);
827
- if (__privateGet(this, _closeAllConnections)) {
828
- snapIds.forEach((snapId) => {
829
- var _a;
830
- (_a = __privateGet(this, _closeAllConnections)) == null ? void 0 : _a.call(this, snapId);
831
- });
832
- }
833
- await this.messagingSystem.call("ExecutionService:terminateAllSnaps");
834
- snapIds.forEach((snapId) => __privateMethod(this, _revokeAllSnapPermissions, revokeAllSnapPermissions_fn).call(this, snapId));
835
- this.update((state) => {
836
- state.snaps = {};
837
- state.snapStates = {};
838
- });
839
- __privateGet(this, _snapsRuntimeData).clear();
840
- if (__privateGet(this, _preinstalledSnaps)) {
841
- __privateMethod(this, _handlePreinstalledSnaps, handlePreinstalledSnaps_fn).call(this, __privateGet(this, _preinstalledSnaps));
842
- Object.values(this.state?.snaps).forEach(
843
- (snap) => __privateMethod(this, _setupRuntime, setupRuntime_fn).call(this, snap.id)
844
- );
845
- }
846
- }
847
- /**
848
- * Removes the given snap from state, and clears all associated handlers
849
- * and listeners.
850
- *
851
- * @param snapId - The id of the Snap.
852
- * @returns A promise that resolves once the snap has been removed.
853
- */
854
- async removeSnap(snapId) {
855
- return this.removeSnaps([snapId]);
856
- }
857
- /**
858
- * Stops the given snaps, removes them from state, and clears all associated
859
- * permissions, handlers, and listeners.
860
- *
861
- * @param snapIds - The ids of the Snaps.
862
- */
863
- async removeSnaps(snapIds) {
864
- if (!Array.isArray(snapIds)) {
865
- throw new Error("Expected array of snap ids.");
866
- }
867
- snapIds.forEach((snapId) => {
868
- const snap = this.getExpect(snapId);
869
- assert(snap.removable !== false, `${snapId} is not removable.`);
870
- });
871
- await Promise.all(
872
- snapIds.map(async (snapId) => {
873
- const snap = this.getExpect(snapId);
874
- const truncated = this.getTruncatedExpect(snapId);
875
- await this.disableSnap(snapId);
876
- __privateMethod(this, _revokeAllSnapPermissions, revokeAllSnapPermissions_fn).call(this, snapId);
877
- __privateMethod(this, _removeSnapFromSubjects, removeSnapFromSubjects_fn).call(this, snapId);
878
- __privateGet(this, _snapsRuntimeData).delete(snapId);
879
- this.update((state) => {
880
- delete state.snaps[snapId];
881
- delete state.snapStates[snapId];
882
- delete state.unencryptedSnapStates[snapId];
883
- });
884
- if (snap.status !== SnapStatus.Installing) {
885
- this.messagingSystem.publish(
886
- `SnapController:snapUninstalled`,
887
- truncated
888
- );
889
- }
890
- })
891
- );
892
- }
893
- /**
894
- * Removes a snap's permission (caveat) from the specified subject.
895
- *
896
- * @param origin - The origin from which to remove the snap.
897
- * @param snapId - The id of the snap to remove.
898
- */
899
- removeSnapFromSubject(origin, snapId) {
900
- const subjectPermissions = this.messagingSystem.call(
901
- "PermissionController:getPermissions",
902
- origin
903
- );
904
- const snapIdsCaveat = subjectPermissions?.[WALLET_SNAP_PERMISSION_KEY]?.caveats?.find((caveat) => caveat.type === SnapCaveatType.SnapIds);
905
- if (!snapIdsCaveat) {
906
- return;
907
- }
908
- const caveatHasSnap = Boolean(
909
- snapIdsCaveat.value?.[snapId]
910
- );
911
- if (caveatHasSnap) {
912
- const newCaveatValue = {
913
- ...snapIdsCaveat.value
914
- };
915
- delete newCaveatValue[snapId];
916
- if (Object.keys(newCaveatValue).length > 0) {
917
- this.messagingSystem.call(
918
- "PermissionController:updateCaveat",
919
- origin,
920
- WALLET_SNAP_PERMISSION_KEY,
921
- SnapCaveatType.SnapIds,
922
- newCaveatValue
923
- );
924
- } else {
925
- this.messagingSystem.call("PermissionController:revokePermissions", {
926
- [origin]: [WALLET_SNAP_PERMISSION_KEY]
927
- });
928
- }
929
- }
930
- }
931
- /**
932
- * Checks if a list of permissions are dynamic and allowed to be revoked, if they are they will all be revoked.
933
- *
934
- * @param snapId - The snap ID.
935
- * @param permissionNames - The names of the permissions.
936
- * @throws If non-dynamic permissions are passed.
937
- */
938
- revokeDynamicSnapPermissions(snapId, permissionNames) {
939
- assert(
940
- permissionNames.every(
941
- (permissionName) => __privateGet(this, _dynamicPermissions).includes(permissionName)
942
- ),
943
- "Non-dynamic permissions cannot be revoked"
944
- );
945
- this.messagingSystem.call("PermissionController:revokePermissions", {
946
- [snapId]: permissionNames
947
- });
948
- }
949
- /**
950
- * Handles incrementing the activeReferences counter.
951
- *
952
- * @param snapId - The snap id of the snap that was referenced.
953
- */
954
- incrementActiveReferences(snapId) {
955
- const runtime = __privateMethod(this, _getRuntimeExpect, getRuntimeExpect_fn).call(this, snapId);
956
- runtime.activeReferences += 1;
957
- }
958
- /**
959
- * Handles decrement the activeReferences counter.
960
- *
961
- * @param snapId - The snap id of the snap that was referenced..
962
- */
963
- decrementActiveReferences(snapId) {
964
- const runtime = __privateMethod(this, _getRuntimeExpect, getRuntimeExpect_fn).call(this, snapId);
965
- assert(
966
- runtime.activeReferences > 0,
967
- "SnapController reference management is in an invalid state."
968
- );
969
- runtime.activeReferences -= 1;
970
- }
971
- /**
972
- * Gets all snaps in their truncated format.
973
- *
974
- * @returns All installed snaps in their truncated format.
975
- */
976
- getAllSnaps() {
977
- return Object.values(this.state.snaps).map(truncateSnap);
978
- }
979
- /**
980
- * Gets the serialized permitted snaps of the given origin, if any.
981
- *
982
- * @param origin - The origin whose permitted snaps to retrieve.
983
- * @returns The serialized permitted snaps for the origin.
984
- */
985
- getPermittedSnaps(origin) {
986
- const permissions = this.messagingSystem.call(
987
- "PermissionController:getPermissions",
988
- origin
989
- ) ?? {};
990
- const snaps = permissions[WALLET_SNAP_PERMISSION_KEY]?.caveats?.find(
991
- (caveat) => caveat.type === SnapCaveatType.SnapIds
992
- )?.value ?? {};
993
- return Object.keys(snaps).reduce(
994
- (permittedSnaps, snapId) => {
995
- const snap = this.get(snapId);
996
- const truncatedSnap = this.getTruncated(snapId);
997
- if (truncatedSnap && snap?.status !== SnapStatus.Installing) {
998
- permittedSnaps[snapId] = truncatedSnap;
999
- }
1000
- return permittedSnaps;
1001
- },
1002
- {}
1003
- );
1004
- }
1005
- /**
1006
- * Installs the snaps requested by the given origin, returning the snap
1007
- * object if the origin is permitted to install it, and an authorization error
1008
- * otherwise.
1009
- *
1010
- * @param origin - The origin that requested to install the snaps.
1011
- * @param requestedSnaps - The snaps to install.
1012
- * @returns An object of snap ids and snap objects, or errors if a
1013
- * snap couldn't be installed.
1014
- */
1015
- async installSnaps(origin, requestedSnaps) {
1016
- __privateMethod(this, _assertCanUsePlatform, assertCanUsePlatform_fn).call(this);
1017
- const result = {};
1018
- const snapIds = Object.keys(requestedSnaps);
1019
- const pendingUpdates = [];
1020
- const pendingInstalls = [];
1021
- try {
1022
- for (const [snapId, { version: rawVersion }] of Object.entries(
1023
- requestedSnaps
1024
- )) {
1025
- assertIsValidSnapId(snapId);
1026
- const [error, version] = resolveVersionRange(rawVersion);
1027
- if (error) {
1028
- throw rpcErrors.invalidParams(
1029
- `The "version" field must be a valid SemVer version range if specified. Received: "${rawVersion}".`
1030
- );
1031
- }
1032
- const location = __privateGet(this, _detectSnapLocation).call(this, snapId, {
1033
- versionRange: version,
1034
- fetch: __privateGet(this, _fetchFunction),
1035
- allowLocal: __privateGet(this, _featureFlags).allowLocalSnaps,
1036
- resolveVersion: async (range) => __privateGet(this, _featureFlags).requireAllowlist ? await __privateMethod(this, _resolveAllowlistVersion, resolveAllowlistVersion_fn).call(this, snapId, range) : range
1037
- });
1038
- const isUpdate = this.has(snapId) && !location.shouldAlwaysReload;
1039
- if (isUpdate && __privateMethod(this, _isValidUpdate, isValidUpdate_fn).call(this, snapId, version)) {
1040
- const existingSnap = this.getExpect(snapId);
1041
- pendingUpdates.push({ snapId, oldVersion: existingSnap.version });
1042
- let rollbackSnapshot = __privateMethod(this, _getRollbackSnapshot, getRollbackSnapshot_fn).call(this, snapId);
1043
- if (rollbackSnapshot === void 0) {
1044
- rollbackSnapshot = __privateMethod(this, _createRollbackSnapshot, createRollbackSnapshot_fn).call(this, snapId);
1045
- rollbackSnapshot.newVersion = version;
1046
- } else {
1047
- throw new Error("This snap is already being updated.");
1048
- }
1049
- } else if (!isUpdate) {
1050
- pendingInstalls.push(snapId);
1051
- }
1052
- result[snapId] = await this.processRequestedSnap(
1053
- origin,
1054
- snapId,
1055
- location,
1056
- version
1057
- );
1058
- }
1059
- pendingInstalls.forEach(
1060
- (snapId) => this.messagingSystem.publish(
1061
- `SnapController:snapInstalled`,
1062
- this.getTruncatedExpect(snapId),
1063
- origin
1064
- )
1065
- );
1066
- pendingUpdates.forEach(
1067
- ({ snapId, oldVersion }) => this.messagingSystem.publish(
1068
- `SnapController:snapUpdated`,
1069
- this.getTruncatedExpect(snapId),
1070
- oldVersion,
1071
- origin
1072
- )
1073
- );
1074
- snapIds.forEach((snapId) => __privateGet(this, _rollbackSnapshots).delete(snapId));
1075
- } catch (error) {
1076
- const installed = pendingInstalls.filter((snapId) => this.has(snapId));
1077
- await this.removeSnaps(installed);
1078
- const snapshottedSnaps = [...__privateGet(this, _rollbackSnapshots).keys()];
1079
- const snapsToRollback = pendingUpdates.map(({ snapId }) => snapId).filter((snapId) => snapshottedSnaps.includes(snapId));
1080
- await __privateMethod(this, _rollbackSnaps, rollbackSnaps_fn).call(this, snapsToRollback);
1081
- throw error;
1082
- }
1083
- return result;
1084
- }
1085
- /**
1086
- * Adds, authorizes, and runs the given snap with a snap provider.
1087
- * Results from this method should be efficiently serializable.
1088
- *
1089
- * @param origin - The origin requesting the snap.
1090
- * @param snapId - The id of the snap.
1091
- * @param location - The location implementation of the snap.
1092
- * @param versionRange - The semver range of the snap to install.
1093
- * @returns The resulting snap object, or an error if something went wrong.
1094
- */
1095
- async processRequestedSnap(origin, snapId, location, versionRange) {
1096
- const existingSnap = this.getTruncated(snapId);
1097
- if (existingSnap && !location.shouldAlwaysReload) {
1098
- if (satisfiesVersionRange(existingSnap.version, versionRange)) {
1099
- return existingSnap;
1100
- }
1101
- return await this.updateSnap(
1102
- origin,
1103
- snapId,
1104
- location,
1105
- versionRange,
1106
- // Since we are requesting an update from within processRequestedSnap,
1107
- // we disable the emitting of the snapUpdated event and rely on the caller
1108
- // to publish this event after the update is complete.
1109
- // This is necessary as installSnaps may be installing multiple snaps
1110
- // and we don't want to emit events prematurely.
1111
- false
1112
- );
1113
- }
1114
- __privateMethod(this, _assertCanInstallSnaps, assertCanInstallSnaps_fn).call(this);
1115
- let pendingApproval = __privateMethod(this, _createApproval, createApproval_fn).call(this, {
1116
- origin,
1117
- snapId,
1118
- type: SNAP_APPROVAL_INSTALL
1119
- });
1120
- this.messagingSystem.publish(
1121
- "SnapController:snapInstallStarted",
1122
- snapId,
1123
- origin,
1124
- false
1125
- );
1126
- if (existingSnap && this.isRunning(snapId)) {
1127
- await this.stopSnap(snapId, SnapStatusEvents.Stop);
1128
- }
1129
- if (existingSnap && location.shouldAlwaysReload) {
1130
- __privateMethod(this, _revokeAllSnapPermissions, revokeAllSnapPermissions_fn).call(this, snapId);
1131
- }
1132
- try {
1133
- const { sourceCode } = await __privateMethod(this, _add, add_fn).call(this, {
1134
- origin,
1135
- id: snapId,
1136
- location,
1137
- versionRange
1138
- });
1139
- await this.authorize(snapId, pendingApproval);
1140
- pendingApproval = __privateMethod(this, _createApproval, createApproval_fn).call(this, {
1141
- origin,
1142
- snapId,
1143
- type: SNAP_APPROVAL_RESULT
1144
- });
1145
- await __privateMethod(this, _startSnap, startSnap_fn).call(this, {
1146
- snapId,
1147
- sourceCode
1148
- });
1149
- const truncated = this.getTruncatedExpect(snapId);
1150
- __privateMethod(this, _updateApproval, updateApproval_fn).call(this, pendingApproval.id, {
1151
- loading: false,
1152
- type: SNAP_APPROVAL_INSTALL
1153
- });
1154
- return truncated;
1155
- } catch (error) {
1156
- logError(`Error when adding ${snapId}.`, error);
1157
- const errorString = error instanceof Error ? error.message : error.toString();
1158
- __privateMethod(this, _updateApproval, updateApproval_fn).call(this, pendingApproval.id, {
1159
- loading: false,
1160
- type: SNAP_APPROVAL_INSTALL,
1161
- error: errorString
1162
- });
1163
- this.messagingSystem.publish(
1164
- "SnapController:snapInstallFailed",
1165
- snapId,
1166
- origin,
1167
- false,
1168
- errorString
1169
- );
1170
- throw error;
1171
- }
1172
- }
1173
- /**
1174
- * Updates an installed snap. The flow is similar to
1175
- * {@link SnapController.installSnaps}. The user will be asked if they want
1176
- * to update, then approve any permission changes, and finally the snap will
1177
- * be restarted.
1178
- *
1179
- * The update will fail if the user rejects any prompt or if the new version
1180
- * of the snap is blocked.
1181
- *
1182
- * If the original version of the snap was blocked and the update succeeded,
1183
- * the snap will be unblocked and enabled before it is restarted.
1184
- *
1185
- * @param origin - The origin requesting the snap update.
1186
- * @param snapId - The id of the Snap to be updated.
1187
- * @param location - The location implementation of the snap.
1188
- * @param newVersionRange - A semver version range in which the maximum version will be chosen.
1189
- * @param emitEvent - An optional boolean flag to indicate whether this update should emit an event.
1190
- * @returns The snap metadata if updated, `null` otherwise.
1191
- */
1192
- async updateSnap(origin, snapId, location, newVersionRange = DEFAULT_REQUESTED_SNAP_VERSION, emitEvent = true) {
1193
- __privateMethod(this, _assertCanInstallSnaps, assertCanInstallSnaps_fn).call(this);
1194
- __privateMethod(this, _assertCanUsePlatform, assertCanUsePlatform_fn).call(this);
1195
- if (!isValidSemVerRange(newVersionRange)) {
1196
- throw new Error(
1197
- `Received invalid snap version range: "${newVersionRange}".`
1198
- );
1199
- }
1200
- let pendingApproval = __privateMethod(this, _createApproval, createApproval_fn).call(this, {
1201
- origin,
1202
- snapId,
1203
- type: SNAP_APPROVAL_UPDATE
1204
- });
1205
- try {
1206
- this.messagingSystem.publish(
1207
- "SnapController:snapInstallStarted",
1208
- snapId,
1209
- origin,
1210
- true
1211
- );
1212
- const snap = this.getExpect(snapId);
1213
- const oldManifest = snap.manifest;
1214
- const newSnap = await fetchSnap(snapId, location);
1215
- const { sourceCode: sourceCodeFile, manifest: manifestFile } = newSnap;
1216
- const manifest = manifestFile.result;
1217
- const newVersion = manifest.version;
1218
- if (!gtVersion(newVersion, snap.version)) {
1219
- throw rpcErrors.invalidParams(
1220
- `Snap "${snapId}@${snap.version}" is already installed. Couldn't update to a version inside requested "${newVersionRange}" range.`
1221
- );
1222
- }
1223
- if (!satisfiesVersionRange(newVersion, newVersionRange)) {
1224
- throw new Error(
1225
- `Version mismatch. Manifest for "${snapId}" specifies version "${newVersion}" which doesn't satisfy requested version range "${newVersionRange}".`
1226
- );
1227
- }
1228
- await __privateMethod(this, _assertIsInstallAllowed, assertIsInstallAllowed_fn).call(this, snapId, {
1229
- version: newVersion,
1230
- checksum: manifest.source.shasum,
1231
- permissions: manifest.initialPermissions
1232
- });
1233
- const processedPermissions = processSnapPermissions(
1234
- manifest.initialPermissions
1235
- );
1236
- __privateMethod(this, _validateSnapPermissions, validateSnapPermissions_fn).call(this, processedPermissions);
1237
- const { newPermissions, unusedPermissions, approvedPermissions } = __privateMethod(this, _calculatePermissionsChange, calculatePermissionsChange_fn).call(this, snapId, processedPermissions);
1238
- const { newConnections, unusedConnections, approvedConnections } = __privateMethod(this, _calculateConnectionsChange, calculateConnectionsChange_fn).call(this, snapId, oldManifest.initialConnections ?? {}, manifest.initialConnections ?? {});
1239
- __privateMethod(this, _updateApproval, updateApproval_fn).call(this, pendingApproval.id, {
1240
- permissions: newPermissions,
1241
- newVersion: manifest.version,
1242
- newPermissions,
1243
- approvedPermissions,
1244
- unusedPermissions,
1245
- newConnections,
1246
- unusedConnections,
1247
- approvedConnections,
1248
- loading: false
1249
- });
1250
- const { permissions: approvedNewPermissions, ...requestData } = await pendingApproval.promise;
1251
- pendingApproval = __privateMethod(this, _createApproval, createApproval_fn).call(this, {
1252
- origin,
1253
- snapId,
1254
- type: SNAP_APPROVAL_RESULT
1255
- });
1256
- if (this.isRunning(snapId)) {
1257
- await this.stopSnap(snapId, SnapStatusEvents.Stop);
1258
- }
1259
- __privateMethod(this, _transition, transition_fn).call(this, snapId, SnapStatusEvents.Update);
1260
- __privateMethod(this, _set, set_fn).call(this, {
1261
- origin,
1262
- id: snapId,
1263
- files: newSnap,
1264
- isUpdate: true
1265
- });
1266
- __privateMethod(this, _updatePermissions, updatePermissions_fn).call(this, {
1267
- snapId,
1268
- unusedPermissions,
1269
- newPermissions: approvedNewPermissions,
1270
- requestData
1271
- });
1272
- if (manifest.initialConnections) {
1273
- __privateMethod(this, _handleInitialConnections, handleInitialConnections_fn).call(this, snapId, oldManifest.initialConnections ?? null, manifest.initialConnections);
1274
- }
1275
- const rollbackSnapshot = __privateMethod(this, _getRollbackSnapshot, getRollbackSnapshot_fn).call(this, snapId);
1276
- if (rollbackSnapshot !== void 0) {
1277
- rollbackSnapshot.permissions.revoked = unusedPermissions;
1278
- rollbackSnapshot.permissions.granted = approvedNewPermissions;
1279
- rollbackSnapshot.permissions.requestData = requestData;
1280
- }
1281
- const sourceCode = sourceCodeFile.toString();
1282
- assert(
1283
- typeof sourceCode === "string" && sourceCode.length > 0,
1284
- `Invalid source code for snap "${snapId}".`
1285
- );
1286
- try {
1287
- await __privateMethod(this, _startSnap, startSnap_fn).call(this, { snapId, sourceCode });
1288
- } catch {
1289
- throw new Error(`Snap ${snapId} crashed with updated source code.`);
1290
- }
1291
- const truncatedSnap = this.getTruncatedExpect(snapId);
1292
- if (emitEvent) {
1293
- this.messagingSystem.publish(
1294
- "SnapController:snapUpdated",
1295
- truncatedSnap,
1296
- snap.version,
1297
- origin
1298
- );
1299
- }
1300
- __privateMethod(this, _updateApproval, updateApproval_fn).call(this, pendingApproval.id, {
1301
- loading: false,
1302
- type: SNAP_APPROVAL_UPDATE
1303
- });
1304
- return truncatedSnap;
1305
- } catch (error) {
1306
- logError(`Error when updating ${snapId},`, error);
1307
- const errorString = error instanceof Error ? error.message : error.toString();
1308
- __privateMethod(this, _updateApproval, updateApproval_fn).call(this, pendingApproval.id, {
1309
- loading: false,
1310
- error: errorString,
1311
- type: SNAP_APPROVAL_UPDATE
1312
- });
1313
- this.messagingSystem.publish(
1314
- "SnapController:snapInstallFailed",
1315
- snapId,
1316
- origin,
1317
- true,
1318
- errorString
1319
- );
1320
- throw error;
1321
- }
1322
- }
1323
- /**
1324
- * Get metadata for the given snap ID.
1325
- *
1326
- * @param snapId - The ID of the snap to get metadata for.
1327
- * @returns The metadata for the given snap ID, or `null` if the snap is not
1328
- * verified.
1329
- */
1330
- async getRegistryMetadata(snapId) {
1331
- __privateMethod(this, _assertCanUsePlatform, assertCanUsePlatform_fn).call(this);
1332
- return await this.messagingSystem.call("SnapsRegistry:getMetadata", snapId);
1333
- }
1334
- /**
1335
- * Initiates a request for the given snap's initial permissions.
1336
- * Must be called in order. See processRequestedSnap.
1337
- *
1338
- * This function is not hash private yet because of tests.
1339
- *
1340
- * @param snapId - The id of the Snap.
1341
- * @param pendingApproval - Pending approval to update.
1342
- * @returns The snap's approvedPermissions.
1343
- */
1344
- async authorize(snapId, pendingApproval) {
1345
- log(`Authorizing snap: ${snapId}`);
1346
- const snapsState = this.state.snaps;
1347
- const snap = snapsState[snapId];
1348
- const { initialPermissions, initialConnections } = snap;
1349
- try {
1350
- const processedPermissions = processSnapPermissions(initialPermissions);
1351
- __privateMethod(this, _validateSnapPermissions, validateSnapPermissions_fn).call(this, processedPermissions);
1352
- __privateMethod(this, _updateApproval, updateApproval_fn).call(this, pendingApproval.id, {
1353
- loading: false,
1354
- connections: initialConnections ?? {},
1355
- permissions: processedPermissions
1356
- });
1357
- const { permissions: approvedPermissions, ...requestData } = await pendingApproval.promise;
1358
- __privateMethod(this, _updatePermissions, updatePermissions_fn).call(this, {
1359
- snapId,
1360
- newPermissions: approvedPermissions,
1361
- requestData
1362
- });
1363
- if (snap.manifest.initialConnections) {
1364
- __privateMethod(this, _handleInitialConnections, handleInitialConnections_fn).call(this, snapId, null, snap.manifest.initialConnections);
1365
- }
1366
- } finally {
1367
- const runtime = __privateMethod(this, _getRuntimeExpect, getRuntimeExpect_fn).call(this, snapId);
1368
- runtime.installPromise = null;
1369
- }
1370
- }
1371
- destroy() {
1372
- super.destroy();
1373
- if (__privateGet(this, _timeoutForLastRequestStatus)) {
1374
- clearTimeout(__privateGet(this, _timeoutForLastRequestStatus));
1375
- }
1376
- this.messagingSystem.unsubscribe(
1377
- "ExecutionService:unhandledError",
1378
- this._onUnhandledSnapError
1379
- );
1380
- this.messagingSystem.unsubscribe(
1381
- "ExecutionService:outboundRequest",
1382
- this._onOutboundRequest
1383
- );
1384
- this.messagingSystem.unsubscribe(
1385
- "ExecutionService:outboundResponse",
1386
- this._onOutboundResponse
1387
- );
1388
- this.messagingSystem.clearEventSubscriptions(
1389
- "SnapController:snapInstalled"
1390
- );
1391
- this.messagingSystem.clearEventSubscriptions("SnapController:snapUpdated");
1392
- }
1393
- /**
1394
- * Passes a JSON-RPC request object to the RPC handler function of a snap.
1395
- *
1396
- * @param options - A bag of options.
1397
- * @param options.snapId - The ID of the recipient snap.
1398
- * @param options.origin - The origin of the RPC request.
1399
- * @param options.handler - The handler to trigger on the snap for the request.
1400
- * @param options.request - The JSON-RPC request object.
1401
- * @returns The result of the JSON-RPC request.
1402
- */
1403
- async handleRequest({
1404
- snapId,
1405
- origin,
1406
- handler: handlerType,
1407
- request: rawRequest
1408
- }) {
1409
- __privateMethod(this, _assertCanUsePlatform, assertCanUsePlatform_fn).call(this);
1410
- const request = {
1411
- jsonrpc: "2.0",
1412
- id: nanoid(),
1413
- ...rawRequest
1414
- };
1415
- assertIsJsonRpcRequest(request);
1416
- const permissionName = handlerEndowments[handlerType];
1417
- assert(
1418
- typeof permissionName === "string" || permissionName === null,
1419
- "'permissionName' must be either a string or null."
1420
- );
1421
- const permissions = this.messagingSystem.call(
1422
- "PermissionController:getPermissions",
1423
- snapId
1424
- );
1425
- if (permissionName !== null && (!permissions || !hasProperty(permissions, permissionName))) {
1426
- throw new Error(
1427
- `Snap "${snapId}" is not permitted to use "${permissionName}".`
1428
- );
1429
- }
1430
- const handlerPermissions = permissionName ? permissions[permissionName] : void 0;
1431
- if (permissionName === SnapEndowments.Rpc || permissionName === SnapEndowments.Keyring) {
1432
- assert(handlerPermissions);
1433
- const subject = this.messagingSystem.call(
1434
- "SubjectMetadataController:getSubjectMetadata",
1435
- origin
1436
- );
1437
- const origins = permissionName === SnapEndowments.Rpc ? getRpcCaveatOrigins(handlerPermissions) : getKeyringCaveatOrigins(handlerPermissions);
1438
- assert(origins);
1439
- if (!isOriginAllowed(
1440
- origins,
1441
- subject?.subjectType ?? SubjectType.Website,
1442
- origin
1443
- )) {
1444
- throw new Error(
1445
- `Snap "${snapId}" is not permitted to handle requests from "${origin}".`
1446
- );
1447
- }
1448
- }
1449
- const handler = __privateMethod(this, _getRpcRequestHandler, getRpcRequestHandler_fn).call(this, snapId);
1450
- if (!handler) {
1451
- throw new Error(
1452
- `Snap RPC message handler not found for snap "${snapId}".`
1453
- );
1454
- }
1455
- const timeout = __privateMethod(this, _getExecutionTimeout, getExecutionTimeout_fn).call(this, handlerPermissions);
1456
- return handler({ origin, handler: handlerType, request, timeout });
1457
- }
1458
- };
1459
- _closeAllConnections = new WeakMap();
1460
- _dynamicPermissions = new WeakMap();
1461
- _environmentEndowmentPermissions = new WeakMap();
1462
- _excludedPermissions = new WeakMap();
1463
- _featureFlags = new WeakMap();
1464
- _fetchFunction = new WeakMap();
1465
- _idleTimeCheckInterval = new WeakMap();
1466
- _maxIdleTime = new WeakMap();
1467
- _encryptor = new WeakMap();
1468
- _getMnemonic = new WeakMap();
1469
- _getFeatureFlags = new WeakMap();
1470
- _detectSnapLocation = new WeakMap();
1471
- _snapsRuntimeData = new WeakMap();
1472
- _rollbackSnapshots = new WeakMap();
1473
- _timeoutForLastRequestStatus = new WeakMap();
1474
- _statusMachine = new WeakMap();
1475
- _preinstalledSnaps = new WeakMap();
1476
- _initializeStateMachine = new WeakSet();
1477
- initializeStateMachine_fn = function() {
1478
- const disableGuard = ({ snapId }) => {
1479
- return this.getExpect(snapId).enabled;
1480
- };
1481
- const statusConfig = {
1482
- initial: SnapStatus.Installing,
1483
- states: {
1484
- [SnapStatus.Installing]: {
1485
- on: {
1486
- [SnapStatusEvents.Start]: {
1487
- target: SnapStatus.Running,
1488
- cond: disableGuard
1489
- }
1490
- }
1491
- },
1492
- [SnapStatus.Updating]: {
1493
- on: {
1494
- [SnapStatusEvents.Start]: {
1495
- target: SnapStatus.Running,
1496
- cond: disableGuard
1497
- },
1498
- [SnapStatusEvents.Stop]: SnapStatus.Stopped
1499
- }
1500
- },
1501
- [SnapStatus.Running]: {
1502
- on: {
1503
- [SnapStatusEvents.Stop]: SnapStatus.Stopped,
1504
- [SnapStatusEvents.Crash]: SnapStatus.Crashed
1505
- }
1506
- },
1507
- [SnapStatus.Stopped]: {
1508
- on: {
1509
- [SnapStatusEvents.Start]: {
1510
- target: SnapStatus.Running,
1511
- cond: disableGuard
1512
- },
1513
- [SnapStatusEvents.Update]: SnapStatus.Updating
1514
- }
1515
- },
1516
- [SnapStatus.Crashed]: {
1517
- on: {
1518
- [SnapStatusEvents.Start]: {
1519
- target: SnapStatus.Running,
1520
- cond: disableGuard
1521
- },
1522
- [SnapStatusEvents.Update]: SnapStatus.Updating
1523
- }
1524
- }
1525
- }
1526
- };
1527
- __privateSet(this, _statusMachine, createMachine(statusConfig));
1528
- validateMachine(__privateGet(this, _statusMachine));
1529
- };
1530
- _registerMessageHandlers = new WeakSet();
1531
- registerMessageHandlers_fn = function() {
1532
- this.messagingSystem.registerActionHandler(
1533
- `${controllerName}:clearSnapState`,
1534
- (...args) => this.clearSnapState(...args)
1535
- );
1536
- this.messagingSystem.registerActionHandler(
1537
- `${controllerName}:get`,
1538
- (...args) => this.get(...args)
1539
- );
1540
- this.messagingSystem.registerActionHandler(
1541
- `${controllerName}:getSnapState`,
1542
- async (...args) => this.getSnapState(...args)
1543
- );
1544
- this.messagingSystem.registerActionHandler(
1545
- `${controllerName}:handleRequest`,
1546
- async (...args) => this.handleRequest(...args)
1547
- );
1548
- this.messagingSystem.registerActionHandler(
1549
- `${controllerName}:has`,
1550
- (...args) => this.has(...args)
1551
- );
1552
- this.messagingSystem.registerActionHandler(
1553
- `${controllerName}:updateBlockedSnaps`,
1554
- async () => this.updateBlockedSnaps()
1555
- );
1556
- this.messagingSystem.registerActionHandler(
1557
- `${controllerName}:updateSnapState`,
1558
- async (...args) => this.updateSnapState(...args)
1559
- );
1560
- this.messagingSystem.registerActionHandler(
1561
- `${controllerName}:enable`,
1562
- (...args) => this.enableSnap(...args)
1563
- );
1564
- this.messagingSystem.registerActionHandler(
1565
- `${controllerName}:disable`,
1566
- async (...args) => this.disableSnap(...args)
1567
- );
1568
- this.messagingSystem.registerActionHandler(
1569
- `${controllerName}:remove`,
1570
- async (...args) => this.removeSnap(...args)
1571
- );
1572
- this.messagingSystem.registerActionHandler(
1573
- `${controllerName}:getPermitted`,
1574
- (...args) => this.getPermittedSnaps(...args)
1575
- );
1576
- this.messagingSystem.registerActionHandler(
1577
- `${controllerName}:install`,
1578
- async (...args) => this.installSnaps(...args)
1579
- );
1580
- this.messagingSystem.registerActionHandler(
1581
- `${controllerName}:getAll`,
1582
- (...args) => this.getAllSnaps(...args)
1583
- );
1584
- this.messagingSystem.registerActionHandler(
1585
- `${controllerName}:incrementActiveReferences`,
1586
- (...args) => this.incrementActiveReferences(...args)
1587
- );
1588
- this.messagingSystem.registerActionHandler(
1589
- `${controllerName}:decrementActiveReferences`,
1590
- (...args) => this.decrementActiveReferences(...args)
1591
- );
1592
- this.messagingSystem.registerActionHandler(
1593
- `${controllerName}:getRegistryMetadata`,
1594
- async (...args) => this.getRegistryMetadata(...args)
1595
- );
1596
- this.messagingSystem.registerActionHandler(
1597
- `${controllerName}:disconnectOrigin`,
1598
- (...args) => this.removeSnapFromSubject(...args)
1599
- );
1600
- this.messagingSystem.registerActionHandler(
1601
- `${controllerName}:revokeDynamicPermissions`,
1602
- (...args) => this.revokeDynamicSnapPermissions(...args)
1603
- );
1604
- this.messagingSystem.registerActionHandler(
1605
- `${controllerName}:getFile`,
1606
- async (...args) => this.getSnapFile(...args)
1607
- );
1608
- };
1609
- _handlePreinstalledSnaps = new WeakSet();
1610
- handlePreinstalledSnaps_fn = function(preinstalledSnaps) {
1611
- for (const {
1612
- snapId,
1613
- manifest,
1614
- files,
1615
- removable,
1616
- hidden
1617
- } of preinstalledSnaps) {
1618
- const existingSnap = this.get(snapId);
1619
- const isAlreadyInstalled = existingSnap !== void 0;
1620
- const isUpdate = isAlreadyInstalled && gtVersion(manifest.version, existingSnap.version);
1621
- if (isAlreadyInstalled && (!isUpdate || existingSnap.preinstalled !== true)) {
1622
- continue;
1623
- }
1624
- const manifestFile = new VirtualFile({
1625
- path: NpmSnapFileNames.Manifest,
1626
- value: JSON.stringify(manifest),
1627
- result: manifest
1628
- });
1629
- const virtualFiles = files.map(
1630
- ({ path, value }) => new VirtualFile({ value, path })
1631
- );
1632
- const { filePath, iconPath } = manifest.source.location.npm;
1633
- const sourceCode = virtualFiles.find((file) => file.path === filePath);
1634
- const svgIcon = iconPath ? virtualFiles.find((file) => file.path === iconPath) : void 0;
1635
- assert(sourceCode, "Source code not provided for preinstalled snap.");
1636
- assert(
1637
- !iconPath || iconPath && svgIcon,
1638
- "Icon not provided for preinstalled snap."
1639
- );
1640
- assert(
1641
- manifest.source.files === void 0,
1642
- "Auxiliary files are not currently supported for preinstalled snaps."
1643
- );
1644
- const localizationFiles = manifest.source.locales?.map(
1645
- (path) => virtualFiles.find((file) => file.path === path)
1646
- ) ?? [];
1647
- const validatedLocalizationFiles = getValidatedLocalizationFiles(
1648
- localizationFiles.filter(Boolean)
1649
- );
1650
- assert(
1651
- localizationFiles.length === validatedLocalizationFiles.length,
1652
- "Missing localization files for preinstalled snap."
1653
- );
1654
- const filesObject = {
1655
- manifest: manifestFile,
1656
- sourceCode,
1657
- svgIcon,
1658
- auxiliaryFiles: [],
1659
- localizationFiles: validatedLocalizationFiles
1660
- };
1661
- __privateMethod(this, _set, set_fn).call(this, {
1662
- id: snapId,
1663
- origin: "metamask",
1664
- files: filesObject,
1665
- removable,
1666
- hidden,
1667
- preinstalled: true
1668
- });
1669
- const processedPermissions = processSnapPermissions(
1670
- manifest.initialPermissions
1671
- );
1672
- __privateMethod(this, _validateSnapPermissions, validateSnapPermissions_fn).call(this, processedPermissions);
1673
- const { newPermissions, unusedPermissions } = __privateMethod(this, _calculatePermissionsChange, calculatePermissionsChange_fn).call(this, snapId, processedPermissions);
1674
- __privateMethod(this, _updatePermissions, updatePermissions_fn).call(this, { snapId, newPermissions, unusedPermissions });
1675
- if (manifest.initialConnections) {
1676
- __privateMethod(this, _handleInitialConnections, handleInitialConnections_fn).call(this, snapId, existingSnap?.initialConnections ?? null, manifest.initialConnections);
1677
- }
1678
- this.update((state) => {
1679
- state.snaps[snapId].status = SnapStatus.Stopped;
1680
- });
1681
- }
1682
- };
1683
- _pollForLastRequestStatus = new WeakSet();
1684
- pollForLastRequestStatus_fn = function() {
1685
- __privateSet(this, _timeoutForLastRequestStatus, setTimeout(() => {
1686
- __privateMethod(this, _stopSnapsLastRequestPastMax, stopSnapsLastRequestPastMax_fn).call(this).catch((error) => {
1687
- logError(error);
1688
- });
1689
- __privateMethod(this, _pollForLastRequestStatus, pollForLastRequestStatus_fn).call(this);
1690
- }, __privateGet(this, _idleTimeCheckInterval)));
1691
- };
1692
- _blockSnap = new WeakSet();
1693
- blockSnap_fn = async function(snapId, blockedSnapInfo) {
1694
- if (!this.has(snapId)) {
1695
- return;
1696
- }
1697
- try {
1698
- this.update((state) => {
1699
- state.snaps[snapId].blocked = true;
1700
- state.snaps[snapId].blockInformation = blockedSnapInfo;
1701
- });
1702
- await this.disableSnap(snapId);
1703
- } catch (error) {
1704
- logError(
1705
- `Encountered error when stopping blocked snap "${snapId}".`,
1706
- error
1707
- );
1708
- }
1709
- this.messagingSystem.publish(
1710
- `${controllerName}:snapBlocked`,
1711
- snapId,
1712
- blockedSnapInfo
1713
- );
1714
- };
1715
- _unblockSnap = new WeakSet();
1716
- unblockSnap_fn = function(snapId) {
1717
- if (!this.has(snapId) || !this.state.snaps[snapId].blocked) {
1718
- return;
1719
- }
1720
- this.update((state) => {
1721
- state.snaps[snapId].blocked = false;
1722
- delete state.snaps[snapId].blockInformation;
1723
- });
1724
- this.messagingSystem.publish(`${controllerName}:snapUnblocked`, snapId);
1725
- };
1726
- _assertIsInstallAllowed = new WeakSet();
1727
- assertIsInstallAllowed_fn = async function(snapId, snapInfo) {
1728
- const results = await this.messagingSystem.call("SnapsRegistry:get", {
1729
- [snapId]: snapInfo
1730
- });
1731
- const result = results[snapId];
1732
- if (result.status === 1 /* Blocked */) {
1733
- throw new Error(
1734
- `Cannot install version "${snapInfo.version}" of snap "${snapId}": The version is blocked. ${result.reason?.explanation ?? ""}`
1735
- );
1736
- }
1737
- const isAllowlistingRequired = Object.keys(snapInfo.permissions).some(
1738
- (permission) => !ALLOWED_PERMISSIONS.includes(permission)
1739
- );
1740
- if (__privateGet(this, _featureFlags).requireAllowlist && isAllowlistingRequired && result.status !== 2 /* Verified */) {
1741
- throw new Error(
1742
- `Cannot install version "${snapInfo.version}" of snap "${snapId}": ${result.status === 3 /* Unavailable */ ? "The registry is temporarily unavailable." : "The snap is not on the allowlist."}`
1743
- );
1744
- }
1745
- };
1746
- _assertCanInstallSnaps = new WeakSet();
1747
- assertCanInstallSnaps_fn = function() {
1748
- assert(
1749
- __privateGet(this, _featureFlags).disableSnapInstallation !== true,
1750
- "Installing Snaps is currently disabled in this version of MetaMask."
1751
- );
1752
- };
1753
- _assertCanUsePlatform = new WeakSet();
1754
- assertCanUsePlatform_fn = function() {
1755
- const flags = __privateGet(this, _getFeatureFlags).call(this);
1756
- assert(
1757
- flags.disableSnaps !== true,
1758
- "The Snaps platform requires basic functionality to be used. Enable basic functionality in the settings to use the Snaps platform."
1759
- );
1760
- };
1761
- _stopSnapsLastRequestPastMax = new WeakSet();
1762
- stopSnapsLastRequestPastMax_fn = async function() {
1763
- const entries = [...__privateGet(this, _snapsRuntimeData).entries()];
1764
- return Promise.all(
1765
- entries.filter(
1766
- ([_snapId, runtime]) => runtime.activeReferences === 0 && runtime.pendingInboundRequests.length === 0 && runtime.lastRequest && __privateGet(this, _maxIdleTime) && timeSince(runtime.lastRequest) > __privateGet(this, _maxIdleTime)
1767
- ).map(async ([snapId]) => this.stopSnap(snapId, SnapStatusEvents.Stop))
1768
- );
1769
- };
1770
- _transition = new WeakSet();
1771
- transition_fn = function(snapId, event) {
1772
- const { interpreter } = __privateMethod(this, _getRuntimeExpect, getRuntimeExpect_fn).call(this, snapId);
1773
- interpreter.send(event);
1774
- this.update((state) => {
1775
- state.snaps[snapId].status = interpreter.state.value;
1776
- });
1777
- };
1778
- _terminateSnap = new WeakSet();
1779
- terminateSnap_fn = async function(snapId) {
1780
- await this.messagingSystem.call("ExecutionService:terminateSnap", snapId);
1781
- await new Promise((resolve) => setTimeout(resolve, 1));
1782
- const runtime = __privateMethod(this, _getRuntimeExpect, getRuntimeExpect_fn).call(this, snapId);
1783
- runtime.pendingInboundRequests.filter((pendingRequest) => pendingRequest.timer.status !== "finished").forEach((pendingRequest) => pendingRequest.timer.finish());
1784
- await new Promise((resolve) => setTimeout(resolve, 1));
1785
- this.messagingSystem.publish(
1786
- "SnapController:snapTerminated",
1787
- this.getTruncatedExpect(snapId)
1788
- );
1789
- };
1790
- _getSnapEncryptionKey = new WeakSet();
1791
- getSnapEncryptionKey_fn = async function({
1792
- snapId,
1793
- salt: passedSalt,
1794
- useCache,
1795
- keyMetadata
1796
- }) {
1797
- const runtime = __privateMethod(this, _getRuntimeExpect, getRuntimeExpect_fn).call(this, snapId);
1798
- if (runtime.encryptionKey && runtime.encryptionSalt && useCache) {
1799
- return {
1800
- key: await __privateGet(this, _encryptor).importKey(runtime.encryptionKey),
1801
- salt: runtime.encryptionSalt
1802
- };
1803
- }
1804
- const salt = passedSalt ?? __privateGet(this, _encryptor).generateSalt();
1805
- const mnemonicPhrase = await __privateGet(this, _getMnemonic).call(this);
1806
- const entropy = await getEncryptionEntropy({ snapId, mnemonicPhrase });
1807
- const encryptionKey = await __privateGet(this, _encryptor).keyFromPassword(
1808
- entropy,
1809
- salt,
1810
- true,
1811
- keyMetadata
1812
- );
1813
- const exportedKey = await __privateGet(this, _encryptor).exportKey(encryptionKey);
1814
- if (useCache) {
1815
- runtime.encryptionKey = exportedKey;
1816
- runtime.encryptionSalt = salt;
1817
- }
1818
- return { key: encryptionKey, salt };
1819
- };
1820
- _decryptSnapState = new WeakSet();
1821
- decryptSnapState_fn = async function(snapId, state) {
1822
- try {
1823
- const parsed = parseJson(state);
1824
- const { salt, keyMetadata } = parsed;
1825
- const useCache = __privateGet(this, _encryptor).isVaultUpdated(state);
1826
- const { key } = await __privateMethod(this, _getSnapEncryptionKey, getSnapEncryptionKey_fn).call(this, {
1827
- snapId,
1828
- salt,
1829
- useCache,
1830
- // When decrypting state we expect key metadata to be present.
1831
- // If it isn't present, we assume that the Snap state we are decrypting is old enough to use the legacy encryption params.
1832
- keyMetadata: keyMetadata ?? LEGACY_ENCRYPTION_KEY_DERIVATION_OPTIONS
1833
- });
1834
- const decryptedState = await __privateGet(this, _encryptor).decryptWithKey(key, parsed);
1835
- assert(isValidJson(decryptedState));
1836
- return decryptedState;
1837
- } catch {
1838
- throw rpcErrors.internal({
1839
- message: "Failed to decrypt snap state, the state must be corrupted."
1840
- });
1841
- }
1842
- };
1843
- _encryptSnapState = new WeakSet();
1844
- encryptSnapState_fn = async function(snapId, state) {
1845
- const { key, salt } = await __privateMethod(this, _getSnapEncryptionKey, getSnapEncryptionKey_fn).call(this, {
1846
- snapId,
1847
- useCache: true
1848
- });
1849
- const encryptedState = await __privateGet(this, _encryptor).encryptWithKey(key, state);
1850
- encryptedState.salt = salt;
1851
- return JSON.stringify(encryptedState);
1852
- };
1853
- _handleInitialConnections = new WeakSet();
1854
- handleInitialConnections_fn = function(snapId, previousInitialConnections, initialConnections) {
1855
- if (previousInitialConnections) {
1856
- const revokedInitialConnections = setDiff(
1857
- previousInitialConnections,
1858
- initialConnections
1859
- );
1860
- for (const origin of Object.keys(revokedInitialConnections)) {
1861
- this.removeSnapFromSubject(origin, snapId);
1862
- }
1863
- }
1864
- for (const origin of Object.keys(initialConnections)) {
1865
- __privateMethod(this, _addSnapToSubject, addSnapToSubject_fn).call(this, origin, snapId);
1866
- }
1867
- };
1868
- _addSnapToSubject = new WeakSet();
1869
- addSnapToSubject_fn = function(origin, snapId) {
1870
- const subjectPermissions = this.messagingSystem.call(
1871
- "PermissionController:getPermissions",
1872
- origin
1873
- );
1874
- const existingCaveat = subjectPermissions?.[WALLET_SNAP_PERMISSION_KEY]?.caveats?.find((caveat) => caveat.type === SnapCaveatType.SnapIds);
1875
- const subjectHasSnap = Boolean(
1876
- existingCaveat?.value?.[snapId]
1877
- );
1878
- if (subjectHasSnap) {
1879
- return;
1880
- }
1881
- if (existingCaveat) {
1882
- this.messagingSystem.call(
1883
- "PermissionController:updateCaveat",
1884
- origin,
1885
- WALLET_SNAP_PERMISSION_KEY,
1886
- SnapCaveatType.SnapIds,
1887
- { ...existingCaveat.value, [snapId]: {} }
1888
- );
1889
- return;
1890
- }
1891
- const approvedPermissions = {
1892
- [WALLET_SNAP_PERMISSION_KEY]: {
1893
- caveats: [
1894
- {
1895
- type: SnapCaveatType.SnapIds,
1896
- value: {
1897
- [snapId]: {}
1898
- }
1899
- }
1900
- ]
1901
- }
1902
- };
1903
- this.messagingSystem.call("PermissionController:grantPermissions", {
1904
- approvedPermissions,
1905
- subject: { origin }
1906
- });
1907
- };
1908
- _removeSnapFromSubjects = new WeakSet();
1909
- removeSnapFromSubjects_fn = function(snapId) {
1910
- const subjects = this.messagingSystem.call(
1911
- "PermissionController:getSubjectNames"
1912
- );
1913
- for (const subject of subjects) {
1914
- this.removeSnapFromSubject(subject, snapId);
1915
- }
1916
- };
1917
- _revokeAllSnapPermissions = new WeakSet();
1918
- revokeAllSnapPermissions_fn = function(snapId) {
1919
- if (this.messagingSystem.call("PermissionController:hasPermissions", snapId)) {
1920
- this.messagingSystem.call(
1921
- "PermissionController:revokeAllPermissions",
1922
- snapId
1923
- );
1924
- }
1925
- };
1926
- _createApproval = new WeakSet();
1927
- createApproval_fn = function({
1928
- origin,
1929
- snapId,
1930
- type
1931
- }) {
1932
- const id = nanoid();
1933
- const promise = this.messagingSystem.call(
1934
- "ApprovalController:addRequest",
1935
- {
1936
- origin,
1937
- id,
1938
- type,
1939
- requestData: {
1940
- // Mirror previous installation metadata
1941
- metadata: { id, origin: snapId, dappOrigin: origin },
1942
- snapId
1943
- },
1944
- requestState: {
1945
- loading: true
1946
- }
1947
- },
1948
- true
1949
- );
1950
- return { id, promise };
1951
- };
1952
- _updateApproval = new WeakSet();
1953
- updateApproval_fn = function(id, requestState) {
1954
- try {
1955
- this.messagingSystem.call("ApprovalController:updateRequestState", {
1956
- id,
1957
- requestState
1958
- });
1959
- } catch {
1960
- }
1961
- };
1962
- _resolveAllowlistVersion = new WeakSet();
1963
- resolveAllowlistVersion_fn = async function(snapId, versionRange) {
1964
- return await this.messagingSystem.call(
1965
- "SnapsRegistry:resolveVersion",
1966
- snapId,
1967
- versionRange
1968
- );
1969
- };
1970
- _add = new WeakSet();
1971
- add_fn = async function(args) {
1972
- const { id: snapId, location, versionRange } = args;
1973
- __privateMethod(this, _setupRuntime, setupRuntime_fn).call(this, snapId);
1974
- const runtime = __privateMethod(this, _getRuntimeExpect, getRuntimeExpect_fn).call(this, snapId);
1975
- if (!runtime.installPromise) {
1976
- log(`Adding snap: ${snapId}`);
1977
- runtime.installPromise = (async () => {
1978
- const fetchedSnap = await fetchSnap(snapId, location);
1979
- const manifest = fetchedSnap.manifest.result;
1980
- if (!satisfiesVersionRange(manifest.version, versionRange)) {
1981
- throw new Error(
1982
- `Version mismatch. Manifest for "${snapId}" specifies version "${manifest.version}" which doesn't satisfy requested version range "${versionRange}".`
1983
- );
1984
- }
1985
- await __privateMethod(this, _assertIsInstallAllowed, assertIsInstallAllowed_fn).call(this, snapId, {
1986
- version: manifest.version,
1987
- checksum: manifest.source.shasum,
1988
- permissions: manifest.initialPermissions
1989
- });
1990
- return __privateMethod(this, _set, set_fn).call(this, {
1991
- ...args,
1992
- files: fetchedSnap,
1993
- id: snapId
1994
- });
1995
- })();
1996
- }
1997
- try {
1998
- return await runtime.installPromise;
1999
- } catch (error) {
2000
- runtime.installPromise = null;
2001
- throw error;
2002
- }
2003
- };
2004
- _startSnap = new WeakSet();
2005
- startSnap_fn = async function(snapData) {
2006
- const { snapId } = snapData;
2007
- if (this.isRunning(snapId)) {
2008
- throw new Error(`Snap "${snapId}" is already started.`);
2009
- }
2010
- try {
2011
- const runtime = __privateMethod(this, _getRuntimeExpect, getRuntimeExpect_fn).call(this, snapId);
2012
- const result = await this.messagingSystem.call(
2013
- "ExecutionService:executeSnap",
2014
- {
2015
- ...snapData,
2016
- endowments: await __privateMethod(this, _getEndowments, getEndowments_fn).call(this, snapId)
2017
- }
2018
- );
2019
- __privateMethod(this, _transition, transition_fn).call(this, snapId, SnapStatusEvents.Start);
2020
- runtime.lastRequest = Date.now();
2021
- return result;
2022
- } catch (error) {
2023
- await __privateMethod(this, _terminateSnap, terminateSnap_fn).call(this, snapId);
2024
- throw error;
2025
- }
2026
- };
2027
- _getEndowments = new WeakSet();
2028
- getEndowments_fn = async function(snapId) {
2029
- let allEndowments = [];
2030
- for (const permissionName of __privateGet(this, _environmentEndowmentPermissions)) {
2031
- if (this.messagingSystem.call(
2032
- "PermissionController:hasPermission",
2033
- snapId,
2034
- permissionName
2035
- )) {
2036
- const endowments = await this.messagingSystem.call(
2037
- "PermissionController:getEndowments",
2038
- snapId,
2039
- permissionName
2040
- );
2041
- if (endowments) {
2042
- if (!Array.isArray(endowments) || endowments.some((value) => typeof value !== "string")) {
2043
- throw new Error("Expected an array of string endowment names.");
2044
- }
2045
- allEndowments = allEndowments.concat(endowments);
2046
- }
2047
- }
2048
- }
2049
- const dedupedEndowments = [
2050
- .../* @__PURE__ */ new Set([...DEFAULT_ENDOWMENTS, ...allEndowments])
2051
- ];
2052
- if (dedupedEndowments.length < // This is a bug in TypeScript: https://github.com/microsoft/TypeScript/issues/48313
2053
- // eslint-disable-next-line @typescript-eslint/restrict-plus-operands
2054
- DEFAULT_ENDOWMENTS.length + allEndowments.length) {
2055
- logError(
2056
- `Duplicate endowments found for ${snapId}. Default endowments should not be requested.`,
2057
- allEndowments
2058
- );
2059
- }
2060
- return dedupedEndowments;
2061
- };
2062
- _set = new WeakSet();
2063
- set_fn = function(args) {
2064
- const {
2065
- id: snapId,
2066
- origin,
2067
- files,
2068
- isUpdate = false,
2069
- removable,
2070
- preinstalled,
2071
- hidden
2072
- } = args;
2073
- const {
2074
- manifest,
2075
- sourceCode: sourceCodeFile,
2076
- svgIcon,
2077
- auxiliaryFiles: rawAuxiliaryFiles,
2078
- localizationFiles
2079
- } = files;
2080
- assertIsSnapManifest(manifest.result);
2081
- const { version } = manifest.result;
2082
- const sourceCode = sourceCodeFile.toString();
2083
- assert(
2084
- typeof sourceCode === "string" && sourceCode.length > 0,
2085
- `Invalid source code for snap "${snapId}".`
2086
- );
2087
- const auxiliaryFiles = rawAuxiliaryFiles.map((file) => {
2088
- assert(typeof file.data.base64 === "string");
2089
- return {
2090
- path: file.path,
2091
- value: file.data.base64
2092
- };
2093
- });
2094
- const snapsState = this.state.snaps;
2095
- const existingSnap = snapsState[snapId];
2096
- const previousVersionHistory = existingSnap?.versionHistory ?? [];
2097
- const versionHistory = [
2098
- ...previousVersionHistory,
2099
- {
2100
- version,
2101
- date: Date.now(),
2102
- origin
2103
- }
2104
- ];
2105
- const localizedFiles = localizationFiles.map((file) => file.result);
2106
- const snap = {
2107
- // Restore relevant snap state if it exists
2108
- ...existingSnap,
2109
- // Note that the snap will be unblocked and enabled, regardless of its
2110
- // previous state.
2111
- blocked: false,
2112
- enabled: true,
2113
- removable,
2114
- preinstalled,
2115
- hidden,
2116
- id: snapId,
2117
- initialConnections: manifest.result.initialConnections,
2118
- initialPermissions: manifest.result.initialPermissions,
2119
- manifest: manifest.result,
2120
- status: __privateGet(this, _statusMachine).config.initial,
2121
- sourceCode,
2122
- version,
2123
- versionHistory,
2124
- auxiliaryFiles,
2125
- localizationFiles: localizedFiles
2126
- };
2127
- delete snap.blockInformation;
2128
- const { inversePatches } = this.update((state) => {
2129
- state.snaps[snapId] = snap;
2130
- });
2131
- if (isUpdate) {
2132
- const rollbackSnapshot = __privateMethod(this, _getRollbackSnapshot, getRollbackSnapshot_fn).call(this, snapId);
2133
- if (rollbackSnapshot !== void 0) {
2134
- rollbackSnapshot.statePatches = inversePatches;
2135
- }
2136
- }
2137
- const { proposedName } = getLocalizedSnapManifest(
2138
- manifest.result,
2139
- "en",
2140
- localizedFiles
2141
- );
2142
- this.messagingSystem.call("SubjectMetadataController:addSubjectMetadata", {
2143
- subjectType: SubjectType.Snap,
2144
- name: proposedName,
2145
- origin: snap.id,
2146
- version,
2147
- svgIcon: svgIcon?.toString() ?? null
2148
- });
2149
- return { ...snap, sourceCode };
2150
- };
2151
- _validateSnapPermissions = new WeakSet();
2152
- validateSnapPermissions_fn = function(processedPermissions) {
2153
- const permissionKeys = Object.keys(processedPermissions);
2154
- const handlerPermissions = Array.from(
2155
- new Set(Object.values(handlerEndowments))
2156
- );
2157
- assert(
2158
- permissionKeys.some((key) => handlerPermissions.includes(key)),
2159
- `A snap must request at least one of the following permissions: ${handlerPermissions.filter((handler) => handler !== null).join(", ")}.`
2160
- );
2161
- const excludedPermissionErrors = permissionKeys.reduce(
2162
- (errors, permission) => {
2163
- if (hasProperty(__privateGet(this, _excludedPermissions), permission)) {
2164
- errors.push(__privateGet(this, _excludedPermissions)[permission]);
2165
- }
2166
- return errors;
2167
- },
2168
- []
2169
- );
2170
- assert(
2171
- excludedPermissionErrors.length === 0,
2172
- `One or more permissions are not allowed:
2173
- ${excludedPermissionErrors.join(
2174
- "\n"
2175
- )}`
2176
- );
2177
- };
2178
- _getExecutionTimeout = new WeakSet();
2179
- getExecutionTimeout_fn = function(permission) {
2180
- return getMaxRequestTimeCaveat(permission) ?? this.maxRequestTime;
2181
- };
2182
- _getRpcRequestHandler = new WeakSet();
2183
- getRpcRequestHandler_fn = function(snapId) {
2184
- const runtime = __privateMethod(this, _getRuntimeExpect, getRuntimeExpect_fn).call(this, snapId);
2185
- const existingHandler = runtime.rpcHandler;
2186
- if (existingHandler) {
2187
- return existingHandler;
2188
- }
2189
- const requestQueue = new RequestQueue(5);
2190
- const startPromises = /* @__PURE__ */ new Map();
2191
- const rpcHandler = async ({
2192
- origin,
2193
- handler: handlerType,
2194
- request,
2195
- timeout
2196
- }) => {
2197
- if (this.state.snaps[snapId].enabled === false) {
2198
- throw new Error(`Snap "${snapId}" is disabled.`);
2199
- }
2200
- if (this.state.snaps[snapId].status === SnapStatus.Installing) {
2201
- throw new Error(
2202
- `Snap "${snapId}" is currently being installed. Please try again later.`
2203
- );
2204
- }
2205
- if (!this.isRunning(snapId)) {
2206
- let localStartPromise = startPromises.get(snapId);
2207
- if (!localStartPromise) {
2208
- localStartPromise = this.startSnap(snapId);
2209
- startPromises.set(snapId, localStartPromise);
2210
- } else if (requestQueue.get(origin) >= requestQueue.maxQueueSize) {
2211
- throw new Error(
2212
- "Exceeds maximum number of requests waiting to be resolved, please try again."
2213
- );
2214
- }
2215
- requestQueue.increment(origin);
2216
- try {
2217
- await localStartPromise;
2218
- } finally {
2219
- requestQueue.decrement(origin);
2220
- if (startPromises.get(snapId) === localStartPromise) {
2221
- startPromises.delete(snapId);
2222
- }
2223
- }
2224
- }
2225
- const timer = new Timer(timeout);
2226
- __privateMethod(this, _recordSnapRpcRequestStart, recordSnapRpcRequestStart_fn).call(this, snapId, request.id, timer);
2227
- const handleRpcRequestPromise = this.messagingSystem.call(
2228
- "ExecutionService:handleRpcRequest",
2229
- snapId,
2230
- { origin, handler: handlerType, request }
2231
- );
2232
- try {
2233
- const result = await withTimeout(handleRpcRequestPromise, timer);
2234
- if (result === hasTimedOut) {
2235
- throw new Error(
2236
- `${snapId} failed to respond to the request in time.`
2237
- );
2238
- }
2239
- await __privateMethod(this, _assertSnapRpcRequestResult, assertSnapRpcRequestResult_fn).call(this, snapId, handlerType, result);
2240
- const transformedResult = await __privateMethod(this, _transformSnapRpcRequestResult, transformSnapRpcRequestResult_fn).call(this, snapId, handlerType, result);
2241
- __privateMethod(this, _recordSnapRpcRequestFinish, recordSnapRpcRequestFinish_fn).call(this, snapId, request.id);
2242
- return transformedResult;
2243
- } catch (error) {
2244
- __privateMethod(this, _recordSnapRpcRequestFinish, recordSnapRpcRequestFinish_fn).call(this, snapId, request.id);
2245
- const [jsonRpcError, handled] = unwrapError(error);
2246
- if (!handled) {
2247
- await this.stopSnap(snapId, SnapStatusEvents.Crash);
2248
- }
2249
- throw jsonRpcError;
2250
- }
2251
- };
2252
- runtime.rpcHandler = rpcHandler;
2253
- return rpcHandler;
2254
- };
2255
- _createInterface = new WeakSet();
2256
- createInterface_fn = async function(snapId, content) {
2257
- return this.messagingSystem.call(
2258
- "SnapInterfaceController:createInterface",
2259
- snapId,
2260
- content
2261
- );
2262
- };
2263
- _assertInterfaceExists = new WeakSet();
2264
- assertInterfaceExists_fn = function(snapId, id) {
2265
- assert(
2266
- this.messagingSystem.call(
2267
- "SnapInterfaceController:getInterface",
2268
- snapId,
2269
- id
2270
- )
2271
- );
2272
- };
2273
- _transformSnapRpcRequestResult = new WeakSet();
2274
- transformSnapRpcRequestResult_fn = async function(snapId, handlerType, result) {
2275
- switch (handlerType) {
2276
- case HandlerType.OnTransaction:
2277
- case HandlerType.OnSignature:
2278
- case HandlerType.OnHomePage: {
2279
- const castResult = result;
2280
- if (castResult && hasProperty(castResult, "content")) {
2281
- const { content, ...rest } = castResult;
2282
- const id = await __privateMethod(this, _createInterface, createInterface_fn).call(this, snapId, content);
2283
- return { ...rest, id };
2284
- }
2285
- return result;
2286
- }
2287
- default:
2288
- return result;
2289
- }
2290
- };
2291
- _assertSnapRpcRequestResult = new WeakSet();
2292
- assertSnapRpcRequestResult_fn = async function(snapId, handlerType, result) {
2293
- switch (handlerType) {
2294
- case HandlerType.OnTransaction: {
2295
- assertStruct(result, OnTransactionResponseStruct);
2296
- if (result && hasProperty(result, "id")) {
2297
- __privateMethod(this, _assertInterfaceExists, assertInterfaceExists_fn).call(this, snapId, result.id);
2298
- }
2299
- break;
2300
- }
2301
- case HandlerType.OnSignature: {
2302
- assertStruct(result, OnSignatureResponseStruct);
2303
- if (result && hasProperty(result, "id")) {
2304
- __privateMethod(this, _assertInterfaceExists, assertInterfaceExists_fn).call(this, snapId, result.id);
2305
- }
2306
- break;
2307
- }
2308
- case HandlerType.OnHomePage: {
2309
- assertStruct(result, OnHomePageResponseStruct);
2310
- if (result && hasProperty(result, "id")) {
2311
- __privateMethod(this, _assertInterfaceExists, assertInterfaceExists_fn).call(this, snapId, result.id);
2312
- }
2313
- break;
2314
- }
2315
- case HandlerType.OnNameLookup:
2316
- assertStruct(result, OnNameLookupResponseStruct);
2317
- break;
2318
- default:
2319
- break;
2320
- }
2321
- };
2322
- _recordSnapRpcRequestStart = new WeakSet();
2323
- recordSnapRpcRequestStart_fn = function(snapId, requestId, timer) {
2324
- const runtime = __privateMethod(this, _getRuntimeExpect, getRuntimeExpect_fn).call(this, snapId);
2325
- runtime.pendingInboundRequests.push({ requestId, timer });
2326
- runtime.lastRequest = null;
2327
- };
2328
- _recordSnapRpcRequestFinish = new WeakSet();
2329
- recordSnapRpcRequestFinish_fn = function(snapId, requestId) {
2330
- const runtime = __privateMethod(this, _getRuntimeExpect, getRuntimeExpect_fn).call(this, snapId);
2331
- runtime.pendingInboundRequests = runtime.pendingInboundRequests.filter(
2332
- (request) => request.requestId !== requestId
2333
- );
2334
- if (runtime.pendingInboundRequests.length === 0) {
2335
- runtime.lastRequest = Date.now();
2336
- }
2337
- };
2338
- _getRollbackSnapshot = new WeakSet();
2339
- getRollbackSnapshot_fn = function(snapId) {
2340
- return __privateGet(this, _rollbackSnapshots).get(snapId);
2341
- };
2342
- _createRollbackSnapshot = new WeakSet();
2343
- createRollbackSnapshot_fn = function(snapId) {
2344
- assert(
2345
- __privateGet(this, _rollbackSnapshots).get(snapId) === void 0,
2346
- new Error(`Snap "${snapId}" rollback snapshot already exists.`)
2347
- );
2348
- __privateGet(this, _rollbackSnapshots).set(snapId, {
2349
- statePatches: [],
2350
- permissions: {},
2351
- newVersion: ""
2352
- });
2353
- const newRollbackSnapshot = __privateGet(this, _rollbackSnapshots).get(snapId);
2354
- assert(
2355
- newRollbackSnapshot !== void 0,
2356
- new Error(`Snapshot creation failed for ${snapId}.`)
2357
- );
2358
- return newRollbackSnapshot;
2359
- };
2360
- _rollbackSnap = new WeakSet();
2361
- rollbackSnap_fn = async function(snapId) {
2362
- const rollbackSnapshot = __privateMethod(this, _getRollbackSnapshot, getRollbackSnapshot_fn).call(this, snapId);
2363
- if (!rollbackSnapshot) {
2364
- throw new Error("A snapshot does not exist for this snap.");
2365
- }
2366
- await this.stopSnap(snapId, SnapStatusEvents.Stop);
2367
- if (this.get(snapId)?.status !== SnapStatus.Stopped) {
2368
- __privateMethod(this, _transition, transition_fn).call(this, snapId, SnapStatusEvents.Stop);
2369
- }
2370
- const { statePatches, permissions } = rollbackSnapshot;
2371
- if (statePatches?.length) {
2372
- this.applyPatches(statePatches);
2373
- }
2374
- if (this.get(snapId)?.status !== SnapStatus.Stopped) {
2375
- this.update((state) => {
2376
- state.snaps[snapId].status = SnapStatus.Stopped;
2377
- });
2378
- }
2379
- __privateMethod(this, _updatePermissions, updatePermissions_fn).call(this, {
2380
- snapId,
2381
- unusedPermissions: permissions.granted,
2382
- newPermissions: permissions.revoked,
2383
- requestData: permissions.requestData
2384
- });
2385
- const truncatedSnap = this.getTruncatedExpect(snapId);
2386
- this.messagingSystem.publish(
2387
- "SnapController:snapRolledback",
2388
- truncatedSnap,
2389
- rollbackSnapshot.newVersion
2390
- );
2391
- __privateGet(this, _rollbackSnapshots).delete(snapId);
2392
- };
2393
- _rollbackSnaps = new WeakSet();
2394
- rollbackSnaps_fn = async function(snapIds) {
2395
- for (const snapId of snapIds) {
2396
- await __privateMethod(this, _rollbackSnap, rollbackSnap_fn).call(this, snapId);
2397
- }
2398
- };
2399
- _getRuntime = new WeakSet();
2400
- getRuntime_fn = function(snapId) {
2401
- return __privateGet(this, _snapsRuntimeData).get(snapId);
2402
- };
2403
- _getRuntimeExpect = new WeakSet();
2404
- getRuntimeExpect_fn = function(snapId) {
2405
- const runtime = __privateMethod(this, _getRuntime, getRuntime_fn).call(this, snapId);
2406
- assert(
2407
- runtime !== void 0,
2408
- new Error(`Snap "${snapId}" runtime data not found`)
2409
- );
2410
- return runtime;
2411
- };
2412
- _setupRuntime = new WeakSet();
2413
- setupRuntime_fn = function(snapId) {
2414
- if (__privateGet(this, _snapsRuntimeData).has(snapId)) {
2415
- return;
2416
- }
2417
- const snap = this.get(snapId);
2418
- const interpreter = interpret(__privateGet(this, _statusMachine));
2419
- interpreter.start({
2420
- context: { snapId },
2421
- value: snap?.status ?? __privateGet(this, _statusMachine).config.initial
2422
- });
2423
- forceStrict(interpreter);
2424
- __privateGet(this, _snapsRuntimeData).set(snapId, {
2425
- lastRequest: null,
2426
- rpcHandler: null,
2427
- installPromise: null,
2428
- encryptionKey: null,
2429
- encryptionSalt: null,
2430
- activeReferences: 0,
2431
- pendingInboundRequests: [],
2432
- pendingOutboundRequests: 0,
2433
- interpreter,
2434
- stopping: false
2435
- });
2436
- };
2437
- _calculatePermissionsChange = new WeakSet();
2438
- calculatePermissionsChange_fn = function(snapId, desiredPermissionsSet) {
2439
- const oldPermissions = this.messagingSystem.call(
2440
- "PermissionController:getPermissions",
2441
- snapId
2442
- ) ?? {};
2443
- const newPermissions = permissionsDiff(
2444
- desiredPermissionsSet,
2445
- oldPermissions
2446
- );
2447
- const unusedPermissions = permissionsDiff(
2448
- oldPermissions,
2449
- desiredPermissionsSet
2450
- );
2451
- const approvedPermissions = permissionsDiff(
2452
- oldPermissions,
2453
- unusedPermissions
2454
- );
2455
- return { newPermissions, unusedPermissions, approvedPermissions };
2456
- };
2457
- _isSubjectConnectedToSnap = new WeakSet();
2458
- isSubjectConnectedToSnap_fn = function(snapId, origin) {
2459
- const subjectPermissions = this.messagingSystem.call(
2460
- "PermissionController:getPermissions",
2461
- origin
2462
- );
2463
- const existingCaveat = subjectPermissions?.[WALLET_SNAP_PERMISSION_KEY]?.caveats?.find((caveat) => caveat.type === SnapCaveatType.SnapIds);
2464
- return Boolean(existingCaveat?.value?.[snapId]);
2465
- };
2466
- _calculateConnectionsChange = new WeakSet();
2467
- calculateConnectionsChange_fn = function(snapId, oldConnectionsSet, desiredConnectionsSet) {
2468
- const filteredOldConnections = Object.keys(oldConnectionsSet).filter((origin) => __privateMethod(this, _isSubjectConnectedToSnap, isSubjectConnectedToSnap_fn).call(this, snapId, origin)).reduce((accumulator, origin) => {
2469
- accumulator[origin] = oldConnectionsSet[origin];
2470
- return accumulator;
2471
- }, {});
2472
- const newConnections = setDiff(
2473
- desiredConnectionsSet,
2474
- filteredOldConnections
2475
- );
2476
- const unusedConnections = setDiff(
2477
- filteredOldConnections,
2478
- desiredConnectionsSet
2479
- );
2480
- const approvedConnections = setDiff(
2481
- filteredOldConnections,
2482
- unusedConnections
2483
- );
2484
- return { newConnections, unusedConnections, approvedConnections };
2485
- };
2486
- _updatePermissions = new WeakSet();
2487
- updatePermissions_fn = function({
2488
- snapId,
2489
- unusedPermissions = {},
2490
- newPermissions = {},
2491
- requestData
2492
- }) {
2493
- const unusedPermissionsKeys = Object.keys(unusedPermissions);
2494
- if (isNonEmptyArray(unusedPermissionsKeys)) {
2495
- this.messagingSystem.call("PermissionController:revokePermissions", {
2496
- [snapId]: unusedPermissionsKeys
2497
- });
2498
- }
2499
- if (isNonEmptyArray(Object.keys(newPermissions))) {
2500
- this.messagingSystem.call("PermissionController:grantPermissions", {
2501
- approvedPermissions: newPermissions,
2502
- subject: { origin: snapId },
2503
- requestData
2504
- });
2505
- }
2506
- };
2507
- _isValidUpdate = new WeakSet();
2508
- isValidUpdate_fn = function(snapId, newVersionRange) {
2509
- const existingSnap = this.getExpect(snapId);
2510
- if (satisfiesVersionRange(existingSnap.version, newVersionRange)) {
2511
- return false;
2512
- }
2513
- if (gtRange(existingSnap.version, newVersionRange)) {
2514
- return false;
2515
- }
2516
- return true;
2517
- };
2518
- _callLifecycleHook = new WeakSet();
2519
- callLifecycleHook_fn = async function(origin, snapId, handler) {
2520
- const permissionName = handlerEndowments[handler];
2521
- assert(permissionName, "Lifecycle hook must have an endowment.");
2522
- const hasPermission = this.messagingSystem.call(
2523
- "PermissionController:hasPermission",
2524
- snapId,
2525
- permissionName
2526
- );
2527
- if (!hasPermission) {
2528
- return;
2529
- }
2530
- await this.handleRequest({
2531
- snapId,
2532
- handler,
2533
- origin,
2534
- request: {
2535
- jsonrpc: "2.0",
2536
- method: handler
2537
- }
2538
- });
2539
- };
2540
-
2541
- export {
2542
- controllerName,
2543
- SNAP_APPROVAL_INSTALL,
2544
- SNAP_APPROVAL_UPDATE,
2545
- SNAP_APPROVAL_RESULT,
2546
- SnapController
2547
- };
2548
- //# sourceMappingURL=chunk-QWN3UOMA.mjs.map