@metamask/snaps-rpc-methods 15.1.1 → 16.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 (344) hide show
  1. package/CHANGELOG.md +27 -4
  2. package/dist/index.cjs +1 -4
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +1 -2
  5. package/dist/index.d.cts.map +1 -1
  6. package/dist/index.d.mts +1 -2
  7. package/dist/index.d.mts.map +1 -1
  8. package/dist/index.mjs +1 -2
  9. package/dist/index.mjs.map +1 -1
  10. package/dist/permissions.cjs +18 -8
  11. package/dist/permissions.cjs.map +1 -1
  12. package/dist/permissions.d.cts +3 -2
  13. package/dist/permissions.d.cts.map +1 -1
  14. package/dist/permissions.d.mts +3 -2
  15. package/dist/permissions.d.mts.map +1 -1
  16. package/dist/permissions.mjs +17 -7
  17. package/dist/permissions.mjs.map +1 -1
  18. package/dist/permitted/cancelBackgroundEvent.cjs +10 -14
  19. package/dist/permitted/cancelBackgroundEvent.cjs.map +1 -1
  20. package/dist/permitted/cancelBackgroundEvent.d.cts +9 -12
  21. package/dist/permitted/cancelBackgroundEvent.d.cts.map +1 -1
  22. package/dist/permitted/cancelBackgroundEvent.d.mts +9 -12
  23. package/dist/permitted/cancelBackgroundEvent.d.mts.map +1 -1
  24. package/dist/permitted/cancelBackgroundEvent.mjs +10 -14
  25. package/dist/permitted/cancelBackgroundEvent.mjs.map +1 -1
  26. package/dist/permitted/clearState.cjs +10 -16
  27. package/dist/permitted/clearState.cjs.map +1 -1
  28. package/dist/permitted/clearState.d.cts +9 -23
  29. package/dist/permitted/clearState.d.cts.map +1 -1
  30. package/dist/permitted/clearState.d.mts +9 -23
  31. package/dist/permitted/clearState.d.mts.map +1 -1
  32. package/dist/permitted/clearState.mjs +10 -16
  33. package/dist/permitted/clearState.mjs.map +1 -1
  34. package/dist/permitted/closeWebSocket.cjs +7 -14
  35. package/dist/permitted/closeWebSocket.cjs.map +1 -1
  36. package/dist/permitted/closeWebSocket.d.cts +9 -12
  37. package/dist/permitted/closeWebSocket.d.cts.map +1 -1
  38. package/dist/permitted/closeWebSocket.d.mts +9 -12
  39. package/dist/permitted/closeWebSocket.d.mts.map +1 -1
  40. package/dist/permitted/closeWebSocket.mjs +7 -14
  41. package/dist/permitted/closeWebSocket.mjs.map +1 -1
  42. package/dist/permitted/createInterface.cjs +11 -15
  43. package/dist/permitted/createInterface.cjs.map +1 -1
  44. package/dist/permitted/createInterface.d.cts +23 -37
  45. package/dist/permitted/createInterface.d.cts.map +1 -1
  46. package/dist/permitted/createInterface.d.mts +23 -37
  47. package/dist/permitted/createInterface.d.mts.map +1 -1
  48. package/dist/permitted/createInterface.mjs +11 -15
  49. package/dist/permitted/createInterface.mjs.map +1 -1
  50. package/dist/permitted/endTrace.cjs +4 -6
  51. package/dist/permitted/endTrace.cjs.map +1 -1
  52. package/dist/permitted/endTrace.d.cts +8 -11
  53. package/dist/permitted/endTrace.d.cts.map +1 -1
  54. package/dist/permitted/endTrace.d.mts +8 -11
  55. package/dist/permitted/endTrace.d.mts.map +1 -1
  56. package/dist/permitted/endTrace.mjs +4 -6
  57. package/dist/permitted/endTrace.mjs.map +1 -1
  58. package/dist/permitted/getAllSnaps.cjs +5 -11
  59. package/dist/permitted/getAllSnaps.cjs.map +1 -1
  60. package/dist/permitted/getAllSnaps.d.cts +10 -14
  61. package/dist/permitted/getAllSnaps.d.cts.map +1 -1
  62. package/dist/permitted/getAllSnaps.d.mts +10 -14
  63. package/dist/permitted/getAllSnaps.d.mts.map +1 -1
  64. package/dist/permitted/getAllSnaps.mjs +5 -11
  65. package/dist/permitted/getAllSnaps.mjs.map +1 -1
  66. package/dist/permitted/getBackgroundEvents.cjs +8 -15
  67. package/dist/permitted/getBackgroundEvents.cjs.map +1 -1
  68. package/dist/permitted/getBackgroundEvents.d.cts +10 -13
  69. package/dist/permitted/getBackgroundEvents.d.cts.map +1 -1
  70. package/dist/permitted/getBackgroundEvents.d.mts +10 -13
  71. package/dist/permitted/getBackgroundEvents.d.mts.map +1 -1
  72. package/dist/permitted/getBackgroundEvents.mjs +8 -15
  73. package/dist/permitted/getBackgroundEvents.mjs.map +1 -1
  74. package/dist/permitted/getClientStatus.cjs +5 -6
  75. package/dist/permitted/getClientStatus.cjs.map +1 -1
  76. package/dist/permitted/getClientStatus.d.cts +17 -18
  77. package/dist/permitted/getClientStatus.d.cts.map +1 -1
  78. package/dist/permitted/getClientStatus.d.mts +17 -18
  79. package/dist/permitted/getClientStatus.d.mts.map +1 -1
  80. package/dist/permitted/getClientStatus.mjs +5 -6
  81. package/dist/permitted/getClientStatus.mjs.map +1 -1
  82. package/dist/permitted/getFile.cjs +7 -11
  83. package/dist/permitted/getFile.cjs.map +1 -1
  84. package/dist/permitted/getFile.d.cts +8 -10
  85. package/dist/permitted/getFile.d.cts.map +1 -1
  86. package/dist/permitted/getFile.d.mts +8 -10
  87. package/dist/permitted/getFile.d.mts.map +1 -1
  88. package/dist/permitted/getFile.mjs +7 -11
  89. package/dist/permitted/getFile.mjs.map +1 -1
  90. package/dist/permitted/getInterfaceContext.cjs +12 -15
  91. package/dist/permitted/getInterfaceContext.cjs.map +1 -1
  92. package/dist/permitted/getInterfaceContext.d.cts +9 -21
  93. package/dist/permitted/getInterfaceContext.d.cts.map +1 -1
  94. package/dist/permitted/getInterfaceContext.d.mts +9 -21
  95. package/dist/permitted/getInterfaceContext.d.mts.map +1 -1
  96. package/dist/permitted/getInterfaceContext.mjs +12 -15
  97. package/dist/permitted/getInterfaceContext.mjs.map +1 -1
  98. package/dist/permitted/getInterfaceState.cjs +11 -15
  99. package/dist/permitted/getInterfaceState.cjs.map +1 -1
  100. package/dist/permitted/getInterfaceState.d.cts +9 -21
  101. package/dist/permitted/getInterfaceState.d.cts.map +1 -1
  102. package/dist/permitted/getInterfaceState.d.mts +9 -21
  103. package/dist/permitted/getInterfaceState.d.mts.map +1 -1
  104. package/dist/permitted/getInterfaceState.mjs +11 -15
  105. package/dist/permitted/getInterfaceState.mjs.map +1 -1
  106. package/dist/permitted/getSnaps.cjs +6 -12
  107. package/dist/permitted/getSnaps.cjs.map +1 -1
  108. package/dist/permitted/getSnaps.d.cts +11 -14
  109. package/dist/permitted/getSnaps.d.cts.map +1 -1
  110. package/dist/permitted/getSnaps.d.mts +11 -14
  111. package/dist/permitted/getSnaps.d.mts.map +1 -1
  112. package/dist/permitted/getSnaps.mjs +6 -12
  113. package/dist/permitted/getSnaps.mjs.map +1 -1
  114. package/dist/permitted/getState.cjs +9 -11
  115. package/dist/permitted/getState.cjs.map +1 -1
  116. package/dist/permitted/getState.d.cts +17 -28
  117. package/dist/permitted/getState.d.cts.map +1 -1
  118. package/dist/permitted/getState.d.mts +17 -28
  119. package/dist/permitted/getState.d.mts.map +1 -1
  120. package/dist/permitted/getState.mjs +9 -11
  121. package/dist/permitted/getState.mjs.map +1 -1
  122. package/dist/permitted/getWebSockets.cjs +11 -14
  123. package/dist/permitted/getWebSockets.cjs.map +1 -1
  124. package/dist/permitted/getWebSockets.d.cts +10 -13
  125. package/dist/permitted/getWebSockets.d.cts.map +1 -1
  126. package/dist/permitted/getWebSockets.d.mts +10 -13
  127. package/dist/permitted/getWebSockets.d.mts.map +1 -1
  128. package/dist/permitted/getWebSockets.mjs +11 -14
  129. package/dist/permitted/getWebSockets.mjs.map +1 -1
  130. package/dist/permitted/index.cjs +0 -1
  131. package/dist/permitted/index.cjs.map +1 -1
  132. package/dist/permitted/index.d.cts +29 -25
  133. package/dist/permitted/index.d.cts.map +1 -1
  134. package/dist/permitted/index.d.mts +29 -25
  135. package/dist/permitted/index.d.mts.map +1 -1
  136. package/dist/permitted/index.mjs +0 -1
  137. package/dist/permitted/index.mjs.map +1 -1
  138. package/dist/permitted/invokeKeyring.cjs +12 -13
  139. package/dist/permitted/invokeKeyring.cjs.map +1 -1
  140. package/dist/permitted/invokeKeyring.d.cts +17 -16
  141. package/dist/permitted/invokeKeyring.d.cts.map +1 -1
  142. package/dist/permitted/invokeKeyring.d.mts +17 -16
  143. package/dist/permitted/invokeKeyring.d.mts.map +1 -1
  144. package/dist/permitted/invokeKeyring.mjs +12 -13
  145. package/dist/permitted/invokeKeyring.mjs.map +1 -1
  146. package/dist/permitted/invokeSnapSugar.cjs +6 -10
  147. package/dist/permitted/invokeSnapSugar.cjs.map +1 -1
  148. package/dist/permitted/invokeSnapSugar.d.cts +9 -12
  149. package/dist/permitted/invokeSnapSugar.d.cts.map +1 -1
  150. package/dist/permitted/invokeSnapSugar.d.mts +9 -12
  151. package/dist/permitted/invokeSnapSugar.d.mts.map +1 -1
  152. package/dist/permitted/invokeSnapSugar.mjs +6 -10
  153. package/dist/permitted/invokeSnapSugar.mjs.map +1 -1
  154. package/dist/permitted/listEntropySources.cjs +28 -12
  155. package/dist/permitted/listEntropySources.cjs.map +1 -1
  156. package/dist/permitted/listEntropySources.d.cts +12 -23
  157. package/dist/permitted/listEntropySources.d.cts.map +1 -1
  158. package/dist/permitted/listEntropySources.d.mts +12 -23
  159. package/dist/permitted/listEntropySources.d.mts.map +1 -1
  160. package/dist/permitted/listEntropySources.mjs +28 -12
  161. package/dist/permitted/listEntropySources.mjs.map +1 -1
  162. package/dist/permitted/middleware.cjs +70 -20
  163. package/dist/permitted/middleware.cjs.map +1 -1
  164. package/dist/permitted/middleware.d.cts +5 -2
  165. package/dist/permitted/middleware.d.cts.map +1 -1
  166. package/dist/permitted/middleware.d.mts +5 -2
  167. package/dist/permitted/middleware.d.mts.map +1 -1
  168. package/dist/permitted/middleware.mjs +70 -20
  169. package/dist/permitted/middleware.mjs.map +1 -1
  170. package/dist/permitted/openWebSocket.cjs +7 -14
  171. package/dist/permitted/openWebSocket.cjs.map +1 -1
  172. package/dist/permitted/openWebSocket.d.cts +9 -12
  173. package/dist/permitted/openWebSocket.d.cts.map +1 -1
  174. package/dist/permitted/openWebSocket.d.mts +9 -12
  175. package/dist/permitted/openWebSocket.d.mts.map +1 -1
  176. package/dist/permitted/openWebSocket.mjs +7 -14
  177. package/dist/permitted/openWebSocket.mjs.map +1 -1
  178. package/dist/permitted/requestSnaps.cjs +14 -19
  179. package/dist/permitted/requestSnaps.cjs.map +1 -1
  180. package/dist/permitted/requestSnaps.d.cts +9 -36
  181. package/dist/permitted/requestSnaps.d.cts.map +1 -1
  182. package/dist/permitted/requestSnaps.d.mts +9 -36
  183. package/dist/permitted/requestSnaps.d.mts.map +1 -1
  184. package/dist/permitted/requestSnaps.mjs +15 -20
  185. package/dist/permitted/requestSnaps.mjs.map +1 -1
  186. package/dist/permitted/resolveInterface.cjs +11 -15
  187. package/dist/permitted/resolveInterface.cjs.map +1 -1
  188. package/dist/permitted/resolveInterface.d.cts +12 -24
  189. package/dist/permitted/resolveInterface.d.cts.map +1 -1
  190. package/dist/permitted/resolveInterface.d.mts +12 -24
  191. package/dist/permitted/resolveInterface.d.mts.map +1 -1
  192. package/dist/permitted/resolveInterface.mjs +11 -15
  193. package/dist/permitted/resolveInterface.mjs.map +1 -1
  194. package/dist/permitted/scheduleBackgroundEvent.cjs +11 -14
  195. package/dist/permitted/scheduleBackgroundEvent.cjs.map +1 -1
  196. package/dist/permitted/scheduleBackgroundEvent.d.cts +10 -17
  197. package/dist/permitted/scheduleBackgroundEvent.d.cts.map +1 -1
  198. package/dist/permitted/scheduleBackgroundEvent.d.mts +10 -17
  199. package/dist/permitted/scheduleBackgroundEvent.d.mts.map +1 -1
  200. package/dist/permitted/scheduleBackgroundEvent.mjs +11 -14
  201. package/dist/permitted/scheduleBackgroundEvent.mjs.map +1 -1
  202. package/dist/permitted/sendWebSocketMessage.cjs +10 -14
  203. package/dist/permitted/sendWebSocketMessage.cjs.map +1 -1
  204. package/dist/permitted/sendWebSocketMessage.d.cts +9 -12
  205. package/dist/permitted/sendWebSocketMessage.d.cts.map +1 -1
  206. package/dist/permitted/sendWebSocketMessage.d.mts +9 -12
  207. package/dist/permitted/sendWebSocketMessage.d.mts.map +1 -1
  208. package/dist/permitted/sendWebSocketMessage.mjs +10 -14
  209. package/dist/permitted/sendWebSocketMessage.mjs.map +1 -1
  210. package/dist/permitted/setState.cjs +18 -21
  211. package/dist/permitted/setState.cjs.map +1 -1
  212. package/dist/permitted/setState.d.cts +18 -45
  213. package/dist/permitted/setState.d.cts.map +1 -1
  214. package/dist/permitted/setState.d.mts +18 -45
  215. package/dist/permitted/setState.d.mts.map +1 -1
  216. package/dist/permitted/setState.mjs +18 -21
  217. package/dist/permitted/setState.mjs.map +1 -1
  218. package/dist/permitted/startTrace.cjs +4 -6
  219. package/dist/permitted/startTrace.cjs.map +1 -1
  220. package/dist/permitted/startTrace.d.cts +8 -11
  221. package/dist/permitted/startTrace.d.cts.map +1 -1
  222. package/dist/permitted/startTrace.d.mts +8 -11
  223. package/dist/permitted/startTrace.d.mts.map +1 -1
  224. package/dist/permitted/startTrace.mjs +4 -6
  225. package/dist/permitted/startTrace.mjs.map +1 -1
  226. package/dist/permitted/trackError.cjs +4 -6
  227. package/dist/permitted/trackError.cjs.map +1 -1
  228. package/dist/permitted/trackError.d.cts +8 -11
  229. package/dist/permitted/trackError.d.cts.map +1 -1
  230. package/dist/permitted/trackError.d.mts +8 -11
  231. package/dist/permitted/trackError.d.mts.map +1 -1
  232. package/dist/permitted/trackError.mjs +4 -6
  233. package/dist/permitted/trackError.mjs.map +1 -1
  234. package/dist/permitted/trackEvent.cjs +4 -6
  235. package/dist/permitted/trackEvent.cjs.map +1 -1
  236. package/dist/permitted/trackEvent.d.cts +8 -11
  237. package/dist/permitted/trackEvent.d.cts.map +1 -1
  238. package/dist/permitted/trackEvent.d.mts +8 -11
  239. package/dist/permitted/trackEvent.d.mts.map +1 -1
  240. package/dist/permitted/trackEvent.mjs +4 -6
  241. package/dist/permitted/trackEvent.mjs.map +1 -1
  242. package/dist/permitted/updateInterface.cjs +11 -15
  243. package/dist/permitted/updateInterface.cjs.map +1 -1
  244. package/dist/permitted/updateInterface.d.cts +9 -22
  245. package/dist/permitted/updateInterface.d.cts.map +1 -1
  246. package/dist/permitted/updateInterface.d.mts +9 -22
  247. package/dist/permitted/updateInterface.d.mts.map +1 -1
  248. package/dist/permitted/updateInterface.mjs +11 -15
  249. package/dist/permitted/updateInterface.mjs.map +1 -1
  250. package/dist/restricted/dialog.cjs +23 -30
  251. package/dist/restricted/dialog.cjs.map +1 -1
  252. package/dist/restricted/dialog.d.cts +10 -58
  253. package/dist/restricted/dialog.d.cts.map +1 -1
  254. package/dist/restricted/dialog.d.mts +10 -58
  255. package/dist/restricted/dialog.d.mts.map +1 -1
  256. package/dist/restricted/dialog.mjs +23 -30
  257. package/dist/restricted/dialog.mjs.map +1 -1
  258. package/dist/restricted/getBip32Entropy.cjs +15 -12
  259. package/dist/restricted/getBip32Entropy.cjs.map +1 -1
  260. package/dist/restricted/getBip32Entropy.d.cts +11 -24
  261. package/dist/restricted/getBip32Entropy.d.cts.map +1 -1
  262. package/dist/restricted/getBip32Entropy.d.mts +11 -24
  263. package/dist/restricted/getBip32Entropy.d.mts.map +1 -1
  264. package/dist/restricted/getBip32Entropy.mjs +16 -13
  265. package/dist/restricted/getBip32Entropy.mjs.map +1 -1
  266. package/dist/restricted/getBip32PublicKey.cjs +15 -12
  267. package/dist/restricted/getBip32PublicKey.cjs.map +1 -1
  268. package/dist/restricted/getBip32PublicKey.d.cts +11 -24
  269. package/dist/restricted/getBip32PublicKey.d.cts.map +1 -1
  270. package/dist/restricted/getBip32PublicKey.d.mts +11 -24
  271. package/dist/restricted/getBip32PublicKey.d.mts.map +1 -1
  272. package/dist/restricted/getBip32PublicKey.mjs +16 -13
  273. package/dist/restricted/getBip32PublicKey.mjs.map +1 -1
  274. package/dist/restricted/getBip44Entropy.cjs +14 -10
  275. package/dist/restricted/getBip44Entropy.cjs.map +1 -1
  276. package/dist/restricted/getBip44Entropy.d.cts +11 -15
  277. package/dist/restricted/getBip44Entropy.d.cts.map +1 -1
  278. package/dist/restricted/getBip44Entropy.d.mts +11 -15
  279. package/dist/restricted/getBip44Entropy.d.mts.map +1 -1
  280. package/dist/restricted/getBip44Entropy.mjs +15 -11
  281. package/dist/restricted/getBip44Entropy.mjs.map +1 -1
  282. package/dist/restricted/getEntropy.cjs +10 -10
  283. package/dist/restricted/getEntropy.cjs.map +1 -1
  284. package/dist/restricted/getEntropy.d.cts +11 -15
  285. package/dist/restricted/getEntropy.d.cts.map +1 -1
  286. package/dist/restricted/getEntropy.d.mts +11 -15
  287. package/dist/restricted/getEntropy.d.mts.map +1 -1
  288. package/dist/restricted/getEntropy.mjs +11 -11
  289. package/dist/restricted/getEntropy.mjs.map +1 -1
  290. package/dist/restricted/index.cjs.map +1 -1
  291. package/dist/restricted/index.d.cts +20 -160
  292. package/dist/restricted/index.d.cts.map +1 -1
  293. package/dist/restricted/index.d.mts +20 -160
  294. package/dist/restricted/index.d.mts.map +1 -1
  295. package/dist/restricted/index.mjs.map +1 -1
  296. package/dist/restricted/invokeSnap.cjs +11 -12
  297. package/dist/restricted/invokeSnap.cjs.map +1 -1
  298. package/dist/restricted/invokeSnap.d.cts +9 -13
  299. package/dist/restricted/invokeSnap.d.cts.map +1 -1
  300. package/dist/restricted/invokeSnap.d.mts +9 -13
  301. package/dist/restricted/invokeSnap.d.mts.map +1 -1
  302. package/dist/restricted/invokeSnap.mjs +11 -12
  303. package/dist/restricted/invokeSnap.mjs.map +1 -1
  304. package/dist/restricted/manageState.cjs +21 -20
  305. package/dist/restricted/manageState.cjs.map +1 -1
  306. package/dist/restricted/manageState.d.cts +12 -34
  307. package/dist/restricted/manageState.d.cts.map +1 -1
  308. package/dist/restricted/manageState.d.mts +12 -34
  309. package/dist/restricted/manageState.d.mts.map +1 -1
  310. package/dist/restricted/manageState.mjs +21 -20
  311. package/dist/restricted/manageState.mjs.map +1 -1
  312. package/dist/restricted/notify.cjs +31 -24
  313. package/dist/restricted/notify.cjs.map +1 -1
  314. package/dist/restricted/notify.d.cts +16 -25
  315. package/dist/restricted/notify.d.cts.map +1 -1
  316. package/dist/restricted/notify.d.mts +16 -25
  317. package/dist/restricted/notify.d.mts.map +1 -1
  318. package/dist/restricted/notify.mjs +32 -25
  319. package/dist/restricted/notify.mjs.map +1 -1
  320. package/dist/types.cjs +3 -0
  321. package/dist/types.cjs.map +1 -0
  322. package/dist/types.d.cts +155 -0
  323. package/dist/types.d.cts.map +1 -0
  324. package/dist/types.d.mts +155 -0
  325. package/dist/types.d.mts.map +1 -0
  326. package/dist/types.mjs +2 -0
  327. package/dist/types.mjs.map +1 -0
  328. package/dist/utils.cjs +78 -24
  329. package/dist/utils.cjs.map +1 -1
  330. package/dist/utils.d.cts +21 -13
  331. package/dist/utils.d.cts.map +1 -1
  332. package/dist/utils.d.mts +21 -13
  333. package/dist/utils.d.mts.map +1 -1
  334. package/dist/utils.mjs +75 -22
  335. package/dist/utils.mjs.map +1 -1
  336. package/package.json +6 -6
  337. package/dist/permitted/handlers.cjs +0 -63
  338. package/dist/permitted/handlers.cjs.map +0 -1
  339. package/dist/permitted/handlers.d.cts +0 -299
  340. package/dist/permitted/handlers.d.cts.map +0 -1
  341. package/dist/permitted/handlers.d.mts +0 -299
  342. package/dist/permitted/handlers.d.mts.map +0 -1
  343. package/dist/permitted/handlers.mjs +0 -60
  344. package/dist/permitted/handlers.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.mjs","sourceRoot":"","sources":["../../src/permitted/middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,6BAA6B;AACjD,OAAO,EAAE,QAAQ,EAAE,8BAA8B;AAGjD,OAAO,EAAE,cAAc,EAAE,uBAAmB;AAC5C,OAAO,EAAE,WAAW,EAAE,qBAAiB;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAAe,EACf,KAA8B;IAE9B,iEAAiE;IACjE,kEAAkE;IAClE,OAAO,KAAK,UAAU,gBAAgB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG;QACjE,MAAM,OAAO,GACX,cAAc,CAAC,OAAO,CAAC,MAAqC,CAAC,CAAC;QAChE,IAAI,OAAO,EAAE,CAAC;YACZ,IACE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;gBACzD,CAAC,MAAM,EACP,CAAC;gBACD,OAAO,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC;YACzC,CAAC;YAED,iFAAiF;YACjF,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,OAAc,CAAC;YACrD,IAAI,CAAC;gBACH,kEAAkE;gBAClE,OAAO,MAAM,cAAc,CACzB,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,GAAG,EACH,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAC9B,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAChB,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { logError } from '@metamask/snaps-utils';\nimport type { Json, JsonRpcParams } from '@metamask/utils';\n\nimport { methodHandlers } from './handlers';\nimport { selectHooks } from '../utils';\n\n/**\n * Creates a middleware that handles permitted snap RPC methods.\n *\n * @param isSnap - A flag that should indicate whether the requesting origin is a snap or not.\n * @param hooks - An object containing the hooks made available to the permitted RPC methods.\n * @returns The middleware.\n */\nexport function createSnapsMethodMiddleware(\n isSnap: boolean,\n hooks: Record<string, unknown>,\n): JsonRpcMiddleware<JsonRpcParams, Json> {\n // This is not actually a misused promise, the type is just wrong\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n return async function methodMiddleware(request, response, next, end) {\n const handler =\n methodHandlers[request.method as keyof typeof methodHandlers];\n if (handler) {\n if (\n String.prototype.startsWith.call(request.method, 'snap_') &&\n !isSnap\n ) {\n return end(rpcErrors.methodNotFound());\n }\n\n // TODO: Once json-rpc-engine types are up to date, we should type this correctly\n const { implementation, hookNames } = handler as any;\n try {\n // Implementations may or may not be async, so we must await them.\n return await implementation(\n request,\n response,\n next,\n end,\n selectHooks(hooks, hookNames),\n );\n } catch (error) {\n logError(error);\n return end(error);\n }\n }\n\n return next();\n };\n}\n"]}
1
+ {"version":3,"file":"middleware.mjs","sourceRoot":"","sources":["../../src/permitted/middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createMethodMiddleware,\n type JsonRpcMiddleware,\n} from '@metamask/json-rpc-engine';\nimport type { Messenger } from '@metamask/messenger';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport { logError } from '@metamask/snaps-utils';\nimport type { Json, JsonRpcParams } from '@metamask/utils';\n\nimport type { PermittedRpcMethodActions, PermittedRpcMethodHooks } from '.';\nimport { cancelBackgroundEventHandler } from './cancelBackgroundEvent';\nimport { clearStateHandler } from './clearState';\nimport { closeWebSocketHandler } from './closeWebSocket';\nimport { createInterfaceHandler } from './createInterface';\nimport { endTraceHandler } from './endTrace';\nimport { getAllSnapsHandler } from './getAllSnaps';\nimport { getBackgroundEventsHandler } from './getBackgroundEvents';\nimport { getClientStatusHandler } from './getClientStatus';\nimport { getFileHandler } from './getFile';\nimport { getInterfaceContextHandler } from './getInterfaceContext';\nimport { getInterfaceStateHandler } from './getInterfaceState';\nimport { getSnapsHandler } from './getSnaps';\nimport { getStateHandler } from './getState';\nimport { getWebSocketsHandler } from './getWebSockets';\nimport { invokeKeyringHandler } from './invokeKeyring';\nimport { invokeSnapSugarHandler } from './invokeSnapSugar';\nimport { listEntropySourcesHandler } from './listEntropySources';\nimport { openWebSocketHandler } from './openWebSocket';\nimport { requestSnapsHandler } from './requestSnaps';\nimport { resolveInterfaceHandler } from './resolveInterface';\nimport { scheduleBackgroundEventHandler } from './scheduleBackgroundEvent';\nimport { sendWebSocketMessageHandler } from './sendWebSocketMessage';\nimport { setStateHandler } from './setState';\nimport { startTraceHandler } from './startTrace';\nimport { trackErrorHandler } from './trackError';\nimport { trackEventHandler } from './trackEvent';\nimport { updateInterfaceHandler } from './updateInterface';\n\n/* eslint-disable @typescript-eslint/naming-convention */\nconst methodHandlers = {\n wallet_getAllSnaps: getAllSnapsHandler,\n wallet_getSnaps: getSnapsHandler,\n wallet_requestSnaps: requestSnapsHandler,\n wallet_invokeSnap: invokeSnapSugarHandler,\n wallet_invokeKeyring: invokeKeyringHandler,\n snap_clearState: clearStateHandler,\n snap_getClientStatus: getClientStatusHandler,\n snap_getFile: getFileHandler,\n snap_getState: getStateHandler,\n snap_createInterface: createInterfaceHandler,\n snap_updateInterface: updateInterfaceHandler,\n snap_getInterfaceState: getInterfaceStateHandler,\n snap_getInterfaceContext: getInterfaceContextHandler,\n snap_listEntropySources: listEntropySourcesHandler,\n snap_resolveInterface: resolveInterfaceHandler,\n snap_scheduleBackgroundEvent: scheduleBackgroundEventHandler,\n snap_cancelBackgroundEvent: cancelBackgroundEventHandler,\n snap_getBackgroundEvents: getBackgroundEventsHandler,\n snap_setState: setStateHandler,\n snap_trackError: trackErrorHandler,\n snap_trackEvent: trackEventHandler,\n snap_openWebSocket: openWebSocketHandler,\n snap_closeWebSocket: closeWebSocketHandler,\n snap_sendWebSocketMessage: sendWebSocketMessageHandler,\n snap_getWebSockets: getWebSocketsHandler,\n snap_startTrace: startTraceHandler,\n snap_endTrace: endTraceHandler,\n};\n/* eslint-enable @typescript-eslint/naming-convention */\n\n/**\n * Creates a middleware that handles permitted snap RPC methods.\n *\n * @param isSnap - A flag that should indicate whether the requesting origin is a snap or not.\n * @param hooks - An object containing the hooks made available to the permitted RPC methods.\n * @param messenger - The messenger.\n * @returns The middleware.\n */\nexport function createSnapsMethodMiddleware(\n isSnap: boolean,\n hooks: PermittedRpcMethodHooks,\n messenger: Messenger<string, PermittedRpcMethodActions>,\n): JsonRpcMiddleware<JsonRpcParams, Json> {\n const nestedMiddleware = createMethodMiddleware({\n handlers: methodHandlers,\n hooks,\n messenger,\n onError: logError,\n });\n\n // This is not actually a misused promise, the type is just wrong\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n return async function methodMiddleware(request, response, next, end) {\n if (String.prototype.startsWith.call(request.method, 'snap_') && !isSnap) {\n return end(rpcErrors.methodNotFound());\n }\n\n return nestedMiddleware(request, response, next, end);\n };\n}\n"]}
@@ -6,11 +6,6 @@ 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';
10
- const hookNames = {
11
- hasPermission: true,
12
- openWebSocket: true,
13
- };
14
9
  const OpenWebSocketParametersStruct = (0, superstruct_1.object)({
15
10
  url: (0, snaps_utils_1.uri)({ protocol: (0, snaps_sdk_1.union)([(0, snaps_sdk_1.literal)('wss:'), (0, snaps_sdk_1.literal)('ws:')]) }),
16
11
  protocols: (0, superstruct_1.optional)((0, superstruct_1.array)((0, superstruct_1.string)())),
@@ -62,9 +57,8 @@ const OpenWebSocketParametersStruct = (0, superstruct_1.object)({
62
57
  * ```
63
58
  */
64
59
  exports.openWebSocketHandler = {
65
- methodNames: [methodName],
66
60
  implementation: openWebSocketImplementation,
67
- hookNames,
61
+ actionNames: ['PermissionController:hasPermission', 'WebSocketService:open'],
68
62
  };
69
63
  /**
70
64
  * The `snap_openWebSocket` method implementation.
@@ -73,19 +67,18 @@ exports.openWebSocketHandler = {
73
67
  * @param res - The JSON-RPC response object.
74
68
  * @param _next - The `json-rpc-engine` "next" callback. Not used by this function.
75
69
  * @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.
70
+ * @param _hooks - The RPC method hooks. Not used by this function.
71
+ * @param messenger - The messenger used to call controller actions.
79
72
  * @returns Nothing.
80
73
  */
81
- async function openWebSocketImplementation(req, res, _next, end, { hasPermission, openWebSocket }) {
82
- if (!hasPermission(endowments_1.SnapEndowments.NetworkAccess)) {
74
+ async function openWebSocketImplementation(req, res, _next, end, _hooks, messenger) {
75
+ const { params, origin } = req;
76
+ if (!messenger.call('PermissionController:hasPermission', origin, endowments_1.SnapEndowments.NetworkAccess)) {
83
77
  return end(rpc_errors_1.providerErrors.unauthorized());
84
78
  }
85
- const { params } = req;
86
79
  try {
87
80
  const { url, protocols } = getValidatedParams(params);
88
- res.result = await openWebSocket(url, protocols);
81
+ res.result = await messenger.call('WebSocketService:open', origin, url, protocols);
89
82
  }
90
83
  catch (error) {
91
84
  return end(error);
@@ -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,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
+ {"version":3,"file":"openWebSocket.cjs","sourceRoot":"","sources":["../../src/permitted/openWebSocket.ts"],"names":[],"mappings":";;;AAMA,qDAAiE;AACjE,mDAK6B;AAC7B,uDAAgE;AAChE,uDAO+B;AAG/B,wDAA+C;AAU/C,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,cAAc,EAAE,2BAA2B;IAC3C,WAAW,EAAE,CAAC,oCAAoC,EAAE,uBAAuB,CAAC;CAO7E,CAAC;AAEF;;;;;;;;;;GAUG;AACH,KAAK,UAAU,2BAA2B,CACxC,GAAsD,EACtD,GAAgD,EAChD,KAAc,EACd,GAA6B,EAC7B,MAAa,EACb,SAAwD;IAExD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAE/B,IACE,CAAC,SAAS,CAAC,IAAI,CACb,oCAAoC,EACpC,MAAM,EACN,2BAAc,CAAC,aAAa,CAC7B,EACD,CAAC;QACD,OAAO,GAAG,CAAC,2BAAc,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACtD,GAAG,CAAC,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAC/B,uBAAuB,EACvB,MAAM,EACN,GAAG,EACH,SAAS,CACV,CAAC;IACJ,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 {\n JsonRpcEngineEndCallback,\n MethodHandler,\n} from '@metamask/json-rpc-engine';\nimport type { Messenger } from '@metamask/messenger';\nimport type { PermissionControllerHasPermissionAction } from '@metamask/permission-controller';\nimport { providerErrors, rpcErrors } from '@metamask/rpc-errors';\nimport {\n literal,\n union,\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 {\n JsonRpcRequestWithOrigin,\n WebSocketServiceOpenAction,\n} from '../types';\n\nexport type OpenWebSocketMethodActions =\n | PermissionControllerHasPermissionAction\n | WebSocketServiceOpenAction;\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 implementation: openWebSocketImplementation,\n actionNames: ['PermissionController:hasPermission', 'WebSocketService:open'],\n} satisfies MethodHandler<\n never,\n OpenWebSocketMethodActions,\n OpenWebSocketParams,\n OpenWebSocketResult,\n { origin: string }\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. Not used by this function.\n * @param messenger - The messenger used to call controller actions.\n * @returns Nothing.\n */\nasync function openWebSocketImplementation(\n req: JsonRpcRequestWithOrigin<OpenWebSocketParameters>,\n res: PendingJsonRpcResponse<OpenWebSocketResult>,\n _next: unknown,\n end: JsonRpcEngineEndCallback,\n _hooks: never,\n messenger: Messenger<string, OpenWebSocketMethodActions>,\n): Promise<void> {\n const { params, origin } = req;\n\n if (\n !messenger.call(\n 'PermissionController:hasPermission',\n origin,\n SnapEndowments.NetworkAccess,\n )\n ) {\n return end(providerErrors.unauthorized());\n }\n\n try {\n const { url, protocols } = getValidatedParams(params);\n res.result = await messenger.call(\n 'WebSocketService:open',\n origin,\n url,\n protocols,\n );\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,12 +1,11 @@
1
1
  import type { JsonRpcEngineEndCallback } from "@metamask/json-rpc-engine";
2
- import { type JsonRpcRequest, type OpenWebSocketParams, type OpenWebSocketResult } from "@metamask/snaps-sdk";
2
+ import type { Messenger } from "@metamask/messenger";
3
+ import type { PermissionControllerHasPermissionAction } from "@metamask/permission-controller";
4
+ import { type OpenWebSocketParams, type OpenWebSocketResult } from "@metamask/snaps-sdk";
3
5
  import { type InferMatching } from "@metamask/snaps-utils";
4
6
  import type { PendingJsonRpcResponse } from "@metamask/utils";
5
- import type { MethodHooksObject } from "../utils.cjs";
6
- export type OpenWebSocketMethodHooks = {
7
- hasPermission: (permissionName: string) => boolean;
8
- openWebSocket: (url: string, protocols?: string[]) => Promise<string>;
9
- };
7
+ import type { JsonRpcRequestWithOrigin, WebSocketServiceOpenAction } from "../types.cjs";
8
+ export type OpenWebSocketMethodActions = PermissionControllerHasPermissionAction | WebSocketServiceOpenAction;
10
9
  declare const OpenWebSocketParametersStruct: import("@metamask/superstruct").Struct<{
11
10
  url: string;
12
11
  protocols?: string[] | undefined;
@@ -62,9 +61,8 @@ export type OpenWebSocketParameters = InferMatching<typeof OpenWebSocketParamete
62
61
  * ```
63
62
  */
64
63
  export declare const openWebSocketHandler: {
65
- methodNames: ["snap_openWebSocket"];
66
64
  implementation: typeof openWebSocketImplementation;
67
- hookNames: MethodHooksObject<OpenWebSocketMethodHooks>;
65
+ actionNames: ("WebSocketService:open" | "PermissionController:hasPermission")[];
68
66
  };
69
67
  /**
70
68
  * The `snap_openWebSocket` method implementation.
@@ -73,11 +71,10 @@ export declare const openWebSocketHandler: {
73
71
  * @param res - The JSON-RPC response object.
74
72
  * @param _next - The `json-rpc-engine` "next" callback. Not used by this function.
75
73
  * @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.
74
+ * @param _hooks - The RPC method hooks. Not used by this function.
75
+ * @param messenger - The messenger used to call controller actions.
79
76
  * @returns Nothing.
80
77
  */
81
- declare function openWebSocketImplementation(req: JsonRpcRequest<OpenWebSocketParameters>, res: PendingJsonRpcResponse<OpenWebSocketResult>, _next: unknown, end: JsonRpcEngineEndCallback, { hasPermission, openWebSocket }: OpenWebSocketMethodHooks): Promise<void>;
78
+ declare function openWebSocketImplementation(req: JsonRpcRequestWithOrigin<OpenWebSocketParameters>, res: PendingJsonRpcResponse<OpenWebSocketResult>, _next: unknown, end: JsonRpcEngineEndCallback, _hooks: never, messenger: Messenger<string, OpenWebSocketMethodActions>): Promise<void>;
82
79
  export {};
83
80
  //# sourceMappingURL=openWebSocket.d.cts.map
@@ -1 +1 @@
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
+ {"version":3,"file":"openWebSocket.d.cts","sourceRoot":"","sources":["../../src/permitted/openWebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EAEzB,kCAAkC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EAAE,uCAAuC,EAAE,wCAAwC;AAE/F,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACzB,4BAA4B;AAC7B,OAAO,EAAO,KAAK,aAAa,EAAE,8BAA8B;AAShE,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB;AAG9D,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC3B,qBAAiB;AAElB,MAAM,MAAM,0BAA0B,GAClC,uCAAuC,GACvC,0BAA0B,CAAC;AAE/B,QAAA,MAAM,6BAA6B;;;;;;EAGjC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,aAAa,CACjD,OAAO,6BAA6B,EACpC,mBAAmB,CACpB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,eAAO,MAAM,oBAAoB;;;CAShC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,iBAAe,2BAA2B,CACxC,GAAG,EAAE,wBAAwB,CAAC,uBAAuB,CAAC,EACtD,GAAG,EAAE,sBAAsB,CAAC,mBAAmB,CAAC,EAChD,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,wBAAwB,EAC7B,MAAM,EAAE,KAAK,EACb,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,0BAA0B,CAAC,GACvD,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
@@ -1,12 +1,11 @@
1
1
  import type { JsonRpcEngineEndCallback } from "@metamask/json-rpc-engine";
2
- import { type JsonRpcRequest, type OpenWebSocketParams, type OpenWebSocketResult } from "@metamask/snaps-sdk";
2
+ import type { Messenger } from "@metamask/messenger";
3
+ import type { PermissionControllerHasPermissionAction } from "@metamask/permission-controller";
4
+ import { type OpenWebSocketParams, type OpenWebSocketResult } from "@metamask/snaps-sdk";
3
5
  import { type InferMatching } from "@metamask/snaps-utils";
4
6
  import type { PendingJsonRpcResponse } from "@metamask/utils";
5
- import type { MethodHooksObject } from "../utils.mjs";
6
- export type OpenWebSocketMethodHooks = {
7
- hasPermission: (permissionName: string) => boolean;
8
- openWebSocket: (url: string, protocols?: string[]) => Promise<string>;
9
- };
7
+ import type { JsonRpcRequestWithOrigin, WebSocketServiceOpenAction } from "../types.mjs";
8
+ export type OpenWebSocketMethodActions = PermissionControllerHasPermissionAction | WebSocketServiceOpenAction;
10
9
  declare const OpenWebSocketParametersStruct: import("@metamask/superstruct").Struct<{
11
10
  url: string;
12
11
  protocols?: string[] | undefined;
@@ -62,9 +61,8 @@ export type OpenWebSocketParameters = InferMatching<typeof OpenWebSocketParamete
62
61
  * ```
63
62
  */
64
63
  export declare const openWebSocketHandler: {
65
- methodNames: ["snap_openWebSocket"];
66
64
  implementation: typeof openWebSocketImplementation;
67
- hookNames: MethodHooksObject<OpenWebSocketMethodHooks>;
65
+ actionNames: ("WebSocketService:open" | "PermissionController:hasPermission")[];
68
66
  };
69
67
  /**
70
68
  * The `snap_openWebSocket` method implementation.
@@ -73,11 +71,10 @@ export declare const openWebSocketHandler: {
73
71
  * @param res - The JSON-RPC response object.
74
72
  * @param _next - The `json-rpc-engine` "next" callback. Not used by this function.
75
73
  * @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.
74
+ * @param _hooks - The RPC method hooks. Not used by this function.
75
+ * @param messenger - The messenger used to call controller actions.
79
76
  * @returns Nothing.
80
77
  */
81
- declare function openWebSocketImplementation(req: JsonRpcRequest<OpenWebSocketParameters>, res: PendingJsonRpcResponse<OpenWebSocketResult>, _next: unknown, end: JsonRpcEngineEndCallback, { hasPermission, openWebSocket }: OpenWebSocketMethodHooks): Promise<void>;
78
+ declare function openWebSocketImplementation(req: JsonRpcRequestWithOrigin<OpenWebSocketParameters>, res: PendingJsonRpcResponse<OpenWebSocketResult>, _next: unknown, end: JsonRpcEngineEndCallback, _hooks: never, messenger: Messenger<string, OpenWebSocketMethodActions>): Promise<void>;
82
79
  export {};
83
80
  //# sourceMappingURL=openWebSocket.d.mts.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"openWebSocket.d.mts","sourceRoot":"","sources":["../../src/permitted/openWebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EAEzB,kCAAkC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EAAE,uCAAuC,EAAE,wCAAwC;AAE/F,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACzB,4BAA4B;AAC7B,OAAO,EAAO,KAAK,aAAa,EAAE,8BAA8B;AAShE,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB;AAG9D,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC3B,qBAAiB;AAElB,MAAM,MAAM,0BAA0B,GAClC,uCAAuC,GACvC,0BAA0B,CAAC;AAE/B,QAAA,MAAM,6BAA6B;;;;;;EAGjC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,aAAa,CACjD,OAAO,6BAA6B,EACpC,mBAAmB,CACpB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,eAAO,MAAM,oBAAoB;;;CAShC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,iBAAe,2BAA2B,CACxC,GAAG,EAAE,wBAAwB,CAAC,uBAAuB,CAAC,EACtD,GAAG,EAAE,sBAAsB,CAAC,mBAAmB,CAAC,EAChD,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,wBAAwB,EAC7B,MAAM,EAAE,KAAK,EACb,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,0BAA0B,CAAC,GACvD,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
@@ -3,11 +3,6 @@ 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';
7
- const hookNames = {
8
- hasPermission: true,
9
- openWebSocket: true,
10
- };
11
6
  const OpenWebSocketParametersStruct = object({
12
7
  url: uri({ protocol: union([literal('wss:'), literal('ws:')]) }),
13
8
  protocols: optional(array(string())),
@@ -59,9 +54,8 @@ const OpenWebSocketParametersStruct = object({
59
54
  * ```
60
55
  */
61
56
  export const openWebSocketHandler = {
62
- methodNames: [methodName],
63
57
  implementation: openWebSocketImplementation,
64
- hookNames,
58
+ actionNames: ['PermissionController:hasPermission', 'WebSocketService:open'],
65
59
  };
66
60
  /**
67
61
  * The `snap_openWebSocket` method implementation.
@@ -70,19 +64,18 @@ export const openWebSocketHandler = {
70
64
  * @param res - The JSON-RPC response object.
71
65
  * @param _next - The `json-rpc-engine` "next" callback. Not used by this function.
72
66
  * @param end - The `json-rpc-engine` "end" callback.
73
- * @param hooks - The RPC method hooks.
74
- * @param hooks.hasPermission - The function to check if a snap has the `endowment:network-access` permission.
75
- * @param hooks.openWebSocket - The function to open a WebSocket.
67
+ * @param _hooks - The RPC method hooks. Not used by this function.
68
+ * @param messenger - The messenger used to call controller actions.
76
69
  * @returns Nothing.
77
70
  */
78
- async function openWebSocketImplementation(req, res, _next, end, { hasPermission, openWebSocket }) {
79
- if (!hasPermission(SnapEndowments.NetworkAccess)) {
71
+ async function openWebSocketImplementation(req, res, _next, end, _hooks, messenger) {
72
+ const { params, origin } = req;
73
+ if (!messenger.call('PermissionController:hasPermission', origin, SnapEndowments.NetworkAccess)) {
80
74
  return end(providerErrors.unauthorized());
81
75
  }
82
- const { params } = req;
83
76
  try {
84
77
  const { url, protocols } = getValidatedParams(params);
85
- res.result = await openWebSocket(url, protocols);
78
+ res.result = await messenger.call('WebSocketService:open', origin, url, protocols);
86
79
  }
87
80
  catch (error) {
88
81
  return end(error);
@@ -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,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"]}
1
+ {"version":3,"file":"openWebSocket.mjs","sourceRoot":"","sources":["../../src/permitted/openWebSocket.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,6BAA6B;AACjE,OAAO,EACL,OAAO,EACP,KAAK,EAGN,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;AAU/C,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,cAAc,EAAE,2BAA2B;IAC3C,WAAW,EAAE,CAAC,oCAAoC,EAAE,uBAAuB,CAAC;CAO7E,CAAC;AAEF;;;;;;;;;;GAUG;AACH,KAAK,UAAU,2BAA2B,CACxC,GAAsD,EACtD,GAAgD,EAChD,KAAc,EACd,GAA6B,EAC7B,MAAa,EACb,SAAwD;IAExD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAE/B,IACE,CAAC,SAAS,CAAC,IAAI,CACb,oCAAoC,EACpC,MAAM,EACN,cAAc,CAAC,aAAa,CAC7B,EACD,CAAC;QACD,OAAO,GAAG,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACtD,GAAG,CAAC,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAC/B,uBAAuB,EACvB,MAAM,EACN,GAAG,EACH,SAAS,CACV,CAAC;IACJ,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 {\n JsonRpcEngineEndCallback,\n MethodHandler,\n} from '@metamask/json-rpc-engine';\nimport type { Messenger } from '@metamask/messenger';\nimport type { PermissionControllerHasPermissionAction } from '@metamask/permission-controller';\nimport { providerErrors, rpcErrors } from '@metamask/rpc-errors';\nimport {\n literal,\n union,\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 {\n JsonRpcRequestWithOrigin,\n WebSocketServiceOpenAction,\n} from '../types';\n\nexport type OpenWebSocketMethodActions =\n | PermissionControllerHasPermissionAction\n | WebSocketServiceOpenAction;\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 implementation: openWebSocketImplementation,\n actionNames: ['PermissionController:hasPermission', 'WebSocketService:open'],\n} satisfies MethodHandler<\n never,\n OpenWebSocketMethodActions,\n OpenWebSocketParams,\n OpenWebSocketResult,\n { origin: string }\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. Not used by this function.\n * @param messenger - The messenger used to call controller actions.\n * @returns Nothing.\n */\nasync function openWebSocketImplementation(\n req: JsonRpcRequestWithOrigin<OpenWebSocketParameters>,\n res: PendingJsonRpcResponse<OpenWebSocketResult>,\n _next: unknown,\n end: JsonRpcEngineEndCallback,\n _hooks: never,\n messenger: Messenger<string, OpenWebSocketMethodActions>,\n): Promise<void> {\n const { params, origin } = req;\n\n if (\n !messenger.call(\n 'PermissionController:hasPermission',\n origin,\n SnapEndowments.NetworkAccess,\n )\n ) {\n return end(providerErrors.unauthorized());\n }\n\n try {\n const { url, protocols } = getValidatedParams(params);\n res.result = await messenger.call(\n 'WebSocketService:open',\n origin,\n url,\n protocols,\n );\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,12 +6,6 @@ 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';
10
- const hookNames = {
11
- installSnaps: true,
12
- requestPermissions: true,
13
- getPermissions: true,
14
- };
15
9
  /**
16
10
  * Request permission for a dapp to communicate with the specified Snaps and
17
11
  * attempt to install them if they're not already installed.
@@ -38,9 +32,12 @@ const hookNames = {
38
32
  * ```
39
33
  */
40
34
  exports.requestSnapsHandler = {
41
- methodNames: [methodName],
42
35
  implementation: requestSnapsImplementation,
43
- hookNames,
36
+ actionNames: [
37
+ 'SnapController:installSnaps',
38
+ 'PermissionController:requestPermissions',
39
+ 'PermissionController:getPermissions',
40
+ ],
44
41
  };
45
42
  /**
46
43
  * Checks whether an origin has existing `wallet_snap` permission and
@@ -110,15 +107,12 @@ function getMutex(origin) {
110
107
  * @param _next - The `json-rpc-engine` "next" callback. Not used by this
111
108
  * function.
112
109
  * @param end - The `json-rpc-engine` "end" callback.
113
- * @param hooks - The RPC method hooks.
114
- * @param hooks.installSnaps - A function that tries to install a given snap, prompting the user if necessary.
115
- * @param hooks.requestPermissions - A function that requests permissions on
116
- * behalf of a subject.
117
- * @param hooks.getPermissions - A function that gets the current permissions.
110
+ * @param _hooks - The RPC method hooks. Not used by this function.
111
+ * @param messenger - The messenger used to call controller actions.
118
112
  * @returns A promise that resolves once the JSON-RPC response has been modified.
119
113
  * @throws If the params are invalid.
120
114
  */
121
- async function requestSnapsImplementation(req, res, _next, end, { installSnaps, requestPermissions, getPermissions }) {
115
+ async function requestSnapsImplementation(req, res, _next, end, _hooks, messenger) {
122
116
  const requestedSnaps = req.params;
123
117
  if (!(0, utils_1.isObject)(requestedSnaps)) {
124
118
  return end(rpc_errors_1.rpcErrors.invalidParams({
@@ -130,7 +124,6 @@ async function requestSnapsImplementation(req, res, _next, end, { installSnaps,
130
124
  message: 'Request must have at least one requested snap.',
131
125
  }));
132
126
  }
133
- // We expect the MM middleware stack to always add the origin to requests
134
127
  const { origin } = req;
135
128
  const mutex = getMutex(origin);
136
129
  // Process requests sequentially for each origin as permissions need to be merged
@@ -142,17 +135,19 @@ async function requestSnapsImplementation(req, res, _next, end, { installSnaps,
142
135
  caveats: [{ type: snaps_utils_1.SnapCaveatType.SnapIds, value: requestedSnaps }],
143
136
  },
144
137
  };
145
- const existingPermissions = await getPermissions();
138
+ const existingPermissions = messenger.call('PermissionController:getPermissions', origin);
146
139
  if (!existingPermissions) {
147
- const [, metadata] = await requestPermissions(requestedPermissions);
140
+ const [, metadata] = await messenger.call('PermissionController:requestPermissions', { origin }, requestedPermissions);
141
+ (0, utils_1.assert)(metadata.data);
148
142
  res.result = metadata.data[invokeSnap_1.WALLET_SNAP_PERMISSION_KEY];
149
143
  }
150
144
  else if (hasRequestedSnaps(existingPermissions, requestedSnaps)) {
151
- res.result = await installSnaps(requestedSnaps);
145
+ res.result = await messenger.call('SnapController:installSnaps', origin, requestedSnaps);
152
146
  }
153
147
  else {
154
148
  const mergedPermissionsRequest = getSnapPermissionsRequest(existingPermissions, requestedPermissions);
155
- const [, metadata] = await requestPermissions(mergedPermissionsRequest);
149
+ const [, metadata] = await messenger.call('PermissionController:requestPermissions', { origin }, mergedPermissionsRequest);
150
+ (0, utils_1.assert)(metadata.data);
156
151
  res.result = metadata.data[invokeSnap_1.WALLET_SNAP_PERMISSION_KEY];
157
152
  }
158
153
  }
@@ -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 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"]}
1
+ {"version":3,"file":"requestSnaps.cjs","sourceRoot":"","sources":["../../src/permitted/requestSnaps.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n JsonRpcEngineEndCallback,\n MethodHandler,\n} from '@metamask/json-rpc-engine';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n Caveat,\n PermissionConstraint,\n PermissionControllerGetPermissionsAction,\n PermissionControllerRequestPermissionsAction,\n RequestedPermissions,\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 { PendingJsonRpcResponse, Json } from '@metamask/utils';\nimport { assert, hasProperty, isObject } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\n\nimport { WALLET_SNAP_PERMISSION_KEY } from '../restricted/invokeSnap';\nimport type {\n JsonRpcRequestWithOrigin,\n SnapControllerInstallSnapsAction,\n} from '../types';\n\nexport type RequestSnapsMethodActions =\n | SnapControllerInstallSnapsAction\n | PermissionControllerRequestPermissionsAction\n | PermissionControllerGetPermissionsAction;\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 implementation: requestSnapsImplementation,\n actionNames: [\n 'SnapController:installSnaps',\n 'PermissionController:requestPermissions',\n 'PermissionController:getPermissions',\n ],\n} satisfies MethodHandler<\n never,\n RequestSnapsMethodActions,\n RequestSnapsParams,\n RequestSnapsResult,\n { origin: string }\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. Not used by this function.\n * @param messenger - The messenger used to call controller actions.\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: JsonRpcRequestWithOrigin<RequestSnapsParams>,\n res: PendingJsonRpcResponse<RequestSnapsResult>,\n _next: unknown,\n end: JsonRpcEngineEndCallback,\n _hooks: never,\n messenger: Messenger<string, RequestSnapsMethodActions>,\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 const { origin } = req;\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 = messenger.call(\n 'PermissionController:getPermissions',\n origin,\n );\n\n if (!existingPermissions) {\n const [, metadata] = await messenger.call(\n 'PermissionController:requestPermissions',\n { origin },\n requestedPermissions,\n );\n\n assert(metadata.data);\n\n res.result = metadata.data[\n WALLET_SNAP_PERMISSION_KEY\n ] as RequestSnapsResult;\n } else if (hasRequestedSnaps(existingPermissions, requestedSnaps)) {\n res.result = await messenger.call(\n 'SnapController:installSnaps',\n origin,\n requestedSnaps,\n );\n } else {\n const mergedPermissionsRequest = getSnapPermissionsRequest(\n existingPermissions,\n requestedPermissions,\n );\n\n const [, metadata] = await messenger.call(\n 'PermissionController:requestPermissions',\n { origin },\n mergedPermissionsRequest,\n );\n\n assert(metadata.data);\n\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,9 +1,11 @@
1
1
  import type { JsonRpcEngineEndCallback } from "@metamask/json-rpc-engine";
2
- import type { PermissionConstraint, RequestedPermissions } from "@metamask/permission-controller";
2
+ import type { Messenger } from "@metamask/messenger";
3
+ import type { PermissionConstraint, PermissionControllerGetPermissionsAction, PermissionControllerRequestPermissionsAction } from "@metamask/permission-controller";
3
4
  import type { RequestSnapsParams, RequestSnapsResult } from "@metamask/snaps-sdk";
4
5
  import type { SnapsPermissionRequest } from "@metamask/snaps-utils";
5
- import type { JsonRpcRequest, PendingJsonRpcResponse } from "@metamask/utils";
6
- import type { MethodHooksObject } from "../utils.cjs";
6
+ import type { PendingJsonRpcResponse } from "@metamask/utils";
7
+ import type { JsonRpcRequestWithOrigin, SnapControllerInstallSnapsAction } from "../types.cjs";
8
+ export type RequestSnapsMethodActions = SnapControllerInstallSnapsAction | PermissionControllerRequestPermissionsAction | PermissionControllerGetPermissionsAction;
7
9
  /**
8
10
  * Request permission for a dapp to communicate with the specified Snaps and
9
11
  * attempt to install them if they're not already installed.
@@ -30,34 +32,8 @@ import type { MethodHooksObject } from "../utils.cjs";
30
32
  * ```
31
33
  */
32
34
  export declare const requestSnapsHandler: {
33
- methodNames: ["wallet_requestSnaps"];
34
35
  implementation: typeof requestSnapsImplementation;
35
- hookNames: MethodHooksObject<RequestSnapsHooks>;
36
- };
37
- export type RequestSnapsHooks = {
38
- /**
39
- * Installs the requested snaps if they are permitted.
40
- */
41
- installSnaps: (requestedSnaps: RequestSnapsParams) => Promise<RequestSnapsResult>;
42
- /**
43
- * Initiates a permission request for the requesting origin.
44
- *
45
- * @returns The result of the permissions request.
46
- */
47
- requestPermissions: (permissions: RequestedPermissions) => Promise<[
48
- Record<string, PermissionConstraint>,
49
- {
50
- data: Record<string, unknown>;
51
- id: string;
52
- origin: string;
53
- }
54
- ]>;
55
- /**
56
- * Gets the current permissions for the requesting origin.
57
- *
58
- * @returns The current permissions of the requesting origin.
59
- */
60
- getPermissions: () => Promise<Record<string, PermissionConstraint> | undefined>;
36
+ actionNames: ("SnapController:installSnaps" | "PermissionController:requestPermissions" | "PermissionController:getPermissions")[];
61
37
  };
62
38
  /**
63
39
  * Checks whether an origin has existing `wallet_snap` permission and
@@ -86,14 +62,11 @@ export declare function getSnapPermissionsRequest(existingPermissions: Record<st
86
62
  * @param _next - The `json-rpc-engine` "next" callback. Not used by this
87
63
  * function.
88
64
  * @param end - The `json-rpc-engine` "end" callback.
89
- * @param hooks - The RPC method hooks.
90
- * @param hooks.installSnaps - A function that tries to install a given snap, prompting the user if necessary.
91
- * @param hooks.requestPermissions - A function that requests permissions on
92
- * behalf of a subject.
93
- * @param hooks.getPermissions - A function that gets the current permissions.
65
+ * @param _hooks - The RPC method hooks. Not used by this function.
66
+ * @param messenger - The messenger used to call controller actions.
94
67
  * @returns A promise that resolves once the JSON-RPC response has been modified.
95
68
  * @throws If the params are invalid.
96
69
  */
97
- declare function requestSnapsImplementation(req: JsonRpcRequest<RequestSnapsParams>, res: PendingJsonRpcResponse<RequestSnapsResult>, _next: unknown, end: JsonRpcEngineEndCallback, { installSnaps, requestPermissions, getPermissions }: RequestSnapsHooks): Promise<void>;
70
+ declare function requestSnapsImplementation(req: JsonRpcRequestWithOrigin<RequestSnapsParams>, res: PendingJsonRpcResponse<RequestSnapsResult>, _next: unknown, end: JsonRpcEngineEndCallback, _hooks: never, messenger: Messenger<string, RequestSnapsMethodActions>): Promise<void>;
98
71
  export {};
99
72
  //# sourceMappingURL=requestSnaps.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"requestSnaps.d.cts","sourceRoot":"","sources":["../../src/permitted/requestSnaps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,kCAAkC;AAC1E,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EAGrB,wCAAwC;AAEzC,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EACnB,4BAA4B;AAC7B,OAAO,KAAK,EAAE,sBAAsB,EAAE,8BAA8B;AAKpE,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EAEvB,wBAAwB;AAKzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAiB;AAUlD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,mBAAmB;;;;CAQ/B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;OAEG;IACH,YAAY,EAAE,CACZ,cAAc,EAAE,kBAAkB,KAC/B,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEjC;;;;OAIG;IACH,kBAAkB,EAAE,CAClB,WAAW,EAAE,oBAAoB,KAC9B,OAAO,CACV;QACE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC;QACpC;YAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAAC,EAAE,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE;KAC9D,CACF,CAAC;IAEF;;;;OAIG;IACH,cAAc,EAAE,MAAM,OAAO,CAC3B,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAAG,SAAS,CACjD,CAAC;CACH,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,EACzD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACtC,OAAO,CAcT;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,EACzD,oBAAoB,EAAE,OAAO,GAC5B,sBAAsB,CAmCxB;AAiBD;;;;;;;;;;;;;;;;GAgBG;AACH,iBAAe,0BAA0B,CACvC,GAAG,EAAE,cAAc,CAAC,kBAAkB,CAAC,EACvC,GAAG,EAAE,sBAAsB,CAAC,kBAAkB,CAAC,EAC/C,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,wBAAwB,EAC7B,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,EAAE,iBAAiB,GACtE,OAAO,CAAC,IAAI,CAAC,CA0Df"}
1
+ {"version":3,"file":"requestSnaps.d.cts","sourceRoot":"","sources":["../../src/permitted/requestSnaps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EAEzB,kCAAkC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EAEV,oBAAoB,EACpB,wCAAwC,EACxC,4CAA4C,EAE7C,wCAAwC;AAEzC,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EACnB,4BAA4B;AAC7B,OAAO,KAAK,EAAE,sBAAsB,EAAE,8BAA8B;AAKpE,OAAO,KAAK,EAAE,sBAAsB,EAAQ,wBAAwB;AAKpE,OAAO,KAAK,EACV,wBAAwB,EACxB,gCAAgC,EACjC,qBAAiB;AAElB,MAAM,MAAM,yBAAyB,GACjC,gCAAgC,GAChC,4CAA4C,GAC5C,wCAAwC,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,mBAAmB;;;CAa/B,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,EACzD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACtC,OAAO,CAcT;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,EACzD,oBAAoB,EAAE,OAAO,GAC5B,sBAAsB,CAmCxB;AAiBD;;;;;;;;;;;;;GAaG;AACH,iBAAe,0BAA0B,CACvC,GAAG,EAAE,wBAAwB,CAAC,kBAAkB,CAAC,EACjD,GAAG,EAAE,sBAAsB,CAAC,kBAAkB,CAAC,EAC/C,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,wBAAwB,EAC7B,MAAM,EAAE,KAAK,EACb,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,yBAAyB,CAAC,GACtD,OAAO,CAAC,IAAI,CAAC,CA8Ef"}
@@ -1,9 +1,11 @@
1
1
  import type { JsonRpcEngineEndCallback } from "@metamask/json-rpc-engine";
2
- import type { PermissionConstraint, RequestedPermissions } from "@metamask/permission-controller";
2
+ import type { Messenger } from "@metamask/messenger";
3
+ import type { PermissionConstraint, PermissionControllerGetPermissionsAction, PermissionControllerRequestPermissionsAction } from "@metamask/permission-controller";
3
4
  import type { RequestSnapsParams, RequestSnapsResult } from "@metamask/snaps-sdk";
4
5
  import type { SnapsPermissionRequest } from "@metamask/snaps-utils";
5
- import type { JsonRpcRequest, PendingJsonRpcResponse } from "@metamask/utils";
6
- import type { MethodHooksObject } from "../utils.mjs";
6
+ import type { PendingJsonRpcResponse } from "@metamask/utils";
7
+ import type { JsonRpcRequestWithOrigin, SnapControllerInstallSnapsAction } from "../types.mjs";
8
+ export type RequestSnapsMethodActions = SnapControllerInstallSnapsAction | PermissionControllerRequestPermissionsAction | PermissionControllerGetPermissionsAction;
7
9
  /**
8
10
  * Request permission for a dapp to communicate with the specified Snaps and
9
11
  * attempt to install them if they're not already installed.
@@ -30,34 +32,8 @@ import type { MethodHooksObject } from "../utils.mjs";
30
32
  * ```
31
33
  */
32
34
  export declare const requestSnapsHandler: {
33
- methodNames: ["wallet_requestSnaps"];
34
35
  implementation: typeof requestSnapsImplementation;
35
- hookNames: MethodHooksObject<RequestSnapsHooks>;
36
- };
37
- export type RequestSnapsHooks = {
38
- /**
39
- * Installs the requested snaps if they are permitted.
40
- */
41
- installSnaps: (requestedSnaps: RequestSnapsParams) => Promise<RequestSnapsResult>;
42
- /**
43
- * Initiates a permission request for the requesting origin.
44
- *
45
- * @returns The result of the permissions request.
46
- */
47
- requestPermissions: (permissions: RequestedPermissions) => Promise<[
48
- Record<string, PermissionConstraint>,
49
- {
50
- data: Record<string, unknown>;
51
- id: string;
52
- origin: string;
53
- }
54
- ]>;
55
- /**
56
- * Gets the current permissions for the requesting origin.
57
- *
58
- * @returns The current permissions of the requesting origin.
59
- */
60
- getPermissions: () => Promise<Record<string, PermissionConstraint> | undefined>;
36
+ actionNames: ("SnapController:installSnaps" | "PermissionController:requestPermissions" | "PermissionController:getPermissions")[];
61
37
  };
62
38
  /**
63
39
  * Checks whether an origin has existing `wallet_snap` permission and
@@ -86,14 +62,11 @@ export declare function getSnapPermissionsRequest(existingPermissions: Record<st
86
62
  * @param _next - The `json-rpc-engine` "next" callback. Not used by this
87
63
  * function.
88
64
  * @param end - The `json-rpc-engine` "end" callback.
89
- * @param hooks - The RPC method hooks.
90
- * @param hooks.installSnaps - A function that tries to install a given snap, prompting the user if necessary.
91
- * @param hooks.requestPermissions - A function that requests permissions on
92
- * behalf of a subject.
93
- * @param hooks.getPermissions - A function that gets the current permissions.
65
+ * @param _hooks - The RPC method hooks. Not used by this function.
66
+ * @param messenger - The messenger used to call controller actions.
94
67
  * @returns A promise that resolves once the JSON-RPC response has been modified.
95
68
  * @throws If the params are invalid.
96
69
  */
97
- declare function requestSnapsImplementation(req: JsonRpcRequest<RequestSnapsParams>, res: PendingJsonRpcResponse<RequestSnapsResult>, _next: unknown, end: JsonRpcEngineEndCallback, { installSnaps, requestPermissions, getPermissions }: RequestSnapsHooks): Promise<void>;
70
+ declare function requestSnapsImplementation(req: JsonRpcRequestWithOrigin<RequestSnapsParams>, res: PendingJsonRpcResponse<RequestSnapsResult>, _next: unknown, end: JsonRpcEngineEndCallback, _hooks: never, messenger: Messenger<string, RequestSnapsMethodActions>): Promise<void>;
98
71
  export {};
99
72
  //# sourceMappingURL=requestSnaps.d.mts.map