@abtnode/blocklet-services 1.16.30 → 1.16.31-beta-4246ab25

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 (197) hide show
  1. package/api/libs/connect/session.js +365 -374
  2. package/api/routes/federated.js +13 -1
  3. package/api/routes/oauth.js +10 -4
  4. package/api/routes/user-session.js +1 -1
  5. package/api/routes/user.js +14 -24
  6. package/api/services/auth/connect/issue-passport.js +2 -1
  7. package/api/services/auth/connect/login.js +2 -1
  8. package/api/util/federated.js +1 -1
  9. package/api/validators/login.js +3 -0
  10. package/dist/assets/{Add-DV9cHTiI.js → Add-CtuOts08.js} +1 -1
  11. package/dist/assets/{AddBox-DjGRetT1.js → AddBox-BEozRxtr.js} +1 -1
  12. package/dist/assets/{Alert-BriK3hjA.js → Alert-C8bmV94C.js} +1 -1
  13. package/dist/assets/{ArrowDropDown-DX29Pf8V.js → ArrowDropDown-BXgf18Oe.js} +1 -1
  14. package/dist/assets/{Avatar-CpQhQmV4.js → Avatar-BFetDMjX.js} +1 -1
  15. package/dist/assets/{ButtonGroup-BPdi_2z2.js → ButtonGroup-4rs4O4kq.js} +1 -1
  16. package/dist/assets/{CheckCircle-DwkE-k6U.js → CheckCircle-DTVdjeqk.js} +1 -1
  17. package/dist/assets/{ChevronRight-BHXal2s_.js → ChevronRight-DJc4PiWZ.js} +1 -1
  18. package/dist/assets/{Close-BtG4tyUL.js → Close-CQy5q5kE.js} +1 -1
  19. package/dist/assets/CloseOutlined-9hT_S7vV.js +1 -0
  20. package/dist/assets/{Delete-rvy-F0hT.js → Delete-v2KnFPpc.js} +1 -1
  21. package/dist/assets/{DeleteOutline-C36lJe42.js → DeleteOutline-D-H_BT5g.js} +1 -1
  22. package/dist/assets/{Done-n1c-sUsw.js → Done-Cg0F76Fb.js} +1 -1
  23. package/dist/assets/{Download-DuCZFVPl.js → Download-xUlajQ0m.js} +1 -1
  24. package/dist/assets/{Edit-BrAk9NBL.js → Edit-CLeS4wAm.js} +1 -1
  25. package/dist/assets/{EditIcon-CPgYqcwg.js → EditIcon-Bv8uXQxv.js} +1 -1
  26. package/dist/assets/{Error-g7gK9Wfp.js → Error-ke6eGotz.js} +1 -1
  27. package/dist/assets/{ExpandMore-DpLFPsWa.js → ExpandMore-C2VxPPft.js} +1 -1
  28. package/dist/assets/{FilterList-BpmYd7MC.js → FilterList-Bm69psLt.js} +1 -1
  29. package/dist/assets/{FormControl-Dq6XW9kS.js → FormControl-BsXCFEZS.js} +1 -1
  30. package/dist/assets/{FormControlLabel-CQnpTkDU.js → FormControlLabel-DImktg38.js} +1 -1
  31. package/dist/assets/{FormGroup-C8sAhYQk.js → FormGroup-DaX4v3-4.js} +1 -1
  32. package/dist/assets/{Google-C3cw6Unp.js → Google-TWzgXpTH.js} +1 -1
  33. package/dist/assets/{Hidden-c0nvbE8_.js → Hidden-cGmlvPpU.js} +1 -1
  34. package/dist/assets/{InfoOutlined-DEt-KJ8v.js → InfoOutlined-B8pG85_Z.js} +1 -1
  35. package/dist/assets/{InputAdornment-Dr1oU3Hs.js → InputAdornment-C6qOb1bH.js} +1 -1
  36. package/dist/assets/{InputLabel-DYr7To9X.js → InputLabel-CgXPR_2f.js} +1 -1
  37. package/dist/assets/{LastPage-DV14H4DC.js → LastPage-DJY3kolG.js} +1 -1
  38. package/dist/assets/{Launch-DSSRxyd1.js → Launch-CMhSFuNV.js} +1 -1
  39. package/dist/assets/{LaunchOutlined-DOGa7uCZ.js → LaunchOutlined-DSyzpk6k.js} +1 -1
  40. package/dist/assets/{Link-BzeSWqDp.js → Link-DOOEUv0s.js} +1 -1
  41. package/dist/assets/{ListItemText-BWMpM4cA.js → ListItemText-EkATTCYw.js} +1 -1
  42. package/dist/assets/{LoadingButton-IrsPdnhT.js → LoadingButton-Cbp2GFzD.js} +1 -1
  43. package/dist/assets/{LockIcon-Cx_TySkG.js → LockIcon-BEU0_8Ic.js} +1 -1
  44. package/dist/assets/{Loop-CSmyyk97.js → Loop-BueHJmrR.js} +1 -1
  45. package/dist/assets/{MoreHoriz-B_IgZ_Tw.js → MoreHoriz-Drbf_Pvd.js} +1 -1
  46. package/dist/assets/{MoreVert-BQD92YJp.js → MoreVert-C7sQuxig.js} +1 -1
  47. package/dist/assets/{OpenInNew-Ba4HupG6.js → OpenInNew-C4QXGxL_.js} +1 -1
  48. package/dist/assets/{Pagination-g_z2fX8D.js → Pagination-B8kJW6gb.js} +1 -1
  49. package/dist/assets/{PlayArrow-CvyM0yMY.js → PlayArrow-CYrln-Kc.js} +1 -1
  50. package/dist/assets/{QuestionMarkCircle-B_wELYAO.js → QuestionMarkCircle-DTOYeWeD.js} +1 -1
  51. package/dist/assets/{RadioGroup-BSqtRWJR.js → RadioGroup-CmTDruGg.js} +1 -1
  52. package/dist/assets/{Search-D_9DtKpx.js → Search-CZ97KNMp.js} +1 -1
  53. package/dist/assets/{Select-CMM8MR9i.js → Select-CiXWOKZU.js} +1 -1
  54. package/dist/assets/{ServerLogo-Ds39xok2.js → ServerLogo-Cr53R7IJ.js} +1 -1
  55. package/dist/assets/{Skeleton-d-rA8WB_.js → Skeleton-HvFaI-R8.js} +1 -1
  56. package/dist/assets/{Slider-Cv9IlmAx.js → Slider-BUNOUzy3.js} +1 -1
  57. package/dist/assets/{Stepper-X4KYPIVJ.js → Stepper-B-zipvzv.js} +1 -1
  58. package/dist/assets/{TextField-BYelVRF_.js → TextField-Cb2e0-k4.js} +1 -1
  59. package/dist/assets/{Toolbar-DI2YKZS2.js → Toolbar-CmSNHGuN.js} +1 -1
  60. package/dist/assets/{ViewList-DWZsPuDR.js → ViewList-DzP1BYln.js} +1 -1
  61. package/dist/assets/{access-control-Deg0Ez_v.js → access-control-fQTJIcIl.js} +1 -1
  62. package/dist/assets/{actions-Dv2KmWA_.js → actions-Db7l4CqQ.js} +1 -1
  63. package/dist/assets/add-component-core-DkGv9RyG.js +979 -0
  64. package/dist/assets/{add-resource-B2YCggbD.js → add-resource-B8-Fd7hl.js} +1 -1
  65. package/dist/assets/{addon-B-L0-6EM.js → addon-D3OhbJEi.js} +1 -1
  66. package/dist/assets/{analytics-B3U8I3AQ.js → analytics-BNwjU7d3.js} +1 -1
  67. package/dist/assets/api-8rjdlHSp.js +1 -0
  68. package/dist/assets/{audit-logs-Dt1zBSaX.js → audit-logs-CxzQNS32.js} +1 -1
  69. package/dist/assets/{button-BotQVFjI.js → button-BSfqa6UD.js} +1 -1
  70. package/dist/assets/click-to-copy-DdF2xqop.js +1 -0
  71. package/dist/assets/{complete-BfHgp0O7.js → complete-DvEcFSqc.js} +2 -2
  72. package/dist/assets/{component-BziFLYA3.js → component-B8W7o8FZ.js} +1 -1
  73. package/dist/assets/{config-BqLTd80Y.js → config-D7luuyWR.js} +1 -1
  74. package/dist/assets/{config-navigation-1U4iVdBl.js → config-navigation-asIRdIHI.js} +1 -1
  75. package/dist/assets/{config-BcfULTik.js → config-qbPWLYt1.js} +2 -2
  76. package/dist/assets/{confirm-BWW215hi.js → confirm-BMHhcHat.js} +1 -1
  77. package/dist/assets/{connect-CfBbqaTr.js → connect-BiWyubdJ.js} +1 -1
  78. package/dist/assets/{connect-DC7BGJJv.js → connect-hN5_Shp6.js} +1 -1
  79. package/dist/assets/{connect-to-CHo6hM6n.js → connect-to-DfkUklQ5.js} +1 -1
  80. package/dist/assets/{content-layout-BP4bsvx7.js → content-layout-DiWC1J4K.js} +1 -1
  81. package/dist/assets/{dashboard-BWG8DtF1.js → dashboard-XyLI0qCZ.js} +3 -3
  82. package/dist/assets/{did-address-TSZ5XRBj.js → did-address-DpvI-gvi.js} +1 -1
  83. package/dist/assets/{domain-B0bCdxTC.js → domain-BSIv0NhM.js} +1 -1
  84. package/dist/assets/{domain-list-A5SqLbLS.js → domain-list-DuyWKGsk.js} +2 -2
  85. package/dist/assets/{exchange-passport-CBjbwwA6.js → exchange-passport-texx7vZK.js} +1 -1
  86. package/dist/assets/{fallback-Dz8ZuYD5.js → fallback-BwmWTfvT.js} +1 -1
  87. package/dist/assets/{format-error-DQS9AwZv.js → format-error-Cly-PKJi.js} +1 -1
  88. package/dist/assets/{fuel-BP12PtJ1.js → fuel-CxlptVAT.js} +1 -1
  89. package/dist/assets/{fullpage-DXFbt1Ve.js → fullpage-BS2tcmjR.js} +1 -1
  90. package/dist/assets/{home-Cx9PAId-.js → home--VzEOnFl.js} +1 -1
  91. package/dist/assets/{iframe-CO-VEhes.js → iframe-DlpSvIZn.js} +1 -1
  92. package/dist/assets/{index-CFQwbx1S.js → index-B2WTvZE_.js} +1 -1
  93. package/dist/assets/{index-D-GkMvG_.js → index-B3lhXfcq.js} +1 -1
  94. package/dist/assets/{index-COZKzHiS.js → index-B4CQ80Yw.js} +1 -1
  95. package/dist/assets/{index-BcFOSrVl.js → index-B4uw4r9c.js} +1 -1
  96. package/dist/assets/{index-VIHj0M7P.js → index-B5nEIEWt.js} +1 -1
  97. package/dist/assets/{index-CQU16qpp.js → index-B8xBf8Wa.js} +1 -1
  98. package/dist/assets/{index-ByYl1QnH.js → index-BB6k-EGG.js} +1 -1
  99. package/dist/assets/{index-zQvc8SIq.js → index-BDMqvDjm.js} +1 -1
  100. package/dist/assets/{index-DCMTEGgZ.js → index-BIzJJSjX.js} +1 -1
  101. package/dist/assets/{index-B0wa_Sca.js → index-BKSYmDJM.js} +1 -1
  102. package/dist/assets/{index-BmHPL-9s.js → index-BTAdP21P.js} +3 -3
  103. package/dist/assets/{index-46Rvg-Bo.js → index-BoqN1cez.js} +1 -1
  104. package/dist/assets/{index-MoRwjSwP.js → index-BqSFfNnu.js} +1 -1
  105. package/dist/assets/index-BquWLMx9.js +262 -0
  106. package/dist/assets/{index-B5Pm_bPi.js → index-C1caLcNJ.js} +1 -1
  107. package/dist/assets/{index-D5PXuh6o.js → index-CIqhUvIF.js} +11 -11
  108. package/dist/assets/{index-D_u35EkG.js → index-CVRkgzxH.js} +6 -6
  109. package/dist/assets/{index-DtAm5Ed6.js → index-CbGiX9t1.js} +1 -1
  110. package/dist/assets/{index-BJDKEH0b.js → index-CieFHkS_.js} +5 -5
  111. package/dist/assets/{index-Bwzls06Y.js → index-Cw44iEdL.js} +1 -1
  112. package/dist/assets/{index--YUaVsoq.js → index-D1pqWkt2.js} +17 -17
  113. package/dist/assets/{index-ChpB_Xok.js → index-DCGVoYKL.js} +1 -1
  114. package/dist/assets/index-DEPlCG8R.js +16 -0
  115. package/dist/assets/{index-B22_1WOD.js → index-DXtRwHZx.js} +1 -1
  116. package/dist/assets/{index-TTSckhl8.js → index-DiJCHCJQ.js} +1 -1
  117. package/dist/assets/{index-BqmsKa7O.js → index-DlGzjxDp.js} +1 -1
  118. package/dist/assets/{index-ozDSMBYi.js → index-DuAuh_Qj.js} +1 -1
  119. package/dist/assets/{index-BsjCwHmK.js → index-N3bV1fPM.js} +1 -1
  120. package/dist/assets/{index-DU7LqWjQ.js → index-SOr8TZG4.js} +1 -1
  121. package/dist/assets/{index-BSHfXuRt.js → index-b39g55oS.js} +1 -1
  122. package/dist/assets/index-mD8SG0jv.js +1287 -0
  123. package/dist/assets/{index-Du6azec5.js → index-pO1GnrcK.js} +1 -1
  124. package/dist/assets/{index.es-CYl4P_xg.js → index.es-Dn-9AeYW.js} +1 -1
  125. package/dist/assets/{index.esm-DDyWFyUp.js → index.esm-BoTu77Ll.js} +1 -1
  126. package/dist/assets/{invitation-YCFRX3K4.js → invitation-CjSjQDE9.js} +1 -1
  127. package/dist/assets/{invite-BVqEvYi7.js → invite-BqTMGcAv.js} +1 -1
  128. package/dist/assets/{issue-passport-Bt2ICeaH.js → issue-passport-C-_NcTdl.js} +1 -1
  129. package/dist/assets/{item-DmDrPoAj.js → item-BbixSUZ4.js} +1 -1
  130. package/dist/assets/{jss-plugin-props-sort.esm-B9z92TrV.js → jss-plugin-props-sort.esm-DZWDNslx.js} +1 -1
  131. package/dist/assets/{launch-result-message-DpNOYW9u.js → launch-result-message-t8NtPfuc.js} +1 -1
  132. package/dist/assets/{layout-D41GSjev.js → layout-CsM3bk7r.js} +1 -1
  133. package/dist/assets/{list-header-cw9lRKSX.js → list-header-DXbrT6CB.js} +1 -1
  134. package/dist/assets/localization-BbbfeFcx.js +1 -0
  135. package/dist/assets/{log-DVDRYSeA.js → log-BWAyxwAa.js} +1 -1
  136. package/dist/assets/login-KizuTJVS.js +1 -0
  137. package/dist/assets/{login-oauth-callback--4mls_Fw.js → login-oauth-callback-BhWnqy5G.js} +1 -1
  138. package/dist/assets/{logo-uploader-CHBeSau3.js → logo-uploader-B4fp_c-2.js} +3 -3
  139. package/dist/assets/{lost-passport-6PNRRlCd.js → lost-passport-5g_wfjCg.js} +3 -3
  140. package/dist/assets/{lottie-C16LOHrZ.js → lottie-CoQLIbP3.js} +1 -1
  141. package/dist/assets/{notifications-DHYTuxQt.js → notifications-BZOTKwjU.js} +1 -1
  142. package/dist/assets/{open-window-CEqHc-YI.js → open-window-OYk_-NDp.js} +1 -1
  143. package/dist/assets/{overview-jW78KQ6d.js → overview-BdlskfN-.js} +2 -2
  144. package/dist/assets/{page-header-Bjl7D46v.js → page-header-T1Bp_mgt.js} +1 -1
  145. package/dist/assets/{permission-BK9x4qjQ.js → permission-Bg73hR5s.js} +1 -1
  146. package/dist/assets/{preferences-4fQh6PBV.js → preferences-CWItrONZ.js} +1 -1
  147. package/dist/assets/publish-resource-Q0hqmXfS.js +1 -0
  148. package/dist/assets/{react-DCoycSH4.js → react-DXe505Vk.js} +19 -19
  149. package/dist/assets/{redux-Xix6UYN5.js → redux-t7duEter.js} +1 -1
  150. package/dist/assets/resource-dialog-BbVyEJK6.js +57 -0
  151. package/dist/assets/sdk-BsJqLCFt.js +1 -0
  152. package/dist/assets/{selector-BcHp8r2b.js → selector-G5cR85qZ.js} +1 -1
  153. package/dist/assets/session-t0W8qYc5.js +1 -0
  154. package/dist/assets/{setup-DXuWRjLR.js → setup-CokXt_nD.js} +3 -3
  155. package/dist/assets/{shorten-label-DZ5n7VkB.js → shorten-label-EXwW2h8a.js} +1 -1
  156. package/dist/assets/{slicedToArray-DiN6EoYj.js → slicedToArray-Bt_4hqVg.js} +2 -2
  157. package/dist/assets/{spaces-DBKeHx91.js → spaces-DlyQ1uJX.js} +1 -1
  158. package/dist/assets/{start-C4mLiamV.js → start-BxnAS7F4.js} +1 -1
  159. package/dist/assets/{step-actions-NyA7AGpj.js → step-actions-Dj2gkAXe.js} +1 -1
  160. package/dist/assets/{studio-CC7YQ-9Q.js → studio-B28kKr7m.js} +1 -1
  161. package/dist/assets/{switch-control-VH3u6pwk.js → switch-control-DuZuSueD.js} +1 -1
  162. package/dist/assets/{toUpper-D8eon-dl.js → toUpper-DPQf9Liw.js} +1 -1
  163. package/dist/assets/{transfer-Dp36g86n.js → transfer-Z8bjhog8.js} +1 -1
  164. package/dist/assets/{uniqBy-Cev3lMnU.js → uniqBy-Bdhm211i.js} +1 -1
  165. package/dist/assets/{unsubscribe-Be0k3pAZ.js → unsubscribe-DJEG2TOy.js} +1 -1
  166. package/dist/assets/{url-join-B-UX0vQK.js → url-join-vYtMsJoM.js} +1 -1
  167. package/dist/assets/use-blocklet-info-for-connect-did-spaces-CoBB3cqW.js +1 -0
  168. package/dist/assets/{use-mobile-BLqjm-5m.js → use-mobile-Bgh27XUZ.js} +1 -1
  169. package/dist/assets/{useAsync-PE3W-DLW.js → useAsync-BLR1bit_.js} +1 -1
  170. package/dist/assets/{useFormControl-DMGx-jdt.js → useFormControl-CJQAQwNi.js} +1 -1
  171. package/dist/assets/{useLocalStorage-eP0cInBT.js → useLocalStorage-BqRSbLpZ.js} +1 -1
  172. package/dist/assets/{useSetState-DEVLe2Fz.js → useSetState-Bgiqtk4Z.js} +1 -1
  173. package/dist/assets/{useSlot-BrU8y60n.js → useSlot-CgMgJNqB.js} +1 -1
  174. package/dist/assets/{useSlotProps-fP10cTIP.js → useSlotProps-2VUaV6ss.js} +1 -1
  175. package/dist/assets/{useThemeProps-C59Glnbx.js → useThemeProps-aetSbjSK.js} +1 -1
  176. package/dist/assets/user-center-B1Gsfz8w.js +1 -0
  177. package/dist/assets/{user-sessions-C8nlOE7U.js → user-sessions-DlIZI2bO.js} +1 -1
  178. package/dist/assets/{util-yXMDVjHb.js → util-BrJI9hcg.js} +1 -1
  179. package/dist/assets/{wrap-locale-DL11xPuS.js → wrap-locale-DSIbwxKJ.js} +1 -1
  180. package/dist/index.html +1 -1
  181. package/dist/service-worker.js +1 -1
  182. package/package.json +38 -38
  183. package/dist/assets/CloseOutlined-CYZb8eDz.js +0 -1
  184. package/dist/assets/add-component-core-CGy2QLvt.js +0 -979
  185. package/dist/assets/api-DJ1sjN9o.js +0 -1
  186. package/dist/assets/click-to-copy-C932KUDy.js +0 -1
  187. package/dist/assets/index-CTFO1wAr.js +0 -262
  188. package/dist/assets/index-CaLGv6xG.js +0 -1293
  189. package/dist/assets/index-CndSwPzI.js +0 -16
  190. package/dist/assets/localization-9mzelGR9.js +0 -1
  191. package/dist/assets/login-BLIQel5D.js +0 -1
  192. package/dist/assets/publish-resource-RsLy3V3l.js +0 -1
  193. package/dist/assets/resource-dialog-CMS1eEc0.js +0 -57
  194. package/dist/assets/sdk-B75CkXUw.js +0 -1
  195. package/dist/assets/session-AqfK0jLG.js +0 -1
  196. package/dist/assets/use-blocklet-info-for-connect-did-spaces-DF1lby8c.js +0 -1
  197. package/dist/assets/user-center-CkHZ_2ui.js +0 -1
