@abtnode/blocklet-services 1.16.44-beta-20250512-155818-937e465d → 1.16.44-beta-20250516-225119-c0b5ec8d

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 (268) hide show
  1. package/api/index.js +3 -1
  2. package/api/libs/connect/session.js +22 -9
  3. package/api/libs/image.js +1 -2
  4. package/api/libs/open-graph/index.js +1 -2
  5. package/api/libs/push-kit/index.js +1 -0
  6. package/api/middlewares/check-federated-cors-call.js +2 -2
  7. package/api/middlewares/check-permission.js +10 -3
  8. package/api/routes/blocklet.js +1 -1
  9. package/api/routes/csp-proxy.js +67 -0
  10. package/api/routes/federated.js +30 -25
  11. package/api/routes/oauth/client.js +2 -2
  12. package/api/routes/openembed.js +1 -1
  13. package/api/routes/user-session.js +1 -2
  14. package/api/routes/user.js +9 -6
  15. package/api/services/auth/connect/connect-to-did-spaces-for-user.js +1 -1
  16. package/api/services/auth/connect/pre-setup.js +2 -1
  17. package/api/services/auth/connect/setup.js +31 -4
  18. package/api/services/image/index.js +1 -1
  19. package/api/services/notification/queue.js +27 -4
  20. package/api/socket/channel/did.js +14 -7
  21. package/api/util/federated.js +5 -1
  22. package/api/util/user-util.js +1 -1
  23. package/dist/assets/{AdapterDayjs-BD9H1lZ-.js → AdapterDayjs-YbaNvT9I.js} +1 -1
  24. package/dist/assets/{ArrowDropDown-BrO-zDlb.js → ArrowDropDown-xgs4N3Rf.js} +1 -1
  25. package/dist/assets/{CheckCircle-Ds4QI0ey.js → CheckCircle-JXD6tKIa.js} +1 -1
  26. package/dist/assets/{ChevronLeft-CnQaQ-rc.js → ChevronLeft-D0eko_T8.js} +1 -1
  27. package/dist/assets/{ChevronRight-a_2_x6Ew.js → ChevronRight-CQY9Ni7X.js} +1 -1
  28. package/dist/assets/{Community-DW6DJTIs.js → Community-BCL2L7ib.js} +1 -1
  29. package/dist/assets/{DeleteOutline-CFN4r-OG.js → DeleteOutline-BEGOj_wq.js} +1 -1
  30. package/dist/assets/{Done-DqSE6KPe.js → Done-BUJJNjlP.js} +1 -1
  31. package/dist/assets/{Download-C_LRKzbG.js → Download-DdZEsxmZ.js} +1 -1
  32. package/dist/assets/{Edit-CbR4eoK8.js → Edit-vxeVwrqO.js} +1 -1
  33. package/dist/assets/{EditIcon-DxUWMw59.js → EditIcon-Dffk7mPL.js} +1 -1
  34. package/dist/assets/{Email-DWueGk7t.js → Email-CdSNK0eA.js} +1 -1
  35. package/dist/assets/{Error-jEHdDLNk.js → Error-C-RD4e9g.js} +1 -1
  36. package/dist/assets/{ExpandLess-CkoEHpgk.js → ExpandLess-CmqG9SE7.js} +1 -1
  37. package/dist/assets/{Google-DHEolkW-.js → Google-B7PA4qF8.js} +1 -1
  38. package/dist/assets/{Holiday-Dwvo6QkZ.js → Holiday-enHMZqEf.js} +1 -1
  39. package/dist/assets/{InfoOutlined-DkG0jjos.js → InfoOutlined-BIr5nkjV.js} +1 -1
  40. package/dist/assets/{Launch-B-2Jomi6.js → Launch-KvZQI_SA.js} +1 -1
  41. package/dist/assets/{LaunchOutlined-CXNijfqX.js → LaunchOutlined-ClxZU_tj.js} +1 -1
  42. package/dist/assets/{Location-DUEOr9J2.js → Location-By12Z3Te.js} +1 -1
  43. package/dist/assets/{LockIcon-Cjg8jV1E.js → LockIcon-98CKEIBe.js} +1 -1
  44. package/dist/assets/{Meeting-CJaI_cKm.js → Meeting-CLeFWDkY.js} +1 -1
  45. package/dist/assets/{MoreHoriz-B6KdR0Y8.js → MoreHoriz-H8rabTmY.js} +1 -1
  46. package/dist/assets/{OffSick-C9VqqjrN.js → OffSick-dUm363rs.js} +1 -1
  47. package/dist/assets/{Phone-DcHUzCa-.js → Phone--BSu-btI.js} +1 -1
  48. package/dist/assets/{PlayArrow-BToG9L6q.js → PlayArrow-CmxnItFZ.js} +1 -1
  49. package/dist/assets/{QuestionMarkCircle-BPVDAm8U.js → QuestionMarkCircle-DTf-Tya5.js} +1 -1
  50. package/dist/assets/{ServerLogo-s6cfhx92.js → ServerLogo-CEsILJl5.js} +1 -1
  51. package/dist/assets/{Timezone-B-Ho_Uno.js → Timezone-YZ0dMUEr.js} +1 -1
  52. package/dist/assets/{TuneOutlined-BR2H7Mxj.js → TuneOutlined-DmhFMgM-.js} +1 -1
  53. package/dist/assets/{ViewList-D8vtMKQz.js → ViewList-DXk3qGFU.js} +1 -1
  54. package/dist/assets/{WorkingRemotely-lJ6DUMCR.js → WorkingRemotely-BX7rgbEY.js} +1 -1
  55. package/dist/assets/{access-control-CCSlKYYz.js → access-control-DfNk54C9.js} +1 -1
  56. package/dist/assets/{actions-BjTeIzgS.js → actions-V9hjjowb.js} +1 -1
  57. package/dist/assets/{add-component-core-C7-Epxoj.js → add-component-core-Dx4Ojnmk.js} +16 -16
  58. package/dist/assets/add-resource-CxXfKLfm.js +1 -0
  59. package/dist/assets/addon-DtaZ0TB3.js +14 -0
  60. package/dist/assets/{advanced-tG5IRVhQ.js → advanced-Ddtt8Hj-.js} +1 -1
  61. package/dist/assets/appearance-BrPMC4u8.js +1 -0
  62. package/dist/assets/ar-2yn9i2dw.js +7 -0
  63. package/dist/assets/audit-logs-D9m5k0JB.js +35 -0
  64. package/dist/assets/{authorize-DNTNbUhI.js → authorize-T5C3DfFM.js} +1 -1
  65. package/dist/assets/{base32-_zEVBJUg.js → base32-BPfgmw66.js} +1 -1
  66. package/dist/assets/blocklet-default-logo-Bspnu_ws.png +0 -0
  67. package/dist/assets/{branding-hDeNkLC2.js → branding-BVm4-_4U.js} +2 -2
  68. package/dist/assets/{branding-By8KDk5Q.js → branding-hFlZ2gIT.js} +2 -2
  69. package/dist/assets/{bundle-avatar-DYTLzqlT.js → bundle-avatar-BEofqN1I.js} +1 -1
  70. package/dist/assets/button-m03GMAJs.js +1 -0
  71. package/dist/assets/click-to-copy-DmYkL7Ui.js +1 -0
  72. package/dist/assets/{collapse-QV_2gdtM.js → collapse-FsvH0gRe.js} +1 -1
  73. package/dist/assets/complete-DwnM8k9G.js +39 -0
  74. package/dist/assets/{component-Blsql2u0.js → component-s7RjpIXH.js} +8 -8
  75. package/dist/assets/{config-LE_EJolF.js → config-Dl_53WnU.js} +1 -1
  76. package/dist/assets/{config-D6r2ZAFY.js → config-bdYGvEMY.js} +2 -2
  77. package/dist/assets/{config-navigation-B0nu0al4.js → config-navigation-bI89qiN3.js} +3 -3
  78. package/dist/assets/config-space-D1h9DQze.js +1 -0
  79. package/dist/assets/confirm-zdbJI4Oz.js +7 -0
  80. package/dist/assets/{connect-Cu2Ssv5A.js → connect-B2amNptu.js} +1 -1
  81. package/dist/assets/connect-BTGTAWj-.js +5 -0
  82. package/dist/assets/connect-to-DrS33AaQ.js +1 -0
  83. package/dist/assets/{content-layout-BzF-fNQz.js → content-layout--sy9JlYZ.js} +1 -1
  84. package/dist/assets/dashboard-u-oRSlsi.js +239 -0
  85. package/dist/assets/de-CEKbJD3-.js +7 -0
  86. package/dist/assets/delete-confirm-CUNBU1J1.js +1 -0
  87. package/dist/assets/{did-address-DjwPl1uy.js → did-address-BI9LYTx-.js} +1 -1
  88. package/dist/assets/domain-ER_Bg0qe.js +9 -0
  89. package/dist/assets/domain-action-card-CYBXEnlZ.js +28 -0
  90. package/dist/assets/domains-CBYb9WvZ.js +1 -0
  91. package/dist/assets/dot-BB5occkV.js +7 -0
  92. package/dist/assets/{email-BZVu6WP-.js → email-BmZcVM-V.js} +2 -2
  93. package/dist/assets/{empty-spinner-n0_Ehns5.js → empty-spinner-BZw_ShnT.js} +1 -1
  94. package/dist/assets/{es-BuUaHPig.js → es-dvMygD-W.js} +3 -3
  95. package/dist/assets/{exchange-passport-8jdiPDph.js → exchange-passport-B5vniH8u.js} +1 -1
  96. package/dist/assets/fr-BvFd5xp9.js +7 -0
  97. package/dist/assets/{fuel-Dx_cnsCl.js → fuel-DW3R8bWE.js} +1 -1
  98. package/dist/assets/{gen-access-key-CqKmmKML.js → gen-access-key-h48ZchOb.js} +1 -1
  99. package/dist/assets/get-safe-url-BcH2iukm.js +1 -0
  100. package/dist/assets/get-safe-url-OaLLn0UN.js +1 -0
  101. package/dist/assets/hi-C51yBXa5.js +5 -0
  102. package/dist/assets/{home-DzCwBE8F.js → home-CJ28zTIJ.js} +1 -1
  103. package/dist/assets/id-B1Mq_eQI.js +7 -0
  104. package/dist/assets/{iframe-DW7zzzTG.js → iframe-D0kv9-rE.js} +1 -1
  105. package/dist/assets/index-8eXqqyHQ.js +5 -0
  106. package/dist/assets/index-BGat0zzz.js +284 -0
  107. package/dist/assets/index-BXdw6keY.js +1 -0
  108. package/dist/assets/{index-BDYaw77z.js → index-BdH_4Yfe.js} +1 -1
  109. package/dist/assets/{index-C5SsKJ2n.js → index-C0te7llT.js} +18 -14
  110. package/dist/assets/index-C1rBJXFe.js +1 -0
  111. package/dist/assets/index-C3bbolus.js +113 -0
  112. package/dist/assets/{index-BYCeMwoO.js → index-C849wD9b.js} +1 -1
  113. package/dist/assets/{index-Bju4sfVL.js → index-CJpkpFKR.js} +2 -2
  114. package/dist/assets/index-CNauVjuD.js +99 -0
  115. package/dist/assets/{index-Btl_rz0J.js → index-CSbITcwB.js} +17 -17
  116. package/dist/assets/{index-DcUhenm6.js → index-CmQOzzP8.js} +1 -1
  117. package/dist/assets/{index-HU4yqI-9.js → index-D-X7HfwW.js} +1 -1
  118. package/dist/assets/{index-CPfvVvHv.js → index-D-mbJPLJ.js} +12 -12
  119. package/dist/assets/{index-enM9Y412.js → index-D3iGbfL9.js} +1 -1
  120. package/dist/assets/index-D70ICXrC.js +1 -0
  121. package/dist/assets/{index-DefO2n6z.js → index-DRCFOq4H.js} +58 -58
  122. package/dist/assets/{index-B8r-LrrM.js → index-DbsXFWms.js} +1 -1
  123. package/dist/assets/{index-BIPRCLBG.js → index-DoCu_ga_.js} +2 -2
  124. package/dist/assets/index-DwnC6XvN.js +6 -0
  125. package/dist/assets/{index-ftkgQlGr.js → index-DwswX2WL.js} +1 -1
  126. package/dist/assets/index-Up0XQY6f.js +55 -0
  127. package/dist/assets/index-VzeamwDR.js +241 -0
  128. package/dist/assets/index-nBzxkc-e.js +4 -0
  129. package/dist/assets/{index-SzdSxpkq.js → index-tD3kWii2.js} +4 -4
  130. package/dist/assets/{invitation-1bsb30Yz.js → invitation-CLUn7Gd4.js} +4 -4
  131. package/dist/assets/invite-B1zBa8Gp.js +1 -0
  132. package/dist/assets/issue-passport-5n5uQFFQ.js +1 -0
  133. package/dist/assets/item-BCYQnjF7.js +2 -0
  134. package/dist/assets/ja-CCKVmbEX.js +7 -0
  135. package/dist/assets/ko-A_w8tIEg.js +7 -0
  136. package/dist/assets/{landing-page-Due4o1uF.js → landing-page-CUrvCtHZ.js} +1 -1
  137. package/dist/assets/{launch-result-message-DIYoykBK.js → launch-result-message-Eea5FZDm.js} +1 -1
  138. package/dist/assets/{layout-D93HKT6w.js → layout-Bs_rMuQ9.js} +2 -2
  139. package/dist/assets/list-CFP3MiEI.js +2 -0
  140. package/dist/assets/list-M2tV_ZYf.js +236 -0
  141. package/dist/assets/list-header-DNFbdM3a.js +1 -0
  142. package/dist/assets/localization-Cl5vfs2R.js +1 -0
  143. package/dist/assets/{log--AX8zo75.js → log-CcpvITx1.js} +2 -3
  144. package/dist/assets/logger-BYg6vYBA.js +1 -0
  145. package/dist/assets/{login-WRcteY7r.js → login-4G5grSod.js} +1 -1
  146. package/dist/assets/login-oauth-callback-DMou-vp-.js +1 -0
  147. package/dist/assets/{logo-uploader-CQCy6MG3.js → logo-uploader-Bf6myR3q.js} +3 -3
  148. package/dist/assets/{lost-passport-kJX7pEJj.js → lost-passport-DWc6Kq0b.js} +2 -2
  149. package/dist/assets/{open-window--2G6Qjbq.js → open-window-CuyFfntO.js} +1 -1
  150. package/dist/assets/overview-vcNUrQdk.js +85 -0
  151. package/dist/assets/{page-header-xyZktwBS.js → page-header-DpNvpd52.js} +4 -4
  152. package/dist/assets/{passport-item-CIvCqz_R.js → passport-item-IDGIDfr4.js} +1 -1
  153. package/dist/assets/{permission-BH1TY_tz.js → permission-Cnn9EYOW.js} +1 -1
  154. package/dist/assets/preferences-Cqm2olsT.js +1 -0
  155. package/dist/assets/profile-embed-CcuuyEXm.js +1 -0
  156. package/dist/assets/pt-7HHecjdA.js +5 -0
  157. package/dist/assets/publish-resource-DGUHUINH.js +1 -0
  158. package/dist/assets/{react-beautiful-dnd.esm-7PS2VwOi.js → react-beautiful-dnd.esm-cfY5JZV6.js} +1 -1
  159. package/dist/assets/ru-Bw8FVC4M.js +5 -0
  160. package/dist/assets/runtime-efQyx-LE.js +1 -0
  161. package/dist/assets/sdk-CXaHNlMH.js +1 -0
  162. package/dist/assets/{section-Cv4udilp.js → section-C1TPQFRq.js} +1 -1
  163. package/dist/assets/{security-DM8MeY05.js → security-DFjq-0Qw.js} +4 -4
  164. package/dist/assets/{session-CHdTc1We.js → session-B2z_IWIe.js} +1 -1
  165. package/dist/assets/setup-CLYOmcmD.js +30 -0
  166. package/dist/assets/{shorten-label-Cng55547.js → shorten-label-Bf7YQUd6.js} +1 -1
  167. package/dist/assets/{simple-select-CP_Svi_D.js → simple-select-DwWEI_ZU.js} +1 -1
  168. package/dist/assets/{slicedToArray-C7EPqaHf.js → slicedToArray-BSaY8ui4.js} +1 -1
  169. package/dist/assets/{spaces-BVG-t3ND.js → spaces-DMMN97uo.js} +1 -1
  170. package/dist/assets/{start-CIjuDAiX.js → start-xHz18_Rr.js} +3 -3
  171. package/dist/assets/{starting-progress-CiLZpNpg.js → starting-progress-DeFtXRb_.js} +1 -1
  172. package/dist/assets/status-y-bc7cex.js +1 -0
  173. package/dist/assets/{step-actions-CeJCmiCS.js → step-actions-Btu6D6gk.js} +1 -1
  174. package/dist/assets/{studio-DikseKRr.js → studio-CiFHrC57.js} +1 -1
  175. package/dist/assets/{switch-control-C5i52ixk.js → switch-control-DnNP5DPe.js} +1 -1
  176. package/dist/assets/table-tips-hNIkakER.js +1 -0
  177. package/dist/assets/th-DyW-mYrC.js +5 -0
  178. package/dist/assets/traffic-BIrotm6H.js +35 -0
  179. package/dist/assets/{transfer-CTEHVklh.js → transfer-BeJGTbo1.js} +1 -1
  180. package/dist/assets/{unsubscribe-Bi2IV-2n.js → unsubscribe-Bjxnpv_W.js} +1 -1
  181. package/dist/assets/{use-blocklet-logo-BEy8Tnso.js → use-blocklet-logo-BoFa24A6.js} +1 -1
  182. package/dist/assets/{use-mobile-Boa_xu9A.js → use-mobile-JEGQfLZ2.js} +1 -1
  183. package/dist/assets/{use-mobile-DyX6Fl8Z.js → use-mobile-ZAS6Si4t.js} +1 -1
  184. package/dist/assets/useAsync-DnXpD472.js +1 -0
  185. package/dist/assets/{useLocalStorage-DVnkpneF.js → useLocalStorage-BRd3tKN9.js} +1 -1
  186. package/dist/assets/user-center-DI0NPFtg.js +76 -0
  187. package/dist/assets/{util-MKllNgBs.js → util-C3FgySYN.js} +1 -1
  188. package/dist/assets/{util-CEAObyfj.js → util-CVjZG67N.js} +1 -1
  189. package/dist/assets/{vendor-arcblock-uz9DVywv.js → vendor-arcblock-DPRICUXM.js} +109 -109
  190. package/dist/assets/{vendor-hooks-rDgu5KV9.js → vendor-hooks-Zkb4Ilbj.js} +1 -1
  191. package/dist/assets/{vendor-mui-core-D_bnq77o.js → vendor-mui-core-Bh-qMRq3.js} +1 -1
  192. package/dist/assets/{vendor-mui-x-R-0SFz4c.js → vendor-mui-x-CQTjfcpn.js} +1 -1
  193. package/dist/assets/{vendor-ux-did-connect-DHrruicZ.js → vendor-ux-did-connect-Ck9lzrbN.js} +73 -73
  194. package/dist/assets/vi-bzer6J4H.js +5 -0
  195. package/dist/assets/wrap-locale-COcPskJ7.js +1 -0
  196. package/dist/assets/zh-Cti0XXui.js +8 -0
  197. package/dist/assets/zh-tw-BLcDG99i.js +7 -0
  198. package/dist/images/all-done-dark.svg +68 -0
  199. package/dist/images/all-done-light.svg +60 -0
  200. package/dist/index.html +5 -5
  201. package/dist/service-worker.js +1 -1
  202. package/package.json +48 -47
  203. package/dist/assets/add-resource-CJHw7ea0.js +0 -1
  204. package/dist/assets/addon--u4EErgw.js +0 -14
  205. package/dist/assets/appearance-bRLsRDs2.js +0 -1
  206. package/dist/assets/ar-Blzb8h2o.js +0 -7
  207. package/dist/assets/audit-logs-B3-Fo3nR.js +0 -35
  208. package/dist/assets/button-D8hoY4xw.js +0 -1
  209. package/dist/assets/click-to-copy-CFiGx48J.js +0 -1
  210. package/dist/assets/complete-6R-n_Ra9.js +0 -45
  211. package/dist/assets/config-space-d34Deg7R.js +0 -1
  212. package/dist/assets/confirm-DjTZImyg.js +0 -7
  213. package/dist/assets/connect-K4ZmMu4L.js +0 -5
  214. package/dist/assets/connect-to-BG15Vnyg.js +0 -1
  215. package/dist/assets/dashboard-BIOpvfj3.js +0 -239
  216. package/dist/assets/de-BxI5dM9K.js +0 -7
  217. package/dist/assets/delete-confirm-BzuBR6TW.js +0 -1
  218. package/dist/assets/domain-action-card-Bcs_GWxq.js +0 -24
  219. package/dist/assets/domain-wh85yL2O.js +0 -9
  220. package/dist/assets/domains-bzKFbARj.js +0 -1
  221. package/dist/assets/dot-C4hULxc0.js +0 -7
  222. package/dist/assets/format-error-BrmqJs5a.js +0 -2
  223. package/dist/assets/fr-DezMACmP.js +0 -7
  224. package/dist/assets/get-safe-url-B5RJTMjC.js +0 -1
  225. package/dist/assets/get-safe-url-Bk6PlU7n.js +0 -1
  226. package/dist/assets/hi-ClbEozhq.js +0 -5
  227. package/dist/assets/id-CXYm-1K3.js +0 -7
  228. package/dist/assets/index-8CHxrfFP.js +0 -1
  229. package/dist/assets/index-B9nvthxv.js +0 -4
  230. package/dist/assets/index-C-A13dEh.js +0 -141
  231. package/dist/assets/index-Cc-e6lxg.js +0 -1
  232. package/dist/assets/index-DjEDWgGs.js +0 -6
  233. package/dist/assets/index-Du38Vjy4.js +0 -241
  234. package/dist/assets/index-Dyl-XQ73.js +0 -99
  235. package/dist/assets/index-Jnk92KZC.js +0 -284
  236. package/dist/assets/index-USO5zFMh.js +0 -55
  237. package/dist/assets/index-ioZVVJtg.js +0 -113
  238. package/dist/assets/invite-CALl83Zc.js +0 -1
  239. package/dist/assets/issue-passport-BcStTsbv.js +0 -1
  240. package/dist/assets/item-Bk_1JLeG.js +0 -2
  241. package/dist/assets/ja-B5V7b8Cm.js +0 -7
  242. package/dist/assets/ko-DP9up1nF.js +0 -7
  243. package/dist/assets/list-D96_O-GY.js +0 -2
  244. package/dist/assets/list-header-HqBQs1yn.js +0 -1
  245. package/dist/assets/list-rt6nku1-.js +0 -236
  246. package/dist/assets/localization-BUDtnbyU.js +0 -1
  247. package/dist/assets/logger-BLZgTs_U.js +0 -1
  248. package/dist/assets/login-oauth-callback-DZaPZfnA.js +0 -1
  249. package/dist/assets/overview-CpKMiGEK.js +0 -85
  250. package/dist/assets/preferences-CfmnTXfl.js +0 -1
  251. package/dist/assets/profile-embed-ZtzRYgXv.js +0 -1
  252. package/dist/assets/pt-CG45pWr4.js +0 -5
  253. package/dist/assets/publish-resource-CCa5xfwz.js +0 -1
  254. package/dist/assets/ru-0VhRQc7t.js +0 -5
  255. package/dist/assets/runtime-eXYlg9Cz.js +0 -1
  256. package/dist/assets/sdk-9eXJSWHG.js +0 -1
  257. package/dist/assets/setup-BEsU41BB.js +0 -30
  258. package/dist/assets/status-CUMJd-nJ.js +0 -1
  259. package/dist/assets/th-DwH8cjcw.js +0 -5
  260. package/dist/assets/traffic-B5x_6GvF.js +0 -35
  261. package/dist/assets/useAsync-C8ydfEEr.js +0 -1
  262. package/dist/assets/useAsync-CMWsznMW.js +0 -1
  263. package/dist/assets/user-center-DcXdjtRX.js +0 -76
  264. package/dist/assets/vi-CcmTJggB.js +0 -5
  265. package/dist/assets/wrap-locale-B9TkXFQe.js +0 -1
  266. package/dist/assets/zh-C2MKZFZw.js +0 -8
  267. package/dist/assets/zh-tw-mW-UVEHx.js +0 -7
  268. package/dist/images/all-done.png +0 -0
