@abtnode/blocklet-services 1.16.42-beta-20250412-084444-20b0cf19 → 1.16.42-beta-20250415-222652-04c5d2fe

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 (340) hide show
  1. package/api/index.js +36 -5
  2. package/api/libs/auth/index.js +5 -5
  3. package/api/libs/connect/session.js +29 -3
  4. package/api/libs/jwt.js +36 -1
  5. package/api/libs/push-kit/index.js +16 -11
  6. package/api/routes/federated.js +1 -1
  7. package/api/routes/mcp.js +26 -13
  8. package/api/routes/{oauth.js → oauth/client.js} +22 -21
  9. package/api/routes/oauth/server.js +95 -0
  10. package/api/routes/user-session.js +49 -40
  11. package/api/routes/user.js +21 -8
  12. package/api/services/auth/connect/gen-access-key.js +92 -0
  13. package/api/services/auth/index.js +8 -0
  14. package/api/services/auth/passkey.js +1 -1
  15. package/api/services/auth/session.js +39 -13
  16. package/api/services/dashboard/index.js +6 -0
  17. package/api/services/mcp/server.js +151 -32
  18. package/api/services/notification/queue.js +9 -6
  19. package/api/services/oauth/server.js +213 -0
  20. package/api/util/attach-shared-utils.js +12 -5
  21. package/api/util/index.js +1 -1
  22. package/api/util/user-util.js +1 -21
  23. package/dist/assets/AdapterDayjs-BLBXeg9J.js +3 -0
  24. package/dist/assets/{ArrowDropDown-C_E3qkPd.js → ArrowDropDown--dAaadP8.js} +1 -1
  25. package/dist/assets/{CheckCircle-D7Ntmb2o.js → CheckCircle-Av1UotA-.js} +1 -1
  26. package/dist/assets/{ChevronLeft-BIgT65EY.js → ChevronLeft-De8Da-PB.js} +1 -1
  27. package/dist/assets/{ChevronRight-foZmiP4J.js → ChevronRight-CQOI2CyK.js} +1 -1
  28. package/dist/assets/{Community-Ds1NG5Zj.js → Community-B_YqAP9P.js} +1 -1
  29. package/dist/assets/{DeleteOutline-CKVA3PXs.js → DeleteOutline-Cgoi-K0i.js} +1 -1
  30. package/dist/assets/{Done-BDrYSkZM.js → Done-BYuUlh_s.js} +1 -1
  31. package/dist/assets/{Download-BQiSNQBP.js → Download-DUKR_Wkm.js} +1 -1
  32. package/dist/assets/Edit-D2RQMivt.js +1 -0
  33. package/dist/assets/{EditIcon-Bt91o1l6.js → EditIcon-5ixNT5sW.js} +1 -1
  34. package/dist/assets/{Email-C7SKOpM8.js → Email-RGD-rKFl.js} +1 -1
  35. package/dist/assets/{Error-CK4gTMoT.js → Error-By0ZMWzh.js} +1 -1
  36. package/dist/assets/{ExpandLess-1B6PdCYC.js → ExpandLess-BNGLjxae.js} +1 -1
  37. package/dist/assets/{Google-DimUFzIe.js → Google-tZCjvU7D.js} +1 -1
  38. package/dist/assets/{Holiday-Dfj3kBBI.js → Holiday-C_1hMIGZ.js} +1 -1
  39. package/dist/assets/{InfoOutlined-CEHciuDy.js → InfoOutlined-DSoJjRQo.js} +1 -1
  40. package/dist/assets/{Launch-DX76v5dw.js → Launch-B161pSEw.js} +1 -1
  41. package/dist/assets/{LaunchOutlined-CnOQGhu-.js → LaunchOutlined-wehxIahb.js} +1 -1
  42. package/dist/assets/{Location--4ueDivQ.js → Location-B6FoL795.js} +1 -1
  43. package/dist/assets/{LockIcon-B84lMZao.js → LockIcon-D3vSMIOk.js} +1 -1
  44. package/dist/assets/{Meeting-CVVnP-bH.js → Meeting-BfKca-xn.js} +1 -1
  45. package/dist/assets/{MoreHoriz-THEF6D0C.js → MoreHoriz-Bo_R2nuS.js} +1 -1
  46. package/dist/assets/{OffSick-C_2x7yDI.js → OffSick-QPPyYyU6.js} +1 -1
  47. package/dist/assets/{Phone-CaKOX2Yu.js → Phone-_lRBpoVi.js} +1 -1
  48. package/dist/assets/{PlayArrow-DpcMtsY5.js → PlayArrow-D38lbyGo.js} +1 -1
  49. package/dist/assets/{QuestionMarkCircle-5K6WR8Pc.js → QuestionMarkCircle-B4EnwYju.js} +1 -1
  50. package/dist/assets/{ServerLogo-C4P-qXGV.js → ServerLogo-BW4PKwV0.js} +1 -1
  51. package/dist/assets/{Timezone-Bgwxnj29.js → Timezone-bYzGwn3x.js} +1 -1
  52. package/dist/assets/{TuneOutlined-DHqZ7jGz.js → TuneOutlined-DMMtKa6E.js} +1 -1
  53. package/dist/assets/{ViewList-DOu7Co_L.js → ViewList-CMIoKrN6.js} +1 -1
  54. package/dist/assets/{WorkingRemotely-Dm2BOs5c.js → WorkingRemotely-BK9_vlZ-.js} +1 -1
  55. package/dist/assets/{access-control-wqGz9JCo.js → access-control-DLD9n3S7.js} +1 -1
  56. package/dist/assets/actions-CMsM02NP.js +1 -0
  57. package/dist/assets/add-component-core-FnU4dwXM.js +763 -0
  58. package/dist/assets/{add-resource-DmN1IY_o.js → add-resource-CubCXHBS.js} +1 -1
  59. package/dist/assets/{addon-D1_etOjl.js → addon-5JaI2ctX.js} +1 -1
  60. package/dist/assets/advanced-D4wfoh0v.js +14 -0
  61. package/dist/assets/api-3sG9at7i.js +1 -0
  62. package/dist/assets/appearance-BUsj4DWC.js +1 -0
  63. package/dist/assets/{ar-DrRqcx2b.js → ar-BUQWR0Zu.js} +1 -1
  64. package/dist/assets/{ar-Cb5zQ0go.js → ar-CMzth4YC.js} +3 -3
  65. package/dist/assets/{audit-logs-DU66CSpw.js → audit-logs-rk_iUYcM.js} +3 -3
  66. package/dist/assets/authorize-CDJXjmiI.js +1 -0
  67. package/dist/assets/{base32-CLGITfm-.js → base32-BhlNgZPk.js} +1 -1
  68. package/dist/assets/{branding-C5rNAfwW.js → branding-BBbE2Klb.js} +1 -1
  69. package/dist/assets/branding-JQ1914RB.js +40 -0
  70. package/dist/assets/{bundle-avatar-vSofRY4G.js → bundle-avatar-woUZoGoi.js} +1 -1
  71. package/dist/assets/button-Rx3uHycr.js +1 -0
  72. package/dist/assets/click-to-copy-BxZJa7n5.js +1 -0
  73. package/dist/assets/cloneDeep-kMVNpUap.js +1 -0
  74. package/dist/assets/{complete-BeWyfTmK.js → complete-KnPBZq-P.js} +2 -2
  75. package/dist/assets/{component-CZ948vh4.js → component-fD-EGTLm.js} +80 -80
  76. package/dist/assets/{config-CFbM7U_5.js → config-8xeoVfWN.js} +2 -2
  77. package/dist/assets/{config-DzZULB-q.js → config-DbqQgRSU.js} +1 -1
  78. package/dist/assets/config-navigation-DrgPbe5I.js +26 -0
  79. package/dist/assets/{config-space-Drp9NI7a.js → config-space-DZ9w_4_9.js} +1 -1
  80. package/dist/assets/confirm-_RIb3OmR.js +7 -0
  81. package/dist/assets/{connect-0zFqdTRm.js → connect-CJOq1BXE.js} +1 -1
  82. package/dist/assets/{connect-CpUC5BAX.js → connect-CPIImVme.js} +1 -1
  83. package/dist/assets/{connect-to-BasQxweP.js → connect-to-BdhN0BHi.js} +1 -1
  84. package/dist/assets/{content-layout-Bs-vdQ_U.js → content-layout-BM34AwsG.js} +1 -1
  85. package/dist/assets/dashboard-vsk4QHJ1.js +275 -0
  86. package/dist/assets/de-BkBUnf4o.js +13 -0
  87. package/dist/assets/{de-BRPos3d1.js → de-_X0eQXZu.js} +1 -1
  88. package/dist/assets/delete-confirm-DaoAi4Gz.js +1 -0
  89. package/dist/assets/did-address-CGHn52xI.js +1 -0
  90. package/dist/assets/domain-BJUSWYGQ.js +9 -0
  91. package/dist/assets/domain-action-card-9r42-rWK.js +29 -0
  92. package/dist/assets/domains-BNDFk-7R.js +1 -0
  93. package/dist/assets/{email-C5iUsSjP.js → email-fp1LVcF6.js} +3 -3
  94. package/dist/assets/empty-spinner-Ict2ItjU.js +1 -0
  95. package/dist/assets/es-C47yMWlQ.js +14 -0
  96. package/dist/assets/{es-D2rCdMgt.js → es-yHIDSG5r.js} +1 -1
  97. package/dist/assets/{exchange-passport-CyGvLDal.js → exchange-passport-DIyhYtFS.js} +1 -1
  98. package/dist/assets/{format-error-BrmqJs5a.js → format-error-LAoTjvJe.js} +1 -1
  99. package/dist/assets/{fr-Chv_7X3-.js → fr-CXUB715N.js} +3 -3
  100. package/dist/assets/{fr-DAFx50ef.js → fr-D6i3bCqR.js} +1 -1
  101. package/dist/assets/{fuel-C5H_z1Ay.js → fuel-aGwI1uP2.js} +1 -1
  102. package/dist/assets/gen-access-key-DMS1kzry.js +2 -0
  103. package/dist/assets/{get-safe-url-BOY9UAaI.js → get-safe-url-DMordnyN.js} +1 -1
  104. package/dist/assets/{get-safe-url-D_Puq_oh.js → get-safe-url-DW2Z07ex.js} +1 -1
  105. package/dist/assets/{hi-CkD7b6N9.js → hi-ChVLDWm_.js} +1 -1
  106. package/dist/assets/hi-DCG5QxbH.js +11 -0
  107. package/dist/assets/{home-CjHQSa_8.js → home-B_gUzcjU.js} +1 -1
  108. package/dist/assets/id-BjbrrkXh.js +14 -0
  109. package/dist/assets/{id-BMWKdVei.js → id-D6XXuY_a.js} +1 -1
  110. package/dist/assets/{iframe-BhRKCdFb.js → iframe-BEanRyio.js} +1 -1
  111. package/dist/assets/index-4rY7Xp2W.js +14 -0
  112. package/dist/assets/{index-CjmXl7jW.js → index-AhbLOD9c.js} +1 -1
  113. package/dist/assets/{index-CYAgDp3G.js → index-BDNlzmD0.js} +4 -4
  114. package/dist/assets/{index-BjYech25.js → index-BPa_QtWl.js} +30 -30
  115. package/dist/assets/index-BjN8LAYh.js +224 -0
  116. package/dist/assets/index-BmexzVQt.js +1 -0
  117. package/dist/assets/{index-C1nvgBfF.js → index-C-7MyHbp.js} +1 -1
  118. package/dist/assets/index-C0hr4pkt.js +346 -0
  119. package/dist/assets/{index-d34Q6nXR.js → index-CFJtmMCn.js} +1 -1
  120. package/dist/assets/index-CFkRKsyT.js +290 -0
  121. package/dist/assets/{index-9aeq_G-H.js → index-CX4jvZnM.js} +1 -1
  122. package/dist/assets/{index-CVIeQOoE.js → index-CbW18ndN.js} +2 -2
  123. package/dist/assets/index-CcjD0qiY.js +93 -0
  124. package/dist/assets/{index-Cuoxr9xB.js → index-D1fVmwHN.js} +1 -1
  125. package/dist/assets/{index-Du2DtxVt.js → index-D22ZWGxu.js} +1 -1
  126. package/dist/assets/{index-C5lvlGzp.js → index-D22lazSG.js} +3 -3
  127. package/dist/assets/{index-B8FtPEFx.js → index-D2EAXstd.js} +2 -2
  128. package/dist/assets/index-DBZZ-U66.js +1 -0
  129. package/dist/assets/index-DUQK_NaI.js +113 -0
  130. package/dist/assets/{index-Ctl8J5Z5.js → index-D_gSWW1P.js} +1 -1
  131. package/dist/assets/index-DbpVrp8z.js +138 -0
  132. package/dist/assets/{index-BYsXlcQC.js → index-DkPKxdcu.js} +1 -1
  133. package/dist/assets/{index-DkZfhapD.js → index-DzDfEcNp.js} +1 -1
  134. package/dist/assets/{index-BTOIZL6e.js → index-O2l0NSUF.js} +1 -1
  135. package/dist/assets/{index-CPE8Apzb.js → index-pV_0wOyY.js} +1 -1
  136. package/dist/assets/{index-DVQCgvFb.js → index-tUQxVYYQ.js} +1 -1
  137. package/dist/assets/index-xa5W6ExD.js +1 -0
  138. package/dist/assets/{invitation-C9hFp_wD.js → invitation-D-l4US6a.js} +3 -3
  139. package/dist/assets/invite-DPswrm4J.js +1 -0
  140. package/dist/assets/{issue-passport-D3F63x7z.js → issue-passport-AJghkFHK.js} +1 -1
  141. package/dist/assets/item-zk7clNKz.js +2 -0
  142. package/dist/assets/{ja-D2jInSAT.js → ja-DKZCt8Yp.js} +1 -1
  143. package/dist/assets/ja-DmNZQIta.js +14 -0
  144. package/dist/assets/{ko-BGB5KJZq.js → ko-B0uE9AyQ.js} +1 -1
  145. package/dist/assets/ko-CfYwMwZz.js +14 -0
  146. package/dist/assets/{landing-page-B5nKEn_3.js → landing-page-D13wALfk.js} +1 -1
  147. package/dist/assets/{launch-result-message-C0Ao1hE-.js → launch-result-message-Bvdtucih.js} +1 -1
  148. package/dist/assets/{layout-D5ALyxXA.js → layout-aS-gjZH3.js} +1 -1
  149. package/dist/assets/list-CJt5nOcn.js +234 -0
  150. package/dist/assets/{list-header-BibBP5t1.js → list-header-Bm8u_Z_p.js} +1 -1
  151. package/dist/assets/localization-Us9buoy1.js +1 -0
  152. package/dist/assets/{log-Dg8IZoeo.js → log-DFaz-U9x.js} +7 -7
  153. package/dist/assets/{logger-Bd77RetM.js → logger-DXlQ8ejK.js} +1 -1
  154. package/dist/assets/{login-B9XiO8eS.js → login-DKSu0ge6.js} +1 -1
  155. package/dist/assets/login-oauth-callback-CP7cNspN.js +1 -0
  156. package/dist/assets/{logo-uploader-ChABQ_cS.js → logo-uploader-B7i5QemW.js} +5 -5
  157. package/dist/assets/{lost-passport-gGzRW--h.js → lost-passport-QRUn4RXe.js} +3 -3
  158. package/dist/assets/{lottie-react.esm-D2t-u0YU.js → lottie-react.esm-CPHH620R.js} +1 -1
  159. package/dist/assets/{lottie-web-jYmAQWuC.js → lottie-web-B6s7dDoL.js} +1 -1
  160. package/dist/assets/omit-MMUW2k9W.js +1 -0
  161. package/dist/assets/{open-window-CX_mRFPs.js → open-window-B6LZyZAW.js} +1 -1
  162. package/dist/assets/{overview-ClfPLbRa.js → overview-B3A_5sHO.js} +2 -2
  163. package/dist/assets/{page-header-DWf5vODI.js → page-header-DUh_2MUQ.js} +1 -1
  164. package/dist/assets/passport-item-BY6VS7Ot.js +1 -0
  165. package/dist/assets/{permission-CmHMB8NK.js → permission-DKFJEWNH.js} +1 -1
  166. package/dist/assets/preferences-CA76rfbp.js +1 -0
  167. package/dist/assets/profile-embed-DHFHXO1W.js +1 -0
  168. package/dist/assets/{pt-DY0Ku5W5.js → pt-DCzE4kPq.js} +1 -1
  169. package/dist/assets/pt-DD_rP5GH.js +12 -0
  170. package/dist/assets/publish-resource-rxvf6s83.js +1 -0
  171. package/dist/assets/{raf-schd.esm-B3j6BePR.js → raf-schd.esm-GV-XhwE0.js} +1 -1
  172. package/dist/assets/{react-beautiful-dnd.esm-B3HYEQUw.js → react-beautiful-dnd.esm-D0nBCaor.js} +1 -1
  173. package/dist/assets/{relative-time-CE47D6s7.js → relative-time-BK3hjJNN.js} +1 -1
  174. package/dist/assets/roboto-latin-400-normal-BVyCgWwA.woff +0 -0
  175. package/dist/assets/roboto-latin-400-normal-DXyFPIdK.woff2 +0 -0
  176. package/dist/assets/roboto-latin-500-normal-C6iW8rdg.woff2 +0 -0
  177. package/dist/assets/roboto-latin-500-normal-rpP1_v3s.woff +0 -0
  178. package/dist/assets/roboto-latin-700-normal-BWcFiwQV.woff +0 -0
  179. package/dist/assets/roboto-latin-700-normal-CbYYDfWS.woff2 +0 -0
  180. package/dist/assets/roboto-latin-ext-400-normal-BSFkPfbf.woff +0 -0
  181. package/dist/assets/roboto-latin-ext-400-normal-DgXbz5gU.woff2 +0 -0
  182. package/dist/assets/roboto-latin-ext-500-normal-DvHxAkTn.woff +0 -0
  183. package/dist/assets/roboto-latin-ext-500-normal-OQJhyaXd.woff2 +0 -0
  184. package/dist/assets/roboto-latin-ext-700-normal-Ba-CAIIA.woff +0 -0
  185. package/dist/assets/roboto-latin-ext-700-normal-DchBbzVz.woff2 +0 -0
  186. package/dist/assets/{ru-Cv5vRo7s.js → ru-B9yj9TuE.js} +1 -1
  187. package/dist/assets/ru-CwgUUzV8.js +11 -0
  188. package/dist/assets/runtime-D_bXZ0w0.js +1 -0
  189. package/dist/assets/sdk-Hg_BMu_u.js +1 -0
  190. package/dist/assets/{security-DmjkCoJ_.js → security-DEmFjZiu.js} +1 -1
  191. package/dist/assets/session-DB9Du-lc.js +1 -0
  192. package/dist/assets/{setup-DLCw2h80.js → setup-kkb6SvQ7.js} +4 -4
  193. package/dist/assets/{shorten-label-DDBwv81M.js → shorten-label-CwDvu4_S.js} +1 -1
  194. package/dist/assets/simple-select-DgqUhMvQ.js +1 -0
  195. package/dist/assets/{slicedToArray-Da5X2Yv5.js → slicedToArray-B8PdYes9.js} +1 -1
  196. package/dist/assets/{spaces-CyFGYf34.js → spaces-25E9GQ6_.js} +1 -1
  197. package/dist/assets/{start-CwSXw9Xs.js → start-DfEUlPuS.js} +1 -1
  198. package/dist/assets/{status-CgfGREVl.js → status-CUyAteC9.js} +1 -1
  199. package/dist/assets/{step-actions-BNW8I1sI.js → step-actions-CAgwlOEY.js} +1 -1
  200. package/dist/assets/{studio-cLKWVbyy.js → studio-2U2-FOOC.js} +1 -1
  201. package/dist/assets/{switch-control-DpvMHPLC.js → switch-control-DwTxPESj.js} +1 -1
  202. package/dist/assets/th-KqE3tuDR.js +12 -0
  203. package/dist/assets/{th-D6oDBVGi.js → th-et0IV3ES.js} +1 -1
  204. package/dist/assets/traffic-B94bYvtf.js +35 -0
  205. package/dist/assets/{transfer-BHifjdxl.js → transfer-DWjvJtPs.js} +1 -1
  206. package/dist/assets/{unsubscribe-CcyOqX8E.js → unsubscribe-CTZlUfqc.js} +1 -1
  207. package/dist/assets/use-mobile-BHPd3bDQ.js +1 -0
  208. package/dist/assets/use-mobile-CHMVa8_W.js +1 -0
  209. package/dist/assets/{useAsync-BENTIUEf.js → useAsync-DKE0K0bz.js} +1 -1
  210. package/dist/assets/{useAsyncRetry-DSYkC9r5.js → useAsyncRetry-BBomZj1z.js} +2 -2
  211. package/dist/assets/{useLocalStorage-Cq9THoCr.js → useLocalStorage-DKl7XFfI.js} +1 -1
  212. package/dist/assets/{useSetState-CWq0AVWn.js → useSetState-BL3ktMon.js} +1 -1
  213. package/dist/assets/user-center-Du6EtGgy.js +77 -0
  214. package/dist/assets/{util-BmbbisPE.js → util-BEvdQ5nP.js} +1 -1
  215. package/dist/assets/{util-1n1Ulk5w.js → util-DkIhTuT7.js} +1 -1
  216. package/dist/assets/{vendor-arcblock-V3HYELzG.js → vendor-arcblock-ACo-BN0q.js} +83 -83
  217. package/dist/assets/{vendor-hooks-DN4nZ7TU.js → vendor-hooks-BwVH-TAd.js} +2 -2
  218. package/dist/assets/{vendor-mui-core-1jJmAutq.js → vendor-mui-core-DxD1UA4o.js} +2 -2
  219. package/dist/assets/vendor-mui-x-Bit8yv3W.js +6 -0
  220. package/dist/assets/{vendor-react-DEoibe3W.js → vendor-react-DoD83n6N.js} +1 -1
  221. package/dist/assets/vendor-utils-CTIzdAFg.js +11 -0
  222. package/dist/assets/vendor-ux-did-connect-2GapMFC4.css +1 -0
  223. package/dist/assets/vendor-ux-did-connect-DOjsg91L.js +1832 -0
  224. package/dist/assets/vi-BSkiIyr-.js +12 -0
  225. package/dist/assets/{vi-BKKJMbW2.js → vi-LBvVt_pj.js} +1 -1
  226. package/dist/assets/wrap-locale-DjpRZNtr.js +1 -0
  227. package/dist/assets/{zh-nDA-W8Iz.js → zh-BYP8UvRZ.js} +4 -4
  228. package/dist/assets/{zh-tw-B9PQstHP.js → zh-tw-Dcs2VpLv.js} +3 -3
  229. package/dist/assets/{zh-tw-B08rjgK3.js → zh-tw-l3XXo5aT.js} +1 -1
  230. package/dist/assets/{zh-gJhiLbCP.js → zh-yJzqRkfw.js} +1 -1
  231. package/dist/index.html +9 -9
  232. package/dist/service-worker.js +2 -2
  233. package/package.json +45 -43
  234. package/dist/assets/actions-CAL1KFv7.js +0 -1
  235. package/dist/assets/add-component-core-DqvSoT6a.js +0 -762
  236. package/dist/assets/advanced-CzJgEcda.js +0 -14
  237. package/dist/assets/api-kwOW9mRz.js +0 -1
  238. package/dist/assets/appearance-Bn0kYJHu.js +0 -1
  239. package/dist/assets/branding-CiE421Dn.js +0 -40
  240. package/dist/assets/button-BSJ2z68-.js +0 -1
  241. package/dist/assets/click-to-copy-C9iEVQIO.js +0 -1
  242. package/dist/assets/cloneDeep-DHAAvuEH.js +0 -1
  243. package/dist/assets/config-navigation-hrdLDyFZ.js +0 -26
  244. package/dist/assets/confirm-B9OqaJpT.js +0 -7
  245. package/dist/assets/dashboard-BYUKOMAe.js +0 -262
  246. package/dist/assets/de-BOcpEFUQ.js +0 -13
  247. package/dist/assets/delete-confirm-CM4f-ajO.js +0 -1
  248. package/dist/assets/did-address-B_VfxEC5.js +0 -1
  249. package/dist/assets/domain-D0xqhxvZ.js +0 -9
  250. package/dist/assets/domain-action-card-pHkmKFE3.js +0 -29
  251. package/dist/assets/domains-BrNRyjCn.js +0 -1
  252. package/dist/assets/empty-spinner-Cia24BVr.js +0 -1
  253. package/dist/assets/es-DAe7HpzA.js +0 -14
  254. package/dist/assets/hi-BqgGDMzX.js +0 -11
  255. package/dist/assets/id-DbN1Ye4x.js +0 -14
  256. package/dist/assets/index-Bee_YcJC.js +0 -113
  257. package/dist/assets/index-Cp_gD4ZQ.js +0 -1
  258. package/dist/assets/index-D3YZfNxX.js +0 -5
  259. package/dist/assets/index-DFoYVoMG.js +0 -346
  260. package/dist/assets/index-DR9nQ2tJ.js +0 -1
  261. package/dist/assets/index-DUU3hQpo.js +0 -138
  262. package/dist/assets/index-Dzvf3kMf.js +0 -220
  263. package/dist/assets/index-Kaq7tC6c.js +0 -290
  264. package/dist/assets/invite-CzfqL5Tx.js +0 -1
  265. package/dist/assets/item-C_TigVeC.js +0 -2
  266. package/dist/assets/ja-Bv-A_sTl.js +0 -14
  267. package/dist/assets/ko-Bl3kd-sp.js +0 -14
  268. package/dist/assets/list-DuzdV0Wa.js +0 -221
  269. package/dist/assets/localization-WUgLuLwU.js +0 -1
  270. package/dist/assets/login-oauth-callback-5AlLzjZ2.js +0 -1
  271. package/dist/assets/omit-IjXSqbDA.js +0 -1
  272. package/dist/assets/preferences-COMN8FgJ.js +0 -1
  273. package/dist/assets/profile-embed-Crj1xM6Z.js +0 -1
  274. package/dist/assets/pt-B7_jgyK-.js +0 -12
  275. package/dist/assets/publish-resource-C6TOyrHC.js +0 -1
  276. package/dist/assets/roboto-cyrillic-400-normal-DAIM1_dR.woff2 +0 -0
  277. package/dist/assets/roboto-cyrillic-400-normal-Dry59Hjn.woff +0 -0
  278. package/dist/assets/roboto-cyrillic-500-normal-CsCirF4J.woff +0 -0
  279. package/dist/assets/roboto-cyrillic-500-normal-hCeO1jFL.woff2 +0 -0
  280. package/dist/assets/roboto-cyrillic-700-normal-CB1Rmiii.woff +0 -0
  281. package/dist/assets/roboto-cyrillic-700-normal-CzEIZVQR.woff2 +0 -0
  282. package/dist/assets/roboto-cyrillic-ext-400-normal-BxX1-eA_.woff +0 -0
  283. package/dist/assets/roboto-cyrillic-ext-400-normal-DzMWdK87.woff2 +0 -0
  284. package/dist/assets/roboto-cyrillic-ext-500-normal-B7rQpwPu.woff2 +0 -0
  285. package/dist/assets/roboto-cyrillic-ext-500-normal-ElvJfk8V.woff +0 -0
  286. package/dist/assets/roboto-cyrillic-ext-700-normal-CIu0AXX2.woff +0 -0
  287. package/dist/assets/roboto-cyrillic-ext-700-normal-D_fA0fHY.woff2 +0 -0
  288. package/dist/assets/roboto-greek-400-normal-CAI06USH.woff +0 -0
  289. package/dist/assets/roboto-greek-400-normal-jFM2czAU.woff2 +0 -0
  290. package/dist/assets/roboto-greek-500-normal-BJMS0heP.woff2 +0 -0
  291. package/dist/assets/roboto-greek-500-normal-D8eQD5zT.woff +0 -0
  292. package/dist/assets/roboto-greek-700-normal-DCrt6r9F.woff +0 -0
  293. package/dist/assets/roboto-greek-700-normal-DpKAje7q.woff2 +0 -0
  294. package/dist/assets/roboto-latin-400-normal-551zQQ7R.woff +0 -0
  295. package/dist/assets/roboto-latin-400-normal-CNwBRw8h.woff2 +0 -0
  296. package/dist/assets/roboto-latin-500-normal-CkrA1NAy.woff2 +0 -0
  297. package/dist/assets/roboto-latin-500-normal-_8jDuD7w.woff +0 -0
  298. package/dist/assets/roboto-latin-700-normal-CTLkNcF_.woff +0 -0
  299. package/dist/assets/roboto-latin-700-normal-DZr4b_KL.woff2 +0 -0
  300. package/dist/assets/roboto-latin-ext-400-normal-ZYmyxeOy.woff2 +0 -0
  301. package/dist/assets/roboto-latin-ext-400-normal-uRIBRJt5.woff +0 -0
  302. package/dist/assets/roboto-latin-ext-500-normal-C_ARlJGk.woff2 +0 -0
  303. package/dist/assets/roboto-latin-ext-500-normal-eJ10kk0m.woff +0 -0
  304. package/dist/assets/roboto-latin-ext-700-normal-BNPgmEQS.woff2 +0 -0
  305. package/dist/assets/roboto-latin-ext-700-normal-Cnx4FGpK.woff +0 -0
  306. package/dist/assets/roboto-math-400-normal-B3wgz80t.woff2 +0 -0
  307. package/dist/assets/roboto-math-400-normal-DHrwdhE6.woff +0 -0
  308. package/dist/assets/roboto-math-500-normal-CFNaIMFC.woff2 +0 -0
  309. package/dist/assets/roboto-math-500-normal-CetgDdIa.woff +0 -0
  310. package/dist/assets/roboto-math-700-normal-CpTCM92H.woff +0 -0
  311. package/dist/assets/roboto-math-700-normal-xbpggnJp.woff2 +0 -0
  312. package/dist/assets/roboto-symbols-400-normal-bG5rsNFs.woff +0 -0
  313. package/dist/assets/roboto-symbols-400-normal-fF1SLJBj.woff2 +0 -0
  314. package/dist/assets/roboto-symbols-500-normal-BXFTxrNR.woff2 +0 -0
  315. package/dist/assets/roboto-symbols-500-normal-toKUCDph.woff +0 -0
  316. package/dist/assets/roboto-symbols-700-normal-B2QKVW64.woff +0 -0
  317. package/dist/assets/roboto-symbols-700-normal-DKkQdRpM.woff2 +0 -0
  318. package/dist/assets/roboto-vietnamese-400-normal-CDDxGrUb.woff2 +0 -0
  319. package/dist/assets/roboto-vietnamese-400-normal-DgufTq8s.woff +0 -0
  320. package/dist/assets/roboto-vietnamese-500-normal-Dw5heWgq.woff +0 -0
  321. package/dist/assets/roboto-vietnamese-500-normal-HYpufUYk.woff2 +0 -0
  322. package/dist/assets/roboto-vietnamese-700-normal-BFWtvCOj.woff2 +0 -0
  323. package/dist/assets/roboto-vietnamese-700-normal-ChAl_rRV.woff +0 -0
  324. package/dist/assets/ru-CToatViJ.js +0 -11
  325. package/dist/assets/runtime-CdKbOwQM.js +0 -1
  326. package/dist/assets/sdk-j4w1A_X4.js +0 -1
  327. package/dist/assets/session-0rF5SuCk.js +0 -1
  328. package/dist/assets/simple-select-vCKkiHhG.js +0 -1
  329. package/dist/assets/th-23Hwasay.js +0 -12
  330. package/dist/assets/traffic-ChJb5Oyl.js +0 -37
  331. package/dist/assets/use-mobile-DjnNmGRG.js +0 -1
  332. package/dist/assets/use-mobile-DpXDDjat.js +0 -1
  333. package/dist/assets/user-center-DfDG_giT.js +0 -77
  334. package/dist/assets/vendor-mui-x-CPwlD3uT.js +0 -6
  335. package/dist/assets/vendor-utils-C3FZIS9A.js +0 -11
  336. package/dist/assets/vendor-ux-did-connect-BDmhBveY.css +0 -1
  337. package/dist/assets/vendor-ux-did-connect-DEbq97Xz.js +0 -1832
  338. package/dist/assets/vi-D-QGxDS1.js +0 -12
  339. package/dist/assets/wrap-locale-5LSB6OAr.js +0 -1
  340. /package/api/services/oauth/{index.js → client.js} +0 -0
