@abtnode/blocklet-services 1.16.27 → 1.16.28-beta-bfbab430

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 (229) hide show
  1. package/api/index.js +4 -3
  2. package/api/libs/connect/session.js +12 -6
  3. package/api/libs/connect/v1.js +5 -1
  4. package/api/libs/push-kit/index.js +114 -0
  5. package/api/routes/federated.js +2 -3
  6. package/api/routes/oauth.js +13 -2
  7. package/api/routes/user-session.js +22 -4
  8. package/api/routes/user.js +12 -0
  9. package/api/services/auth/connect/invite.js +6 -0
  10. package/api/services/auth/connect/issue-passport.js +6 -0
  11. package/api/services/auth/session.js +8 -2
  12. package/api/services/notification/index.js +21 -1
  13. package/api/socket/channel/did.js +114 -49
  14. package/api/util/index.js +18 -3
  15. package/dist/assets/{Add-CwM8vqJb.js → Add-BM20NrQO.js} +1 -1
  16. package/dist/assets/{AddBox-CWtpGmfL.js → AddBox--wxfR3G0.js} +1 -1
  17. package/dist/assets/Alert-DtzaUssX.js +1 -0
  18. package/dist/assets/{ArrowDropDown-D7NxLtoD.js → ArrowDropDown-Iyfxx2xg.js} +1 -1
  19. package/dist/assets/{Avatar-DALZS0lZ.js → Avatar-CUpS4Ilr.js} +1 -1
  20. package/dist/assets/{ButtonGroup-CJkesdM3.js → ButtonGroup-CYyG5u2K.js} +1 -1
  21. package/dist/assets/{CheckCircle-BJ5Uw81o.js → CheckCircle-DoaQShhi.js} +1 -1
  22. package/dist/assets/ChevronRight-CoSoIqx4.js +1 -0
  23. package/dist/assets/{Close-DmMtvJJN.js → Close-BLsWc_Tk.js} +1 -1
  24. package/dist/assets/{CloseOutlined-C9Px1Nek.js → CloseOutlined-DW47mLri.js} +1 -1
  25. package/dist/assets/{Delete-DYY-Ow66.js → Delete-BeboIHFa.js} +1 -1
  26. package/dist/assets/{DeleteOutline-D9U3cBQw.js → DeleteOutline-BaCf1XtY.js} +1 -1
  27. package/dist/assets/{Done-DsGkSs6f.js → Done-BEjApK9u.js} +1 -1
  28. package/dist/assets/{Download-BEa4Nrk6.js → Download-DjWaMhPn.js} +1 -1
  29. package/dist/assets/{Edit-B2iBIPGp.js → Edit-DyzvkXNJ.js} +1 -1
  30. package/dist/assets/{EditIcon-DJlQ7yQx.js → EditIcon-BXRvvSFr.js} +1 -1
  31. package/dist/assets/{Error-07pFpb7C.js → Error-DcCaeZ_S.js} +1 -1
  32. package/dist/assets/{ExpandMore-CM-DE2JK.js → ExpandMore-Dw5iC69g.js} +1 -1
  33. package/dist/assets/{FilterList-B6nHdXje.js → FilterList-B_AYjksa.js} +5 -5
  34. package/dist/assets/FormControl-CKJrH8LS.js +1 -0
  35. package/dist/assets/{FormControlLabel-DKslb7to.js → FormControlLabel-J_nG7S9r.js} +1 -1
  36. package/dist/assets/{FormGroup-Ba1ctrn7.js → FormGroup-B2XKvk2U.js} +1 -1
  37. package/dist/assets/{Google-kq1gRB6c.js → Google-_J6to4FR.js} +4 -4
  38. package/dist/assets/{Hidden-CUsYJfHX.js → Hidden-BLdLc8h9.js} +1 -1
  39. package/dist/assets/{InfoOutlined-Bb4PKvfm.js → InfoOutlined-jXjX6Tro.js} +1 -1
  40. package/dist/assets/{InputAdornment-HFI-ThUx.js → InputAdornment-DYTxgt6k.js} +1 -1
  41. package/dist/assets/{InputLabel-CRX7GO1W.js → InputLabel-lATzw7NR.js} +1 -1
  42. package/dist/assets/{LastPage-_qKWqTam.js → LastPage-2k34T11k.js} +1 -1
  43. package/dist/assets/{Launch-DF8F5LY1.js → Launch-DOIBGLzl.js} +1 -1
  44. package/dist/assets/{LaunchOutlined-B6B8I_2E.js → LaunchOutlined-SrMQHpJM.js} +1 -1
  45. package/dist/assets/{Link-J1qypDUa.js → Link-5b2HVhJS.js} +1 -1
  46. package/dist/assets/{ListItemText--5OHywDj.js → ListItemText-BWOzBiMo.js} +1 -1
  47. package/dist/assets/{LoadingButton-CQrsv4YE.js → LoadingButton-CK30gWPr.js} +1 -1
  48. package/dist/assets/{LockIcon-CatEwcOV.js → LockIcon-DSoFeiUW.js} +1 -1
  49. package/dist/assets/{Loop-B9IjX0E7.js → Loop-CBPEms0Q.js} +1 -1
  50. package/dist/assets/{MoreHoriz-OF0bQEaE.js → MoreHoriz-D2VMH51n.js} +1 -1
  51. package/dist/assets/{MoreVert-DQBeF_6h.js → MoreVert-BEZvlzF-.js} +1 -1
  52. package/dist/assets/{OpenInNew-IStrdCVC.js → OpenInNew-Ck3ijqlL.js} +1 -1
  53. package/dist/assets/Pagination-DYCSDEOZ.js +2 -0
  54. package/dist/assets/{PlayArrow-CK4Wf37C.js → PlayArrow-Bep57q0l.js} +1 -1
  55. package/dist/assets/{QuestionMarkCircle-BqrlW5d1.js → QuestionMarkCircle-BRJ6UWDC.js} +1 -1
  56. package/dist/assets/{RadioGroup--3XkfP_A.js → RadioGroup-DjYscIah.js} +1 -1
  57. package/dist/assets/{Search-BD9rBqLl.js → Search-DFMpNFHb.js} +1 -1
  58. package/dist/assets/{Select-VsDz5FE8.js → Select-B59j8vqU.js} +2 -2
  59. package/dist/assets/{ServerLogo-VaBfp8lH.js → ServerLogo-B-brfx83.js} +1 -1
  60. package/dist/assets/{Skeleton-DUeW-_dm.js → Skeleton-CjiEfCyO.js} +4 -4
  61. package/dist/assets/{Slider-C_5S9kwO.js → Slider-BJkaec7K.js} +1 -1
  62. package/dist/assets/{Stepper-BbPygfKM.js → Stepper-JkeBEOuY.js} +1 -1
  63. package/dist/assets/{TextField-aPyTQ1Wg.js → TextField-C5D15Ugf.js} +1 -1
  64. package/dist/assets/{Toolbar-DjGyyZ0P.js → Toolbar-CSkIjhiI.js} +1 -1
  65. package/dist/assets/{ViewList-DEy367A5.js → ViewList-BKInLQTN.js} +1 -1
  66. package/dist/assets/access-control-BCwpKFRG.js +13 -0
  67. package/dist/assets/{actions-C3pxTAkB.js → actions-DPCHP2Zq.js} +1 -1
  68. package/dist/assets/{add-component-core-Bl_jCY6w.js → add-component-core-07RqFKRp.js} +53 -53
  69. package/dist/assets/add-resource-DyhrbJxX.js +1 -0
  70. package/dist/assets/{addon-D6Zv_xJR.js → addon-Dd_1kHaH.js} +1 -1
  71. package/dist/assets/{analytics-9rS1UvzU.js → analytics-CpnXFlCP.js} +9 -9
  72. package/dist/assets/api-BEakJrYk.js +1 -0
  73. package/dist/assets/{ar-DqmJV4p8.js → ar-DXpJw3XU.js} +1 -1
  74. package/dist/assets/{audit-logs-DqukTJ9s.js → audit-logs-CcdVOnke.js} +2 -2
  75. package/dist/assets/{button-CRqbeCtP.js → button-BKUtHuLK.js} +1 -1
  76. package/dist/assets/{click-to-copy-BAX04hG0.js → click-to-copy-C5Z-YhEj.js} +1 -1
  77. package/dist/assets/{complete-D_oUCOrq.js → complete-DGbpqS5n.js} +4 -4
  78. package/dist/assets/{component-CZa-Hbf-.js → component-DqG0gKuO.js} +40 -40
  79. package/dist/assets/{config-Br1oEhxb.js → config-DLELBWuY.js} +1 -1
  80. package/dist/assets/config-DseId50E.js +32 -0
  81. package/dist/assets/{config-navigation-BAezznbr.js → config-navigation-D3NGEvCy.js} +2 -2
  82. package/dist/assets/{config-space-BFhSdYit.js → config-space-Dq3sHJW8.js} +1 -1
  83. package/dist/assets/confirm-Bp1YUyru.js +7 -0
  84. package/dist/assets/connect-CCqeZs4y.js +1 -0
  85. package/dist/assets/connect-De6kBvVp.js +5 -0
  86. package/dist/assets/{connect-to-dvuLvbZ-.js → connect-to-DNQSW4Zf.js} +2 -2
  87. package/dist/assets/{content-layout-9WIqKbOM.js → content-layout-FX0-4e_U.js} +1 -1
  88. package/dist/assets/dashboard-gEbtoKpZ.js +129 -0
  89. package/dist/assets/{de-CHOUObJ5.js → de-CWxlIdre.js} +1 -1
  90. package/dist/assets/{did-address-DmmIbEBi.js → did-address-Etx4oDtC.js} +1 -1
  91. package/dist/assets/domain-Bp688Xuz.js +9 -0
  92. package/dist/assets/domain-list-xUOKEmgZ.js +12 -0
  93. package/dist/assets/{es-aZ4oYeVs.js → es-BmrvDK07.js} +1 -1
  94. package/dist/assets/exchange-passport-Ca8hn9GK.js +1 -0
  95. package/dist/assets/{fallback-Bjkb8vHx.js → fallback-CIBVmJin.js} +1 -1
  96. package/dist/assets/{fr-Bi9vptGI.js → fr-B7SxgRy3.js} +1 -1
  97. package/dist/assets/fuel-CJOxfEOO.js +32 -0
  98. package/dist/assets/{fullpage-CKGw8-fI.js → fullpage-D3A4C5-R.js} +1 -1
  99. package/dist/assets/{hi-BXYjfUTP.js → hi-BRRtNIB_.js} +1 -1
  100. package/dist/assets/{home-DhEHMf3u.js → home-CjQy6Wn4.js} +1 -1
  101. package/dist/assets/{id-VVXvzjmO.js → id-D6-Qi7Q1.js} +1 -1
  102. package/dist/assets/{iframe-hH7vDtKv.js → iframe-BBq0Voai.js} +1 -1
  103. package/dist/assets/{index-BVS_h6_H.js → index-3J8dxrpv.js} +1 -1
  104. package/dist/assets/{index-BP_qJBTx.js → index-B-MiDNZJ.js} +1 -1
  105. package/dist/assets/{index-CwWUEzws.js → index-B0YP3d1_.js} +3 -3
  106. package/dist/assets/{index-B05fFzEE.js → index-B4NnGwvJ.js} +1 -1
  107. package/dist/assets/{index-Bm0QayqF.js → index-BJX9Tvpd.js} +6 -6
  108. package/dist/assets/{index-CO8IqBmF.js → index-BNte_m1O.js} +1 -1
  109. package/dist/assets/{index-9Y8ZRmbf.js → index-BYYybgec.js} +38 -35
  110. package/dist/assets/{index-B3UB5TOv.js → index-BgwjaAEK.js} +1 -1
  111. package/dist/assets/{index-BLyEUpiJ.js → index-BvTERmRP.js} +1 -1
  112. package/dist/assets/{index-B7MppK7L.js → index-BvWO4cX9.js} +1 -1
  113. package/dist/assets/{index-B9czh19J.js → index-BvsLirqD.js} +155 -154
  114. package/dist/assets/{index-B3s-NAqV.js → index-C2gRwmn2.js} +1 -1
  115. package/dist/assets/{index-BF78-zJ5.js → index-C7siWm6R.js} +1 -1
  116. package/dist/assets/{index-BJaQQWJE.js → index-CBJAk2V8.js} +2 -2
  117. package/dist/assets/{index-Dwuihh4n.js → index-CR0jMc07.js} +1 -1
  118. package/dist/assets/{index-HqCEhnQP.js → index-CnSZHHme.js} +1 -1
  119. package/dist/assets/{index-DyRXn6rY.js → index-Cy0soagJ.js} +1 -1
  120. package/dist/assets/{index-BdYns3WE.js → index-CzncbcdH.js} +1 -1
  121. package/dist/assets/{index-Cimrtxl8.js → index-D4zAIKo5.js} +4 -4
  122. package/dist/assets/{index-c3sUblIj.js → index-DA6RGcPS.js} +1 -1
  123. package/dist/assets/{index-nRvA5BM-.js → index-DUsylIII.js} +1 -1
  124. package/dist/assets/{index-CHnlO9E8.js → index-DWdOmPJK.js} +5 -5
  125. package/dist/assets/index-Dm4QfKgj.js +262 -0
  126. package/dist/assets/{index-DukOQ0Y3.js → index-DxgnjIVN.js} +1 -1
  127. package/dist/assets/{index-BpqWJ7Er.js → index-DzIqbqJ_.js} +7 -7
  128. package/dist/assets/{index-0FEizmM4.js → index-QBptYklD.js} +8 -8
  129. package/dist/assets/{index-B7G9Fhd_.js → index-QUyszNOn.js} +1 -1
  130. package/dist/assets/index-Ta8CgfK0.js +4 -0
  131. package/dist/assets/{index-CwHsstjC.js → index-kTvctsLd.js} +1 -1
  132. package/dist/assets/{index-DuUQrj2C.js → index-lo0p8vGs.js} +11 -11
  133. package/dist/assets/index-r7u0jEi1.js +1 -0
  134. package/dist/assets/{index-hnQe74ZU.js → index-zD9-bZuV.js} +1 -1
  135. package/dist/assets/{index.es-eYwgfi8m.js → index.es-BwRDpSz4.js} +3 -3
  136. package/dist/assets/{index.esm-U8pM0U8X.js → index.esm-CpvBYn6L.js} +1 -1
  137. package/dist/assets/{invitation-7mUGX79t.js → invitation-DmGeq7ty.js} +4 -4
  138. package/dist/assets/{invite-C8ZVAak5.js → invite-BHr71ERq.js} +1 -1
  139. package/dist/assets/issue-passport-CVLycMc5.js +1 -0
  140. package/dist/assets/{item-Bop3PNhc.js → item-BcWo6lea.js} +1 -1
  141. package/dist/assets/{ja-DqJiajLu.js → ja--dtwu5Xy.js} +1 -1
  142. package/dist/assets/{jss-plugin-props-sort.esm-Bc8cqy_b.js → jss-plugin-props-sort.esm-CS5B424R.js} +4 -4
  143. package/dist/assets/{ko-DQKmtlbI.js → ko-DpRJDWhF.js} +1 -1
  144. package/dist/assets/{launch-result-message-Dzt2QHg4.js → launch-result-message-CAUmoCmH.js} +1 -1
  145. package/dist/assets/{layout-Bsd-UJ0q.js → layout-l6KrRo_j.js} +1 -1
  146. package/dist/assets/{list-header-Do3beXgv.js → list-header-C_S_alCD.js} +1 -1
  147. package/dist/assets/localization-Bewup7q7.js +1 -0
  148. package/dist/assets/{log-DEXPeWJf.js → log-Ch42uXqw.js} +8 -8
  149. package/dist/assets/{login-C4_wiMTC.js → login-BxjyT1qS.js} +1 -1
  150. package/dist/assets/{login-oauth-callback-DZ7nd9rq.js → login-oauth-callback-C6s-4b1V.js} +1 -1
  151. package/dist/assets/{logo-uploader-qdt-u5pf.js → logo-uploader-CGtIsD0T.js} +3 -3
  152. package/dist/assets/{lost-passport-CGdWl3yM.js → lost-passport-By5cjQFH.js} +3 -3
  153. package/dist/assets/{lottie-vIbHYG02.js → lottie-DVm7n_Um.js} +1 -1
  154. package/dist/assets/notifications-CEpa_xHz.js +62 -0
  155. package/dist/assets/overview-GOUiKG2a.js +12 -0
  156. package/dist/assets/{page-header-CspR2DX0.js → page-header-COyUenU-.js} +1 -1
  157. package/dist/assets/{permission-Dl2bYO4H.js → permission-DWzaHXWC.js} +1 -1
  158. package/dist/assets/{preferences-DqxPfbJN.js → preferences-CE-9QBFo.js} +1 -1
  159. package/dist/assets/{pt-si0ACe2m.js → pt-BxA88dKG.js} +1 -1
  160. package/dist/assets/publish-resource-UvJbVy1r.js +1 -0
  161. package/dist/assets/{react-eYk4JkPK.js → react-CY_QENHU.js} +3 -3
  162. package/dist/assets/{redux-Br01S-c2.js → redux-CTTkxs7M.js} +1 -1
  163. package/dist/assets/{resource-dialog-jzqGsDCb.js → resource-dialog-CfRq8NMl.js} +3 -3
  164. package/dist/assets/{ru-B36cpSA6.js → ru-C9WJaQoQ.js} +1 -1
  165. package/dist/assets/{selector-D_3o6AEu.js → selector-BEck9RSE.js} +2 -2
  166. package/dist/assets/session-CVIETtuz.js +1 -0
  167. package/dist/assets/setup-CkCZJ55S.js +14 -0
  168. package/dist/assets/{slicedToArray-CwHagVUQ.js → slicedToArray-DCpTgETk.js} +2 -2
  169. package/dist/assets/{spaces-DNCapkb6.js → spaces-BFbdkHH8.js} +1 -1
  170. package/dist/assets/start-CvZw2F8k.js +186 -0
  171. package/dist/assets/{step-actions-D8a8ZXtt.js → step-actions-5tGgPrhF.js} +2 -2
  172. package/dist/assets/{studio-IOq2NSOB.js → studio-CGE88nOP.js} +1 -1
  173. package/dist/assets/{switch-control-nONosChT.js → switch-control-DBbuPW4q.js} +1 -1
  174. package/dist/assets/{th-Dtc8_3Sk.js → th-z7LSYRZi.js} +1 -1
  175. package/dist/assets/{toUpper-B_IOVg6L.js → toUpper-DTIWej6b.js} +1 -1
  176. package/dist/assets/transfer-26ConaJn.js +16 -0
  177. package/dist/assets/uniqBy-BF_2_CqX.js +1 -0
  178. package/dist/assets/{unsubscribe-Bsb_3Ieh.js → unsubscribe-Cwx3CGkA.js} +1 -1
  179. package/dist/assets/use-blocklet-info-for-connect-did-spaces-DXCdpGY7.js +1 -0
  180. package/dist/assets/{use-mobile-ioC1m4Aw.js → use-mobile-DTODc0Do.js} +1 -1
  181. package/dist/assets/{useAsync-CUaC98xZ.js → useAsync-BIhajT1g.js} +1 -1
  182. package/dist/assets/{useFormControl-DN9T7ala.js → useFormControl-D74Gykn0.js} +1 -1
  183. package/dist/assets/useLocalStorage-CTTJpYi8.js +1 -0
  184. package/dist/assets/{useSetState-s4taE93i.js → useSetState-B8DWdra7.js} +1 -1
  185. package/dist/assets/useSlot-C0EbF40A.js +1 -0
  186. package/dist/assets/{user-center-CRnZOCDY.js → user-center-BurgeGnu.js} +1 -1
  187. package/dist/assets/{user-sessions-CMehw0R-.js → user-sessions-DFuVpXta.js} +1 -1
  188. package/dist/assets/util-BfdLSo0f.js +1 -0
  189. package/dist/assets/{vi-DpH7bkpR.js → vi-CAtyUyNW.js} +1 -1
  190. package/dist/assets/wrap-locale-mANFn3Dq.js +1 -0
  191. package/dist/assets/{zh-Dizc5DZz.js → zh-BVBeddUa.js} +1 -1
  192. package/dist/assets/{zh-tw-Cb93tcSH.js → zh-tw-CoStw7dd.js} +1 -1
  193. package/dist/index.html +1 -1
  194. package/dist/service-worker.js +1 -1
  195. package/package.json +18 -18
  196. package/dist/assets/Alert-DEfPMXiL.js +0 -1
  197. package/dist/assets/ChevronRight-D7mN0YuF.js +0 -1
  198. package/dist/assets/FormControl-Cmz7MMzt.js +0 -1
  199. package/dist/assets/Pagination-BZdZkcIC.js +0 -2
  200. package/dist/assets/access-control-DK2pI24G.js +0 -13
  201. package/dist/assets/add-resource-CPVqxtxe.js +0 -1
  202. package/dist/assets/api-CehzwmLw.js +0 -1
  203. package/dist/assets/config-hzwzGLfY.js +0 -32
  204. package/dist/assets/confirm-CjNsJKwh.js +0 -7
  205. package/dist/assets/connect-BMVV8zee.js +0 -5
  206. package/dist/assets/connect-BSqfICbm.js +0 -1
  207. package/dist/assets/dashboard-aseO1swh.js +0 -129
  208. package/dist/assets/domain-DLtg0rzi.js +0 -9
  209. package/dist/assets/domain-list-DQowufpU.js +0 -12
  210. package/dist/assets/exchange-passport-CkmSpB9Y.js +0 -1
  211. package/dist/assets/fuel-CAVJYvfz.js +0 -32
  212. package/dist/assets/index-BXrQh9rJ.js +0 -1
  213. package/dist/assets/index-C-632Bpb.js +0 -4
  214. package/dist/assets/index-CBOJPxPp.js +0 -262
  215. package/dist/assets/issue-passport-DZimOHGE.js +0 -1
  216. package/dist/assets/localization-C8OGiNfd.js +0 -1
  217. package/dist/assets/notifications-g3gIPxdM.js +0 -62
  218. package/dist/assets/overview-DKlRksmh.js +0 -12
  219. package/dist/assets/publish-resource-C97kIenG.js +0 -1
  220. package/dist/assets/session-Dheoj1eV.js +0 -1
  221. package/dist/assets/setup-B7pfHqWG.js +0 -14
  222. package/dist/assets/start-DjJppiHH.js +0 -186
  223. package/dist/assets/transfer-DV0XxzFA.js +0 -16
  224. package/dist/assets/uniqBy-Bd7wqwWH.js +0 -1
  225. package/dist/assets/use-blocklet-info-for-connect-did-spaces-fww7xb0i.js +0 -1
  226. package/dist/assets/useLocalStorage-QmE2CUEj.js +0 -1
  227. package/dist/assets/useSlot-BTLZemfY.js +0 -1
  228. package/dist/assets/util-B4zpW16j.js +0 -1
  229. package/dist/assets/wrap-locale-BSC6foWr.js +0 -1