package/api/index.js CHANGED
@@ -25,7 +25,7 @@ const { getAppOgCacheDir } = require('@abtnode/util/lib/blocklet');
25
25
  const { ensureLocale } = require('@abtnode/util/lib/middlewares/ensure-locale');
26
26
  const normalizePathPrefix = require('@abtnode/util/lib/normalize-path-prefix');
27
27
  const createInvite = require('@abtnode/auth/lib/invitation');
28
- const { getStatusFromError } = require('@abtnode/util/lib/custom-error');
28
+ const { getStatusFromError } = require('@blocklet/error');
29
29
  const { withQuery, joinURL, withTrailingSlash } = require('ufo');
30
30
  const { createProxyMiddleware, responseInterceptor } = require('http-proxy-middleware');
31
31
  const { findComponentByIdV2, getMountPoints } = require('@blocklet/meta/lib/util');
@@ -67,6 +67,7 @@ const createOAuthServerRoutes = require('./routes/oauth/server');
67
67
  const createFederatedRoutes = require('./routes/federated');
68
68
  const createUserRoutes = require('./routes/user');
69
69
  const createOcapRoutes = require('./routes/ocap');
70
+ const createCspProxyRoutes = require('./routes/csp-proxy');
70
71
  const createUserSessionRoutes = require('./routes/user-session');
