@metamask/snaps-rpc-methods 14.2.0 → 15.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/dist/endowments/assets.cjs +1 -1
  3. package/dist/endowments/assets.cjs.map +1 -1
  4. package/dist/endowments/assets.mjs +1 -1
  5. package/dist/endowments/assets.mjs.map +1 -1
  6. package/dist/endowments/cronjob.cjs +3 -8
  7. package/dist/endowments/cronjob.cjs.map +1 -1
  8. package/dist/endowments/cronjob.d.cts.map +1 -1
  9. package/dist/endowments/cronjob.d.mts.map +1 -1
  10. package/dist/endowments/cronjob.mjs +4 -9
  11. package/dist/endowments/cronjob.mjs.map +1 -1
  12. package/dist/endowments/home-page.cjs +6 -1
  13. package/dist/endowments/home-page.cjs.map +1 -1
  14. package/dist/endowments/home-page.d.cts +2 -1
  15. package/dist/endowments/home-page.d.cts.map +1 -1
  16. package/dist/endowments/home-page.d.mts +2 -1
  17. package/dist/endowments/home-page.d.mts.map +1 -1
  18. package/dist/endowments/home-page.mjs +6 -1
  19. package/dist/endowments/home-page.mjs.map +1 -1
  20. package/dist/endowments/index.d.cts +3 -0
  21. package/dist/endowments/index.d.cts.map +1 -1
  22. package/dist/endowments/index.d.mts +3 -0
  23. package/dist/endowments/index.d.mts.map +1 -1
  24. package/dist/endowments/keyring.cjs +2 -4
  25. package/dist/endowments/keyring.cjs.map +1 -1
  26. package/dist/endowments/keyring.d.cts +1 -1
  27. package/dist/endowments/keyring.d.cts.map +1 -1
  28. package/dist/endowments/keyring.d.mts +1 -1
  29. package/dist/endowments/keyring.d.mts.map +1 -1
  30. package/dist/endowments/keyring.mjs +2 -4
  31. package/dist/endowments/keyring.mjs.map +1 -1
  32. package/dist/endowments/lifecycle-hooks.cjs +6 -1
  33. package/dist/endowments/lifecycle-hooks.cjs.map +1 -1
  34. package/dist/endowments/lifecycle-hooks.d.cts +2 -1
  35. package/dist/endowments/lifecycle-hooks.d.cts.map +1 -1
  36. package/dist/endowments/lifecycle-hooks.d.mts +2 -1
  37. package/dist/endowments/lifecycle-hooks.d.mts.map +1 -1
  38. package/dist/endowments/lifecycle-hooks.mjs +6 -1
  39. package/dist/endowments/lifecycle-hooks.mjs.map +1 -1
  40. package/dist/endowments/rpc.cjs +2 -4
  41. package/dist/endowments/rpc.cjs.map +1 -1
  42. package/dist/endowments/rpc.d.cts +1 -1
  43. package/dist/endowments/rpc.d.cts.map +1 -1
  44. package/dist/endowments/rpc.d.mts +1 -1
  45. package/dist/endowments/rpc.d.mts.map +1 -1
  46. package/dist/endowments/rpc.mjs +2 -4
  47. package/dist/endowments/rpc.mjs.map +1 -1
  48. package/dist/endowments/settings-page.cjs +6 -1
  49. package/dist/endowments/settings-page.cjs.map +1 -1
  50. package/dist/endowments/settings-page.d.cts +2 -1
  51. package/dist/endowments/settings-page.d.cts.map +1 -1
  52. package/dist/endowments/settings-page.d.mts +2 -1
  53. package/dist/endowments/settings-page.d.mts.map +1 -1
  54. package/dist/endowments/settings-page.mjs +6 -1
  55. package/dist/endowments/settings-page.mjs.map +1 -1
  56. package/dist/endowments/signature-insight.cjs +6 -8
  57. package/dist/endowments/signature-insight.cjs.map +1 -1
  58. package/dist/endowments/signature-insight.d.cts.map +1 -1
  59. package/dist/endowments/signature-insight.d.mts.map +1 -1
  60. package/dist/endowments/signature-insight.mjs +6 -8
  61. package/dist/endowments/signature-insight.mjs.map +1 -1
  62. package/dist/endowments/transaction-insight.cjs +2 -7
  63. package/dist/endowments/transaction-insight.cjs.map +1 -1
  64. package/dist/endowments/transaction-insight.d.cts.map +1 -1
  65. package/dist/endowments/transaction-insight.d.mts.map +1 -1
  66. package/dist/endowments/transaction-insight.mjs +2 -7
  67. package/dist/endowments/transaction-insight.mjs.map +1 -1
  68. package/dist/middleware/index.cjs +3 -0
  69. package/dist/middleware/index.cjs.map +1 -1
  70. package/dist/middleware/index.d.cts +1 -0
  71. package/dist/middleware/index.d.cts.map +1 -1
  72. package/dist/middleware/index.d.mts +1 -0
  73. package/dist/middleware/index.d.mts.map +1 -1
  74. package/dist/middleware/index.mjs +1 -0
  75. package/dist/middleware/index.mjs.map +1 -1
  76. package/dist/middleware/wallet-snap-permission.cjs +32 -0
  77. package/dist/middleware/wallet-snap-permission.cjs.map +1 -0
  78. package/dist/middleware/wallet-snap-permission.d.cts +18 -0
  79. package/dist/middleware/wallet-snap-permission.d.cts.map +1 -0
  80. package/dist/middleware/wallet-snap-permission.d.mts +18 -0
  81. package/dist/middleware/wallet-snap-permission.d.mts.map +1 -0
  82. package/dist/middleware/wallet-snap-permission.mjs +28 -0
  83. package/dist/middleware/wallet-snap-permission.mjs.map +1 -0
  84. package/dist/permitted/cancelBackgroundEvent.cjs +20 -0
  85. package/dist/permitted/cancelBackgroundEvent.cjs.map +1 -1
  86. package/dist/permitted/cancelBackgroundEvent.d.cts +43 -3
  87. package/dist/permitted/cancelBackgroundEvent.d.cts.map +1 -1
  88. package/dist/permitted/cancelBackgroundEvent.d.mts +43 -3
  89. package/dist/permitted/cancelBackgroundEvent.d.mts.map +1 -1
  90. package/dist/permitted/cancelBackgroundEvent.mjs +20 -0
  91. package/dist/permitted/cancelBackgroundEvent.mjs.map +1 -1
  92. package/dist/permitted/clearState.cjs +13 -2
  93. package/dist/permitted/clearState.cjs.map +1 -1
  94. package/dist/permitted/clearState.d.cts +35 -3
  95. package/dist/permitted/clearState.d.cts.map +1 -1
  96. package/dist/permitted/clearState.d.mts +35 -3
  97. package/dist/permitted/clearState.d.mts.map +1 -1
  98. package/dist/permitted/clearState.mjs +13 -2
  99. package/dist/permitted/clearState.mjs.map +1 -1
  100. package/dist/permitted/closeWebSocket.cjs +19 -2
  101. package/dist/permitted/closeWebSocket.cjs.map +1 -1
  102. package/dist/permitted/closeWebSocket.d.cts +39 -4
  103. package/dist/permitted/closeWebSocket.d.cts.map +1 -1
  104. package/dist/permitted/closeWebSocket.d.mts +39 -4
  105. package/dist/permitted/closeWebSocket.d.mts.map +1 -1
  106. package/dist/permitted/closeWebSocket.mjs +19 -2
  107. package/dist/permitted/closeWebSocket.mjs.map +1 -1
  108. package/dist/permitted/createInterface.cjs +33 -2
  109. package/dist/permitted/createInterface.cjs.map +1 -1
  110. package/dist/permitted/createInterface.d.cts +68 -17
  111. package/dist/permitted/createInterface.d.cts.map +1 -1
  112. package/dist/permitted/createInterface.d.mts +68 -17
  113. package/dist/permitted/createInterface.d.mts.map +1 -1
  114. package/dist/permitted/createInterface.mjs +34 -3
  115. package/dist/permitted/createInterface.mjs.map +1 -1
  116. package/dist/permitted/endTrace.cjs +6 -2
  117. package/dist/permitted/endTrace.cjs.map +1 -1
  118. package/dist/permitted/endTrace.d.cts +28 -4
  119. package/dist/permitted/endTrace.d.cts.map +1 -1
  120. package/dist/permitted/endTrace.d.mts +28 -4
  121. package/dist/permitted/endTrace.d.mts.map +1 -1
  122. package/dist/permitted/endTrace.mjs +6 -2
  123. package/dist/permitted/endTrace.mjs.map +1 -1
  124. package/dist/permitted/getAllSnaps.cjs +4 -1
  125. package/dist/permitted/getAllSnaps.cjs.map +1 -1
  126. package/dist/permitted/getAllSnaps.d.cts +25 -3
  127. package/dist/permitted/getAllSnaps.d.cts.map +1 -1
  128. package/dist/permitted/getAllSnaps.d.mts +25 -3
  129. package/dist/permitted/getAllSnaps.d.mts.map +1 -1
  130. package/dist/permitted/getAllSnaps.mjs +4 -1
  131. package/dist/permitted/getAllSnaps.mjs.map +1 -1
  132. package/dist/permitted/getBackgroundEvents.cjs +24 -0
  133. package/dist/permitted/getBackgroundEvents.cjs.map +1 -1
  134. package/dist/permitted/getBackgroundEvents.d.cts +48 -3
  135. package/dist/permitted/getBackgroundEvents.d.cts.map +1 -1
  136. package/dist/permitted/getBackgroundEvents.d.mts +48 -3
  137. package/dist/permitted/getBackgroundEvents.d.mts.map +1 -1
  138. package/dist/permitted/getBackgroundEvents.mjs +24 -0
  139. package/dist/permitted/getBackgroundEvents.mjs.map +1 -1
  140. package/dist/permitted/getClientStatus.cjs +27 -2
  141. package/dist/permitted/getClientStatus.cjs.map +1 -1
  142. package/dist/permitted/getClientStatus.d.cts +50 -4
  143. package/dist/permitted/getClientStatus.d.cts.map +1 -1
  144. package/dist/permitted/getClientStatus.d.mts +50 -4
  145. package/dist/permitted/getClientStatus.d.mts.map +1 -1
  146. package/dist/permitted/getClientStatus.mjs +27 -2
  147. package/dist/permitted/getClientStatus.mjs.map +1 -1
  148. package/dist/permitted/getFile.cjs +28 -1
  149. package/dist/permitted/getFile.cjs.map +1 -1
  150. package/dist/permitted/getFile.d.cts +49 -3
  151. package/dist/permitted/getFile.d.cts.map +1 -1
  152. package/dist/permitted/getFile.d.mts +49 -3
  153. package/dist/permitted/getFile.d.mts.map +1 -1
  154. package/dist/permitted/getFile.mjs +28 -1
  155. package/dist/permitted/getFile.mjs.map +1 -1
  156. package/dist/permitted/getInterfaceContext.cjs +49 -3
  157. package/dist/permitted/getInterfaceContext.cjs.map +1 -1
  158. package/dist/permitted/getInterfaceContext.d.cts +65 -3
  159. package/dist/permitted/getInterfaceContext.d.cts.map +1 -1
  160. package/dist/permitted/getInterfaceContext.d.mts +65 -3
  161. package/dist/permitted/getInterfaceContext.d.mts.map +1 -1
  162. package/dist/permitted/getInterfaceContext.mjs +50 -4
  163. package/dist/permitted/getInterfaceContext.mjs.map +1 -1
  164. package/dist/permitted/getInterfaceState.cjs +27 -3
  165. package/dist/permitted/getInterfaceState.cjs.map +1 -1
  166. package/dist/permitted/getInterfaceState.d.cts +43 -3
  167. package/dist/permitted/getInterfaceState.d.cts.map +1 -1
  168. package/dist/permitted/getInterfaceState.d.mts +43 -3
  169. package/dist/permitted/getInterfaceState.d.mts.map +1 -1
  170. package/dist/permitted/getInterfaceState.mjs +28 -4
  171. package/dist/permitted/getInterfaceState.mjs.map +1 -1
  172. package/dist/permitted/getSnaps.cjs +21 -2
  173. package/dist/permitted/getSnaps.cjs.map +1 -1
  174. package/dist/permitted/getSnaps.d.cts +42 -4
  175. package/dist/permitted/getSnaps.d.cts.map +1 -1
  176. package/dist/permitted/getSnaps.d.mts +42 -4
  177. package/dist/permitted/getSnaps.d.mts.map +1 -1
  178. package/dist/permitted/getSnaps.mjs +21 -2
  179. package/dist/permitted/getSnaps.mjs.map +1 -1
  180. package/dist/permitted/getState.cjs +24 -2
  181. package/dist/permitted/getState.cjs.map +1 -1
  182. package/dist/permitted/getState.d.cts +46 -4
  183. package/dist/permitted/getState.d.cts.map +1 -1
  184. package/dist/permitted/getState.d.mts +46 -4
  185. package/dist/permitted/getState.d.mts.map +1 -1
  186. package/dist/permitted/getState.mjs +24 -2
  187. package/dist/permitted/getState.mjs.map +1 -1
  188. package/dist/permitted/getWebSockets.cjs +29 -2
  189. package/dist/permitted/getWebSockets.cjs.map +1 -1
  190. package/dist/permitted/getWebSockets.d.cts +50 -4
  191. package/dist/permitted/getWebSockets.d.cts.map +1 -1
  192. package/dist/permitted/getWebSockets.d.mts +50 -4
  193. package/dist/permitted/getWebSockets.d.mts.map +1 -1
  194. package/dist/permitted/getWebSockets.mjs +29 -2
  195. package/dist/permitted/getWebSockets.mjs.map +1 -1
  196. package/dist/permitted/handlers.cjs +0 -4
  197. package/dist/permitted/handlers.cjs.map +1 -1
  198. package/dist/permitted/handlers.d.cts +274 -56
  199. package/dist/permitted/handlers.d.cts.map +1 -1
  200. package/dist/permitted/handlers.d.mts +274 -56
  201. package/dist/permitted/handlers.d.mts.map +1 -1
  202. package/dist/permitted/handlers.mjs +0 -4
  203. package/dist/permitted/handlers.mjs.map +1 -1
  204. package/dist/permitted/index.cjs.map +1 -1
  205. package/dist/permitted/index.d.cts +1 -3
  206. package/dist/permitted/index.d.cts.map +1 -1
  207. package/dist/permitted/index.d.mts +1 -3
  208. package/dist/permitted/index.d.mts.map +1 -1
  209. package/dist/permitted/index.mjs.map +1 -1
  210. package/dist/permitted/invokeKeyring.cjs +8 -2
  211. package/dist/permitted/invokeKeyring.cjs.map +1 -1
  212. package/dist/permitted/invokeKeyring.d.cts +34 -4
  213. package/dist/permitted/invokeKeyring.d.cts.map +1 -1
  214. package/dist/permitted/invokeKeyring.d.mts +34 -4
  215. package/dist/permitted/invokeKeyring.d.mts.map +1 -1
  216. package/dist/permitted/invokeKeyring.mjs +8 -2
  217. package/dist/permitted/invokeKeyring.mjs.map +1 -1
  218. package/dist/permitted/invokeSnapSugar.cjs +25 -2
  219. package/dist/permitted/invokeSnapSugar.cjs.map +1 -1
  220. package/dist/permitted/invokeSnapSugar.d.cts +30 -3
  221. package/dist/permitted/invokeSnapSugar.d.cts.map +1 -1
  222. package/dist/permitted/invokeSnapSugar.d.mts +30 -3
  223. package/dist/permitted/invokeSnapSugar.d.mts.map +1 -1
  224. package/dist/permitted/invokeSnapSugar.mjs +25 -2
  225. package/dist/permitted/invokeSnapSugar.mjs.map +1 -1
  226. package/dist/permitted/listEntropySources.cjs +40 -1
  227. package/dist/permitted/listEntropySources.cjs.map +1 -1
  228. package/dist/permitted/listEntropySources.d.cts +64 -3
  229. package/dist/permitted/listEntropySources.d.cts.map +1 -1
  230. package/dist/permitted/listEntropySources.d.mts +64 -3
  231. package/dist/permitted/listEntropySources.d.mts.map +1 -1
  232. package/dist/permitted/listEntropySources.mjs +40 -1
  233. package/dist/permitted/listEntropySources.mjs.map +1 -1
  234. package/dist/permitted/openWebSocket.cjs +46 -2
  235. package/dist/permitted/openWebSocket.cjs.map +1 -1
  236. package/dist/permitted/openWebSocket.d.cts +66 -4
  237. package/dist/permitted/openWebSocket.d.cts.map +1 -1
  238. package/dist/permitted/openWebSocket.d.mts +66 -4
  239. package/dist/permitted/openWebSocket.d.mts.map +1 -1
  240. package/dist/permitted/openWebSocket.mjs +46 -2
  241. package/dist/permitted/openWebSocket.mjs.map +1 -1
  242. package/dist/permitted/requestSnaps.cjs +25 -2
  243. package/dist/permitted/requestSnaps.cjs.map +1 -1
  244. package/dist/permitted/requestSnaps.d.cts +51 -3
  245. package/dist/permitted/requestSnaps.d.cts.map +1 -1
  246. package/dist/permitted/requestSnaps.d.mts +51 -3
  247. package/dist/permitted/requestSnaps.d.mts.map +1 -1
  248. package/dist/permitted/requestSnaps.mjs +25 -2
  249. package/dist/permitted/requestSnaps.mjs.map +1 -1
  250. package/dist/permitted/resolveInterface.cjs +38 -2
  251. package/dist/permitted/resolveInterface.cjs.map +1 -1
  252. package/dist/permitted/resolveInterface.d.cts +55 -4
  253. package/dist/permitted/resolveInterface.d.cts.map +1 -1
  254. package/dist/permitted/resolveInterface.d.mts +55 -4
  255. package/dist/permitted/resolveInterface.d.mts.map +1 -1
  256. package/dist/permitted/resolveInterface.mjs +39 -3
  257. package/dist/permitted/resolveInterface.mjs.map +1 -1
  258. package/dist/permitted/scheduleBackgroundEvent.cjs +26 -0
  259. package/dist/permitted/scheduleBackgroundEvent.cjs.map +1 -1
  260. package/dist/permitted/scheduleBackgroundEvent.d.cts +49 -3
  261. package/dist/permitted/scheduleBackgroundEvent.d.cts.map +1 -1
  262. package/dist/permitted/scheduleBackgroundEvent.d.mts +49 -3
  263. package/dist/permitted/scheduleBackgroundEvent.d.mts.map +1 -1
  264. package/dist/permitted/scheduleBackgroundEvent.mjs +26 -0
  265. package/dist/permitted/scheduleBackgroundEvent.mjs.map +1 -1
  266. package/dist/permitted/sendWebSocketMessage.cjs +24 -2
  267. package/dist/permitted/sendWebSocketMessage.cjs.map +1 -1
  268. package/dist/permitted/sendWebSocketMessage.d.cts +44 -4
  269. package/dist/permitted/sendWebSocketMessage.d.cts.map +1 -1
  270. package/dist/permitted/sendWebSocketMessage.d.mts +44 -4
  271. package/dist/permitted/sendWebSocketMessage.d.mts.map +1 -1
  272. package/dist/permitted/sendWebSocketMessage.mjs +24 -2
  273. package/dist/permitted/sendWebSocketMessage.mjs.map +1 -1
  274. package/dist/permitted/setState.cjs +48 -2
  275. package/dist/permitted/setState.cjs.map +1 -1
  276. package/dist/permitted/setState.d.cts +72 -4
  277. package/dist/permitted/setState.d.cts.map +1 -1
  278. package/dist/permitted/setState.d.mts +72 -4
  279. package/dist/permitted/setState.d.mts.map +1 -1
  280. package/dist/permitted/setState.mjs +48 -2
  281. package/dist/permitted/setState.mjs.map +1 -1
  282. package/dist/permitted/startTrace.cjs +4 -1
  283. package/dist/permitted/startTrace.cjs.map +1 -1
  284. package/dist/permitted/startTrace.d.cts +26 -3
  285. package/dist/permitted/startTrace.d.cts.map +1 -1
  286. package/dist/permitted/startTrace.d.mts +26 -3
  287. package/dist/permitted/startTrace.d.mts.map +1 -1
  288. package/dist/permitted/startTrace.mjs +4 -1
  289. package/dist/permitted/startTrace.mjs.map +1 -1
  290. package/dist/permitted/trackError.cjs +4 -1
  291. package/dist/permitted/trackError.cjs.map +1 -1
  292. package/dist/permitted/trackError.d.cts +26 -3
  293. package/dist/permitted/trackError.d.cts.map +1 -1
  294. package/dist/permitted/trackError.d.mts +26 -3
  295. package/dist/permitted/trackError.d.mts.map +1 -1
  296. package/dist/permitted/trackError.mjs +4 -1
  297. package/dist/permitted/trackError.mjs.map +1 -1
  298. package/dist/permitted/trackEvent.cjs +4 -1
  299. package/dist/permitted/trackEvent.cjs.map +1 -1
  300. package/dist/permitted/trackEvent.d.cts +25 -4
  301. package/dist/permitted/trackEvent.d.cts.map +1 -1
  302. package/dist/permitted/trackEvent.d.mts +25 -4
  303. package/dist/permitted/trackEvent.d.mts.map +1 -1
  304. package/dist/permitted/trackEvent.mjs +4 -1
  305. package/dist/permitted/trackEvent.mjs.map +1 -1
  306. package/dist/permitted/updateInterface.cjs +47 -2
  307. package/dist/permitted/updateInterface.cjs.map +1 -1
  308. package/dist/permitted/updateInterface.d.cts +64 -3
  309. package/dist/permitted/updateInterface.d.cts.map +1 -1
  310. package/dist/permitted/updateInterface.d.mts +64 -3
  311. package/dist/permitted/updateInterface.d.mts.map +1 -1
  312. package/dist/permitted/updateInterface.mjs +48 -3
  313. package/dist/permitted/updateInterface.mjs.map +1 -1
  314. package/dist/restricted/caveats/snapIds.cjs.map +1 -1
  315. package/dist/restricted/caveats/snapIds.d.cts.map +1 -1
  316. package/dist/restricted/caveats/snapIds.d.mts.map +1 -1
  317. package/dist/restricted/caveats/snapIds.mjs.map +1 -1
  318. package/dist/restricted/dialog.cjs +49 -1
  319. package/dist/restricted/dialog.cjs.map +1 -1
  320. package/dist/restricted/dialog.d.cts +52 -2
  321. package/dist/restricted/dialog.d.cts.map +1 -1
  322. package/dist/restricted/dialog.d.mts +52 -2
  323. package/dist/restricted/dialog.d.mts.map +1 -1
  324. package/dist/restricted/dialog.mjs +49 -1
  325. package/dist/restricted/dialog.mjs.map +1 -1
  326. package/dist/restricted/getBip32Entropy.cjs +55 -0
  327. package/dist/restricted/getBip32Entropy.cjs.map +1 -1
  328. package/dist/restricted/getBip32Entropy.d.cts +55 -0
  329. package/dist/restricted/getBip32Entropy.d.cts.map +1 -1
  330. package/dist/restricted/getBip32Entropy.d.mts +55 -0
  331. package/dist/restricted/getBip32Entropy.d.mts.map +1 -1
  332. package/dist/restricted/getBip32Entropy.mjs +55 -0
  333. package/dist/restricted/getBip32Entropy.mjs.map +1 -1
  334. package/dist/restricted/getBip32PublicKey.cjs +36 -0
  335. package/dist/restricted/getBip32PublicKey.cjs.map +1 -1
  336. package/dist/restricted/getBip32PublicKey.d.cts +36 -0
  337. package/dist/restricted/getBip32PublicKey.d.cts.map +1 -1
  338. package/dist/restricted/getBip32PublicKey.d.mts +36 -0
  339. package/dist/restricted/getBip32PublicKey.d.mts.map +1 -1
  340. package/dist/restricted/getBip32PublicKey.mjs +36 -0
  341. package/dist/restricted/getBip32PublicKey.mjs.map +1 -1
  342. package/dist/restricted/getBip44Entropy.cjs +53 -0
  343. package/dist/restricted/getBip44Entropy.cjs.map +1 -1
  344. package/dist/restricted/getBip44Entropy.d.cts +53 -0
  345. package/dist/restricted/getBip44Entropy.d.cts.map +1 -1
  346. package/dist/restricted/getBip44Entropy.d.mts +53 -0
  347. package/dist/restricted/getBip44Entropy.d.mts.map +1 -1
  348. package/dist/restricted/getBip44Entropy.mjs +53 -0
  349. package/dist/restricted/getBip44Entropy.mjs.map +1 -1
  350. package/dist/restricted/getEntropy.cjs +35 -0
  351. package/dist/restricted/getEntropy.cjs.map +1 -1
  352. package/dist/restricted/getEntropy.d.cts +35 -0
  353. package/dist/restricted/getEntropy.d.cts.map +1 -1
  354. package/dist/restricted/getEntropy.d.mts +35 -0
  355. package/dist/restricted/getEntropy.d.mts.map +1 -1
  356. package/dist/restricted/getEntropy.mjs +35 -0
  357. package/dist/restricted/getEntropy.mjs.map +1 -1
  358. package/dist/restricted/getLocale.cjs +11 -0
  359. package/dist/restricted/getLocale.cjs.map +1 -1
  360. package/dist/restricted/getLocale.d.cts +11 -0
  361. package/dist/restricted/getLocale.d.cts.map +1 -1
  362. package/dist/restricted/getLocale.d.mts +11 -0
  363. package/dist/restricted/getLocale.d.mts.map +1 -1
  364. package/dist/restricted/getLocale.mjs +11 -0
  365. package/dist/restricted/getLocale.mjs.map +1 -1
  366. package/dist/restricted/getPreferences.cjs +24 -0
  367. package/dist/restricted/getPreferences.cjs.map +1 -1
  368. package/dist/restricted/getPreferences.d.cts +24 -0
  369. package/dist/restricted/getPreferences.d.cts.map +1 -1
  370. package/dist/restricted/getPreferences.d.mts +24 -0
  371. package/dist/restricted/getPreferences.d.mts.map +1 -1
  372. package/dist/restricted/getPreferences.mjs +24 -0
  373. package/dist/restricted/getPreferences.mjs.map +1 -1
  374. package/dist/restricted/index.d.cts +1 -1
  375. package/dist/restricted/index.d.mts +1 -1
  376. package/dist/restricted/invokeSnap.cjs +22 -0
  377. package/dist/restricted/invokeSnap.cjs.map +1 -1
  378. package/dist/restricted/invokeSnap.d.cts +24 -6
  379. package/dist/restricted/invokeSnap.d.cts.map +1 -1
  380. package/dist/restricted/invokeSnap.d.mts +24 -6
  381. package/dist/restricted/invokeSnap.d.mts.map +1 -1
  382. package/dist/restricted/invokeSnap.mjs +22 -0
  383. package/dist/restricted/invokeSnap.mjs.map +1 -1
  384. package/dist/restricted/manageAccounts.cjs +10 -0
  385. package/dist/restricted/manageAccounts.cjs.map +1 -1
  386. package/dist/restricted/manageAccounts.d.cts +10 -0
  387. package/dist/restricted/manageAccounts.d.cts.map +1 -1
  388. package/dist/restricted/manageAccounts.d.mts +10 -0
  389. package/dist/restricted/manageAccounts.d.mts.map +1 -1
  390. package/dist/restricted/manageAccounts.mjs +10 -0
  391. package/dist/restricted/manageAccounts.mjs.map +1 -1
  392. package/dist/restricted/manageState.cjs +42 -0
  393. package/dist/restricted/manageState.cjs.map +1 -1
  394. package/dist/restricted/manageState.d.cts +42 -0
  395. package/dist/restricted/manageState.d.cts.map +1 -1
  396. package/dist/restricted/manageState.d.mts +42 -0
  397. package/dist/restricted/manageState.d.mts.map +1 -1
  398. package/dist/restricted/manageState.mjs +42 -0
  399. package/dist/restricted/manageState.mjs.map +1 -1
  400. package/dist/restricted/notify.cjs +74 -0
  401. package/dist/restricted/notify.cjs.map +1 -1
  402. package/dist/restricted/notify.d.cts +74 -0
  403. package/dist/restricted/notify.d.cts.map +1 -1
  404. package/dist/restricted/notify.d.mts +74 -0
  405. package/dist/restricted/notify.d.mts.map +1 -1
  406. package/dist/restricted/notify.mjs +74 -0
  407. package/dist/restricted/notify.mjs.map +1 -1
  408. package/dist/utils.cjs +14 -1
  409. package/dist/utils.cjs.map +1 -1
  410. package/dist/utils.d.cts +6 -0
  411. package/dist/utils.d.cts.map +1 -1
  412. package/dist/utils.d.mts +6 -0
  413. package/dist/utils.d.mts.map +1 -1
  414. package/dist/utils.mjs +13 -0
  415. package/dist/utils.mjs.map +1 -1
  416. package/package.json +11 -7
  417. package/dist/permitted/experimentalProviderRequest.cjs +0 -152
  418. package/dist/permitted/experimentalProviderRequest.cjs.map +0 -1
  419. package/dist/permitted/experimentalProviderRequest.d.cts +0 -39
  420. package/dist/permitted/experimentalProviderRequest.d.cts.map +0 -1
  421. package/dist/permitted/experimentalProviderRequest.d.mts +0 -39
  422. package/dist/permitted/experimentalProviderRequest.d.mts.map +0 -1
  423. package/dist/permitted/experimentalProviderRequest.mjs +0 -149
  424. package/dist/permitted/experimentalProviderRequest.mjs.map +0 -1
  425. package/dist/permitted/getCurrencyRate.cjs +0 -63
  426. package/dist/permitted/getCurrencyRate.cjs.map +0 -1
  427. package/dist/permitted/getCurrencyRate.d.cts +0 -20
  428. package/dist/permitted/getCurrencyRate.d.cts.map +0 -1
  429. package/dist/permitted/getCurrencyRate.d.mts +0 -20
  430. package/dist/permitted/getCurrencyRate.d.mts.map +0 -1
  431. package/dist/permitted/getCurrencyRate.mjs +0 -60
  432. package/dist/permitted/getCurrencyRate.mjs.map +0 -1