package/api/index.js CHANGED
@@ -266,6 +266,7 @@ module.exports = function createServer(node, serverOptions = {}) {
266
266
  // API: notification
267
267
  notificationService.sendToUser.attach(server);
268
268
  notificationService.sendToMail.attach(server);
269
+ notificationService.sendToPush.attach(server);
269
270
  notificationService.sendToAppChannel.attach(server);
270
271
  relayService.sendToRelay.attach(server);
271
272
 
@@ -362,16 +363,16 @@ module.exports = function createServer(node, serverOptions = {}) {
362
363
  // After all service middleware, we can now safely pass all traffic to blocklets
363
364
  server.use(async (req, res) => {
364
365
  try {
365
- const { target } = await ensureProxyUrl(req);
366
+ const { target, headers, error } = await ensureProxyUrl(req);
366
367
  if (target) {
367
368
  if (imageService.isImageAccepted(req) && imageService.isImageRequest(req)) {
368
369
  req.target = target; // for internal use
369
370
  imageService.processImage(req, res);
370
371
  } else {
371
- proxy.safeWeb(req, res, { target });
372
+ proxy.safeWeb(req, res, { target, headers });
372
373
  }
373
374
  } else {
374
- throw new Error('empty proxy target');
375
+ throw new Error(error);
375
376
  }
376
377
  } catch (err) {
377
378
  logger.error('Failed to get component target', { url: req.url, error: err });
@@ -158,7 +158,7 @@ const checkAppOwner = ({ role, blocklet, userDid, locale = 'en' }) => {
158
158
  const isDidSpaceRequiredOnConnect = (blocklet, request) => {
159
159
  let flag = false;
160
160
 
161
- const [, componentDid] = request.headers['x-blocklet-component-id'].split('/');
161
+ const [, componentDid] = (request.get('x-blocklet-component-id') || '').split('/');
162
162
 
163
163
  forEachBlockletSync(blocklet, (b) => {
164
164
  flag =
@@ -472,7 +472,7 @@ module.exports = {
472
472
  locale,
473
473
  passport,
474
474
  sourceAppPid,
475
- lastLoginIp: get(request, 'headers[x-real-ip]') || '',
475
+ lastLoginIp: request.get('x-real-aip') || '',
476
476
  connectedAccount: [connectAccount, connectedNft],
477
477
  },
478
478
  });
@@ -502,7 +502,7 @@ module.exports = {
502
502
  locale,
503
503
  passport,
504
504
  sourceAppPid,
505
- lastLoginIp: get(request, 'headers[x-real-ip]') || '',
505
+ lastLoginIp: request.get('x-real-ip') || '',
506
506
  connectedAccount: [connectAccount, connectedNft],
507
507
  },
508
508
  });
@@ -522,8 +522,10 @@ module.exports = {
522
522
  node
523
523
  );
524
524
  }
525
- const lastLoginIp = request.headers['x-real-ip'];
526
- const ua = request.headers['user-agent'];
525
+ const lastLoginIp = request.get('x-real-ip');
526
+ const walletDeviceMessageToken = request.get('wallet-device-message-token');
527
+ const walletDeviceId = request.get('wallet-device-id');
528
+ const ua = request.get('user-agent');
527
529
  // request.context.store.connectedWallet
528
530
  const walletOS = request.context.didwallet.os;
529
531
 
@@ -538,6 +540,8 @@ module.exports = {
538
540
  lastLoginIp,
539
541
  extra: {
540
542
  walletOS,
543
+ walletDeviceMessageToken,
544
+ walletDeviceId,
541
545
  },
542
546
  });
543
547
 
@@ -571,6 +575,8 @@ module.exports = {
571
575
  lastLoginIp,
572
576
  extra: {
573
577
  walletOS,
578
+ walletDeviceMessageToken,
579
+ walletDeviceId,
574
580
  },
575
581
  });
576
582
  });