71
72
  const createBlockletRoutes = require('./routes/blocklet');
72
73
  const createConnectRelayRoutes = require('./routes/connect/relay');
@@ -763,6 +764,7 @@ self.blocklet = {
763
764
  createFederatedRoutes.init(server, node, options);
764
765
  createUserRoutes.init(server, node, options);
765
766
  createOcapRoutes.init(server);
767
+ createCspProxyRoutes.init(server);
766
768
  createUserSessionRoutes.init(server, node, options);
767
769
  createEnvRoutes.init(server, node, options);
768
770
  createBlockletRoutes.init(server, node);
@@ -30,7 +30,7 @@ const {
30
30
  upsertToPassports,
31
31
  getPassportClaimUrl,
32
32
  } = require('@abtnode/auth/lib/passport');
33
- const CustomError = require('@abtnode/util/lib/custom-error');
33
+ const { CustomError } = require('@blocklet/error');
34
34
  const { getKeyPairClaim, getAuthPrincipalForMigrateAppToV2 } = require('@abtnode/auth/lib/server');
35
35
  const { checkInvitedUserOnly } = require('@abtnode/auth/lib/oauth');
36
36
  const { fromAppDid } = require('@arcblock/did-ext');
@@ -1243,14 +1243,27 @@ module.exports = {
1243
1243
  };
1244
1244
 
1245
1245
  if (sourceAppPid) {
1246
- await migrateFederatedAccount({
1247
- // 目前只允许未注册过的钱包绑定 auth0,所以直接传入钱包生成的 userDid 和 userPk
1248
- toUserDid: userDid,
1249
- toUserPk: userPk,
1250
- fromUserDid: previousUserDid,
1251
- blockletInfo,
1252
- blocklet,
1253
- });
1246
+ try {
1247
+ await migrateFederatedAccount({
1248
+ // 目前只允许未注册过的钱包绑定 auth0,所以直接传入钱包生成的 userDid 和 userPk
1249
+ toUserDid: userDid,
1250
+ toUserPk: userPk,
1251
+ fromUserDid: previousUserDid,
1252
+ blockletInfo,
1253
+ blocklet,
1254
+ });
1255
+ } catch (error) {
1256
+ logger.error('Failed to migrate federated account', {
1257
+ error,
1258
+ toUserDid: userDid,
1259
+ fromUserDid: previousUserDid,
1260
+ });
1261
+
1262
+ if (error?.response?.data) {
1263
+ throw new Error(error.response.data);
1264
+ }
1265
+ throw error;
1266
+ }
1254
1267
  } else {
1255
1268
  const connectedAccounts = oauthUser?.connectedAccounts || [];
1256
1269
  const sourceProvider = oauthUser?.sourceProvider;
package/api/libs/image.js CHANGED
@@ -8,8 +8,7 @@ const toLower = require('lodash/toLower');
8
8
  const { Joi } = require('@arcblock/validator');
9
9
  const stringify = require('json-stable-stringify');
10
10
  const md5 = require('@abtnode/util/lib/md5');
11
- const formatError = require('@abtnode/util/lib/format-error');
12
- const { getStatusFromError } = require('@abtnode/util/lib/custom-error');
11
+ const { formatError, getStatusFromError } = require('@blocklet/error');
13
12
 
14
13
  const logger = require('@abtnode/logger')('@abtnode/blocklet-services/image');
15
14
 
@@ -7,8 +7,7 @@ const { joinURL } = require('ufo');
7
7
  const { Joi } = require('@arcblock/validator');
8
8
  const stringify = require('json-stable-stringify');
9
9
  const md5 = require('@abtnode/util/lib/md5');
10
- const formatError = require('@abtnode/util/lib/format-error');
11
- const CustomError = require('@abtnode/util/lib/custom-error');
10
+ const { formatError, CustomError } = require('@blocklet/error');
12
11
  const { getPassportColor } = require('@abtnode/auth/lib/util/create-passport-svg');
13
12
  const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
14
13
 
@@ -18,6 +18,7 @@ async function sendPush(receiver, notification, { node, teamDid }) {
18
18
 
19
19
  if (!config.enabled || !config.endpoint) {
20
20
  // skip send email
21
+ logger.warn(`Push Kit Service is not Enabled: ${teamDid}`);
21
22
  throw new Error('Push Kit Service is not Enabled.');
22
23
  }
23
24
 
@@ -6,8 +6,8 @@ function checkFederatedCorsCall() {
6
6
  const sites = federated?.sites || [];
7
7
  const memberEnabled = sites.find((item) => {
8
8
  if (item.status === 'approved') {
9
- const siteHost = new URL(item.appUrl).host;
10
- const callerHost = new URL(caller).host;
9
+ const siteHost = new URL(item.appUrl).hostname;
10
+ const callerHost = new URL(caller).hostname;
11
11
  return [siteHost, ...(item.aliasDomain || [])].includes(callerHost);
12
12
  }
13
13
  return false;
@@ -1,7 +1,14 @@
1
- const { ROLES } = require('@abtnode/constant');
1
+ const { ROLES, SERVER_ROLES } = require('@abtnode/constant');
2
2
 
3
- const adminRoles = [ROLES.OWNER, ROLES.ADMIN];
4
- const memberRoles = [ROLES.OWNER, ROLES.ADMIN, ROLES.MEMBER];
3
+ const adminRoles = [ROLES.OWNER, ROLES.ADMIN, SERVER_ROLES.BLOCKLET_OWNER, SERVER_ROLES.BLOCKLET_ADMIN];
4
+ const memberRoles = [
5
+ ROLES.OWNER,
6
+ ROLES.ADMIN,
7
+ ROLES.MEMBER,
8
+ SERVER_ROLES.BLOCKLET_OWNER,
9
+ SERVER_ROLES.BLOCKLET_ADMIN,
10
+ SERVER_ROLES.BLOCKLET_MEMBER,
11
+ ];
5
12
 
6
13
  const getCheckMiddleware = (roles) => (req, res, next) => {
7
14
  if (!req.user) {
@@ -11,7 +11,7 @@ const cors = require('cors');
11
11
  const { getPassportStatusEndpoint } = require('@abtnode/auth/lib/auth');
12
12
  const { createPassportVC, createPassport, createUserPassport } = require('@abtnode/auth/lib/passport');
13
13
  const formatContext = require('@abtnode/util/lib/format-context');
14
- const { getStatusFromError } = require('@abtnode/util/lib/custom-error');
14
+ const { getStatusFromError } = require('@blocklet/error');
15
15
  const { getUserAvatarUrl, getAvatarFile, getAppAvatarUrl, extractUserAvatar } = require('@abtnode/util/lib/user');
16
16
  const {
17
17
  attachSendLogoContext,
@@ -0,0 +1,67 @@
1
+ const { getChainClient } = require('@abtnode/util/lib/get-chain-client');
2
+ const { MAIN_CHAIN_ENDPOINT } = require('@abtnode/constant');
3
+ const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
4
+ const { default: axios } = require('axios');
5
+
6
+ const logger = require('../libs/logger')('blocklet-services:csp-proxy');
7
+
8
+ const PREFIX = WELLKNOWN_SERVICE_PATH_PREFIX;
9
+
10
+ module.exports = {
11
+ init(server) {
12
+ const chainClient = getChainClient(MAIN_CHAIN_ENDPOINT);
13
+
14
+ if (!chainClient) {
15
+ logger.error('get chain client failed');
16
+ return;
17
+ }
18
+
19
+ server.get(`${PREFIX}/proxy`, async (req, res) => {
20
+ const { url } = req.query;
21
+
22
+ if (!url) {
23
+ res.status(400).send('Missing image URL');
24
+ }
25
+
26
+ try {
27
+ // 检查是否是一个有效的URL
28
+ const urlObj = new URL(url);
29
+
30
+ // 检查协议是否是https
31
+ if (urlObj.protocol !== 'https:') {
32
+ res.status(400).send('Invalid image URL');
33
+ return;
34
+ }
35
+
36
+ // 使用流式请求和响应
37
+ const response = await axios.get(url, {
38
+ responseType: 'stream',
39
+ });
40
+
41
+ // 设置响应头
42
+ res.set('Content-Type', response.headers['content-type']);
43
+ if (response.headers['content-length']) {
44
+ res.set('Content-Length', response.headers['content-length']);
45
+ }
46
+
47
+ // 直接将流管道传输到响应
48
+ response.data.pipe(res);
49
+
50
+ // 处理错误
51
+ response.data.on('error', (err) => {
52
+ logger.error('Stream error:', err.message);
53
+ if (!res.headersSent) {
54
+ res.status(500).send('Error streaming the image');
55
+ }
56
+ });
57
+ } catch (error) {
58
+ if (error instanceof TypeError && error.message.includes('Invalid URL')) {
59
+ res.status(400).send('Invalid image URL');
60
+ return;
61
+ }
62
+ logger.error('Error fetching the image:', error.message);
63
+ res.status(500).send('Could not fetch the image');
64
+ }
65
+ });
66
+ },
67
+ };
@@ -333,32 +333,37 @@ module.exports = {
333
333
  ensureBlocklet(),
334
334
  checkFederatedCall({ mode: 'memberToMaster' }),
335
335
  async (req, res) => {
336
- const { blocklet, verifySite, verifyData } = req;
337
- const { did: teamDid, wallet: blockletWallet } = await req.getBlockletInfo();
338
- const { fromUserDid, toUserDid, toUserPk } = verifyData;
339
- const oauthUser = await node.getUser({ teamDid, user: { did: fromUserDid } });
340
- const connectedAccounts = oauthUser?.connectedAccounts || [];
341
- const sourceProvider = oauthUser?.sourceProvider;
342
- const oauthAccount = connectedAccounts.find((item) => item.provider === sourceProvider);
343
- const userWallet = fromAppDid(oauthAccount.id, blockletWallet.secretKey);
344
-
345
- const bindUser = {
346
- did: toUserDid,
347
- pk: toUserPk,
348
- };
349
- await declareAccount({ wallet: userWallet, blocklet });
350
- await migrateAccount({ wallet: userWallet, blocklet, user: bindUser });
351
- await node.createAuditLog(
352
- {
353
- action: 'migrateFederatedAccount',
354
- args: { fromUserDid, toUserDid, callerSite: verifySite, teamDid },
355
- context: {
356
- user: getAuditLogActorByFederatedSite(verifySite),
336
+ try {
337
+ const { blocklet, verifySite, verifyData } = req;
338
+ const { did: teamDid, wallet: blockletWallet } = await req.getBlockletInfo();
339
+ const { fromUserDid, toUserDid, toUserPk } = verifyData;
340
+ const oauthUser = await node.getUser({ teamDid, user: { did: fromUserDid } });
341
+ const connectedAccounts = oauthUser?.connectedAccounts || [];
342
+ const sourceProvider = oauthUser?.sourceProvider;
343
+ const oauthAccount = connectedAccounts.find((item) => item.provider === sourceProvider);
344
+ const userWallet = fromAppDid(oauthAccount.id, blockletWallet.secretKey);
345
+
346
+ const bindUser = {
347
+ did: toUserDid,
348
+ pk: toUserPk,
349
+ };
350
+ await declareAccount({ wallet: userWallet, blocklet });
351
+ await migrateAccount({ wallet: userWallet, blocklet, user: bindUser });
352
+ await node.createAuditLog(
353
+ {
354
+ action: 'migrateFederatedAccount',
355
+ args: { fromUserDid, toUserDid, callerSite: verifySite, teamDid },
356
+ context: {
357
+ user: getAuditLogActorByFederatedSite(verifySite),
358
+ },
357
359
  },
358
- },
359
- node
360
- );
361
- res.status(204).send();
360
+ node
361
+ );
362
+ res.status(204).send();
363
+ } catch (error) {
364
+ logger.error('Failed to migrate federated account', { error });
365
+ res.status(500).send(error.message);
366
+ }
362
367
  }
363
368
  );
364
369
 
@@ -10,7 +10,7 @@ const { upsertToPassports } = require('@abtnode/auth/lib/passport');
10
10
  const { getWalletDid, getConnectedAccounts, getSourceProvider } = require('@blocklet/meta/lib/did-utils');
11
11
  const formatContext = require('@abtnode/util/lib/format-context');
12
12
  const createTranslator = require('@abtnode/util/lib/translate');
13
- const CustomError = require('@abtnode/util/lib/custom-error');
13
+ const { CustomError } = require('@blocklet/error');
14
14
  const { LOGIN_PROVIDER } = require('@blocklet/constant');
15
15
  const { withHttps, withTrailingSlash } = require('ufo');
16
16
  const { getLastUsedPassport } = require('@abtnode/auth/lib/passport');
@@ -655,7 +655,7 @@ module.exports = {
655
655
  }
656
656
 
657
657
  try {
658
- referrerHost = new URL(referrer).host;
658
+ referrerHost = new URL(referrer).hostname;
659
659
  } catch (err) {
660
660
  logger.error('Invalid referrer (failed to parse referrer)', { err });
661
661
  res.status(400).send('Invalid host'); // 这里故意返回 Invalid host 而不是 Invalid referrer,可以避免攻击者伪造 referrer 来绕过信任域名检查
@@ -1,6 +1,6 @@
1
1
  const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
2
2
  const { BLOCKLET_OPENEMBED_PREFIX } = require('@blocklet/constant');
3
- const formatError = require('@abtnode/util/lib/format-error');
3
+ const { formatError } = require('@blocklet/error');
4
4
  const pMap = require('p-map');
5
5
  const YAML = require('yaml');
6
6
  const { joinURL, withQuery, withLeadingSlash, withoutTrailingSlash } = require('ufo');
@@ -136,8 +136,7 @@ module.exports = {
136
136
  init(app, node, options) {
137
137
  const ensureCors = cors(async (req, callback) => {
138
138
  const domains = await getTrustedDomains({ node, req, blocklet: req.blocklet });
139
- const host = req?.get('host') || req?.headers?.host;
140
- if (domains.includes(host)) {
139
+ if (domains.includes(req.hostname)) {
141
140
  callback(null, { origin: true });
142
141
  } else {
143
142
  callback(null, { origin: false });
@@ -18,8 +18,7 @@ const { getWallet, getWalletDid } = require('@blocklet/meta/lib/did-utils');
18
18
  const { Joi } = require('@arcblock/validator');
19
19
  const { parse } = require('@abtnode/core/lib/util/ua');
20
20
  const getRequestIP = require('@abtnode/util/lib/get-request-ip');
21
- const formatError = require('@abtnode/util/lib/format-error');
22
- const CustomError = require('@abtnode/util/lib/custom-error');
21
+ const { formatError, CustomError } = require('@blocklet/error');
23
22
  const { xss } = require('@blocklet/xss');
24
23
  const { withQuery, joinURL } = require('ufo');
25
24
  const cors = require('cors');
@@ -738,8 +737,7 @@ module.exports = {
738
737
  init(server, node, options) {
739
738
  const ensureCors = cors(async (req, callback) => {
740
739
  const domains = await federatedUtil.getTrustedDomains({ node, req, blocklet: req.blocklet });
741
- const host = req?.get('host') || req?.headers?.host;
742
- if (domains.includes(host)) {
740
+ if (domains.includes(req.hostname)) {
743
741
  callback(null, { origin: true });
744
742
  } else {
745
743
  callback(null, { origin: false });
@@ -940,8 +938,13 @@ module.exports = {
940
938
  // HACK: 用户使用当前登录会话注销所有会话时,要排除当前登录会话
941
939
  params.visitorId = { [Op.ne]: visitorId };
942
940
  }
943
- } else if (visitorId) {
944
- params.visitorId = visitorId;
941
+ } else {
942
+ params.status = {
943
+ [Op.ne]: 'offline',
944
+ };
945
+ if (visitorId) {
946
+ params.visitorId = visitorId;
947
+ }
945
948
  }
946
949
  if (!params.visitorId && !params.status) {
947
950
  res.status(400).json({ error: 'visitorId or status is required' });
@@ -3,7 +3,7 @@ const { Joi } = require('@arcblock/validator');
3
3
  const { messages } = require('@abtnode/auth/lib/auth');
4
4
  const { getDidSpacesInfoByClaims, silentAuthorizationInConnect } = require('@abtnode/auth/lib/util/spaces');
5
5
  const { DID_SPACES } = require('@blocklet/constant');
6
- const formatError = require('@abtnode/util/lib/format-error');
6
+ const { formatError } = require('@blocklet/error');
7
7
  const logger = require('../../../libs/logger')(require('../../../../package.json').name);
8
8
 
9
9
  const ExtraParamsSchema = Joi.object({
@@ -9,7 +9,7 @@ module.exports = function createRoutes() {
9
9
  action: 'pre-setup',
10
10
  authPrincipal: false,
11
11
  claims: getAppDidOwnerClaims(),
12
- onAuth: ({ claims, userDid, userPk, extraParams: { locale } }) => {
12
+ onAuth: ({ claims, userDid, userPk, extraParams: { locale, visitorId } }) => {
13
13
  const claim = claims.find((x) => x.type === 'signature');
14
14
  verifySignature(claim, userDid, userPk, locale);
15
15
  logger.info('pre-setup.connect.success', { userDid });
@@ -17,6 +17,7 @@ module.exports = function createRoutes() {
17
17
  nextWorkflowData: {
18
18
  claim: pick(claim, ['origin', 'sig']),
19
19
  pk: userPk,
20
+ visitorId,
20
21
  },
21
22
  };
22
23
  },
@@ -4,8 +4,10 @@ const { messages } = require('@abtnode/auth/lib/auth');
4
4
  const { extractUserAvatar } = require('@abtnode/util/lib/user');
5
5
  const formatContext = require('@abtnode/util/lib/format-context');
6
6
  const verifySignature = require('@abtnode/auth/lib/util/verify-signature');
7
- const { LOGIN_PROVIDER } = require('@blocklet/constant');
8
7
  const getRequestIP = require('@abtnode/util/lib/get-request-ip');
8
+ const { getDeviceData } = require('@abtnode/util/lib/device');
9
+ const getOrigin = require('@abtnode/util/lib/get-origin');
10
+ const { getLoginProvider } = require('@blocklet/sdk/lib/util/login');
9
11
 
10
12
  const logger = require('../../../libs/logger')('setup');
11
13
 
@@ -59,6 +61,10 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
59
61
  verifySignature(proof.claim, blocklet.appDid, proof.pk, locale);
60
62
  const profile = claims.find((x) => x.type === 'profile');
61
63
 
64
+ const lastLoginIp = getRequestIP(req);
65
+ const deviceData = getDeviceData({ req });
66
+ const walletOS = req.context.didwallet.os;
67
+ const provider = getLoginProvider(req);
62
68
  try {
63
69
  if (user) {
64
70
  // Update user
@@ -89,17 +95,18 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
89
95
  did: userDid,
90
96
  pk: userPk,
91
97
  locale,
92
- lastLoginIp: getRequestIP(req),
98
+ lastLoginIp,
93
99
  extra: {
94
100
  baseUrl,
95
101
  },
96
102
  connectedAccount: {
97
- provider: LOGIN_PROVIDER.WALLET,
103
+ provider,
98
104
  did: userDid,
99
105
  pk: userPk,
100
106
  },
101
107
  },
102
108
  });
109
+
103
110
  await node.createAuditLog(
104
111
  {
105
112
  action: 'addUser',
@@ -111,6 +118,22 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
111
118
  );
112
119
  }
113
120
 
121
+ const userSessionDoc = await node.upsertUserSession({
122
+ teamDid,
123
+ visitorId: proof?.visitorId || extraParams?.visitorId,
124
+ userDid,
125
+ appPid: teamDid,
126
+ status: 'online',
127
+ ua: null,
128
+ lastLoginIp,
129
+ extra: {
130
+ walletOS,
131
+ device: deviceData,
132
+ },
133
+ locale,
134
+ origin: await getOrigin({ req }),
135
+ });
136
+
114
137
  // Generate new session token that client can save to localStorage
115
138
  // HACK: 此处没有 passportId,所以特意不设置 refreshToken,失效后下次登录就能选择合适的 passport
116
139
  const sessionToken = await createSessionToken(userDid, {
@@ -119,7 +142,11 @@ module.exports = function createRoutes(node, authenticator, createSessionToken)
119
142
  fullName: profile?.fullName,
120
143
  elevated: true,
121
144
  });
122
- await updateSession({ sessionToken }, true);
145
+ if (userSessionDoc) {
146
+ await updateSession({ sessionToken, visitorId: userSessionDoc?.visitorId }, true);
147
+ } else {
148
+ await updateSession({ sessionToken }, true);
149
+ }
123
150
  logger.info('setup.connect.success', { userDid });
124
151
  } catch (err) {
125
152
  logger.error('setup.connect.error', { error: err, userDid });
@@ -3,7 +3,7 @@
3
3
  const path = require('path');
4
4
  const { http } = require('follow-redirects');
5
5
  const { getAppImageCacheDir } = require('@abtnode/util/lib/blocklet');
6
- const CustomError = require('@abtnode/util/lib/custom-error');
6
+ const { CustomError } = require('@blocklet/error');
7
7
 
8
8
  const logger = require('../../libs/logger')();
9
9
 
@@ -5,6 +5,7 @@ const JWT = require('@arcblock/jwt');
5
5
  const md5 = require('@abtnode/util/lib/md5');
6
6
  const { wipeSensitiveData } = require('@blocklet/meta/lib/util');
7
7
  const cloneDeep = require('@abtnode/util/lib/deep-clone');
8
+ const { NOTIFICATION_TYPES } = require('@blocklet/sdk/lib/validators/notification');
8
9
  const {
9
10
  NODE_MODES,
10
11
  EVENTS,
@@ -23,6 +24,23 @@ const eventHub =
23
24
 
24
25
  const logger = require('../../libs/logger')('notification');
25
26
 
27
+ /**
28
+ *
29
+ * 校验是否是有效的 passthrough 消息
30
+ * 场景:discuss kit chat 中发送消息时会有两个通知,一个通知是消息的已读状态没有消息体,一个通知发送的内容,
31
+ */
32
+ const validPassthroughMessage = (notification) => {
33
+ if (
34
+ !notification ||
35
+ notification.type !== NOTIFICATION_TYPES.PASSTHROUGH ||
36
+ notification.passthroughType !== 'messageStatus'
37
+ ) {
38
+ return true;
39
+ }
40
+ const { data } = notification;
41
+ return data && data.message;
42
+ };
43
+
26
44
  const createNotificationQueue = (name, options, handler) => {
27
45
  if (!handler || typeof handler !== 'function') {
28
46
  throw new Error('Handler is required');
@@ -80,7 +98,7 @@ const init = ({ node, notificationService }) => {
80
98
  pushOnly: job.pushOnly,
81
99
  });
82
100
  } catch (error) {
83
- logger.error('Failed to send to app', { notificationId: job.notification.id, error });
101
+ logger.warning('Failed to send to app', { notificationId: job.notification.id, error });
84
102
  }
85
103
  }
86
104
  );
@@ -104,7 +122,7 @@ const init = ({ node, notificationService }) => {
104
122
  pushOnly: job.pushOnly,
105
123
  });
106
124
  } catch (error) {
107
- logger.error('Failed to send to push', { notificationId: job.notification.id, error });
125
+ logger.warn('Failed to send to push', { notificationId: job.notification.id, error });
108
126
  }
109
127
  });
110
128
 
@@ -176,7 +194,7 @@ const init = ({ node, notificationService }) => {
176
194
  pushOnly: input.pushOnly,
177
195
  });
178
196
  } catch (error) {
179
- logger.error('Failed to send to email', { notificationId: job.notificationId, error });
197
+ logger.warn('Failed to send to email', { notificationId: job.notificationId, error });
180
198
  }
181
199
  }
182
200
  );
@@ -226,7 +244,7 @@ const init = ({ node, notificationService }) => {
226
244
  pushOnly: input.pushOnly,
227
245
  });
228
246
  } catch (error) {
229
- logger.error('Failed to send to webhook', { url: job.url, notificationId: job.notification.id, error });
247
+ logger.warn('Failed to send to webhook', { url: job.url, notificationId: job.notification.id, error });
230
248
  }
231
249
  }
232
250
  );
@@ -415,6 +433,11 @@ const init = ({ node, notificationService }) => {
415
433
  const insertToPushKitPushQueue = (props, nodeInfo, isResend) => {
416
434
  const { channels, notification, sender, userInfo, teamDid, options = {} } = props;
417
435
 
436
+ // 如果是无效的 passthrough 消息,则不进行推送
437
+ if (!validPassthroughMessage(notification)) {
438
+ return;
439
+ }
440
+
418
441
  const receiverDid = getWalletDid(userInfo) || userInfo.did;
419
442
 
420
443
  const commonParams = {
@@ -35,6 +35,12 @@ const CHANNEL_FIELD_MAP = {
35
35
  [NOTIFICATION_SEND_CHANNEL.EMAIL]: ['emailSendStatus', 'emailSendAt', 'emailSendFailedReason', 'emailSendRecord'],
36
36
  };
37
37
 
38
+ const CHANNEL_MAP = {
39
+ [NOTIFICATION_TYPES.HI]: [NOTIFICATION_SEND_CHANNEL.WALLET],
40
+ [NOTIFICATION_TYPES.CONNECT]: [NOTIFICATION_SEND_CHANNEL.WALLET],
41
+ [NOTIFICATION_TYPES.PASSTHROUGH]: [NOTIFICATION_SEND_CHANNEL.WALLET, NOTIFICATION_SEND_CHANNEL.PUSH],
42
+ };
43
+
38
44
  const updateNotificationSendStatus = async ({
39
45
  node,
40
46
  teamDid,
@@ -163,10 +169,11 @@ const sendToUserDid = async ({ sender, receiver: rawDid, notification, options,
163
169
  // eg: type = 'passthrough', 'hi', 'connect', 'feed', 默认只需要通知 wallet
164
170
  const pushOnly = _notification.type && _notification.type.toLowerCase() !== NOTIFICATION_TYPES.NOTIFICATION;
165
171
 
166
- // 如果是 passthrough hi connect, 只需要通知 wallet
167
- const onlyWallet = [NOTIFICATION_TYPES.PASSTHROUGH, NOTIFICATION_TYPES.HI, NOTIFICATION_TYPES.CONNECT].includes(
168
- _notification.type?.toLowerCase()
169
- );
172
+ // 通知渠道的确定有两种方式 1. 用户传入的 channels 2. 根据 notification 类型确定
173
+ // 如果是 hi connect, 只需要通知 wallet
174
+ // passthrough 类型,用于 discuss kit 的 chat channel
175
+ // 1. push kit: native 通知快速跳转到 chat channel
176
+ // 2. app: 钱包消息,可以查看到接收到消息
170
177
 
171
178
  return node.createNotification({
172
179
  teamDid,
@@ -177,7 +184,7 @@ const sendToUserDid = async ({ sender, receiver: rawDid, notification, options,
177
184
  entityType: _notification.entityType || 'blocklet',
178
185
  entityId: _notification.entityId || sender.appDid,
179
186
  source: _notification.source || 'component',
180
- channels: onlyWallet ? [NOTIFICATION_SEND_CHANNEL.WALLET] : channels,
187
+ channels: CHANNEL_MAP[_notification.type] || channels,
181
188
  sender,
182
189
  options: { ...rest },
183
190
  pushOnly,
@@ -234,7 +241,7 @@ const sendToAppDid = async ({
234
241
  }
235
242
 
236
243
  if (count <= 0 && keepForOfflineUser) {
237
- logger.error('Online client was not found', { userDid: receiver });
244
+ logger.warn('Online client was not found', { userDid: receiver });
238
245
  await states.message.insert({
239
246
  did: receiver,
240
247
  event: EVENTS.MESSAGE,
@@ -558,7 +565,7 @@ const sendToPush = async ({ sender, receiver, notification, options, node, pushO
558
565
  return res;
559
566
  })
560
567
  .catch((err) => {
561
- logger.error('Failed to send pushKit', { error: err });
568
+ logger.warn('Failed to send pushKit', { error: err });
562
569
  if (!pushOnly) {
563
570
  updateNotificationSendStatus({
564
571
  node,
@@ -126,6 +126,10 @@ function syncFederatedUser(blocklet, node, user, sourceAppPid) {
126
126
  }
127
127
 
128
128
  async function getTrustedDomains({ node, req, blocklet }) {
129
+ if (!blocklet) {
130
+ return req.hostname ? [req.hostname] : [];
131
+ }
132
+
129
133
  const teamDid = blocklet.appPid;
130
134
  const federated = defaults(cloneDeep(blocklet.settings.federated || {}), {
131
135
  config: {
@@ -142,7 +146,7 @@ async function getTrustedDomains({ node, req, blocklet }) {
142
146
  .filter((x) => x.status === 'approved' || isMaster(x))
143
147
  .forEach((cur) => {
144
148
  try {
145
- const appDomain = new URL(cur.appUrl).host;
149
+ const appDomain = new URL(cur.appUrl).hostname;
146
150
  if (appDomain) {
147
151
  domainList.push(appDomain);
148
152
  }
@@ -1,5 +1,5 @@
1
1
  const JWT = require('@arcblock/jwt');
2
- const CustomError = require('@abtnode/util/lib/custom-error');
2
+ const { CustomError } = require('@blocklet/error');
3
3
  const { callFederated } = require('@abtnode/auth/lib/util/federated');
4
4
  const { fromAppDid } = require('@arcblock/did-ext');
5
5