@@ -1,5 +1,7 @@
1
- import type { PermittedHandlerExport } from "@metamask/permission-controller";
2
- import type { EntropySource, ListEntropySourcesParams, ListEntropySourcesResult } from "@metamask/snaps-sdk";
1
+ import type { JsonRpcEngineEndCallback } from "@metamask/json-rpc-engine";
2
+ import type { EntropySource, JsonRpcRequest, ListEntropySourcesParams, ListEntropySourcesResult } from "@metamask/snaps-sdk";
3
+ import type { PendingJsonRpcResponse } from "@metamask/utils";
4
+ import type { MethodHooksObject } from "../utils.mjs";
3
5
  export type ListEntropySourcesHooks = {
4
6
  /**
5
7
  * Check if the requesting origin has a given permission.
@@ -21,5 +23,64 @@ export type ListEntropySourcesHooks = {
21
23
  */
22
24
  getUnlockPromise: (shouldShowUnlockRequest: boolean) => Promise<void>;
23
25
  };
24
- export declare const listEntropySourcesHandler: PermittedHandlerExport<ListEntropySourcesHooks, ListEntropySourcesParams, ListEntropySourcesResult>;
26
+ /**
27
+ * Get a list of entropy sources available to the Snap. The requesting origin
28
+ * must have at least one of the following permissions to access entropy source
29
+ * metadata:
30
+ *
31
+ * - `snap_getBip32Entropy`
32
+ * - `snap_getBip32PublicKey`
33
+ * - `snap_getBip44Entropy`
34
+ * - `snap_getEntropy`
35
+ *
36
+ * @example
37
+ * ```json name="Manifest"
38
+ * {
39
+ * "initialPermissions": {
40
+ * "snap_getBip32Entropy": {}
41
+ * }
42
+ * }
43
+ * ```
44
+ * ```ts name="Usage"
45
+ * const entropySources = await snap.request({ method: 'snap_listEntropySources' });
46
+ * console.log(entropySources);
47
+ * // Example output:
48
+ * // [
49
+ * // {
50
+ * // name: 'Mnemonic 1',
51
+ * // id: 'mnemonic-1',
52
+ * // type: 'mnemonic',
53
+ * // primary: true,
54
+ * // },
55
+ * // {
56
+ * // name: 'Mnemonic 2',
57
+ * // id: 'mnemonic-2',
58
+ * // type: 'mnemonic',
59
+ * // primary: false,
60
+ * // },
61
+ * // ]
62
+ * ```
63
+ */
64
+ export declare const listEntropySourcesHandler: {
65
+ methodNames: ["snap_listEntropySources"];
66
+ implementation: typeof listEntropySourcesImplementation;
67
+ hookNames: MethodHooksObject<ListEntropySourcesHooks>;
68
+ };
69
+ /**
70
+ * The `snap_listEntropySources` method implementation.
71
+ *
72
+ * @param _request - The JSON-RPC request object. Not used by this function.
73
+ * @param response - The JSON-RPC response object.
74
+ * @param _next - The `json-rpc-engine` "next" callback. Not used by this
75
+ * function.
76
+ * @param end - The `json-rpc-engine` "end" callback.
77
+ * @param hooks - The RPC method hooks.
78
+ * @param hooks.hasPermission - The function to check if the origin has a
79
+ * permission.
80
+ * @param hooks.getEntropySources - The function to get the entropy sources.
81
+ * @param hooks.getUnlockPromise - The function to get the unlock promise.
82
+ * @returns Noting.
83
+ */
84
+ declare function listEntropySourcesImplementation(_request: JsonRpcRequest<ListEntropySourcesParams>, response: PendingJsonRpcResponse<ListEntropySourcesResult>, _next: unknown, end: JsonRpcEngineEndCallback, { hasPermission, getEntropySources, getUnlockPromise, }: ListEntropySourcesHooks): Promise<void>;
85
+ export {};
25
86
  //# sourceMappingURL=listEntropySources.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"listEntropySources.d.mts","sourceRoot":"","sources":["../../src/permitted/listEntropySources.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,wCAAwC;AAE9E,OAAO,KAAK,EACV,aAAa,EAEb,wBAAwB,EACxB,wBAAwB,EACzB,4BAA4B;AA0B7B,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;;;OAKG;IACH,aAAa,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC;IAEnD;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,aAAa,EAAE,CAAC;IAEzC;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,uBAAuB,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,sBAAsB,CAC5D,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,CAKzB,CAAC"}