@@ -1106,7 +1112,7 @@ module.exports = {
1106
1112
  pk: oauthUser.pk,
1107
1113
  ...mergeProfile,
1108
1114
  locale,
1109
- lastLoginIp: get(request, 'headers[x-real-ip]') || '',
1115
+ lastLoginIp: request.get('x-real-ap') || '',
1110
1116
  connectedAccounts: [connectedAccount],
1111
1117
  passports: mergePassport,
1112
1118
  },
@@ -83,7 +83,11 @@ module.exports = (node, opts) => {
83
83
 
84
84
  // Only handles did-connect updates, because we need to determine the actual app
85
85
  sendToRelayFn: async (topic, event, data) => {
86
- const publisher = get(data, 'appInfo.agentDid', '') || get(data, 'appInfo.publisher', '');
86
+ // NOTICE: 这里需要和前端订阅的 ws channel 保持一致
87
+ // 1. 如果是统一登录的环境,那么前端订阅的 channel 是 memberAppInfo.publisher
88
+ // 2. 如果是非统一登录的环境,那么前端订阅的 channel 是 appInfo.publisher
89
+ // 永远保持订阅的通道是当前 blocklet 的 did
90
+ const publisher = get(data, 'memberAppInfo.publisher') || get(data, 'appInfo.publisher');
87
91
  if (!publisher) {
88
92
  return null;
89
93
  }
@@ -0,0 +1,114 @@
1
+ const uniqWith = require('lodash/uniqWith');
2
+ const { sign } = require('@blocklet/sdk/lib/util/verify-sign');
3
+ const getBlockletInfo = require('@blocklet/meta/lib/info');
4
+ const { joinURL } = require('ufo');
5
+ const pRetry = require('p-retry');
6
+
7
+ const { api } = require('../api');
8
+ const logger = require('../logger')('blocklet-services:notification');
9
+
10
+ async function sendPush(receiver, notification, { node, teamDid }) {
11
+ const blocklet = await node.getBlocklet({ did: teamDid, useCache: true });
12
+ if (!blocklet) {
13
+ logger.warn(`Failed to get blocklet: ${teamDid}`);
14
+ return null;
15
+ }
16
+
17
+ const config = blocklet.settings?.notification?.pushKit || {};
18
+
19
+ if (!config.enabled || !config.endpoint) {
20
+ // skip send email
21
+ return null;
22
+ }
23
+
24
+ const pushKitConfig = {
25
+ did: config.did || 'z2qa6xfPH6zHq5AQjb2Qm5CfmpndyQsvZrTKH',
26
+ pushPath: config.pushPath || '/api/push',
27
+ };
28
+
29
+ let pushKitUrl;
30
+ try {
31
+ const pushKitOrigin = new URL(config.endpoint).origin;
32
+ const { data: blockletJson } = await api.get(joinURL(pushKitOrigin, '/__blocklet__.js?type=json'));
33
+ const componentMountPoints = blockletJson?.componentMountPoints || [];
34
+ const findPushKitComponent = componentMountPoints.find((x) => x.did === pushKitConfig.did);
35
+ if (!findPushKitComponent) {
36
+ throw new Error(`Endpoint(${config.endpoint}) does not have push kit component`);
37
+ }
38
+ pushKitUrl = joinURL(pushKitOrigin, findPushKitComponent.mountPoint, pushKitConfig.pushPath);
39
+ } catch (error) {
40
+ logger.error(`Failed to get push kit endpoint: ${config.endpoint}`, { error });
41
+ throw new Error(`Invalid push kit endpoint: ${config.endpoint}`);
42
+ }
43
+
44
+ const { users = [] } = await node.getUsers({
45
+ teamDid,
46
+ dids: receiver,
47
+ query: {
48
+ approved: true,
49
+ includeUserSessions: true,
50
+ },
51
+ });
52
+
53
+ const targets = users.reduce((acc, user) => {
54
+ if (user.userSessions?.length > 0) {
55
+ user.userSessions.forEach((x) => {
56
+ const platform = x?.extra?.walletOS;
57
+ const deviceToken = x?.extra?.walletDeviceMessageToken;
58
+ if (platform && ['ios', 'android', 'ios-sandbox'].includes(platform) && deviceToken) {
59
+ acc.push({
60
+ platform,
61
+ deviceToken,
62
+ });
63
+ }
64
+ });
65
+ }
66
+ return acc;
67
+ }, []);
68
+
69
+ const filterTargets = uniqWith(targets, (a, b) => {
70
+ return a.targets === b.targets && a.platform === b.platform;
71
+ });
72
+
73
+ if (filterTargets.length === 0) {
74
+ throw new Error('Invalid receiver: empty target');
75
+ }
76
+
77
+ const blockletInfo = getBlockletInfo(blocklet);
78
+
79
+ const sig = sign(
80
+ {
81
+ targets: filterTargets,
82
+ data: notification,
83
+ },
84
+ { appSk: blockletInfo.wallet.secretKey }
85
+ );
86
+
87
+ try {
88
+ const result = await pRetry(
89
+ () =>
90
+ api.post(
91
+ pushKitUrl,
92
+ {
93
+ targets: filterTargets,
94
+ data: notification,
95
+ },
96
+ {
97
+ headers: {
98
+ 'x-blocklet-sig': sig,
99
+ 'x-blocklet-sig-pk': blockletInfo.wallet.publicKey,
100
+ },
101
+ }
102
+ ),
103
+ { retries: 3 }
104
+ );
105
+ return result?.data;
106
+ } catch (error) {
107
+ logger.error('Failed to send push kit', { error });
108
+ throw error;
109
+ }
110
+ }
111
+
112
+ module.exports = {
113
+ sendPush,
114
+ };
@@ -2,7 +2,6 @@ const { WELLKNOWN_SERVICE_PATH_PREFIX, FEDERATED } = require('@abtnode/constant'
2
2
  const { signV2 } = require('@arcblock/jwt');
3
3
  const normalizePathPrefix = require('@abtnode/util/lib/normalize-path-prefix');
4
4
  const cloneDeep = require('lodash/cloneDeep');
5
- const get = require('lodash/get');
6
5
  const isNil = require('lodash/isNil');
7
6
  const pLimit = require('p-limit');
8
7
  const pRetry = require('p-retry');
@@ -546,7 +545,7 @@ module.exports = {
546
545
  const federatedSites = blocklet.settings?.federated?.sites || [];
547
546
  const loginSite = federatedSites.find((item) => {
548
547
  const siteHost = new URL(item.appUrl).host;
549
- const fromHost = new URL(req.headers.origin).host;
548
+ const fromHost = new URL(req.get('origin')).host;
550
549
  return [siteHost, ...(item.aliasDomain || [])].includes(fromHost);
551
550
  });
552
551
 
@@ -561,7 +560,7 @@ module.exports = {
561
560
  });
562
561
 
563
562
  const user = pick(currentUser, ['did', 'pk', 'fullName', 'locale']);
564
- user.lastLoginIp = get(req, 'headers[x-real-ip]') || '';
563
+ user.lastLoginIp = req.get('x-real-ip') || '';
565
564
 
566
565
  if (currentUser.email) {
567
566
  user.email = currentUser.email;
@@ -4,7 +4,6 @@ const { WELLKNOWN_SERVICE_PATH_PREFIX, NODE_SERVICES, PASSPORT_STATUS } = requir
4
4
  const { extractUserAvatar, getUserAvatarUrl, getAppAvatarUrl } = require('@abtnode/util/lib/user');
5
5
  const { fromAppDid } = require('@arcblock/did-ext');
6
6
  const { getBlockletAppIdList } = require('@blocklet/meta/lib/util');
7
- const get = require('lodash/get');
8
7
  const uniq = require('lodash/uniq');
9
8
  const last = require('lodash/last');
10
9
  const pick = require('lodash/pick');
@@ -187,7 +186,7 @@ async function login(req, node, options) {
187
186
  const { dataDir } = await getApplicationInfo({ node, nodeInfo, teamDid });
188
187
  const [invitedUserOnly] = await isInvitedUserOnly(config, node, teamDid);
189
188
 
190
- const lastLoginIp = get(req, 'headers[x-real-ip]') || '';
189
+ const lastLoginIp = req.get('x-real-ip') || '';
191
190
  let passport = { name: 'Guest', role: 'guest' };
192
191
  let currentUser = await federatedUtil.getUserWithinFederated(
193
192
  { sourceAppPid, teamDid, userDid, userPk },
@@ -275,6 +274,8 @@ async function login(req, node, options) {
275
274
  );
276
275
 
277
276
  const ua = req.get('user-agent');
277
+ const walletDeviceMessageToken = req.get('wallet-device-message-token');
278
+ const walletDeviceId = req.get('wallet-device-id');
278
279
  const userSessionDoc = await node.upsertUserSession({
279
280
  teamDid,
280
281
  userDid: currentUser.did,
@@ -286,6 +287,8 @@ async function login(req, node, options) {
286
287
  lastLoginIp,
287
288
  extra: {
288
289
  walletOS: 'web',
290
+ walletDeviceMessageToken,
291
+ walletDeviceId,
289
292
  },
290
293
  });
291
294
 
@@ -322,6 +325,8 @@ async function login(req, node, options) {
322
325
  lastLoginIp,
323
326
  extra: {
324
327
  walletOS: 'web',
328
+ walletDeviceMessageToken,
329
+ walletDeviceId,
325
330
  },
326
331
  });
327
332
  });
@@ -478,6 +483,8 @@ async function invite(req, node, options) {
478
483
  }
479
484
  const lastLoginIp = req.get('x-real-ip');
480
485
  const ua = req.get('user-agent');
486
+ const walletDeviceMessageToken = req.get('wallet-device-message-token');
487
+ const walletDeviceId = req.get('wallet-device-id');
481
488
  const userSessionDoc = await node.upsertUserSession({
482
489
  teamDid,
483
490
  userDid,
@@ -489,6 +496,8 @@ async function invite(req, node, options) {
489
496
  lastLoginIp,
490
497
  extra: {
491
498
  walletOS: 'web',
499
+ walletDeviceMessageToken,
500
+ walletDeviceId,
492
501
  },
493
502
  });
494
503
 
@@ -509,6 +518,8 @@ async function invite(req, node, options) {
509
518
  lastLoginIp,
510
519
  extra: {
511
520
  walletOS: 'web',
521
+ walletDeviceMessageToken,
522
+ walletDeviceId,
512
523
  },
513
524
  });
514
525
  });
@@ -1,11 +1,11 @@
1
1
  /* eslint-disable no-await-in-loop */
2
2
  const { WELLKNOWN_SERVICE_PATH_PREFIX, SESSION_TTL } = require('@abtnode/constant');
3
3
  const { LOGIN_PROVIDER } = require('@blocklet/constant');
4
- const get = require('lodash/get');
5
4
  const pick = require('lodash/pick');
6
5
  const defaults = require('lodash/defaults');
7
6
  const cloneDeep = require('lodash/cloneDeep');
8
7
  const sortBy = require('lodash/sortBy');
8
+ const omit = require('lodash/omit');
9
9
  const pLimit = require('p-limit');
10
10
  const { getSourceProvider } = require('@blocklet/meta/lib/did-utils');
11
11
 
@@ -132,7 +132,7 @@ module.exports = {
132
132
 
133
133
  const memberSite = federated.sites.find((item) => item.appPid === appPid);
134
134
  const postUser = pick(user, ['did', 'pk', 'fullName', 'locale']);
135
- postUser.lastLoginAt = get(req, 'headers[x-real-ip]') || '';
135
+ postUser.lastLoginAt = req.get('x-real-ip') || '';
136
136
 
137
137
  if (user.email) {
138
138
  postUser.email = user.email;
@@ -196,6 +196,8 @@ module.exports = {
196
196
 
197
197
  const lastLoginIp = req.get('x-real-ip');
198
198
  const ua = req.get('user-agent');
199
+ const walletDeviceMessageToken = req.get('wallet-device-message-token');
200
+ const walletDeviceId = req.get('wallet-device-id');
199
201
 
200
202
  const userSessionDoc = await node.upsertUserSession({
201
203
  teamDid,
@@ -208,6 +210,8 @@ module.exports = {
208
210
  lastLoginIp,
209
211
  extra: {
210
212
  walletOS,
213
+ walletDeviceMessageToken,
214
+ walletDeviceId,
211
215
  },
212
216
  });
213
217
 
@@ -222,6 +226,8 @@ module.exports = {
222
226
  lastLoginIp,
223
227
  extra: {
224
228
  walletOS,
229
+ walletDeviceMessageToken,
230
+ walletDeviceId,
225
231
  },
226
232
  });
227
233
  }
@@ -270,11 +276,23 @@ module.exports = {
270
276
  });
271
277
 
272
278
  const pendingList = userSessions.map((item) =>
273
- limit(() => patchUserSessionData(item, { blocklet, appPid, teamDid, node }))
279
+ limit(() =>
280
+ patchUserSessionData(item, {
281
+ blocklet,
282
+ appPid,
283
+ teamDid,
284
+ node,
285
+ })
286
+ )
274
287
  );
275
288
  await Promise.all(pendingList);
276
289
 
277
- res.json(userSessions);
290
+ // NOTICE: 移除 walletDeviceId 和 walletDeviceMessageToken,避免泄露
291
+ const result = userSessions.map((x) => {
292
+ return omit(x, ['extra.walletDeviceId', 'extra.walletDeviceMessageToken']);
293
+ });
294
+
295
+ res.json(result);
278
296
  });
279
297
  },