@@ -331,422 +331,391 @@ module.exports = {
331
331
  return claims;
332
332
  },
333
333
 
334
- onApprove:
335
- /**
336
- * @description
337
- * @param {{
338
- * node: import('@abtnode/core').TNode,
339
- * claims: any[],
340
- * }} {
341
- * node,
342
- * request,
343
- * locale,
344
- * challenge,
345
- * userDid,
346
- * userPk,
347
- * claims,
348
- * baseUrl,
349
- * createSessionToken,
350
- * componentId,
351
- * action,
352
- * visitorId,
353
- * }
354
- * @return {*}
355
- */
356
- async ({
357
- node,
358
- request,
359
- locale,
360
- challenge,
361
- userDid,
362
- userPk,
363
- claims,
364
- baseUrl,
365
- createSessionToken,
366
- componentId,
367
- action,
368
- visitorId,
369
- }) => {
370
- /** @type {import('@abtnode/client').BlockletState} */
371
- const blocklet = await request.getBlocklet();
372
- const blockletInfo = await request.getBlockletInfo();
373
- const { wallet, secret, name, passportColor, did: teamDid } = blockletInfo;
374
- const sourceAppPid = getSourceAppPid(request);
375
-
376
- // Check user approved
377
- const currentUser = await getUserWithinFederated(
378
- { sourceAppPid, teamDid, userDid, userPk },
379
- { node, blocklet }
380
- );
381
- if (currentUser && !currentUser.approved) {
382
- throw new Error(messages.notAllowedAppUser[locale]);
383
- }
334
+ onApprove: async ({
335
+ node,
336
+ request,
337
+ locale,
338
+ challenge,
339
+ userDid,
340
+ userPk,
341
+ claims,
342
+ baseUrl,
343
+ createSessionToken,
344
+ componentId,
345
+ action,
346
+ visitorId,
347
+ inviter,
348
+ }) => {
349
+ /** @type {import('@abtnode/client').BlockletState} */
350
+ const blocklet = await request.getBlocklet();
351
+ const blockletInfo = await request.getBlockletInfo();
352
+ const { wallet, secret, name, passportColor, did: teamDid } = blockletInfo;
353
+ const sourceAppPid = getSourceAppPid(request);
384
354
 
385
- const realDid = currentUser?.did || userDid;
386
- const realPk = currentUser?.pk || userPk;
355
+ // Check user approved
356
+ const currentUser = await getUserWithinFederated({ sourceAppPid, teamDid, userDid, userPk }, { node, blocklet });
357
+ if (currentUser && !currentUser.approved) {
358
+ throw new Error(messages.notAllowedAppUser[locale]);
359
+ }
387
360
 
388
- // Get auth config
389
- const authConfig = (await request.getServiceConfig(NODE_SERVICES.AUTH, { componentId })) || {};
361
+ const realDid = currentUser?.did || userDid;
362
+ const realPk = currentUser?.pk || userPk;
390
363
 
391
- let vc;
392
- let nftState;
393
- let invitedUserOnly = false;
394
- let defaultRole = ROLES.GUEST;
395
- let defaultTtl = 0;
396
- let defaultTtlPolicy = 'never';
397
- let issuePassport = false;
364
+ // Get auth config
365
+ const authConfig = (await request.getServiceConfig(NODE_SERVICES.AUTH, { componentId })) || {};
398
366
 
399
- const provider = getLoginProvider(request);
400
- const masterSite = getFederatedMaster(blocklet);
367
+ let vc;
368
+ let nftState;
369
+ let invitedUserOnly = false;
370
+ let defaultRole = ROLES.GUEST;
371
+ let defaultTtl = 0;
372
+ let defaultTtlPolicy = 'never';
373
+ let issuePassport = false;
401
374
 
402
- // Get passport vc
403
- if (action === 'login') {
404
- vc = await getPassportVc({
405
- blocklet,
406
- claims,
407
- challenge,
408
- locale,
409
- sourceAppPid,
410
- });
411
- [invitedUserOnly, defaultRole, issuePassport] = await isInvitedUserOnly(authConfig, node, teamDid);
412
- if (invitedUserOnly && !vc) {
413
- throw new Error(messages.missingCredentialClaim[locale]);
414
- }
415
- } else if (action === 'exchangePassport') {
416
- const claim = claims.find((x) => x.type === 'asset');
417
- const isConnected = await node.isConnectedAccount({ teamDid, did: claim.asset });
418
- if (isConnected) {
419
- throw new Error(messages.nftAlreadyUsed[locale]);
420
- }
375
+ const provider = getLoginProvider(request);
376
+ const masterSite = getFederatedMaster(blocklet);
421
377
 
422
- nftState = await verifyNFT({ claims, challenge, locale, chainHost: MAIN_CHAIN_ENDPOINT });
423
- const matchFactory = blocklet.trustedFactories.find((x) => x.factoryAddress === nftState.parent);
424
- if (!matchFactory) {
425
- throw new Error(messages.invalidNftParent[locale]);
426
- }
378
+ // Get passport vc
379
+ if (action === 'login') {
380
+ vc = await getPassportVc({
381
+ blocklet,
382
+ claims,
383
+ challenge,
384
+ locale,
385
+ sourceAppPid,
386
+ });
387
+ [invitedUserOnly, defaultRole, issuePassport] = await isInvitedUserOnly(authConfig, node, teamDid);
388
+ if (invitedUserOnly && !vc) {
389
+ throw new Error(messages.missingCredentialClaim[locale]);
390
+ }
391
+ } else if (action === 'exchangePassport') {
392
+ const claim = claims.find((x) => x.type === 'asset');
393
+ const isConnected = await node.isConnectedAccount({ teamDid, did: claim.asset });
394
+ if (isConnected) {
395
+ throw new Error(messages.nftAlreadyUsed[locale]);
396
+ }
427
397
 
428
- defaultRole = matchFactory.passport.role;
429
- defaultTtl = matchFactory.passport.ttl;
430
- defaultTtlPolicy = matchFactory.passport.ttlPolicy;
431
- issuePassport = true;
398
+ nftState = await verifyNFT({ claims, challenge, locale, chainHost: MAIN_CHAIN_ENDPOINT });
399
+ const matchFactory = blocklet.trustedFactories.find((x) => x.factoryAddress === nftState.parent);
400
+ if (!matchFactory) {
401
+ throw new Error(messages.invalidNftParent[locale]);
432
402
  }
433
403
 
434
- if (issuePassport) {
435
- let expirationDate;
436
- if (nftState && defaultTtl) {
437
- if (defaultTtlPolicy === 'mint') {
438
- expirationDate = +new Date(nftState.context.genesisTime) + defaultTtl;
439
- }
440
- if (defaultTtlPolicy === 'exchange') {
441
- expirationDate = +new Date() + defaultTtl;
442
- }
443
- }
404
+ defaultRole = matchFactory.passport.role;
405
+ defaultTtl = matchFactory.passport.ttl;
406
+ defaultTtlPolicy = matchFactory.passport.ttlPolicy;
407
+ issuePassport = true;
408
+ }
444
409
 
445
- logger.info(`issue passport to user at the ${action} workflow`, {
446
- role: defaultRole,
447
- expire: expirationDate,
448
- policy: defaultTtlPolicy,
449
- ttl: defaultTtl,
450
- });
410
+ if (issuePassport) {
411
+ let expirationDate;
412
+ if (nftState && defaultTtl) {
413
+ if (defaultTtlPolicy === 'mint') {
414
+ expirationDate = +new Date(nftState.context.genesisTime) + defaultTtl;
415
+ }
416
+ if (defaultTtlPolicy === 'exchange') {
417
+ expirationDate = +new Date() + defaultTtl;
418
+ }
419
+ }
451
420
 
452
- const profile = claims.find((x) => x.type === 'profile');
421
+ logger.info(`issue passport to user at the ${action} workflow`, {
422
+ role: defaultRole,
423
+ expire: expirationDate,
424
+ policy: defaultTtlPolicy,
425
+ ttl: defaultTtl,
426
+ });
453
427
 
454
- vc = createPassportVC({
455
- issuerName: name,
456
- issuerWallet: wallet,
457
- issuerAvatarUrl: getAppAvatarUrl(baseUrl),
458
- ownerDid: realDid,
459
- passport: await createPassport({
460
- name: defaultRole,
461
- node,
462
- teamDid,
463
- locale,
464
- endpoint: baseUrl,
465
- }),
466
- endpoint: getPassportStatusEndpoint({
467
- baseUrl: joinURL(baseUrl, WELLKNOWN_SERVICE_PATH_PREFIX),
468
- userDid: realDid,
469
- teamDid,
470
- }),
471
- ownerProfile: profile,
472
- preferredColor: passportColor,
473
- expirationDate: expirationDate ? new Date(expirationDate).toISOString() : undefined,
474
- });
475
- }
428
+ const profile = claims.find((x) => x.type === 'profile');
476
429
 
477
- // Get user passport from vc
478
- let passport = vc ? createUserPassport(vc) : null;
479
- if (currentUser && passport && isUserPassportRevoked(currentUser, passport)) {
480
- throw new Error(messages.passportRevoked[locale](passport.title, name));
481
- }
430
+ vc = createPassportVC({
431
+ issuerName: name,
432
+ issuerWallet: wallet,
433
+ issuerAvatarUrl: getAppAvatarUrl(baseUrl),
434
+ ownerDid: realDid,
435
+ passport: await createPassport({
436
+ name: defaultRole,
437
+ node,
438
+ teamDid,
439
+ locale,
440
+ endpoint: baseUrl,
441
+ }),
442
+ endpoint: getPassportStatusEndpoint({
443
+ baseUrl: joinURL(baseUrl, WELLKNOWN_SERVICE_PATH_PREFIX),
444
+ userDid: realDid,
445
+ teamDid,
446
+ }),
447
+ ownerProfile: profile,
448
+ preferredColor: passportColor,
449
+ expirationDate: expirationDate ? new Date(expirationDate).toISOString() : undefined,
450
+ });
451
+ }
482
452
 
483
- // Get role
484
- const role = await getRoleFromVC({ vc, node, locale, blocklet, teamDid, sourceAppPid });
485
- await validateRole({ role, authConfig, locale, node, teamDid });
453
+ // Get user passport from vc
454
+ let passport = vc ? createUserPassport(vc) : null;
455
+ if (currentUser && passport && isUserPassportRevoked(currentUser, passport)) {
456
+ throw new Error(messages.passportRevoked[locale](passport.title, name));
457
+ }
486
458
 
487
- checkAppOwner({ role, blocklet, userDid, locale });
459
+ // Get role
460
+ const role = await getRoleFromVC({ vc, node, locale, blocklet, teamDid, sourceAppPid });
461
+ await validateRole({ role, authConfig, locale, node, teamDid });
488
462
 
489
- // Recreate passport with correct role
490
- passport = vc ? createUserPassport(vc, { role }) : null;
463
+ checkAppOwner({ role, blocklet, userDid, locale });
491
464
 
492
- const now = new Date().toISOString();
493
- const connectedNft = nftState
494
- ? {
495
- provider: LOGIN_PROVIDER.NFT,
496
- did: nftState.address,
497
- owner: nftState.owner,
498
- firstLoginAt: now,
499
- lastLoginAt: now,
500
- }
501
- : null;
465
+ // Recreate passport with correct role
466
+ passport = vc ? createUserPassport(vc, { role }) : null;
502
467
 
503
- let fullName = currentUser?.fullName;
504
- // Update profile
505
- const passportForLog = passport || { name: 'Guest', role: 'guest' };
468
+ const now = new Date().toISOString();
469
+ const connectedNft = nftState
470
+ ? {
471
+ provider: LOGIN_PROVIDER.NFT,
472
+ did: nftState.address,
473
+ owner: nftState.owner,
474
+ firstLoginAt: now,
475
+ lastLoginAt: now,
476
+ }
477
+ : null;
506
478
 
507
- const connectAccount = { provider, did: userDid, pk: userPk };
479
+ let fullName = currentUser?.fullName;
480
+ // Update profile
481
+ const passportForLog = passport || { name: 'Guest', role: 'guest' };
508
482
 
509
- let updatedUser;
510
- const profile = claims.find((x) => x.type === 'profile');
483
+ const connectAccount = { provider, did: userDid, pk: userPk };
511
484
 
512
- if (profile) {
513
- profile.url = profile?.url || '';
514
- }
485
+ let updatedUser;
486
+ const profile = claims.find((x) => x.type === 'profile');
515
487
 
516
- if (currentUser) {
517
- updatedUser = await node.loginUser({
518
- teamDid,
519
- user: {
520
- did: currentUser.did,
521
- pk: currentUser.pk,
522
- locale,
523
- passport,
524
- sourceAppPid,
525
- lastLoginIp: getRequestIP(request),
526
- connectedAccount: [connectAccount, connectedNft],
527
- ...profile,
528
- avatar: await extractUserAvatar(get(profile, 'avatar'), {
529
- dataDir: blocklet.env.dataDir,
530
- }),
531
- },
532
- });
533
- await node.createAuditLog(
534
- {
535
- action,
536
- args: { teamDid, userDid: realDid, passport: passportForLog, provider, sourceAppPid },
537
- context: formatContext(Object.assign(request, { user: updatedUser })),
538
- result: updatedUser,
539
- },
540
- node
541
- );
542
- } else {
543
- // Create user
544
- fullName = profile.fullName;
488
+ if (profile) {
489
+ profile.url = profile?.url || '';
490
+ }
545
491
 
546
- updatedUser = await node.loginUser({
547
- teamDid,
548
- user: {
549
- ...profile,
550
- avatar: await extractUserAvatar(get(profile, 'avatar'), {
551
- dataDir: blocklet.env.dataDir,
552
- }),
553
- did: realDid,
554
- pk: realPk,
555
- locale,
556
- passport,
557
- sourceAppPid,
558
- lastLoginIp: getRequestIP(request),
559
- connectedAccount: [connectAccount, connectedNft],
560
- },
561
- });
562
- await node.createAuditLog(
563
- {
564
- action: 'addUser',
565
- args: {
566
- teamDid,
567
- userDid: realDid,
568
- sourceAppPid,
569
- provider,
570
- reason: `first login as ${passportForLog.role}`,
571
- },
572
- context: formatContext(Object.assign(request, { user: updatedUser })),
573
- result: updatedUser,
574
- },
575
- node
576
- );
577
- }
578
- const lastLoginIp = getRequestIP(request);
579
- const walletDeviceMessageToken = request.get('wallet-device-message-token');
580
- const walletDeviceId = request.get('wallet-device-id');
581
- const ua = request.get('user-agent');
582
- // request.context.store.connectedWallet
583
- const walletOS = request.context.didwallet.os;
584
-
585
- const userSessionDoc = await node.upsertUserSession({
492
+ if (currentUser) {
493
+ updatedUser = await node.loginUser({
586
494
  teamDid,
587
- visitorId,
588
- userDid: realDid,
589
- appPid: teamDid,
590
- passportId: passport?.id,
591
- status: 'online',
592
- ua,
593
- lastLoginIp,
594
- extra: {
595
- walletOS,
596
- walletDeviceMessageToken,
597
- walletDeviceId,
495
+ user: {
496
+ did: currentUser.did,
497
+ pk: currentUser.pk,
498
+ locale,
499
+ passport,
500
+ sourceAppPid,
501
+ lastLoginIp: getRequestIP(request),
502
+ connectedAccount: [connectAccount, connectedNft],
503
+ ...profile,
504
+ avatar: await extractUserAvatar(get(profile, 'avatar'), {
505
+ dataDir: blocklet.env.dataDir,
506
+ }),
598
507
  },
599
508
  });
600
-
601
- if (shouldSyncFederated(sourceAppPid, blocklet)) {
509
+ await node.createAuditLog(
510
+ {
511
+ action,
512
+ args: { teamDid, userDid: realDid, passport: passportForLog, provider, sourceAppPid },
513
+ context: formatContext(Object.assign(request, { user: updatedUser })),
514
+ result: updatedUser,
515
+ },
602
516
  node
603
- .syncFederated({
604
- did: teamDid,
605
- data: {
606
- users: [
607
- {
608
- did: updatedUser.did,
609
- pk: updatedUser.pk,
610
- fullName: updatedUser.fullName,
611
- email: updatedUser.email || '',
612
- avatar: getUserAvatarUrl(updatedUser.avatar, blocklet),
613
- connectedAccount: [connectAccount, connectedNft],
614
- action: 'connectAccount',
615
- sourceAppPid: sourceAppPid || masterSite.appPid,
616
- },
617
- ],
618
- },
619
- })
620
- .then(() => {
621
- node.syncUserSession({
622
- teamDid,
623
- userDid: realDid,
624
- visitorId: userSessionDoc.visitorId,
625
- passportId: passport?.id,
626
- targetAppPid: sourceAppPid,
627
- ua,
628
- lastLoginIp,
629
- extra: {
630
- walletOS,
631
- walletDeviceMessageToken,
632
- walletDeviceId,
633
- },
634
- });
635
- });
636
- }
637
-
638
- // Generate new session token that client can save to localStorage
639
- const createToken = createTokenFn(createSessionToken);
640
- const sessionConfig = blocklet.settings?.session || {};
517
+ );
518
+ } else {
519
+ // Create user
520
+ fullName = profile.fullName;
641
521
 
642
- const { sessionToken, refreshToken } = createToken(
643
- realDid,
644
- {
645
- secret,
522
+ updatedUser = await node.loginUser({
523
+ teamDid,
524
+ user: {
525
+ ...profile,
526
+ avatar: await extractUserAvatar(get(profile, 'avatar'), {
527
+ dataDir: blocklet.env.dataDir,
528
+ }),
529
+ did: realDid,
530
+ pk: realPk,
531
+ locale,
646
532
  passport,
647
- role,
648
- fullName,
649
- // NOTE: token 中存储当前的 login provider
650
- provider,
651
- walletOS,
533
+ sourceAppPid,
534
+ lastLoginIp: getRequestIP(request),
535
+ connectedAccount: [connectAccount, connectedNft],
536
+ inviter,
537
+ },
538
+ });
539
+ await node.createAuditLog(
540
+ {
541
+ action: 'addUser',
542
+ args: {
543
+ teamDid,
544
+ userDid: realDid,
545
+ sourceAppPid,
546
+ provider,
547
+ reason: `first login as ${passportForLog.role}`,
548
+ },
549
+ context: formatContext(Object.assign(request, { user: updatedUser })),
550
+ result: updatedUser,
652
551
  },
653
- { ...sessionConfig, didConnectVersion: getDidConnectVersion(request) }
552
+ node
654
553
  );
655
- logger.info(`${action}.success`, { userDid: realDid, role });
656
-
657
- if (
658
- // if user provides owner passport AND app does not have owner, set this user to owner
659
- (vc && role === ROLES.OWNER && !blocklet.settings?.owner) ||
660
- // if the user will receive a owner passport AND app does not have owner, set this user to owner
661
- (issuePassport && defaultRole === ROLES.OWNER && !blocklet.settings?.owner)
662
- ) {
663
- logger.info('Bind owner for blocklet', { teamDid, userDid: realDid });
664
- await node.setBlockletInitialized({ did: teamDid, owner: { did: realDid, pk: realPk } });
665
- }
554
+ }
555
+ const lastLoginIp = getRequestIP(request);
556
+ const walletDeviceMessageToken = request.get('wallet-device-message-token');
557
+ const walletDeviceId = request.get('wallet-device-id');
558
+ const ua = request.get('user-agent');
559
+ // request.context.store.connectedWallet
560
+ const walletOS = request.context.didwallet.os;
561
+
562
+ const userSessionDoc = await node.upsertUserSession({
563
+ teamDid,
564
+ visitorId,
565
+ userDid: realDid,
566
+ appPid: teamDid,
567
+ passportId: passport?.id,
568
+ status: 'online',
569
+ ua,
570
+ lastLoginIp,
571
+ extra: {
572
+ walletOS,
573
+ walletDeviceMessageToken,
574
+ walletDeviceId,
575
+ },
576
+ });
666
577
 
667
- // @note: 当第一个用户将要成为 owner 的时候,也是需要绑定 DID Space 的,所以延后执行在此时设置 DID Spaces
668
- const shouldConnectSpace = claims.some(
669
- (x) => x?.meta?.purpose === 'DidSpace' && ['asset', 'verifiableCredential'].includes(x.type)
670
- );
671
- if (action === 'login' && shouldConnectSpace) {
672
- const didSpaceInfo = await getDidSpacesInfoByClaims({ claims });
673
-
674
- const appUrl = getAppUrl(blocklet);
675
- const { data } = await silentAuthorizationInConnect(didSpaceInfo, {
676
- appInfo: {
677
- appDid: blocklet.appDid,
678
- appName: getAppName(blocklet),
679
- appDescription: getAppDescription(blocklet),
680
- appUrl,
681
- scopes: DID_SPACES.AUTHORIZE.DEFAULT_SCOPE,
682
- referrer: joinURL(appUrl, '/.well-known/service/connect'),
683
- metadata: {
684
- did: blocklet.meta.did,
685
- },
686
- },
687
- verifyNFTParams: {
688
- claims,
689
- challenge,
690
- locale,
578
+ if (shouldSyncFederated(sourceAppPid, blocklet)) {
579
+ node
580
+ .syncFederated({
581
+ did: teamDid,
582
+ data: {
583
+ users: [
584
+ {
585
+ did: updatedUser.did,
586
+ pk: updatedUser.pk,
587
+ fullName: updatedUser.fullName,
588
+ email: updatedUser.email || '',
589
+ avatar: getUserAvatarUrl(updatedUser.avatar, blocklet),
590
+ connectedAccount: [connectAccount, connectedNft],
591
+ action: 'connectAccount',
592
+ sourceAppPid: sourceAppPid || masterSite.appPid,
593
+ inviter: updatedUser.inviter,
594
+ generation: updatedUser.generation,
595
+ },
596
+ ],
691
597
  },
598
+ })
599
+ .then(() => {
600
+ node.syncUserSession({
601
+ teamDid,
602
+ userDid: realDid,
603
+ visitorId: userSessionDoc.visitorId,
604
+ passportId: passport?.id,
605
+ targetAppPid: sourceAppPid,
606
+ ua,
607
+ lastLoginIp,
608
+ extra: {
609
+ walletOS,
610
+ walletDeviceMessageToken,
611
+ walletDeviceId,
612
+ },
613
+ });
692
614
  });
615
+ }
693
616
 
694
- /**
695
- * @type {Omit<import('@abtnode/client').SpaceGatewayInput, 'protected'>}
696
- */
697
- const spaceGateway = {
698
- did: data.did,
699
- name: data.name,
700
- endpoint: data.endpoint,
701
- url: didSpaceInfo.didSpacesCoreUrl,
702
- };
617
+ // Generate new session token that client can save to localStorage
618
+ const createToken = createTokenFn(createSessionToken);
619
+ const sessionConfig = blocklet.settings?.session || {};
703
620
 
704
- const user = await node.getUser({
705
- teamDid,
706
- user: {
707
- did: userDid,
708
- },
709
- options: {
710
- enableConnectedAccount: true,
711
- },
712
- });
621
+ const { sessionToken, refreshToken } = createToken(
622
+ realDid,
623
+ {
624
+ secret,
625
+ passport,
626
+ role,
627
+ fullName,
628
+ // NOTE: token 中存储当前的 login provider
629
+ provider,
630
+ walletOS,
631
+ },
632
+ { ...sessionConfig, didConnectVersion: getDidConnectVersion(request) }
633
+ );
634
+ logger.info(`${action}.success`, { userDid: realDid, role });
635
+
636
+ if (
637
+ // if user provides owner passport AND app does not have owner, set this user to owner
638
+ (vc && role === ROLES.OWNER && !blocklet.settings?.owner) ||
639
+ // if the user will receive a owner passport AND app does not have owner, set this user to owner
640
+ (issuePassport && defaultRole === ROLES.OWNER && !blocklet.settings?.owner)
641
+ ) {
642
+ logger.info('Bind owner for blocklet', { teamDid, userDid: realDid });
643
+ await node.setBlockletInitialized({ did: teamDid, owner: { did: realDid, pk: realPk } });
644
+ }
713
645
 
714
- await node.updateUser({
715
- teamDid,
716
- user: {
717
- did: user.did,
718
- didSpace: {
719
- ...user?.didSpace,
720
- ...spaceGateway,
721
- },
646
+ // @note: 当第一个用户将要成为 owner 的时候,也是需要绑定 DID Space 的,所以延后执行在此时设置 DID Spaces
647
+ const shouldConnectSpace = claims.some(
648
+ (x) => x?.meta?.purpose === 'DidSpace' && ['asset', 'verifiableCredential'].includes(x.type)
649
+ );
650
+ if (action === 'login' && shouldConnectSpace) {
651
+ const didSpaceInfo = await getDidSpacesInfoByClaims({ claims });
652
+
653
+ const appUrl = getAppUrl(blocklet);
654
+ const { data } = await silentAuthorizationInConnect(didSpaceInfo, {
655
+ appInfo: {
656
+ appDid: blocklet.appDid,
657
+ appName: getAppName(blocklet),
658
+ appDescription: getAppDescription(blocklet),
659
+ appUrl,
660
+ scopes: DID_SPACES.AUTHORIZE.DEFAULT_SCOPE,
661
+ referrer: joinURL(appUrl, '/.well-known/service/connect'),
662
+ metadata: {
663
+ did: blocklet.meta.did,
722
664
  },
723
- });
724
- }
665
+ },
666
+ verifyNFTParams: {
667
+ claims,
668
+ challenge,
669
+ locale,
670
+ },
671
+ });
725
672
 
726
- // @NOTE: 异步地刷新 profile
727
- Profile.refresh({
728
- node,
729
- blocklet,
673
+ /**
674
+ * @type {Omit<import('@abtnode/client').SpaceGatewayInput, 'protected'>}
675
+ */
676
+ const spaceGateway = {
677
+ did: data.did,
678
+ name: data.name,
679
+ endpoint: data.endpoint,
680
+ url: didSpaceInfo.didSpacesCoreUrl,
681
+ };
682
+
683
+ const user = await node.getUser({
730
684
  teamDid,
731
- userDid,
732
- }).catch((error) => console.warn(error));
685
+ user: {
686
+ did: userDid,
687
+ },
688
+ options: {
689
+ enableConnectedAccount: true,
690
+ },
691
+ });
733
692
 
734
- // issue passport for the first login user in a invite-only team
735
- if (issuePassport) {
736
- return {
737
- disposition: 'attachment',
738
- type: 'VerifiableCredential',
739
- data: vc,
740
- sessionToken,
741
- refreshToken,
742
- visitorId: userSessionDoc.visitorId,
743
- nextWorkflowData: {
744
- userDid: realDid,
693
+ await node.updateUser({
694
+ teamDid,
695
+ user: {
696
+ did: user.did,
697
+ didSpace: {
698
+ ...user?.didSpace,
699
+ ...spaceGateway,
745
700
  },
746
- };
747
- }
701
+ },
702
+ });
703
+ }
704
+
705
+ // @NOTE: 异步地刷新 profile
706
+ Profile.refresh({
707
+ node,
708
+ blocklet,
709
+ teamDid,
710
+ userDid,
711
+ }).catch((error) => console.warn(error));
748
712
 
713
+ // issue passport for the first login user in a invite-only team
714
+ if (issuePassport) {
749
715
  return {
716
+ disposition: 'attachment',
717
+ type: 'VerifiableCredential',
718
+ data: vc,
750
719
  sessionToken,
751
720
  refreshToken,
752
721
  visitorId: userSessionDoc.visitorId,
@@ -754,7 +723,17 @@ module.exports = {
754
723
  userDid: realDid,
755
724
  },
756
725
  };
757
- },
726
+ }
727
+
728
+ return {
729
+ sessionToken,
730
+ refreshToken,
731
+ visitorId: userSessionDoc.visitorId,
732
+ nextWorkflowData: {
733
+ userDid: realDid,
734
+ },
735
+ };
736
+ },
758
737
  },
759
738
 
760
739
  switchProfile: {
@@ -846,7 +825,17 @@ module.exports = {
846
825
  node
847
826
  );
848
827
 
849
- const syncUserData = pick(doc, ['did', 'pk', 'fullName', 'avatar', 'email', 'phone', 'url']);
828
+ const syncUserData = pick(doc, [
829
+ 'did',
830
+ 'pk',
831
+ 'fullName',
832
+ 'avatar',
833
+ 'email',
834
+ 'phone',
835
+ 'url',
836
+ 'inviter',
837
+ 'generation',
838
+ ]);
850
839
  if (syncUserData.avatar) {
851
840
  syncUserData.avatar = getUserAvatarUrl(syncUserData.avatar, blocklet);
852
841
  }
@@ -1172,6 +1161,8 @@ module.exports = {
1172
1161
  email: bindUser?.email,
1173
1162
  fullName: bindUser?.fullName,
1174
1163
  avatar: bindUser?.avatar,
1164
+ inviter: bindUser?.inviter,
1165
+ generation: bindUser?.generation,
1175
1166
  });
1176
1167
  const currentTime = new Date().toISOString();
1177
1168