1
+ {"version":3,"file":"listEntropySources.d.mts","sourceRoot":"","sources":["../../src/permitted/listEntropySources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,kCAAkC;AAG1E,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,wBAAwB,EACxB,wBAAwB,EACzB,4BAA4B;AAC7B,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB;AAM9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAiB;AAqBlD,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;;;OAKG;IACH,aAAa,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC;IAEnD;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,aAAa,EAAE,CAAC;IAEzC;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,uBAAuB,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,yBAAyB;;;;CAQrC,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,iBAAe,gCAAgC,CAC7C,QAAQ,EAAE,cAAc,CAAC,wBAAwB,CAAC,EAClD,QAAQ,EAAE,sBAAsB,CAAC,wBAAwB,CAAC,EAC1D,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,wBAAwB,EAC7B,EACE,aAAa,EACb,iBAAiB,EACjB,gBAAgB,GACjB,EAAE,uBAAuB,GACzB,OAAO,CAAC,IAAI,CAAC,CAUf"}
@@ -13,13 +13,52 @@ const REQUIRED_PERMISSIONS = [
13
13
  getBip44EntropyBuilder.targetName,
14
14
  getEntropyBuilder.targetName,
15
15
  ];
16
+ const methodName = 'snap_listEntropySources';
16
17
  const hookNames = {
17
18
  hasPermission: true,
18
19
  getEntropySources: true,
19
20
  getUnlockPromise: true,
20
21
  };
22
+ /**
23
+ * Get a list of entropy sources available to the Snap. The requesting origin
24
+ * must have at least one of the following permissions to access entropy source
25
+ * metadata:
26
+ *
27
+ * - `snap_getBip32Entropy`
28
+ * - `snap_getBip32PublicKey`
29
+ * - `snap_getBip44Entropy`
30
+ * - `snap_getEntropy`
31
+ *
32
+ * @example
33
+ * ```json name="Manifest"
34
+ * {
35
+ * "initialPermissions": {
36
+ * "snap_getBip32Entropy": {}
37
+ * }
38
+ * }
39
+ * ```
40
+ * ```ts name="Usage"
41
+ * const entropySources = await snap.request({ method: 'snap_listEntropySources' });
42
+ * console.log(entropySources);
43
+ * // Example output:
44
+ * // [
45
+ * // {
46
+ * // name: 'Mnemonic 1',
47
+ * // id: 'mnemonic-1',
48
+ * // type: 'mnemonic',
49
+ * // primary: true,
50
+ * // },
51
+ * // {
52
+ * // name: 'Mnemonic 2',
53
+ * // id: 'mnemonic-2',
54
+ * // type: 'mnemonic',
55
+ * // primary: false,
56
+ * // },
57
+ * // ]
58
+ * ```
59
+ */
21
60
  export const listEntropySourcesHandler = {
22
- methodNames: ['snap_listEntropySources'],
61
+ methodNames: [methodName],
23
62
  implementation: listEntropySourcesImplementation,
24
63
  hookNames,
25
64
  };
@@ -1 +1 @@
1
- {"version":3,"file":"listEntropySources.mjs","sourceRoot":"","sources":["../../src/permitted/listEntropySources.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,6BAA6B;AAStD,OAAO,EAAE,sBAAsB,EAAE,0CAAsC;AACvE,OAAO,EAAE,wBAAwB,EAAE,4CAAwC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,0CAAsC;AACvE,OAAO,EAAE,iBAAiB,EAAE,qCAAiC;AAG7D;;;GAGG;AACH,MAAM,oBAAoB,GAAG;IAC3B,sBAAsB,CAAC,UAAU;IACjC,wBAAwB,CAAC,UAAU;IACnC,sBAAsB,CAAC,UAAU;IACjC,iBAAiB,CAAC,UAAU;CAC7B,CAAC;AAEF,MAAM,SAAS,GAA+C;IAC5D,aAAa,EAAE,IAAI;IACnB,iBAAiB,EAAE,IAAI;IACvB,gBAAgB,EAAE,IAAI;CACvB,CAAC;AA0BF,MAAM,CAAC,MAAM,yBAAyB,GAIlC;IACF,WAAW,EAAE,CAAC,yBAAyB,CAAC;IACxC,cAAc,EAAE,gCAAgC;IAChD,SAAS;CACV,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,gCAAgC,CAC7C,QAAkD,EAClD,QAA0D,EAC1D,KAAc,EACd,GAA6B,EAC7B,EACE,aAAa,EACb,iBAAiB,EACjB,gBAAgB,GACQ;IAE1B,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,GAAG,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAE7B,QAAQ,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACtC,OAAO,GAAG,EAAE,CAAC;AACf,CAAC","sourcesContent":["import type { JsonRpcEngineEndCallback } from '@metamask/json-rpc-engine';\nimport type { PermittedHandlerExport } from '@metamask/permission-controller';\nimport { providerErrors } from '@metamask/rpc-errors';\nimport type {\n EntropySource,\n JsonRpcRequest,\n ListEntropySourcesParams,\n ListEntropySourcesResult,\n} from '@metamask/snaps-sdk';\nimport type { PendingJsonRpcResponse } from '@metamask/utils';\n\nimport { getBip32EntropyBuilder } from '../restricted/getBip32Entropy';\nimport { getBip32PublicKeyBuilder } from '../restricted/getBip32PublicKey';\nimport { getBip44EntropyBuilder } from '../restricted/getBip44Entropy';\nimport { getEntropyBuilder } from '../restricted/getEntropy';\nimport type { MethodHooksObject } from '../utils';\n\n/**\n * A list of permissions that the requesting origin must have at least one of\n * in order to call this method.\n */\nconst REQUIRED_PERMISSIONS = [\n getBip32EntropyBuilder.targetName,\n getBip32PublicKeyBuilder.targetName,\n getBip44EntropyBuilder.targetName,\n getEntropyBuilder.targetName,\n];\n\nconst hookNames: MethodHooksObject<ListEntropySourcesHooks> = {\n hasPermission: true,\n getEntropySources: true,\n getUnlockPromise: true,\n};\n\nexport type ListEntropySourcesHooks = {\n /**\n * Check if the requesting origin has a given permission.\n *\n * @param permissionName - The name of the permission to check.\n * @returns Whether the origin has the permission.\n */\n hasPermission: (permissionName: string) => boolean;\n\n /**\n * Get the entropy sources from the client.\n *\n * @returns The entropy sources.\n */\n getEntropySources: () => EntropySource[];\n\n /**\n * Wait for the extension to be unlocked.\n *\n * @returns A promise that resolves once the extension is unlocked.\n */\n getUnlockPromise: (shouldShowUnlockRequest: boolean) => Promise<void>;\n};\n\nexport const listEntropySourcesHandler: PermittedHandlerExport<\n ListEntropySourcesHooks,\n ListEntropySourcesParams,\n ListEntropySourcesResult\n> = {\n methodNames: ['snap_listEntropySources'],\n implementation: listEntropySourcesImplementation,\n hookNames,\n};\n\n/**\n * The `snap_listEntropySources` method implementation.\n *\n * @param _request - The JSON-RPC request object. Not used by this function.\n * @param response - The JSON-RPC response object.\n * @param _next - The `json-rpc-engine` \"next\" callback. Not used by this\n * function.\n * @param end - The `json-rpc-engine` \"end\" callback.\n * @param hooks - The RPC method hooks.\n * @param hooks.hasPermission - The function to check if the origin has a\n * permission.\n * @param hooks.getEntropySources - The function to get the entropy sources.\n * @param hooks.getUnlockPromise - The function to get the unlock promise.\n * @returns Noting.\n */\nasync function listEntropySourcesImplementation(\n _request: JsonRpcRequest<ListEntropySourcesParams>,\n response: PendingJsonRpcResponse<ListEntropySourcesResult>,\n _next: unknown,\n end: JsonRpcEngineEndCallback,\n {\n hasPermission,\n getEntropySources,\n getUnlockPromise,\n }: ListEntropySourcesHooks,\n): Promise<void> {\n const isPermitted = REQUIRED_PERMISSIONS.some(hasPermission);\n if (!isPermitted) {\n return end(providerErrors.unauthorized());\n }\n\n await getUnlockPromise(true);\n\n response.result = getEntropySources();\n return end();\n}\n"]}
1
+ {"version":3,"file":"listEntropySources.mjs","sourceRoot":"","sources":["../../src/permitted/listEntropySources.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,6BAA6B;AAStD,OAAO,EAAE,sBAAsB,EAAE,0CAAsC;AACvE,OAAO,EAAE,wBAAwB,EAAE,4CAAwC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,0CAAsC;AACvE,OAAO,EAAE,iBAAiB,EAAE,qCAAiC;AAG7D;;;GAGG;AACH,MAAM,oBAAoB,GAAG;IAC3B,sBAAsB,CAAC,UAAU;IACjC,wBAAwB,CAAC,UAAU;IACnC,sBAAsB,CAAC,UAAU;IACjC,iBAAiB,CAAC,UAAU;CAC7B,CAAC;AAEF,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAE7C,MAAM,SAAS,GAA+C;IAC5D,aAAa,EAAE,IAAI;IACnB,iBAAiB,EAAE,IAAI;IACvB,gBAAgB,EAAE,IAAI;CACvB,CAAC;AA0BF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,WAAW,EAAE,CAAC,UAAU,CAAU;IAClC,cAAc,EAAE,gCAAgC;IAChD,SAAS;CAKV,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,gCAAgC,CAC7C,QAAkD,EAClD,QAA0D,EAC1D,KAAc,EACd,GAA6B,EAC7B,EACE,aAAa,EACb,iBAAiB,EACjB,gBAAgB,GACQ;IAE1B,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,GAAG,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAE7B,QAAQ,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACtC,OAAO,GAAG,EAAE,CAAC;AACf,CAAC","sourcesContent":["import type { JsonRpcEngineEndCallback } from '@metamask/json-rpc-engine';\nimport type { PermittedHandlerExport } from '@metamask/permission-controller';\nimport { providerErrors } from '@metamask/rpc-errors';\nimport type {\n EntropySource,\n JsonRpcRequest,\n ListEntropySourcesParams,\n ListEntropySourcesResult,\n} from '@metamask/snaps-sdk';\nimport type { PendingJsonRpcResponse } from '@metamask/utils';\n\nimport { getBip32EntropyBuilder } from '../restricted/getBip32Entropy';\nimport { getBip32PublicKeyBuilder } from '../restricted/getBip32PublicKey';\nimport { getBip44EntropyBuilder } from '../restricted/getBip44Entropy';\nimport { getEntropyBuilder } from '../restricted/getEntropy';\nimport type { MethodHooksObject } from '../utils';\n\n/**\n * A list of permissions that the requesting origin must have at least one of\n * in order to call this method.\n */\nconst REQUIRED_PERMISSIONS = [\n getBip32EntropyBuilder.targetName,\n getBip32PublicKeyBuilder.targetName,\n getBip44EntropyBuilder.targetName,\n getEntropyBuilder.targetName,\n];\n\nconst methodName = 'snap_listEntropySources';\n\nconst hookNames: MethodHooksObject<ListEntropySourcesHooks> = {\n hasPermission: true,\n getEntropySources: true,\n getUnlockPromise: true,\n};\n\nexport type ListEntropySourcesHooks = {\n /**\n * Check if the requesting origin has a given permission.\n *\n * @param permissionName - The name of the permission to check.\n * @returns Whether the origin has the permission.\n */\n hasPermission: (permissionName: string) => boolean;\n\n /**\n * Get the entropy sources from the client.\n *\n * @returns The entropy sources.\n */\n getEntropySources: () => EntropySource[];\n\n /**\n * Wait for the extension to be unlocked.\n *\n * @returns A promise that resolves once the extension is unlocked.\n */\n getUnlockPromise: (shouldShowUnlockRequest: boolean) => Promise<void>;\n};\n\n/**\n * Get a list of entropy sources available to the Snap. The requesting origin\n * must have at least one of the following permissions to access entropy source\n * metadata:\n *\n * - `snap_getBip32Entropy`\n * - `snap_getBip32PublicKey`\n * - `snap_getBip44Entropy`\n * - `snap_getEntropy`\n *\n * @example\n * ```json name=\"Manifest\"\n * {\n * \"initialPermissions\": {\n * \"snap_getBip32Entropy\": {}\n * }\n * }\n * ```\n * ```ts name=\"Usage\"\n * const entropySources = await snap.request({ method: 'snap_listEntropySources' });\n * console.log(entropySources);\n * // Example output:\n * // [\n * // {\n * // name: 'Mnemonic 1',\n * // id: 'mnemonic-1',\n * // type: 'mnemonic',\n * // primary: true,\n * // },\n * // {\n * // name: 'Mnemonic 2',\n * // id: 'mnemonic-2',\n * // type: 'mnemonic',\n * // primary: false,\n * // },\n * // ]\n * ```\n */\nexport const listEntropySourcesHandler = {\n methodNames: [methodName] as const,\n implementation: listEntropySourcesImplementation,\n hookNames,\n} satisfies PermittedHandlerExport<\n ListEntropySourcesHooks,\n ListEntropySourcesParams,\n ListEntropySourcesResult\n>;\n\n/**\n * The `snap_listEntropySources` method implementation.\n *\n * @param _request - The JSON-RPC request object. Not used by this function.\n * @param response - The JSON-RPC response object.\n * @param _next - The `json-rpc-engine` \"next\" callback. Not used by this\n * function.\n * @param end - The `json-rpc-engine` \"end\" callback.\n * @param hooks - The RPC method hooks.\n * @param hooks.hasPermission - The function to check if the origin has a\n * permission.\n * @param hooks.getEntropySources - The function to get the entropy sources.\n * @param hooks.getUnlockPromise - The function to get the unlock promise.\n * @returns Noting.\n */\nasync function listEntropySourcesImplementation(\n _request: JsonRpcRequest<ListEntropySourcesParams>,\n response: PendingJsonRpcResponse<ListEntropySourcesResult>,\n _next: unknown,\n end: JsonRpcEngineEndCallback,\n {\n hasPermission,\n getEntropySources,\n getUnlockPromise,\n }: ListEntropySourcesHooks,\n): Promise<void> {\n const isPermitted = REQUIRED_PERMISSIONS.some(hasPermission);\n if (!isPermitted) {\n return end(providerErrors.unauthorized());\n }\n\n await getUnlockPromise(true);\n\n response.result = getEntropySources();\n return end();\n}\n"]}
@@ -6,6 +6,7 @@ const snaps_sdk_1 = require("@metamask/snaps-sdk");
6
6
  const snaps_utils_1 = require("@metamask/snaps-utils");
7
7
  const superstruct_1 = require("@metamask/superstruct");
8
8
  const endowments_1 = require("../endowments/index.cjs");
9
+ const methodName = 'snap_openWebSocket';
9
10
  const hookNames = {
10
11
  hasPermission: true,
11
12
  openWebSocket: true,
@@ -15,10 +16,53 @@ const OpenWebSocketParametersStruct = (0, superstruct_1.object)({
15
16
  protocols: (0, superstruct_1.optional)((0, superstruct_1.array)((0, superstruct_1.string)())),
16
17
  });
17
18
  /**
18
- * Handler for the `snap_openWebSocket` method.
19
+ * Open a WebSocket connection to the specified URL with optional protocols.
20
+ *
21
+ * Note: This method is only available to snaps that have the
22
+ * [`endowment:network-access`](https://docs.metamask.io/snaps/features/network-access/)
23
+ * permission.
24
+ *
25
+ * @example
26
+ * ```json name="Manifest"
27
+ * {
28
+ * "initialPermissions": {
29
+ * "endowment:network-access": {}
30
+ * }
31
+ * }
32
+ * ```
33
+ * ```ts name="Usage"
34
+ * // Open a connection to a WebSocket server, e.g., in the JSON-RPC handler of
35
+ * // the Snap:
36
+ * snap.request({
37
+ * method: 'snap_openWebSocket',
38
+ * params: {
39
+ * url: 'wss://example.com/socket',
40
+ * protocols: ['protocol1', 'protocol2'], // Optional
41
+ * },
42
+ * });
43
+ *
44
+ * // Listen for events from the WebSocket connection in the `onWebSocketEvent`
45
+ * // handler of the Snap:
46
+ * export const onWebSocketEvent: OnWebSocketEventHandler = async ({ event }) => {
47
+ * switch (event.type) {
48
+ * case 'open':
49
+ * console.log(`WebSocket connection opened with origin ${event.origin}`);
50
+ * break;
51
+ * case 'message':
52
+ * console.log(`WebSocket message received from origin ${event.origin}:`, event.data);
53
+ * break;
54
+ * case 'close':
55
+ * console.log(`WebSocket connection closed with origin ${event.origin}`);
56
+ * break;
57
+ * case 'error':
58
+ * console.error(`WebSocket error from origin ${event.origin}:`, event.error);
59
+ * break;
60
+ * }
61
+ * };
62
+ * ```
19
63
  */
20
64
  exports.openWebSocketHandler = {
21
- methodNames: ['snap_openWebSocket'],
65
+ methodNames: [methodName],
22
66
  implementation: openWebSocketImplementation,
23
67
  hookNames,
24
68
  };
@@ -1 +1 @@
1
- {"version":3,"file":"openWebSocket.cjs","sourceRoot":"","sources":["../../src/permitted/openWebSocket.ts"],"names":[],"mappings":";;;AAEA,qDAAiE;AACjE,mDAM6B;AAC7B,uDAAgE;AAChE,uDAO+B;AAG/B,wDAA+C;AAG/C,MAAM,SAAS,GAAgD;IAC7D,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,IAAI;CACpB,CAAC;AAOF,MAAM,6BAA6B,GAAG,IAAA,oBAAM,EAAC;IAC3C,GAAG,EAAE,IAAA,iBAAG,EAAC,EAAE,QAAQ,EAAE,IAAA,iBAAK,EAAC,CAAC,IAAA,mBAAO,EAAC,MAAM,CAAC,EAAE,IAAA,mBAAO,EAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,SAAS,EAAE,IAAA,sBAAQ,EAAC,IAAA,mBAAK,EAAC,IAAA,oBAAM,GAAE,CAAC,CAAC;CACrC,CAAC,CAAC;AAOH;;GAEG;AACU,QAAA,oBAAoB,GAI7B;IACF,WAAW,EAAE,CAAC,oBAAoB,CAAC;IACnC,cAAc,EAAE,2BAA2B;IAC3C,SAAS;CACV,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,2BAA2B,CACxC,GAA4C,EAC5C,GAAgD,EAChD,KAAc,EACd,GAA6B,EAC7B,EAAE,aAAa,EAAE,aAAa,EAA4B;IAE1D,IAAI,CAAC,aAAa,CAAC,2BAAc,CAAC,aAAa,CAAC,EAAE,CAAC;QACjD,OAAO,GAAG,CAAC,2BAAc,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAEvB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACtD,GAAG,CAAC,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,GAAG,EAAE,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,MAAe;IACzC,IAAI,CAAC;QACH,OAAO,IAAA,oBAAM,EAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,yBAAW,EAAE,CAAC;YACjC,MAAM,sBAAS,CAAC,aAAa,CAAC;gBAC5B,OAAO,EAAE,mBAAmB,KAAK,CAAC,OAAO,GAAG;aAC7C,CAAC,CAAC;QACL,CAAC;QACD,0BAA0B;QAC1B,MAAM,sBAAS,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC","sourcesContent":["import type { JsonRpcEngineEndCallback } from '@metamask/json-rpc-engine';\nimport type { PermittedHandlerExport } from '@metamask/permission-controller';\nimport { providerErrors, rpcErrors } from '@metamask/rpc-errors';\nimport {\n literal,\n union,\n type JsonRpcRequest,\n type OpenWebSocketParams,\n type OpenWebSocketResult,\n} from '@metamask/snaps-sdk';\nimport { uri, type InferMatching } from '@metamask/snaps-utils';\nimport {\n create,\n object,\n array,\n string,\n optional,\n StructError,\n} from '@metamask/superstruct';\nimport type { PendingJsonRpcResponse } from '@metamask/utils';\n\nimport { SnapEndowments } from '../endowments';\nimport type { MethodHooksObject } from '../utils';\n\nconst hookNames: MethodHooksObject<OpenWebSocketMethodHooks> = {\n hasPermission: true,\n openWebSocket: true,\n};\n\nexport type OpenWebSocketMethodHooks = {\n hasPermission: (permissionName: string) => boolean;\n openWebSocket: (url: string, protocols?: string[]) => Promise<string>;\n};\n\nconst OpenWebSocketParametersStruct = object({\n url: uri({ protocol: union([literal('wss:'), literal('ws:')]) }),\n protocols: optional(array(string())),\n});\n\nexport type OpenWebSocketParameters = InferMatching<\n typeof OpenWebSocketParametersStruct,\n OpenWebSocketParams\n>;\n\n/**\n * Handler for the `snap_openWebSocket` method.\n */\nexport const openWebSocketHandler: PermittedHandlerExport<\n OpenWebSocketMethodHooks,\n OpenWebSocketParams,\n OpenWebSocketResult\n> = {\n methodNames: ['snap_openWebSocket'],\n implementation: openWebSocketImplementation,\n hookNames,\n};\n\n/**\n * The `snap_openWebSocket` method implementation.\n *\n * @param req - The JSON-RPC request object.\n * @param res - The JSON-RPC response object.\n * @param _next - The `json-rpc-engine` \"next\" callback. Not used by this function.\n * @param end - The `json-rpc-engine` \"end\" callback.\n * @param hooks - The RPC method hooks.\n * @param hooks.hasPermission - The function to check if a snap has the `endowment:network-access` permission.\n * @param hooks.openWebSocket - The function to open a WebSocket.\n * @returns Nothing.\n */\nasync function openWebSocketImplementation(\n req: JsonRpcRequest<OpenWebSocketParameters>,\n res: PendingJsonRpcResponse<OpenWebSocketResult>,\n _next: unknown,\n end: JsonRpcEngineEndCallback,\n { hasPermission, openWebSocket }: OpenWebSocketMethodHooks,\n): Promise<void> {\n if (!hasPermission(SnapEndowments.NetworkAccess)) {\n return end(providerErrors.unauthorized());\n }\n\n const { params } = req;\n\n try {\n const { url, protocols } = getValidatedParams(params);\n res.result = await openWebSocket(url, protocols);\n } catch (error) {\n return end(error);\n }\n\n return end();\n}\n\n/**\n * Validates the parameters for the snap_openWebSocket method.\n *\n * @param params - Parameters to validate.\n * @returns Validated parameters.\n * @throws Throws RPC error if validation fails.\n */\nfunction getValidatedParams(params: unknown): OpenWebSocketParameters {\n try {\n return create(params, OpenWebSocketParametersStruct);\n } catch (error) {\n if (error instanceof StructError) {\n throw rpcErrors.invalidParams({\n message: `Invalid params: ${error.message}.`,\n });\n }\n /* istanbul ignore next */\n throw rpcErrors.internal();\n }\n}\n"]}
1
+ {"version":3,"file":"openWebSocket.cjs","sourceRoot":"","sources":["../../src/permitted/openWebSocket.ts"],"names":[],"mappings":";;;AAEA,qDAAiE;AACjE,mDAM6B;AAC7B,uDAAgE;AAChE,uDAO+B;AAG/B,wDAA+C;AAG/C,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAExC,MAAM,SAAS,GAAgD;IAC7D,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,IAAI;CACpB,CAAC;AAOF,MAAM,6BAA6B,GAAG,IAAA,oBAAM,EAAC;IAC3C,GAAG,EAAE,IAAA,iBAAG,EAAC,EAAE,QAAQ,EAAE,IAAA,iBAAK,EAAC,CAAC,IAAA,mBAAO,EAAC,MAAM,CAAC,EAAE,IAAA,mBAAO,EAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,SAAS,EAAE,IAAA,sBAAQ,EAAC,IAAA,mBAAK,EAAC,IAAA,oBAAM,GAAE,CAAC,CAAC;CACrC,CAAC,CAAC;AAOH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACU,QAAA,oBAAoB,GAAG;IAClC,WAAW,EAAE,CAAC,UAAU,CAAU;IAClC,cAAc,EAAE,2BAA2B;IAC3C,SAAS;CAKV,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,2BAA2B,CACxC,GAA4C,EAC5C,GAAgD,EAChD,KAAc,EACd,GAA6B,EAC7B,EAAE,aAAa,EAAE,aAAa,EAA4B;IAE1D,IAAI,CAAC,aAAa,CAAC,2BAAc,CAAC,aAAa,CAAC,EAAE,CAAC;QACjD,OAAO,GAAG,CAAC,2BAAc,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAEvB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACtD,GAAG,CAAC,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,GAAG,EAAE,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,MAAe;IACzC,IAAI,CAAC;QACH,OAAO,IAAA,oBAAM,EAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,yBAAW,EAAE,CAAC;YACjC,MAAM,sBAAS,CAAC,aAAa,CAAC;gBAC5B,OAAO,EAAE,mBAAmB,KAAK,CAAC,OAAO,GAAG;aAC7C,CAAC,CAAC;QACL,CAAC;QACD,0BAA0B;QAC1B,MAAM,sBAAS,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC","sourcesContent":["import type { JsonRpcEngineEndCallback } from '@metamask/json-rpc-engine';\nimport type { PermittedHandlerExport } from '@metamask/permission-controller';\nimport { providerErrors, rpcErrors } from '@metamask/rpc-errors';\nimport {\n literal,\n union,\n type JsonRpcRequest,\n type OpenWebSocketParams,\n type OpenWebSocketResult,\n} from '@metamask/snaps-sdk';\nimport { uri, type InferMatching } from '@metamask/snaps-utils';\nimport {\n create,\n object,\n array,\n string,\n optional,\n StructError,\n} from '@metamask/superstruct';\nimport type { PendingJsonRpcResponse } from '@metamask/utils';\n\nimport { SnapEndowments } from '../endowments';\nimport type { MethodHooksObject } from '../utils';\n\nconst methodName = 'snap_openWebSocket';\n\nconst hookNames: MethodHooksObject<OpenWebSocketMethodHooks> = {\n hasPermission: true,\n openWebSocket: true,\n};\n\nexport type OpenWebSocketMethodHooks = {\n hasPermission: (permissionName: string) => boolean;\n openWebSocket: (url: string, protocols?: string[]) => Promise<string>;\n};\n\nconst OpenWebSocketParametersStruct = object({\n url: uri({ protocol: union([literal('wss:'), literal('ws:')]) }),\n protocols: optional(array(string())),\n});\n\nexport type OpenWebSocketParameters = InferMatching<\n typeof OpenWebSocketParametersStruct,\n OpenWebSocketParams\n>;\n\n/**\n * Open a WebSocket connection to the specified URL with optional protocols.\n *\n * Note: This method is only available to snaps that have the\n * [`endowment:network-access`](https://docs.metamask.io/snaps/features/network-access/)\n * permission.\n *\n * @example\n * ```json name=\"Manifest\"\n * {\n * \"initialPermissions\": {\n * \"endowment:network-access\": {}\n * }\n * }\n * ```\n * ```ts name=\"Usage\"\n * // Open a connection to a WebSocket server, e.g., in the JSON-RPC handler of\n * // the Snap:\n * snap.request({\n * method: 'snap_openWebSocket',\n * params: {\n * url: 'wss://example.com/socket',\n * protocols: ['protocol1', 'protocol2'], // Optional\n * },\n * });\n *\n * // Listen for events from the WebSocket connection in the `onWebSocketEvent`\n * // handler of the Snap:\n * export const onWebSocketEvent: OnWebSocketEventHandler = async ({ event }) => {\n * switch (event.type) {\n * case 'open':\n * console.log(`WebSocket connection opened with origin ${event.origin}`);\n * break;\n * case 'message':\n * console.log(`WebSocket message received from origin ${event.origin}:`, event.data);\n * break;\n * case 'close':\n * console.log(`WebSocket connection closed with origin ${event.origin}`);\n * break;\n * case 'error':\n * console.error(`WebSocket error from origin ${event.origin}:`, event.error);\n * break;\n * }\n * };\n * ```\n */\nexport const openWebSocketHandler = {\n methodNames: [methodName] as const,\n implementation: openWebSocketImplementation,\n hookNames,\n} satisfies PermittedHandlerExport<\n OpenWebSocketMethodHooks,\n OpenWebSocketParams,\n OpenWebSocketResult\n>;\n\n/**\n * The `snap_openWebSocket` method implementation.\n *\n * @param req - The JSON-RPC request object.\n * @param res - The JSON-RPC response object.\n * @param _next - The `json-rpc-engine` \"next\" callback. Not used by this function.\n * @param end - The `json-rpc-engine` \"end\" callback.\n * @param hooks - The RPC method hooks.\n * @param hooks.hasPermission - The function to check if a snap has the `endowment:network-access` permission.\n * @param hooks.openWebSocket - The function to open a WebSocket.\n * @returns Nothing.\n */\nasync function openWebSocketImplementation(\n req: JsonRpcRequest<OpenWebSocketParameters>,\n res: PendingJsonRpcResponse<OpenWebSocketResult>,\n _next: unknown,\n end: JsonRpcEngineEndCallback,\n { hasPermission, openWebSocket }: OpenWebSocketMethodHooks,\n): Promise<void> {\n if (!hasPermission(SnapEndowments.NetworkAccess)) {\n return end(providerErrors.unauthorized());\n }\n\n const { params } = req;\n\n try {\n const { url, protocols } = getValidatedParams(params);\n res.result = await openWebSocket(url, protocols);\n } catch (error) {\n return end(error);\n }\n\n return end();\n}\n\n/**\n * Validates the parameters for the snap_openWebSocket method.\n *\n * @param params - Parameters to validate.\n * @returns Validated parameters.\n * @throws Throws RPC error if validation fails.\n */\nfunction getValidatedParams(params: unknown): OpenWebSocketParameters {\n try {\n return create(params, OpenWebSocketParametersStruct);\n } catch (error) {\n if (error instanceof StructError) {\n throw rpcErrors.invalidParams({\n message: `Invalid params: ${error.message}.`,\n });\n }\n /* istanbul ignore next */\n throw rpcErrors.internal();\n }\n}\n"]}
@@ -1,6 +1,8 @@
1
- import type { PermittedHandlerExport } from "@metamask/permission-controller";
2
- import { type OpenWebSocketParams, type OpenWebSocketResult } from "@metamask/snaps-sdk";
1
+ import type { JsonRpcEngineEndCallback } from "@metamask/json-rpc-engine";
2
+ import { type JsonRpcRequest, type OpenWebSocketParams, type OpenWebSocketResult } from "@metamask/snaps-sdk";
3
3
  import { type InferMatching } from "@metamask/snaps-utils";
4
+ import type { PendingJsonRpcResponse } from "@metamask/utils";
5
+ import type { MethodHooksObject } from "../utils.cjs";
4
6
  export type OpenWebSocketMethodHooks = {
5
7
  hasPermission: (permissionName: string) => boolean;
6
8
  openWebSocket: (url: string, protocols?: string[]) => Promise<string>;
@@ -14,8 +16,68 @@ declare const OpenWebSocketParametersStruct: import("@metamask/superstruct").Str
14
16
  }>;
15
17
  export type OpenWebSocketParameters = InferMatching<typeof OpenWebSocketParametersStruct, OpenWebSocketParams>;
16
18
  /**
17
- * Handler for the `snap_openWebSocket` method.
19
+ * Open a WebSocket connection to the specified URL with optional protocols.
20
+ *
21
+ * Note: This method is only available to snaps that have the
22
+ * [`endowment:network-access`](https://docs.metamask.io/snaps/features/network-access/)
23
+ * permission.
24
+ *
25
+ * @example
26
+ * ```json name="Manifest"
27
+ * {
28
+ * "initialPermissions": {
29
+ * "endowment:network-access": {}
30
+ * }
31
+ * }
32
+ * ```
33
+ * ```ts name="Usage"
34
+ * // Open a connection to a WebSocket server, e.g., in the JSON-RPC handler of
35
+ * // the Snap:
36
+ * snap.request({
37
+ * method: 'snap_openWebSocket',
38
+ * params: {
39
+ * url: 'wss://example.com/socket',
40
+ * protocols: ['protocol1', 'protocol2'], // Optional
41
+ * },
42
+ * });
43
+ *
44
+ * // Listen for events from the WebSocket connection in the `onWebSocketEvent`
45
+ * // handler of the Snap:
46
+ * export const onWebSocketEvent: OnWebSocketEventHandler = async ({ event }) => {
47
+ * switch (event.type) {
48
+ * case 'open':
49
+ * console.log(`WebSocket connection opened with origin ${event.origin}`);
50
+ * break;
51
+ * case 'message':
52
+ * console.log(`WebSocket message received from origin ${event.origin}:`, event.data);
53
+ * break;
54
+ * case 'close':
55
+ * console.log(`WebSocket connection closed with origin ${event.origin}`);
56
+ * break;
57
+ * case 'error':
58
+ * console.error(`WebSocket error from origin ${event.origin}:`, event.error);
59
+ * break;
60
+ * }
61
+ * };
62
+ * ```
18
63
  */
19
- export declare const openWebSocketHandler: PermittedHandlerExport<OpenWebSocketMethodHooks, OpenWebSocketParams, OpenWebSocketResult>;
64
+ export declare const openWebSocketHandler: {
65
+ methodNames: ["snap_openWebSocket"];
66
+ implementation: typeof openWebSocketImplementation;
67
+ hookNames: MethodHooksObject<OpenWebSocketMethodHooks>;
68
+ };
69
+ /**
70
+ * The `snap_openWebSocket` method implementation.
71
+ *
72
+ * @param req - The JSON-RPC request object.
73
+ * @param res - The JSON-RPC response object.
74
+ * @param _next - The `json-rpc-engine` "next" callback. Not used by this function.
75
+ * @param end - The `json-rpc-engine` "end" callback.
76
+ * @param hooks - The RPC method hooks.
77
+ * @param hooks.hasPermission - The function to check if a snap has the `endowment:network-access` permission.
78
+ * @param hooks.openWebSocket - The function to open a WebSocket.
79
+ * @returns Nothing.
80
+ */
81
+ declare function openWebSocketImplementation(req: JsonRpcRequest<OpenWebSocketParameters>, res: PendingJsonRpcResponse<OpenWebSocketResult>, _next: unknown, end: JsonRpcEngineEndCallback, { hasPermission, openWebSocket }: OpenWebSocketMethodHooks): Promise<void>;
20
82
  export {};
21
83
  //# sourceMappingURL=openWebSocket.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openWebSocket.d.cts","sourceRoot":"","sources":["../../src/permitted/openWebSocket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,wCAAwC;AAE9E,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACzB,4BAA4B;AAC7B,OAAO,EAAO,KAAK,aAAa,EAAE,8BAA8B;AAmBhE,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC;IACnD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACvE,CAAC;AAEF,QAAA,MAAM,6BAA6B;;;;;;EAGjC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,aAAa,CACjD,OAAO,6BAA6B,EACpC,mBAAmB,CACpB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,sBAAsB,CACvD,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,CAKpB,CAAC"}
1
+ {"version":3,"file":"openWebSocket.d.cts","sourceRoot":"","sources":["../../src/permitted/openWebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,kCAAkC;AAG1E,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACzB,4BAA4B;AAC7B,OAAO,EAAO,KAAK,aAAa,EAAE,8BAA8B;AAShE,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB;AAG9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAiB;AASlD,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC;IACnD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACvE,CAAC;AAEF,QAAA,MAAM,6BAA6B;;;;;;EAGjC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,aAAa,CACjD,OAAO,6BAA6B,EACpC,mBAAmB,CACpB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,eAAO,MAAM,oBAAoB;;;;CAQhC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,iBAAe,2BAA2B,CACxC,GAAG,EAAE,cAAc,CAAC,uBAAuB,CAAC,EAC5C,GAAG,EAAE,sBAAsB,CAAC,mBAAmB,CAAC,EAChD,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,wBAAwB,EAC7B,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,wBAAwB,GACzD,OAAO,CAAC,IAAI,CAAC,CAef"}
@@ -1,6 +1,8 @@
1
- import type { PermittedHandlerExport } from "@metamask/permission-controller";
2
- import { type OpenWebSocketParams, type OpenWebSocketResult } from "@metamask/snaps-sdk";
1
+ import type { JsonRpcEngineEndCallback } from "@metamask/json-rpc-engine";
2
+ import { type JsonRpcRequest, type OpenWebSocketParams, type OpenWebSocketResult } from "@metamask/snaps-sdk";
3
3
  import { type InferMatching } from "@metamask/snaps-utils";
4
+ import type { PendingJsonRpcResponse } from "@metamask/utils";
5
+ import type { MethodHooksObject } from "../utils.mjs";
4
6
  export type OpenWebSocketMethodHooks = {
5
7
  hasPermission: (permissionName: string) => boolean;
6
8
  openWebSocket: (url: string, protocols?: string[]) => Promise<string>;
@@ -14,8 +16,68 @@ declare const OpenWebSocketParametersStruct: import("@metamask/superstruct").Str
14
16
  }>;
15
17
  export type OpenWebSocketParameters = InferMatching<typeof OpenWebSocketParametersStruct, OpenWebSocketParams>;
16
18
  /**
17
- * Handler for the `snap_openWebSocket` method.
19
+ * Open a WebSocket connection to the specified URL with optional protocols.
20
+ *
21
+ * Note: This method is only available to snaps that have the
22
+ * [`endowment:network-access`](https://docs.metamask.io/snaps/features/network-access/)
23
+ * permission.
24
+ *
25
+ * @example
26
+ * ```json name="Manifest"
27
+ * {
28
+ * "initialPermissions": {
29
+ * "endowment:network-access": {}
30
+ * }
31
+ * }
32
+ * ```
33
+ * ```ts name="Usage"
34
+ * // Open a connection to a WebSocket server, e.g., in the JSON-RPC handler of
35
+ * // the Snap:
36
+ * snap.request({
37
+ * method: 'snap_openWebSocket',
38
+ * params: {
39
+ * url: 'wss://example.com/socket',
40
+ * protocols: ['protocol1', 'protocol2'], // Optional
41
+ * },
42
+ * });
43
+ *
44
+ * // Listen for events from the WebSocket connection in the `onWebSocketEvent`
45
+ * // handler of the Snap:
46
+ * export const onWebSocketEvent: OnWebSocketEventHandler = async ({ event }) => {
47
+ * switch (event.type) {
48
+ * case 'open':
49
+ * console.log(`WebSocket connection opened with origin ${event.origin}`);
50
+ * break;
51
+ * case 'message':
52
+ * console.log(`WebSocket message received from origin ${event.origin}:`, event.data);
53
+ * break;
54
+ * case 'close':
55
+ * console.log(`WebSocket connection closed with origin ${event.origin}`);
56
+ * break;
57
+ * case 'error':
58
+ * console.error(`WebSocket error from origin ${event.origin}:`, event.error);
59
+ * break;
60
+ * }
61
+ * };
62
+ * ```
18
63
  */
19
- export declare const openWebSocketHandler: PermittedHandlerExport<OpenWebSocketMethodHooks, OpenWebSocketParams, OpenWebSocketResult>;
64
+ export declare const openWebSocketHandler: {
65
+ methodNames: ["snap_openWebSocket"];
66
+ implementation: typeof openWebSocketImplementation;
67
+ hookNames: MethodHooksObject<OpenWebSocketMethodHooks>;
68
+ };
69
+ /**
70
+ * The `snap_openWebSocket` method implementation.
71
+ *
72
+ * @param req - The JSON-RPC request object.
73
+ * @param res - The JSON-RPC response object.
74
+ * @param _next - The `json-rpc-engine` "next" callback. Not used by this function.
75
+ * @param end - The `json-rpc-engine` "end" callback.
76
+ * @param hooks - The RPC method hooks.
77
+ * @param hooks.hasPermission - The function to check if a snap has the `endowment:network-access` permission.
78
+ * @param hooks.openWebSocket - The function to open a WebSocket.
79
+ * @returns Nothing.
80
+ */
81
+ declare function openWebSocketImplementation(req: JsonRpcRequest<OpenWebSocketParameters>, res: PendingJsonRpcResponse<OpenWebSocketResult>, _next: unknown, end: JsonRpcEngineEndCallback, { hasPermission, openWebSocket }: OpenWebSocketMethodHooks): Promise<void>;
20
82
  export {};
21
83
  //# sourceMappingURL=openWebSocket.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openWebSocket.d.mts","sourceRoot":"","sources":["../../src/permitted/openWebSocket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,wCAAwC;AAE9E,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACzB,4BAA4B;AAC7B,OAAO,EAAO,KAAK,aAAa,EAAE,8BAA8B;AAmBhE,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC;IACnD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACvE,CAAC;AAEF,QAAA,MAAM,6BAA6B;;;;;;EAGjC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,aAAa,CACjD,OAAO,6BAA6B,EACpC,mBAAmB,CACpB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,sBAAsB,CACvD,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,CAKpB,CAAC"}
1
+ {"version":3,"file":"openWebSocket.d.mts","sourceRoot":"","sources":["../../src/permitted/openWebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,kCAAkC;AAG1E,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACzB,4BAA4B;AAC7B,OAAO,EAAO,KAAK,aAAa,EAAE,8BAA8B;AAShE,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB;AAG9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAiB;AASlD,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC;IACnD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACvE,CAAC;AAEF,QAAA,MAAM,6BAA6B;;;;;;EAGjC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,aAAa,CACjD,OAAO,6BAA6B,EACpC,mBAAmB,CACpB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,eAAO,MAAM,oBAAoB;;;;CAQhC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,iBAAe,2BAA2B,CACxC,GAAG,EAAE,cAAc,CAAC,uBAAuB,CAAC,EAC5C,GAAG,EAAE,sBAAsB,CAAC,mBAAmB,CAAC,EAChD,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,wBAAwB,EAC7B,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,wBAAwB,GACzD,OAAO,CAAC,IAAI,CAAC,CAef"}
@@ -3,6 +3,7 @@ import { literal, union } from "@metamask/snaps-sdk";
3
3
  import { uri } from "@metamask/snaps-utils";
4
4
  import { create, object, array, string, optional, StructError } from "@metamask/superstruct";
5
5
  import { SnapEndowments } from "../endowments/index.mjs";
6
+ const methodName = 'snap_openWebSocket';
6
7
  const hookNames = {
7
8
  hasPermission: true,
8
9
  openWebSocket: true,
@@ -12,10 +13,53 @@ const OpenWebSocketParametersStruct = object({
12
13
  protocols: optional(array(string())),
13
14
  });
14
15
  /**
15
- * Handler for the `snap_openWebSocket` method.
16
+ * Open a WebSocket connection to the specified URL with optional protocols.
17
+ *
18
+ * Note: This method is only available to snaps that have the
19
+ * [`endowment:network-access`](https://docs.metamask.io/snaps/features/network-access/)
20
+ * permission.
21
+ *
22
+ * @example
23
+ * ```json name="Manifest"
24
+ * {
25
+ * "initialPermissions": {
26
+ * "endowment:network-access": {}
27
+ * }
28
+ * }
29
+ * ```
30
+ * ```ts name="Usage"
31
+ * // Open a connection to a WebSocket server, e.g., in the JSON-RPC handler of
32
+ * // the Snap:
33
+ * snap.request({
34
+ * method: 'snap_openWebSocket',
35
+ * params: {
36
+ * url: 'wss://example.com/socket',
37
+ * protocols: ['protocol1', 'protocol2'], // Optional
38
+ * },
39
+ * });
40
+ *
41
+ * // Listen for events from the WebSocket connection in the `onWebSocketEvent`
42
+ * // handler of the Snap:
43
+ * export const onWebSocketEvent: OnWebSocketEventHandler = async ({ event }) => {
44
+ * switch (event.type) {
45
+ * case 'open':
46
+ * console.log(`WebSocket connection opened with origin ${event.origin}`);
47
+ * break;
48
+ * case 'message':
49
+ * console.log(`WebSocket message received from origin ${event.origin}:`, event.data);
50
+ * break;
51
+ * case 'close':
52
+ * console.log(`WebSocket connection closed with origin ${event.origin}`);
53
+ * break;
54
+ * case 'error':
55
+ * console.error(`WebSocket error from origin ${event.origin}:`, event.error);
56
+ * break;
57
+ * }
58
+ * };
59
+ * ```
16
60
  */
17
61
  export const openWebSocketHandler = {
18
- methodNames: ['snap_openWebSocket'],
62
+ methodNames: [methodName],
19
63
  implementation: openWebSocketImplementation,
20
64
  hookNames,
21
65
  };
@@ -1 +1 @@
1
- {"version":3,"file":"openWebSocket.mjs","sourceRoot":"","sources":["../../src/permitted/openWebSocket.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,6BAA6B;AACjE,OAAO,EACL,OAAO,EACP,KAAK,EAIN,4BAA4B;AAC7B,OAAO,EAAE,GAAG,EAAsB,8BAA8B;AAChE,OAAO,EACL,MAAM,EACN,MAAM,EACN,KAAK,EACL,MAAM,EACN,QAAQ,EACR,WAAW,EACZ,8BAA8B;AAG/B,OAAO,EAAE,cAAc,EAAE,gCAAsB;AAG/C,MAAM,SAAS,GAAgD;IAC7D,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,IAAI;CACpB,CAAC;AAOF,MAAM,6BAA6B,GAAG,MAAM,CAAC;IAC3C,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;CACrC,CAAC,CAAC;AAOH;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAI7B;IACF,WAAW,EAAE,CAAC,oBAAoB,CAAC;IACnC,cAAc,EAAE,2BAA2B;IAC3C,SAAS;CACV,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,2BAA2B,CACxC,GAA4C,EAC5C,GAAgD,EAChD,KAAc,EACd,GAA6B,EAC7B,EAAE,aAAa,EAAE,aAAa,EAA4B;IAE1D,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;QACjD,OAAO,GAAG,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAEvB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACtD,GAAG,CAAC,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,GAAG,EAAE,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,MAAe;IACzC,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,SAAS,CAAC,aAAa,CAAC;gBAC5B,OAAO,EAAE,mBAAmB,KAAK,CAAC,OAAO,GAAG;aAC7C,CAAC,CAAC;QACL,CAAC;QACD,0BAA0B;QAC1B,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC","sourcesContent":["import type { JsonRpcEngineEndCallback } from '@metamask/json-rpc-engine';\nimport type { PermittedHandlerExport } from '@metamask/permission-controller';\nimport { providerErrors, rpcErrors } from '@metamask/rpc-errors';\nimport {\n literal,\n union,\n type JsonRpcRequest,\n type OpenWebSocketParams,\n type OpenWebSocketResult,\n} from '@metamask/snaps-sdk';\nimport { uri, type InferMatching } from '@metamask/snaps-utils';\nimport {\n create,\n object,\n array,\n string,\n optional,\n StructError,\n} from '@metamask/superstruct';\nimport type { PendingJsonRpcResponse } from '@metamask/utils';\n\nimport { SnapEndowments } from '../endowments';\nimport type { MethodHooksObject } from '../utils';\n\nconst hookNames: MethodHooksObject<OpenWebSocketMethodHooks> = {\n hasPermission: true,\n openWebSocket: true,\n};\n\nexport type OpenWebSocketMethodHooks = {\n hasPermission: (permissionName: string) => boolean;\n openWebSocket: (url: string, protocols?: string[]) => Promise<string>;\n};\n\nconst OpenWebSocketParametersStruct = object({\n url: uri({ protocol: union([literal('wss:'), literal('ws:')]) }),\n protocols: optional(array(string())),\n});\n\nexport type OpenWebSocketParameters = InferMatching<\n typeof OpenWebSocketParametersStruct,\n OpenWebSocketParams\n>;\n\n/**\n * Handler for the `snap_openWebSocket` method.\n */\nexport const openWebSocketHandler: PermittedHandlerExport<\n OpenWebSocketMethodHooks,\n OpenWebSocketParams,\n OpenWebSocketResult\n> = {\n methodNames: ['snap_openWebSocket'],\n implementation: openWebSocketImplementation,\n hookNames,\n};\n\n/**\n * The `snap_openWebSocket` method implementation.\n *\n * @param req - The JSON-RPC request object.\n * @param res - The JSON-RPC response object.\n * @param _next - The `json-rpc-engine` \"next\" callback. Not used by this function.\n * @param end - The `json-rpc-engine` \"end\" callback.\n * @param hooks - The RPC method hooks.\n * @param hooks.hasPermission - The function to check if a snap has the `endowment:network-access` permission.\n * @param hooks.openWebSocket - The function to open a WebSocket.\n * @returns Nothing.\n */\nasync function openWebSocketImplementation(\n req: JsonRpcRequest<OpenWebSocketParameters>,\n res: PendingJsonRpcResponse<OpenWebSocketResult>,\n _next: unknown,\n end: JsonRpcEngineEndCallback,\n { hasPermission, openWebSocket }: OpenWebSocketMethodHooks,\n): Promise<void> {\n if (!hasPermission(SnapEndowments.NetworkAccess)) {\n return end(providerErrors.unauthorized());\n }\n\n const { params } = req;\n\n try {\n const { url, protocols } = getValidatedParams(params);\n res.result = await openWebSocket(url, protocols);\n } catch (error) {\n return end(error);\n }\n\n return end();\n}\n\n/**\n * Validates the parameters for the snap_openWebSocket method.\n *\n * @param params - Parameters to validate.\n * @returns Validated parameters.\n * @throws Throws RPC error if validation fails.\n */\nfunction getValidatedParams(params: unknown): OpenWebSocketParameters {\n try {\n return create(params, OpenWebSocketParametersStruct);\n } catch (error) {\n if (error instanceof StructError) {\n throw rpcErrors.invalidParams({\n message: `Invalid params: ${error.message}.`,\n });\n }\n /* istanbul ignore next */\n throw rpcErrors.internal();\n }\n}\n"]}
1
+ {"version":3,"file":"openWebSocket.mjs","sourceRoot":"","sources":["../../src/permitted/openWebSocket.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,6BAA6B;AACjE,OAAO,EACL,OAAO,EACP,KAAK,EAIN,4BAA4B;AAC7B,OAAO,EAAE,GAAG,EAAsB,8BAA8B;AAChE,OAAO,EACL,MAAM,EACN,MAAM,EACN,KAAK,EACL,MAAM,EACN,QAAQ,EACR,WAAW,EACZ,8BAA8B;AAG/B,OAAO,EAAE,cAAc,EAAE,gCAAsB;AAG/C,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAExC,MAAM,SAAS,GAAgD;IAC7D,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,IAAI;CACpB,CAAC;AAOF,MAAM,6BAA6B,GAAG,MAAM,CAAC;IAC3C,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;CACrC,CAAC,CAAC;AAOH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,WAAW,EAAE,CAAC,UAAU,CAAU;IAClC,cAAc,EAAE,2BAA2B;IAC3C,SAAS;CAKV,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,2BAA2B,CACxC,GAA4C,EAC5C,GAAgD,EAChD,KAAc,EACd,GAA6B,EAC7B,EAAE,aAAa,EAAE,aAAa,EAA4B;IAE1D,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;QACjD,OAAO,GAAG,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAEvB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACtD,GAAG,CAAC,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,GAAG,EAAE,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,MAAe;IACzC,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,SAAS,CAAC,aAAa,CAAC;gBAC5B,OAAO,EAAE,mBAAmB,KAAK,CAAC,OAAO,GAAG;aAC7C,CAAC,CAAC;QACL,CAAC;QACD,0BAA0B;QAC1B,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC","sourcesContent":["import type { JsonRpcEngineEndCallback } from '@metamask/json-rpc-engine';\nimport type { PermittedHandlerExport } from '@metamask/permission-controller';\nimport { providerErrors, rpcErrors } from '@metamask/rpc-errors';\nimport {\n literal,\n union,\n type JsonRpcRequest,\n type OpenWebSocketParams,\n type OpenWebSocketResult,\n} from '@metamask/snaps-sdk';\nimport { uri, type InferMatching } from '@metamask/snaps-utils';\nimport {\n create,\n object,\n array,\n string,\n optional,\n StructError,\n} from '@metamask/superstruct';\nimport type { PendingJsonRpcResponse } from '@metamask/utils';\n\nimport { SnapEndowments } from '../endowments';\nimport type { MethodHooksObject } from '../utils';\n\nconst methodName = 'snap_openWebSocket';\n\nconst hookNames: MethodHooksObject<OpenWebSocketMethodHooks> = {\n hasPermission: true,\n openWebSocket: true,\n};\n\nexport type OpenWebSocketMethodHooks = {\n hasPermission: (permissionName: string) => boolean;\n openWebSocket: (url: string, protocols?: string[]) => Promise<string>;\n};\n\nconst OpenWebSocketParametersStruct = object({\n url: uri({ protocol: union([literal('wss:'), literal('ws:')]) }),\n protocols: optional(array(string())),\n});\n\nexport type OpenWebSocketParameters = InferMatching<\n typeof OpenWebSocketParametersStruct,\n OpenWebSocketParams\n>;\n\n/**\n * Open a WebSocket connection to the specified URL with optional protocols.\n *\n * Note: This method is only available to snaps that have the\n * [`endowment:network-access`](https://docs.metamask.io/snaps/features/network-access/)\n * permission.\n *\n * @example\n * ```json name=\"Manifest\"\n * {\n * \"initialPermissions\": {\n * \"endowment:network-access\": {}\n * }\n * }\n * ```\n * ```ts name=\"Usage\"\n * // Open a connection to a WebSocket server, e.g., in the JSON-RPC handler of\n * // the Snap:\n * snap.request({\n * method: 'snap_openWebSocket',\n * params: {\n * url: 'wss://example.com/socket',\n * protocols: ['protocol1', 'protocol2'], // Optional\n * },\n * });\n *\n * // Listen for events from the WebSocket connection in the `onWebSocketEvent`\n * // handler of the Snap:\n * export const onWebSocketEvent: OnWebSocketEventHandler = async ({ event }) => {\n * switch (event.type) {\n * case 'open':\n * console.log(`WebSocket connection opened with origin ${event.origin}`);\n * break;\n * case 'message':\n * console.log(`WebSocket message received from origin ${event.origin}:`, event.data);\n * break;\n * case 'close':\n * console.log(`WebSocket connection closed with origin ${event.origin}`);\n * break;\n * case 'error':\n * console.error(`WebSocket error from origin ${event.origin}:`, event.error);\n * break;\n * }\n * };\n * ```\n */\nexport const openWebSocketHandler = {\n methodNames: [methodName] as const,\n implementation: openWebSocketImplementation,\n hookNames,\n} satisfies PermittedHandlerExport<\n OpenWebSocketMethodHooks,\n OpenWebSocketParams,\n OpenWebSocketResult\n>;\n\n/**\n * The `snap_openWebSocket` method implementation.\n *\n * @param req - The JSON-RPC request object.\n * @param res - The JSON-RPC response object.\n * @param _next - The `json-rpc-engine` \"next\" callback. Not used by this function.\n * @param end - The `json-rpc-engine` \"end\" callback.\n * @param hooks - The RPC method hooks.\n * @param hooks.hasPermission - The function to check if a snap has the `endowment:network-access` permission.\n * @param hooks.openWebSocket - The function to open a WebSocket.\n * @returns Nothing.\n */\nasync function openWebSocketImplementation(\n req: JsonRpcRequest<OpenWebSocketParameters>,\n res: PendingJsonRpcResponse<OpenWebSocketResult>,\n _next: unknown,\n end: JsonRpcEngineEndCallback,\n { hasPermission, openWebSocket }: OpenWebSocketMethodHooks,\n): Promise<void> {\n if (!hasPermission(SnapEndowments.NetworkAccess)) {\n return end(providerErrors.unauthorized());\n }\n\n const { params } = req;\n\n try {\n const { url, protocols } = getValidatedParams(params);\n res.result = await openWebSocket(url, protocols);\n } catch (error) {\n return end(error);\n }\n\n return end();\n}\n\n/**\n * Validates the parameters for the snap_openWebSocket method.\n *\n * @param params - Parameters to validate.\n * @returns Validated parameters.\n * @throws Throws RPC error if validation fails.\n */\nfunction getValidatedParams(params: unknown): OpenWebSocketParameters {\n try {\n return create(params, OpenWebSocketParametersStruct);\n } catch (error) {\n if (error instanceof StructError) {\n throw rpcErrors.invalidParams({\n message: `Invalid params: ${error.message}.`,\n });\n }\n /* istanbul ignore next */\n throw rpcErrors.internal();\n }\n}\n"]}
@@ -6,16 +6,39 @@ const snaps_utils_1 = require("@metamask/snaps-utils");
6
6
  const utils_1 = require("@metamask/utils");
7
7
  const async_mutex_1 = require("async-mutex");
8
8
  const invokeSnap_1 = require("../restricted/invokeSnap.cjs");
9
+ const methodName = 'wallet_requestSnaps';
9
10
  const hookNames = {
10
11
  installSnaps: true,
11
12
  requestPermissions: true,
12
13
  getPermissions: true,
13
14
  };
14
15
  /**
15
- * `wallet_requestSnaps` installs the requested Snaps and requests permission to use them if necessary.
16
+ * Request permission for a dapp to communicate with the specified Snaps and
17
+ * attempt to install them if they're not already installed.
18
+ *
19
+ * If the Snap version range is specified, MetaMask attempts to install a
20
+ * version of the Snap that satisfies the range. If a compatible version of the
21
+ * Snap is already installed, the request succeeds. If an incompatible version
22
+ * is installed, MetaMask attempts to update the Snap to the latest version that
23
+ * satisfies the range. The request succeeds if the Snap is successfully
24
+ * installed.
25
+ *
26
+ * If the installation of any Snap fails, or the user rejects the installation
27
+ * or permission request, this method returns the error that caused the failure.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * const result = await snap.request({
32
+ * method: 'wallet_requestSnaps',
33
+ * params: {
34
+ * 'npm:@metamask/example-snap': {},
35
+ * 'npm:@metamask/another-snap': { version: '1.2.3' },
36
+ * },
37
+ * });
38
+ * ```
16
39
  */
17
40
  exports.requestSnapsHandler = {
18
- methodNames: ['wallet_requestSnaps'],
41
+ methodNames: [methodName],
19
42
  implementation: requestSnapsImplementation,
20
43
  hookNames,
21
44
  };
@@ -1 +1 @@
1
- {"version":3,"file":"requestSnaps.cjs","sourceRoot":"","sources":["../../src/permitted/requestSnaps.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonRpcEngineEndCallback } from '@metamask/json-rpc-engine';\nimport type {\n PermissionConstraint,\n RequestedPermissions,\n Caveat,\n PermittedHandlerExport,\n} from '@metamask/permission-controller';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type {\n RequestSnapsParams,\n RequestSnapsResult,\n} from '@metamask/snaps-sdk';\nimport type { SnapsPermissionRequest } from '@metamask/snaps-utils';\nimport {\n SnapCaveatType,\n verifyRequestedSnapPermissions,\n} from '@metamask/snaps-utils';\nimport type {\n JsonRpcRequest,\n PendingJsonRpcResponse,\n Json,\n} from '@metamask/utils';\nimport { hasProperty, isObject } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\n\nimport { WALLET_SNAP_PERMISSION_KEY } from '../restricted/invokeSnap';\nimport type { MethodHooksObject } from '../utils';\n\nconst hookNames: MethodHooksObject<RequestSnapsHooks> = {\n installSnaps: true,\n requestPermissions: true,\n getPermissions: true,\n};\n\n/**\n * `wallet_requestSnaps` installs the requested Snaps and requests permission to use them if necessary.\n */\nexport const requestSnapsHandler: PermittedHandlerExport<\n RequestSnapsHooks,\n RequestSnapsParams,\n RequestSnapsResult\n> = {\n methodNames: ['wallet_requestSnaps'],\n implementation: requestSnapsImplementation,\n hookNames,\n};\n\nexport type RequestSnapsHooks = {\n /**\n * Installs the requested snaps if they are permitted.\n */\n installSnaps: (\n requestedSnaps: RequestSnapsParams,\n ) => Promise<RequestSnapsResult>;\n\n /**\n * Initiates a permission request for the requesting origin.\n *\n * @returns The result of the permissions request.\n */\n requestPermissions: (\n permissions: RequestedPermissions,\n ) => Promise<\n [\n Record<string, PermissionConstraint>,\n { data: Record<string, unknown>; id: string; origin: string },\n ]\n >;\n\n /**\n * Gets the current permissions for the requesting origin.\n *\n * @returns The current permissions of the requesting origin.\n */\n getPermissions: () => Promise<\n Record<string, PermissionConstraint> | undefined\n >;\n};\n\n/**\n * Checks whether an origin has existing `wallet_snap` permission and\n * whether or not it has the requested snapIds caveat.\n *\n * @param existingPermissions - The existing permissions for the origin.\n * @param requestedSnaps - The requested snaps.\n * @returns True if the existing permissions satisfy the requested snaps, otherwise false.\n */\nexport function hasRequestedSnaps(\n existingPermissions: Record<string, PermissionConstraint>,\n requestedSnaps: Record<string, unknown>,\n): boolean {\n const snapIdCaveat = existingPermissions[\n WALLET_SNAP_PERMISSION_KEY\n ]?.caveats?.find(\n (caveat: Caveat<string, Json>) => caveat.type === SnapCaveatType.SnapIds,\n );\n\n const permittedSnaps = snapIdCaveat?.value;\n if (isObject(permittedSnaps)) {\n return Object.keys(requestedSnaps).every((requestedSnap) =>\n hasProperty(permittedSnaps, requestedSnap),\n );\n }\n return false;\n}\n\n/**\n * Constructs a valid permission request with merged caveats based on existing permissions\n * and the requested snaps.\n *\n * @param existingPermissions - The existing permissions for the origin.\n * @param requestedPermissions - The permission request passed into `requestPermissions`.\n * @returns `requestedPermissions`.\n */\nexport function getSnapPermissionsRequest(\n existingPermissions: Record<string, PermissionConstraint>,\n requestedPermissions: unknown,\n): SnapsPermissionRequest {\n verifyRequestedSnapPermissions(requestedPermissions);\n\n if (!existingPermissions[WALLET_SNAP_PERMISSION_KEY]) {\n return requestedPermissions;\n }\n\n const snapIdCaveat = existingPermissions[\n WALLET_SNAP_PERMISSION_KEY\n ].caveats?.find(\n (caveat: Caveat<string, Json>) => caveat.type === SnapCaveatType.SnapIds,\n );\n\n const permittedSnaps = (snapIdCaveat?.value as Record<string, Json>) ?? {};\n\n const requestedSnaps =\n requestedPermissions[WALLET_SNAP_PERMISSION_KEY].caveats[0].value;\n\n const snapIdSet = new Set([\n ...Object.keys(permittedSnaps),\n ...Object.keys(requestedSnaps),\n ]);\n\n const mergedCaveatValue = [...snapIdSet].reduce<Record<string, Json>>(\n (request, snapId) => {\n request[snapId] = requestedSnaps[snapId] ?? permittedSnaps[snapId];\n return request;\n },\n {},\n );\n\n requestedPermissions[WALLET_SNAP_PERMISSION_KEY].caveats[0].value =\n mergedCaveatValue;\n\n return requestedPermissions;\n}\n\nconst mutexes = new Map();\n\n/**\n * Get the corresponding Snap installation mutex for a given origin.\n *\n * @param origin - The origin of the request.\n * @returns A mutex for that specific origin.\n */\nfunction getMutex(origin: string) {\n if (!mutexes.has(origin)) {\n mutexes.set(origin, new Mutex());\n }\n return mutexes.get(origin);\n}\n\n/**\n * The `wallet_requestSnaps` method implementation.\n * Tries to install the requested snaps and adds them to the JSON-RPC response.\n *\n * @param req - The JSON-RPC request object.\n * @param res - The JSON-RPC response object.\n * @param _next - The `json-rpc-engine` \"next\" callback. Not used by this\n * function.\n * @param end - The `json-rpc-engine` \"end\" callback.\n * @param hooks - The RPC method hooks.\n * @param hooks.installSnaps - A function that tries to install a given snap, prompting the user if necessary.\n * @param hooks.requestPermissions - A function that requests permissions on\n * behalf of a subject.\n * @param hooks.getPermissions - A function that gets the current permissions.\n * @returns A promise that resolves once the JSON-RPC response has been modified.\n * @throws If the params are invalid.\n */\nasync function requestSnapsImplementation(\n req: JsonRpcRequest<RequestSnapsParams>,\n res: PendingJsonRpcResponse<RequestSnapsResult>,\n _next: unknown,\n end: JsonRpcEngineEndCallback,\n { installSnaps, requestPermissions, getPermissions }: RequestSnapsHooks,\n): Promise<void> {\n const requestedSnaps = req.params;\n if (!isObject(requestedSnaps)) {\n return end(\n rpcErrors.invalidParams({\n message: '\"params\" must be an object.',\n }),\n );\n }\n\n if (Object.keys(requestedSnaps).length === 0) {\n return end(\n rpcErrors.invalidParams({\n message: 'Request must have at least one requested snap.',\n }),\n );\n }\n\n // We expect the MM middleware stack to always add the origin to requests\n const { origin } = req as JsonRpcRequest & { origin: string };\n\n const mutex = getMutex(origin);\n\n // Process requests sequentially for each origin as permissions need to be merged\n // for every request.\n await mutex.runExclusive(async () => {\n try {\n const requestedPermissions = {\n [WALLET_SNAP_PERMISSION_KEY]: {\n caveats: [{ type: SnapCaveatType.SnapIds, value: requestedSnaps }],\n },\n } as RequestedPermissions;\n const existingPermissions = await getPermissions();\n\n if (!existingPermissions) {\n const [, metadata] = await requestPermissions(requestedPermissions);\n res.result = metadata.data[\n WALLET_SNAP_PERMISSION_KEY\n ] as RequestSnapsResult;\n } else if (hasRequestedSnaps(existingPermissions, requestedSnaps)) {\n res.result = await installSnaps(requestedSnaps);\n } else {\n const mergedPermissionsRequest = getSnapPermissionsRequest(\n existingPermissions,\n requestedPermissions,\n );\n\n const [, metadata] = await requestPermissions(mergedPermissionsRequest);\n res.result = metadata.data[\n WALLET_SNAP_PERMISSION_KEY\n ] as RequestSnapsResult;\n }\n } catch (error) {\n res.error = error;\n }\n });\n\n return end();\n}\n"]}
1
+ {"version":3,"file":"requestSnaps.cjs","sourceRoot":"","sources":["../../src/permitted/requestSnaps.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonRpcEngineEndCallback } from '@metamask/json-rpc-engine';\nimport type {\n PermissionConstraint,\n RequestedPermissions,\n Caveat,\n PermittedHandlerExport,\n} from '@metamask/permission-controller';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type {\n RequestSnapsParams,\n RequestSnapsResult,\n} from '@metamask/snaps-sdk';\nimport type { SnapsPermissionRequest } from '@metamask/snaps-utils';\nimport {\n SnapCaveatType,\n verifyRequestedSnapPermissions,\n} from '@metamask/snaps-utils';\nimport type {\n JsonRpcRequest,\n PendingJsonRpcResponse,\n Json,\n} from '@metamask/utils';\nimport { hasProperty, isObject } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\n\nimport { WALLET_SNAP_PERMISSION_KEY } from '../restricted/invokeSnap';\nimport type { MethodHooksObject } from '../utils';\n\nconst methodName = 'wallet_requestSnaps';\n\nconst hookNames: MethodHooksObject<RequestSnapsHooks> = {\n installSnaps: true,\n requestPermissions: true,\n getPermissions: true,\n};\n\n/**\n * Request permission for a dapp to communicate with the specified Snaps and\n * attempt to install them if they're not already installed.\n *\n * If the Snap version range is specified, MetaMask attempts to install a\n * version of the Snap that satisfies the range. If a compatible version of the\n * Snap is already installed, the request succeeds. If an incompatible version\n * is installed, MetaMask attempts to update the Snap to the latest version that\n * satisfies the range. The request succeeds if the Snap is successfully\n * installed.\n *\n * If the installation of any Snap fails, or the user rejects the installation\n * or permission request, this method returns the error that caused the failure.\n *\n * @example\n * ```ts\n * const result = await snap.request({\n * method: 'wallet_requestSnaps',\n * params: {\n * 'npm:@metamask/example-snap': {},\n * 'npm:@metamask/another-snap': { version: '1.2.3' },\n * },\n * });\n * ```\n */\nexport const requestSnapsHandler = {\n methodNames: [methodName] as const,\n implementation: requestSnapsImplementation,\n hookNames,\n} satisfies PermittedHandlerExport<\n RequestSnapsHooks,\n RequestSnapsParams,\n RequestSnapsResult\n>;\n\nexport type RequestSnapsHooks = {\n /**\n * Installs the requested snaps if they are permitted.\n */\n installSnaps: (\n requestedSnaps: RequestSnapsParams,\n ) => Promise<RequestSnapsResult>;\n\n /**\n * Initiates a permission request for the requesting origin.\n *\n * @returns The result of the permissions request.\n */\n requestPermissions: (\n permissions: RequestedPermissions,\n ) => Promise<\n [\n Record<string, PermissionConstraint>,\n { data: Record<string, unknown>; id: string; origin: string },\n ]\n >;\n\n /**\n * Gets the current permissions for the requesting origin.\n *\n * @returns The current permissions of the requesting origin.\n */\n getPermissions: () => Promise<\n Record<string, PermissionConstraint> | undefined\n >;\n};\n\n/**\n * Checks whether an origin has existing `wallet_snap` permission and\n * whether or not it has the requested snapIds caveat.\n *\n * @param existingPermissions - The existing permissions for the origin.\n * @param requestedSnaps - The requested snaps.\n * @returns True if the existing permissions satisfy the requested snaps, otherwise false.\n */\nexport function hasRequestedSnaps(\n existingPermissions: Record<string, PermissionConstraint>,\n requestedSnaps: Record<string, unknown>,\n): boolean {\n const snapIdCaveat = existingPermissions[\n WALLET_SNAP_PERMISSION_KEY\n ]?.caveats?.find(\n (caveat: Caveat<string, Json>) => caveat.type === SnapCaveatType.SnapIds,\n );\n\n const permittedSnaps = snapIdCaveat?.value;\n if (isObject(permittedSnaps)) {\n return Object.keys(requestedSnaps).every((requestedSnap) =>\n hasProperty(permittedSnaps, requestedSnap),\n );\n }\n return false;\n}\n\n/**\n * Constructs a valid permission request with merged caveats based on existing permissions\n * and the requested snaps.\n *\n * @param existingPermissions - The existing permissions for the origin.\n * @param requestedPermissions - The permission request passed into `requestPermissions`.\n * @returns `requestedPermissions`.\n */\nexport function getSnapPermissionsRequest(\n existingPermissions: Record<string, PermissionConstraint>,\n requestedPermissions: unknown,\n): SnapsPermissionRequest {\n verifyRequestedSnapPermissions(requestedPermissions);\n\n if (!existingPermissions[WALLET_SNAP_PERMISSION_KEY]) {\n return requestedPermissions;\n }\n\n const snapIdCaveat = existingPermissions[\n WALLET_SNAP_PERMISSION_KEY\n ].caveats?.find(\n (caveat: Caveat<string, Json>) => caveat.type === SnapCaveatType.SnapIds,\n );\n\n const permittedSnaps = (snapIdCaveat?.value as Record<string, Json>) ?? {};\n\n const requestedSnaps =\n requestedPermissions[WALLET_SNAP_PERMISSION_KEY].caveats[0].value;\n\n const snapIdSet = new Set([\n ...Object.keys(permittedSnaps),\n ...Object.keys(requestedSnaps),\n ]);\n\n const mergedCaveatValue = [...snapIdSet].reduce<Record<string, Json>>(\n (request, snapId) => {\n request[snapId] = requestedSnaps[snapId] ?? permittedSnaps[snapId];\n return request;\n },\n {},\n );\n\n requestedPermissions[WALLET_SNAP_PERMISSION_KEY].caveats[0].value =\n mergedCaveatValue;\n\n return requestedPermissions;\n}\n\nconst mutexes = new Map();\n\n/**\n * Get the corresponding Snap installation mutex for a given origin.\n *\n * @param origin - The origin of the request.\n * @returns A mutex for that specific origin.\n */\nfunction getMutex(origin: string) {\n if (!mutexes.has(origin)) {\n mutexes.set(origin, new Mutex());\n }\n return mutexes.get(origin);\n}\n\n/**\n * The `wallet_requestSnaps` method implementation.\n * Tries to install the requested snaps and adds them to the JSON-RPC response.\n *\n * @param req - The JSON-RPC request object.\n * @param res - The JSON-RPC response object.\n * @param _next - The `json-rpc-engine` \"next\" callback. Not used by this\n * function.\n * @param end - The `json-rpc-engine` \"end\" callback.\n * @param hooks - The RPC method hooks.\n * @param hooks.installSnaps - A function that tries to install a given snap, prompting the user if necessary.\n * @param hooks.requestPermissions - A function that requests permissions on\n * behalf of a subject.\n * @param hooks.getPermissions - A function that gets the current permissions.\n * @returns A promise that resolves once the JSON-RPC response has been modified.\n * @throws If the params are invalid.\n */\nasync function requestSnapsImplementation(\n req: JsonRpcRequest<RequestSnapsParams>,\n res: PendingJsonRpcResponse<RequestSnapsResult>,\n _next: unknown,\n end: JsonRpcEngineEndCallback,\n { installSnaps, requestPermissions, getPermissions }: RequestSnapsHooks,\n): Promise<void> {\n const requestedSnaps = req.params;\n if (!isObject(requestedSnaps)) {\n return end(\n rpcErrors.invalidParams({\n message: '\"params\" must be an object.',\n }),\n );\n }\n\n if (Object.keys(requestedSnaps).length === 0) {\n return end(\n rpcErrors.invalidParams({\n message: 'Request must have at least one requested snap.',\n }),\n );\n }\n\n // We expect the MM middleware stack to always add the origin to requests\n const { origin } = req as JsonRpcRequest & { origin: string };\n\n const mutex = getMutex(origin);\n\n // Process requests sequentially for each origin as permissions need to be merged\n // for every request.\n await mutex.runExclusive(async () => {\n try {\n const requestedPermissions = {\n [WALLET_SNAP_PERMISSION_KEY]: {\n caveats: [{ type: SnapCaveatType.SnapIds, value: requestedSnaps }],\n },\n } as RequestedPermissions;\n const existingPermissions = await getPermissions();\n\n if (!existingPermissions) {\n const [, metadata] = await requestPermissions(requestedPermissions);\n res.result = metadata.data[\n WALLET_SNAP_PERMISSION_KEY\n ] as RequestSnapsResult;\n } else if (hasRequestedSnaps(existingPermissions, requestedSnaps)) {\n res.result = await installSnaps(requestedSnaps);\n } else {\n const mergedPermissionsRequest = getSnapPermissionsRequest(\n existingPermissions,\n requestedPermissions,\n );\n\n const [, metadata] = await requestPermissions(mergedPermissionsRequest);\n res.result = metadata.data[\n WALLET_SNAP_PERMISSION_KEY\n ] as RequestSnapsResult;\n }\n } catch (error) {\n res.error = error;\n }\n });\n\n return end();\n}\n"]}