280
298
  };
@@ -303,6 +303,8 @@ async function login(req, node, options) {
303
303
  );
304
304
  const lastLoginIp = req.get('x-real-ip');
305
305
  const ua = req.get('user-agent');
306
+ const walletDeviceMessageToken = req.get('wallet-device-message-token');
307
+ const walletDeviceId = req.get('wallet-device-id');
306
308
  const userSession = await node.upsertUserSession({
307
309
  visitorId,
308
310
  teamDid,
@@ -313,6 +315,8 @@ async function login(req, node, options) {
313
315
  lastLoginIp,
314
316
  extra: {
315
317
  walletOS: 'api',
318
+ walletDeviceMessageToken,
319
+ walletDeviceId,
316
320
  },
317
321
  });
318
322
  node.syncUserSession({
@@ -325,6 +329,8 @@ async function login(req, node, options) {
325
329
  lastLoginIp,
326
330
  extra: {
327
331
  walletOS: 'api',
332
+ walletDeviceMessageToken,
333
+ walletDeviceId,
328
334
  },
329
335
  });
330
336
  return {
@@ -466,6 +472,8 @@ module.exports = {
466
472
  { ...sessionConfig, didConnectVersion: getDidConnectVersion(req) }
467
473
  );
468
474
  const ua = req.get('user-agent');
475
+ const walletDeviceMessageToken = req.get('wallet-device-message-token');
476
+ const walletDeviceId = req.get('wallet-device-id');
469
477
  const userSession = await node.upsertUserSession({
470
478
  visitorId,
471
479
  teamDid,
@@ -476,6 +484,8 @@ module.exports = {
476
484
  lastLoginIp,
477
485
  extra: {
478
486
  walletOS,
487
+ walletDeviceMessageToken,
488
+ walletDeviceId,
479
489
  },
480
490
  });
481
491
  node.syncUserSession({
@@ -488,6 +498,8 @@ module.exports = {
488
498
  lastLoginIp,
489
499
  extra: {
490
500
  walletOS,
501
+ walletDeviceMessageToken,
502
+ walletDeviceId,
491
503
  },
492
504
  });
493
505
 
@@ -103,6 +103,8 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
103
103
 
104
104
  const lastLoginIp = req.get('x-real-ip');
105
105
  const ua = req.get('user-agent');
106
+ const walletDeviceMessageToken = req.get('wallet-device-message-token');
107
+ const walletDeviceId = req.get('wallet-device-id');
106
108
  const userSessionDoc = await node.upsertUserSession({
107
109
  teamDid,
108
110
  visitorId,
@@ -114,6 +116,8 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
114
116
  lastLoginIp,
115
117
  extra: {
116
118
  walletOS,
119
+ walletDeviceMessageToken,
120
+ walletDeviceId,
117
121
  },
118
122
  });
119
123
  node.syncUserSession({
@@ -126,6 +130,8 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
126
130
  lastLoginIp,
127
131
  extra: {
128
132
  walletOS,
133
+ walletDeviceMessageToken,
134
+ walletDeviceId,
129
135
  },
130
136
  });
131
137
  await updateSession(
@@ -46,6 +46,8 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
46
46
  const walletOS = req.context?.didwallet?.os;
47
47
  const lastLoginIp = req.get('x-real-ip');
48
48
  const ua = req.get('user-agent');
49
+ const walletDeviceMessageToken = req.get('wallet-device-message-token');
50
+ const walletDeviceId = req.get('wallet-device-id');
49
51
 
50
52
  const { response, passport, role } = await handleIssuePassportResponse({
51
53
  req,
@@ -89,6 +91,8 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
89
91
  lastLoginIp,
90
92
  extra: {
91
93
  walletOS,
94
+ walletDeviceMessageToken,
95
+ walletDeviceId,
92
96
  },
93
97
  });
94
98
  node.syncUserSession({
@@ -101,6 +105,8 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
101
105
  lastLoginIp,
102
106
  extra: {
103
107
  walletOS,
108
+ walletDeviceMessageToken,
109
+ walletDeviceId,
104
110
  },
105
111
  });
106
112
 
@@ -54,7 +54,7 @@ module.exports = {
54
54
  user.avatar.split('/').slice(-1)[0]
55
55
  }`;
56
56
 
57
- if (req.headers['x-avatar-host'] === '1') {
57
+ if (req.get('x-avatar-host') === '1') {
58
58
  const appUrl = blocklet.environmentObj.BLOCKLET_APP_URL;
59
59
  user.avatar = joinURL(appUrl, user.avatar);
60
60
  }
@@ -193,7 +193,7 @@ module.exports = {
193
193
  user.avatar.split('/').slice(-1)[0]
194
194
  }`;
195
195
 
196
- if (req.headers['x-avatar-host'] === '1') {
196
+ if (req.get('x-avatar-host') === '1') {
197
197
  const appUrl = blocklet.environmentObj.BLOCKLET_APP_URL;
198
198
  user.avatar = joinURL(appUrl, user.avatar);
199
199
  }
@@ -214,6 +214,8 @@ module.exports = {
214
214
  );
215
215
  const ua = req.get('user-agent');
216
216
  const lastLoginIp = req.get('x-real-ip');
217
+ const walletDeviceMessageToken = req.get('wallet-device-message-token');
218
+ const walletDeviceId = req.get('wallet-device-id');
217
219
  const userSession = await node.upsertUserSession({
218
220
  visitorId,
219
221
  teamDid,
@@ -224,6 +226,8 @@ module.exports = {
224
226
  lastLoginIp,
225
227
  extra: {
226
228
  walletOS,
229
+ walletDeviceMessageToken,
230
+ walletDeviceId,
227
231
  },
228
232
  });
229
233
  if (user?.sourceAppPid) {
@@ -236,6 +240,8 @@ module.exports = {
236
240
  lastLoginIp,
237
241
  extra: {
238
242
  walletOS,
243
+ walletDeviceMessageToken,
244
+ walletDeviceId,
239
245
  },
240
246
  });
241
247
  }
@@ -8,7 +8,7 @@ const { PREFIXES } = require('../../util/constants');
8
8
  const logger = require('../../libs/logger')('notification');
9
9
  const { sendToAppChannel } = require('../../socket/channel/app');
10
10
  const { sendToAppComponents } = require('../../socket/channel/component');
11
- const { sendToUserDid, sendToAppDid, sendToMail } = require('../../socket/channel/did');
11
+ const { sendToUserDid, sendToAppDid, sendToMail, sendToPush } = require('../../socket/channel/did');
12
12
  const getHooksByChannel = require('../../socket/channel/hooks');
13
13
  const { getTokenInfo } = require('../../socket/util');
14
14
 
@@ -131,6 +131,17 @@ const init = ({ node }) => {
131
131
  }
132
132
  };
133
133
 
134
+ const onSendToPush = async (req, res) => {
135
+ try {
136
+ const results = await sendToPush({ ...req.body.data, node });
137
+ res.status(200).json(results);
138
+ } catch (error) {
139
+ logger.error('Send batch mail failed', { error });
140
+ res.statusMessage = error.message;
141
+ res.status(400).send(error.message);
142
+ }
143
+ };
144
+
134
145
  const onSendToAppChannel = async (req, res) => {
135
146
  try {
136
147
  await sendToAppChannel({ ...req.body.data, node, wsServer });
@@ -162,6 +173,15 @@ const init = ({ node }) => {
162
173
  exec: (data) => sendToMail({ ...data, node, wsServer }),
163
174
  },
164
175
 
176
+ sendToPush: {
177
+ attach: (app) => {
178
+ PREFIXES.forEach((prefix) => {
179
+ app.post(`${prefix}/api/send-to-push-kit`, onSendToPush);
180
+ });
181
+ },
182
+ exec: (data) => sendToMail({ ...data, node, wsServer }),
183
+ },
184
+
165
185
  sendToApp: {
166
186
  exec: ({ event, appDid, data }) => sendToAppDid({ event, appDid, data, node, wsServer }),
167
187
  },