@@ -1,9 +1,9 @@
1
1
  /* eslint-disable no-await-in-loop */
2
2
  const {
3
3
  WELLKNOWN_SERVICE_PATH_PREFIX,
4
- SESSION_TTL,
5
4
  PASSPORT_LOG_ACTION,
6
5
  PASSPORT_STATUS,
6
+ SESSION_TTL,
7
7
  } = require('@abtnode/constant');
8
8
  const { LOGIN_PROVIDER } = require('@blocklet/constant');
9
9
  const pick = require('lodash/pick');
@@ -13,7 +13,7 @@ const omit = require('lodash/omit');
13
13
  const pLimit = require('p-limit');
14
14
  const { getSourceProvider } = require('@blocklet/meta/lib/did-utils');
15
15
  const getRequestIP = require('@abtnode/util/lib/get-request-ip');
16
- const { getFederatedMembers, getFederatedMaster } = require('@abtnode/auth/lib/util/federated');
16
+ const { getFederatedMembers, getFederatedMaster, findFederatedSite } = require('@abtnode/auth/lib/util/federated');
17
17
  const { messages } = require('@abtnode/auth/lib/auth');
18
18
  const { Joi } = require('@arcblock/validator');
19
19
  const { getDeviceData } = require('@abtnode/util/lib/device');
@@ -51,12 +51,16 @@ async function getPassportFromFederatedSite(passportId, { appPid, node, teamDid,
51
51
  return undefined;
52
52
  }
53
53
 
54
- async function patchUserSessionData(userSession, { blocklet, appPid, teamDid, node }) {
54
+ function patchUserSessionStatus(userSession, { blocklet }) {
55
55
  const sessionTtl = blocklet.settings?.session?.ttl || SESSION_TTL;
56
56
  // 修正当前 session 的 status,如果超出时间了,则应该显示为过期
57
57
  if (Date.now() - new Date(userSession.updatedAt).getTime() > sessionTtl * 1000) {
58
58
  userSession.status = 'expired';
59
59
  }
60
+ }
61
+
62
+ async function patchUserSessionData(userSession, { blocklet, appPid, teamDid, node }) {
63
+ patchUserSessionStatus(userSession, { blocklet });
60
64
  // 修正 avatar 地址,从 bn:// 转换为 http
61
65
  if (userSession.user?.avatar) {
62
66
  userSession.user.avatar = getUserAvatarUrl(userSession.user.avatar, blocklet);
@@ -154,9 +158,8 @@ module.exports = {
154
158
  }
155
159
 
156
160
  const teamDid = blocklet.appPid;
157
- const [validSession] = await node.getUserSession({
161
+ const validSession = await node.getUserSession({
158
162
  teamDid,
159
- userDid: validUserSession.userDid,
160
163
  id: validUserSession.id,
161
164
  });
162
165
 
@@ -338,35 +341,31 @@ module.exports = {
338
341
 
339
342
  app.get(`${prefix}/myself`, ensureBlocklet(), checkUser, async (req, res) => {
340
343
  const { blocklet } = req;
341
- const { appPid } = blocklet;
342
- const teamDid = appPid;
344
+ const { page, pageSize, status } = req.query;
345
+ const teamDid = blocklet.appPid;
343
346
  const userDid = req.user.did;
344
347
  // 用户管理自己所有的登录会话,不限制 visitorId
345
- const userSessions = await node.getUserSession({
348
+ const { list: userSessions, paging } = await node.getUserSessions({
346
349
  teamDid,
347
- appPid, // 不需要向主站查询 member 的会话列表,所以固定为 teamDid 即可
348
- userDid,
350
+ query: {
351
+ appPid: teamDid, // 不需要向主站查询 member 的会话列表,所以固定为 teamDid 即可
352
+ userDid,
353
+ status,
354
+ },
355
+ paging: {
356
+ page: parseInt(page, 10),
357
+ pageSize: parseInt(pageSize, 10),
358
+ },
349
359
  });
350
360
 
351
- const pendingList = userSessions.map((item) =>
352
- limit(() =>
353
- patchUserSessionData(item, {
354
- blocklet,
355
- appPid,
356
- teamDid,
357
- node,
358
- })
359
- )
360
- );
361
- await Promise.all(pendingList);
362
-
363
- const result = userSessions
364
- .filter((x) => {
365
- return x?.user?.approved;
366
- })
367
- .map((x) => omit(x, userInfoBlackList));
368
-
369
- res.json(result);
361
+ const list = userSessions.map((x) => {
362
+ patchUserSessionStatus(x, { blocklet });
363
+ return omit(x, userInfoBlackList);
364
+ });
365
+ res.json({
366
+ list,
367
+ paging,
368
+ });
370
369
  });
371
370
 
372
371
  /**
@@ -381,8 +380,6 @@ module.exports = {
381
380
  const { appPid } = blocklet;
382
381
  const teamDid = appPid;
383
382
 
384
- const federatedSites = blocklet?.settings?.federated?.sites || [];
385
-
386
383
  const visitorId = req.get('x-blocklet-visitor-id');
387
384
 
388
385
  if (!visitorId) {
@@ -390,19 +387,34 @@ module.exports = {
390
387
  return;
391
388
  }
392
389
 
393
- const userSessions = await node.getUserSession({
390
+ const { list: userSessions } = await node.getUserSessions({
394
391
  teamDid,
395
- visitorId,
392
+ query: {
393
+ visitorId,
394
+ includeUser: true,
395
+ },
396
+ paging: {
397
+ page: 1,
398
+ // 模拟获取所有登录会话
399
+ pageSize: 100,
400
+ },
396
401
  });
397
402
 
398
403
  const validUserSessions = userSessions.filter((x) => {
399
- const federatedSite = federatedSites.find((y) => y.appPid === x.appPid);
400
- if (federatedSite?.appPid === teamDid) {
404
+ if (x.appPid === teamDid) {
401
405
  return true;
402
406
  }
403
- if (federatedSite?.status === 'approved') {
404
- return true;
407
+
408
+ const federatedSite = findFederatedSite(blocklet, x.appPid);
409
+ if (federatedSite) {
410
+ if (federatedSite.appPid === teamDid) {
411
+ return true;
412
+ }
413
+ if (federatedSite.status === 'approved') {
414
+ return true;
415
+ }
405
416
  }
417
+
406
418
  return false;
407
419
  });
408
420
  const pendingList = validUserSessions.map((item) =>
@@ -419,9 +431,6 @@ module.exports = {
419
431
 
420
432
  const result = validUserSessions
421
433
  .filter((x) => {
422
- if (x.status === 'expired') {
423
- return false;
424
- }
425
434
  if (!x?.user?.approved) {
426
435
  return false;
427
436
  }
@@ -25,6 +25,7 @@ const { withQuery, joinURL } = require('ufo');
25
25
  const cors = require('cors');
26
26
  const createTranslator = require('@abtnode/util/lib/translate');
27
27
  const { getDeviceData } = require('@abtnode/util/lib/device');
28
+ const { Op } = require('sequelize');
28
29
 
29
30
  const { createTokenFn, getDidConnectVersion } = require('../util');
30
31
  const initJwt = require('../libs/jwt');
@@ -445,7 +446,7 @@ function checkUserSig({ node }) {
445
446
  }
446
447
 
447
448
  async function loginEmail(req, node, options) {
448
- const { locale = 'en' } = req.query;
449
+ const locale = req.blockletLocale;
449
450
  const { sourceAppPid = null, inviter = null } = req.body;
450
451
 
451
452
  const blocklet = await req.getBlocklet();
@@ -481,7 +482,7 @@ async function loginEmail(req, node, options) {
481
482
  id: sub,
482
483
  userInfo,
483
484
  };
484
- const lastUsedPassport = userUtil.getLastUsedPassport({ passports: currentUser?.passports });
485
+ const lastUsedPassport = getLastUsedPassport(currentUser?.passports, '', { useFallback: false });
485
486
 
486
487
  if (!currentUser) {
487
488
  await userUtil.checkNeedInvite({ req, node, teamDid, locale });
@@ -521,7 +522,7 @@ async function loginEmail(req, node, options) {
521
522
  }
522
523
 
523
524
  async function inviteEmail(req, node, options) {
524
- const { locale = 'en' } = req.query;
525
+ const locale = req.blockletLocale;
525
526
  const { sourceAppPid = null, inviteId, baseUrl } = req.body;
526
527
 
527
528
  if (!inviteId) {
@@ -921,18 +922,29 @@ module.exports = {
921
922
  const { blocklet } = req;
922
923
  const teamDid = blocklet.appPid;
923
924
  // NOTICE: 此处需要保留从 body 携带 visitorId 的功能,用于已登录用户注销自己指定的登录会话
924
- let visitorId = req.body?.visitorId;
925
+ // eslint-disable-next-line prefer-const
926
+ let { status, visitorId } = req.body;
927
+ const params = {};
925
928
  if (!visitorId) {
926
929
  visitorId = req.get('x-blocklet-visitor-id');
927
930
  }
928
- if (!visitorId) {
929
- res.status(400).json({ error: 'visitorId is required' });
931
+ if (status) {
932
+ params.status = status;
933
+ if (visitorId && status === 'online') {
934
+ // HACK: 用户使用当前登录会话注销所有会话时,要排除当前登录会话
935
+ params.visitorId = { [Op.ne]: visitorId };
936
+ }
937
+ } else if (visitorId) {
938
+ params.visitorId = visitorId;
939
+ }
940
+ if (!params.visitorId && !params.status) {
941
+ res.status(400).json({ error: 'visitorId or status is required' });
930
942
  return;
931
943
  }
932
944
 
933
945
  await node.logoutUser({
946
+ ...params,
934
947
  userDid: req.user.did,
935
- visitorId,
936
948
  appPid: teamDid,
937
949
  teamDid,
938
950
  });
@@ -1072,7 +1084,7 @@ module.exports = {
1072
1084
  );
1073
1085
 
1074
1086
  server.post(`${prefixApi}/email/sendCode`, ensureBlocklet(), ensureCors, async (req, res) => {
1075
- const { locale = 'en' } = req.query;
1087
+ const locale = req.blockletLocale;
1076
1088
  const { blocklet } = req;
1077
1089
  const teamDid = blocklet.appPid;
1078
1090
  const { email, useCode = true, useMagicLink = true, sourceAppPid = null } = req.body;
@@ -1128,6 +1140,7 @@ module.exports = {
1128
1140
  params: {
1129
1141
  ...emailData,
1130
1142
  subject,
1143
+ locale,
1131
1144
  },
1132
1145
  });
1133
1146
  } else {
@@ -0,0 +1,92 @@
1
+ const { getSourceAppPid } = require('@blocklet/sdk/lib/util/login');
2
+ const { messages } = require('@abtnode/auth/lib/auth');
3
+ const { authenticateByVc } = require('@abtnode/auth/lib/server');
4
+ const { PASSPORT_LOG_ACTION } = require('@abtnode/constant');
5
+ const formatContext = require('@abtnode/util/lib/format-context');
6
+
7
+ const logger = require('../../../libs/logger')('blocklet-service:connect-cli');
8
+ const { utils } = require('../../../libs/connect/session');
9
+ const { PASSPORT_VC_TYPES } = require('../../../libs/auth/utils');
10
+ const { getTrustedIssuers } = require('../../../util/blocklet-utils');
11
+
12
+ const allowedRoles = ['owner', 'admin'];
13
+
14
+ module.exports = function createRoutes(node) {
15
+ return {
16
+ action: 'gen-access-key',
17
+ onConnect: async ({ request, userDid, extraParams: { locale } }) => {
18
+ const checkUserRole = await utils.checkUserRole({ node, userDid, locale, request, roles: allowedRoles });
19
+ return checkUserRole;
20
+ },
21
+
22
+ onAuth: async ({ request, userDid, challenge, claims, updateSession, extraParams }) => {
23
+ const { locale } = extraParams;
24
+ const sourceAppPid = getSourceAppPid(request);
25
+ const blocklet = await request.getBlocklet();
26
+
27
+ const { role, user, passport } = await authenticateByVc({
28
+ node,
29
+ locale,
30
+ teamDid: blocklet.appPid,
31
+ userDid,
32
+ claims,
33
+ challenge,
34
+ types: PASSPORT_VC_TYPES,
35
+ trustedIssuers: await getTrustedIssuers(blocklet, { sourceAppPid }),
36
+ action: 'gen-access-key',
37
+ });
38
+
39
+ if (!allowedRoles.includes(role)) {
40
+ throw new Error(messages.notAllowed[locale]);
41
+ }
42
+
43
+ if (passport) {
44
+ await node.createPassportLog(
45
+ blocklet.appPid,
46
+ {
47
+ passportId: passport.id,
48
+ action: PASSPORT_LOG_ACTION.USED,
49
+ operatorDid: userDid,
50
+ metadata: {
51
+ action: 'gen-access-key',
52
+ ownerDid: userDid,
53
+ userDid: user.did,
54
+ },
55
+ },
56
+ request
57
+ );
58
+ }
59
+
60
+ const teamDid = blocklet.meta.did;
61
+
62
+ const { accessKeyId, accessKeySecret, expireAt } = await node.createAccessKey(
63
+ { teamDid, remark: extraParams.source, createdVia: 'connect', passport: 'ci' },
64
+ { user }
65
+ );
66
+
67
+ await node.createAuditLog(
68
+ {
69
+ action: 'switchPassport',
70
+ args: { teamDid, userDid, passport, sourceAppPid },
71
+ context: formatContext(Object.assign(request, { user })),
72
+ result: { accessKeyId, expireAt },
73
+ },
74
+ node
75
+ );
76
+
77
+ logger.info('accessKeyId', accessKeyId);
78
+
79
+ await updateSession(
80
+ {
81
+ config: {
82
+ developerDid: userDid,
83
+ accessKeyId,
84
+ accessKeySecret,
85
+ expireAt,
86
+ },
87
+ },
88
+ true
89
+ );
90
+ },
91
+ };
92
+ };
@@ -40,6 +40,8 @@ const createApproveVaultAuth = require('./connect/approve-vault');
40
40
  const createSessionRoutes = require('./session');
41
41
  const createPassportRoutes = require('./passport');
42
42
  const createPasskeyRoutes = require('./passkey');
43
+ const createGenAccessKeyRoutes = require('./connect/gen-access-key');
44
+
43
45
  const { getRedirectUrl, shouldIgnoreUrl, redirectWithoutCache } = require('../../util');
44
46
  const { createConnectToDidSpacesForUserRoute } = require('./connect/connect-to-did-spaces-for-user');
45
47
  const { isEmailKycRequired, isPhoneKycRequired } = require('../../libs/kyc');
@@ -211,6 +213,11 @@ const init = ({ node, options }) => {
211
213
  const { token } = req;
212
214
  await req.ensureUser({ token });
213
215
 
216
+ // Saved for oauth server
217
+ if (req.user) {
218
+ res.locals.user = req.user;
219
+ }
220
+
214
221
  setUserInfoHeaders(req);
215
222
 
216
223
  next();
@@ -247,6 +254,7 @@ const init = ({ node, options }) => {
247
254
  handler.attach(Object.assign({ app }, createVerifyElevatedAuth(node, authenticator, createSessionToken)));
248
255
  handler.attach(Object.assign({ app }, createVerifyDestroyAuth(node, authenticator, createSessionToken)));
249
256
  handler.attach(Object.assign({ app }, createDestroyMyselfAuth(node)));
257
+ handler.attach(Object.assign({ app }, createGenAccessKeyRoutes(node)));
250
258
  });
251
259
  };
252
260
 
@@ -2,7 +2,7 @@ const { createPasskeyHandlers } = require('@abtnode/auth/lib/passkey');
2
2
  const { WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
3
3
  const { createPassportList, createPassportSwitcher } = require('@abtnode/auth/lib/oauth');
4
4
  const { createTokenFn } = require('../../util');
5
- const { checkUser } = require('../../routes/oauth');
5
+ const { checkUser } = require('../../routes/oauth/client');
6
6
 
7
7
  module.exports = {
8
8
  init(router, node, options, createSessionToken) {
@@ -17,10 +17,32 @@ const getRequestIP = require('@abtnode/util/lib/get-request-ip');
17
17
  const { getDeviceData } = require('@abtnode/util/lib/device');
18
18
  const isUrl = require('is-url');
19
19
  const { LRUCache } = require('lru-cache');
20
+ const createTranslator = require('@abtnode/util/lib/translate');
20
21
 
21
22
  const { createTokenFn, getDidConnectVersion } = require('../../util');
22
23
  const checkUser = require('../../middlewares/check-user');
23
24
 
25
+ const translations = {
26
+ zh: {
27
+ userSessionLogout: '用户会话已退出',
28
+ invalidWebhookType: '无效的 webhook 类型',
29
+ invalidWebhookUrl: '无效的 webhook 地址',
30
+ testWebhookMessage: '这是来自 {did} 的测试消息',
31
+ invalidToken: '无效的 token',
32
+ emptyRefreshToken: 'RefreshToken 不能为空',
33
+ },
34
+ en: {
35
+ userSessionLogout: 'User session is logout',
36
+ invalidWebhookType: 'Invalid webhook type',
37
+ invalidWebhookUrl: 'Invalid webhook url',
38
+ testWebhookMessage: 'This is a test message from user {did}',
39
+ invalidToken: 'Invalid token',
40
+ emptyRefreshToken: 'RefreshToken should not be empty',
41
+ },
42
+ };
43
+
44
+ const t = createTranslator({ translations });
45
+
24
46
  const sessionRBACCache = new LRUCache({ max: 3000, ttl: 1000 * 30 });
25
47
  const unReadCountCache = new LRUCache({ max: 3000, ttl: 1000 * 5 });
26
48
 
@@ -176,13 +198,14 @@ module.exports = {
176
198
 
177
199
  const sessionApi = `${WELLKNOWN_SERVICE_PATH_PREFIX}/api/did/session`;
178
200
  router.get(sessionApi, nocache(), sessionBearerToken, handleSession);
201
+ router.post(sessionApi, nocache(), sessionBearerToken, handleSession);
202
+
179
203
  router.get(
180
204
  `${WELLKNOWN_SERVICE_PATH_PREFIX}/api/notifications/unread-count`,
181
205
  nocache(),
182
206
  sessionBearerToken,
183
207
  handleGetUnreadCount
184
208
  );
185
- router.post(sessionApi, nocache(), sessionBearerToken, handleSession);
186
209
 
187
210
  // update user extra: settings, webhooks
188
211
  const extraApi = `${WELLKNOWN_SERVICE_PATH_PREFIX}/api/user/extra`;
@@ -207,17 +230,17 @@ module.exports = {
207
230
  });
208
231
  router.put(extraApi, nocache(), sessionBearerToken, checkUser, async (req, res) => {
209
232
  if (['slack', 'api'].includes(req.body.type) === false) {
210
- res.status(400).send({ error: 'invalid webhook type' });
233
+ res.status(400).send({ error: t('invalidWebhookType', req.blockletLocale) });
211
234
  return;
212
235
  }
213
236
 
214
237
  if (isUrl(req.body.url) === false) {
215
- res.status(400).send({ error: 'invalid webhook url' });
238
+ res.status(400).send({ error: t('invalidWebhookUrl', req.blockletLocale) });
216
239
  }
217
240
 
218
241
  await node.sendTestMessage({
219
242
  webhook: { type: req.body.type, params: [{ name: 'url', value: req.body.url }] },
220
- message: `This is a test message from user ${req.user.did}`,
243
+ message: t('testWebhookMessage', req.blockletLocale, { did: req.user.did }),
221
244
  });
222
245
 
223
246
  res.json({ success: true });
@@ -227,7 +250,7 @@ module.exports = {
227
250
  const { wallet } = await req.getBlockletInfo();
228
251
  const { token } = req.body;
229
252
  if (!verify(token, wallet.publicKey)) {
230
- res.status(403).send('Invalid token');
253
+ res.status(403).send(t('invalidToken', req.blockletLocale));
231
254
  return;
232
255
  }
233
256
 
@@ -258,15 +281,18 @@ module.exports = {
258
281
  if (token) {
259
282
  const teamDid = req.getBlockletDid();
260
283
  const visitorId = req.get('x-blocklet-visitor-id');
284
+ if (!visitorId) {
285
+ res.status(400).send(t('userSessionLogout', req.blockletLocale));
286
+ return;
287
+ }
261
288
  const { appPid = teamDid } = req.query;
262
289
  await req.ensureUser({ token, visitorId, appPid });
263
290
  if (!req.user) {
264
- res.status(400).send('user session is logout');
291
+ res.status(400).send(t('userSessionLogout', req.blockletLocale));
265
292
  return;
266
293
  }
267
294
 
268
295
  try {
269
- const { secret } = await req.getBlockletInfo();
270
296
  const [blocklet, info] = await Promise.all([req.getBlocklet(), req.getBlockletInfo()]);
271
297
 
272
298
  const refreshTokenType = 'refresh';
@@ -276,12 +302,12 @@ module.exports = {
276
302
  passport,
277
303
  provider = LOGIN_PROVIDER.WALLET,
278
304
  walletOS,
279
- } = await verifySessionToken(token, secret, {
305
+ } = await verifySessionToken(token, info.secret, {
280
306
  checkFromDb: true,
281
307
  teamDid,
282
- checkToken: (t) => {
283
- if (t.tokenType !== refreshTokenType) {
284
- throw new Error(`invalid token type ${t.tokenType}`);
308
+ checkToken: (_token) => {
309
+ if (_token.tokenType !== refreshTokenType) {
310
+ throw new Error(`invalid token type ${_token.tokenType}`);
285
311
  }
286
312
  },
287
313
  locale: req.blockletLocale,
@@ -310,7 +336,7 @@ module.exports = {
310
336
  const { sessionToken, refreshToken } = createToken(
311
337
  userPid,
312
338
  {
313
- secret,
339
+ secret: info.secret,
314
340
  passport,
315
341
  role,
316
342
  fullName: user.fullName,
@@ -368,7 +394,7 @@ module.exports = {
368
394
  res.status(400).send(err.message);
369
395
  }
370
396
  } else {
371
- res.status(400).send('empty refreshToken');
397
+ res.status(400).send(t('emptyRefreshToken', req.blockletLocale));
372
398
  }
373
399
  });
374
400
  },
@@ -126,6 +126,12 @@ function createWebsocketServer(node, ensureWsUser, options) {
126
126
  }
127
127
  });
128
128
 
129
+ eventHub.on(EVENTS.NOTIFICATION_BLOCKLET_UPDATE, (data) => {
130
+ const did = data.teamDid;
131
+ const eventName = `${did}/${EVENTS.NOTIFICATION_BLOCKLET_UPDATE}`;
132
+ wsServer.broadcast(eventName, eventName, data, { noCluster: true });
133
+ });
134
+
129
135
  eventHub.on(EVENTS.NOTIFICATION_READ, (data) => {
130
136
  const did = data.teamDid;
131
137
  if (did) {