@abtnode/blocklet-services 1.16.41-beta-20250318-123609-b48bb2d7 → 1.16.41-beta-20250319-131732-1224cca5

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 (151) hide show
  1. package/api/libs/email.js +78 -58
  2. package/api/libs/open-graph/index.js +21 -11
  3. package/api/libs/open-graph/template.js +41 -2
  4. package/api/services/auth/connect/receive-transfer-app-owner.js +15 -3
  5. package/api/services/kyc/index.js +1 -0
  6. package/api/socket/channel/did.js +2 -1
  7. package/dist/assets/{ArrowDropDown-Do4OWmCn.js → ArrowDropDown-ydRfHJ2x.js} +1 -1
  8. package/dist/assets/{CheckCircle-DDHElFhm.js → CheckCircle-DgSwRUf8.js} +1 -1
  9. package/dist/assets/{ChevronLeft-CLfrYODg.js → ChevronLeft-CqDoHwdJ.js} +1 -1
  10. package/dist/assets/{ChevronRight-OJJ2SUEU.js → ChevronRight-Bpkf9aqI.js} +1 -1
  11. package/dist/assets/{DeleteOutline-C954mj84.js → DeleteOutline-D4DYIaUj.js} +1 -1
  12. package/dist/assets/{Done-BXwXbLQs.js → Done-B8c93MpP.js} +1 -1
  13. package/dist/assets/{Download-OmIe8_8C.js → Download-DANYdeZR.js} +1 -1
  14. package/dist/assets/{Error-CXMTbOyQ.js → Error-wKO1hXtU.js} +1 -1
  15. package/dist/assets/{ExpandLess-xJAJmJam.js → ExpandLess-BqrBuxL9.js} +1 -1
  16. package/dist/assets/{Google-jC4aGgA_.js → Google-CBPWeaVC.js} +4 -4
  17. package/dist/assets/{InfoOutlined-Dto4CBtr.js → InfoOutlined-HP5LuELQ.js} +1 -1
  18. package/dist/assets/{Launch-Do09YVNX.js → Launch-XvyEoGhF.js} +1 -1
  19. package/dist/assets/{LaunchOutlined-DyT6-6Gt.js → LaunchOutlined-BfbVRiJT.js} +1 -1
  20. package/dist/assets/{MoreHoriz-CU3bPiks.js → MoreHoriz-Cv3BqpRU.js} +1 -1
  21. package/dist/assets/{PlayArrow-DsdnOq2p.js → PlayArrow-DI84Lay5.js} +1 -1
  22. package/dist/assets/{ViewList-B2mYqtoR.js → ViewList-DLzG9ldE.js} +1 -1
  23. package/dist/assets/{access-control-BWBOA4g6.js → access-control-DM5bKXj8.js} +1 -1
  24. package/dist/assets/{actions-4OuC0GHy.js → actions-CBPbCBQc.js} +1 -1
  25. package/dist/assets/add-component-core-BGLFE6FF.js +765 -0
  26. package/dist/assets/add-resource-CTONcgV6.js +1 -0
  27. package/dist/assets/{addon-D4YcNftH.js → addon-bbJfiLal.js} +1 -1
  28. package/dist/assets/{analytics-BZzzJZSo.js → analytics-jwKnm2P5.js} +1 -1
  29. package/dist/assets/api-CvDkueg1.js +1 -0
  30. package/dist/assets/{ar-BVbwKJY8.js → ar-A7PXaQSB.js} +1 -1
  31. package/dist/assets/{audit-logs-JO59CyGM.js → audit-logs-BSAndjyr.js} +1 -1
  32. package/dist/assets/{base32-BjPUfmet.js → base32-gJJTbpiB.js} +1 -1
  33. package/dist/assets/{branding-CR1e2n6E.js → branding-Ds6v3n-A.js} +2 -2
  34. package/dist/assets/{bundle-avatar-Chdo4m6E.js → bundle-avatar-C4EBeG0M.js} +1 -1
  35. package/dist/assets/{button-BSP6Y6OJ.js → button-BqyvGZC-.js} +1 -1
  36. package/dist/assets/{click-to-copy-fQS5t8fq.js → click-to-copy-Dc16fHKA.js} +1 -1
  37. package/dist/assets/{complete--VG1kQVy.js → complete-B5CCv5xy.js} +1 -1
  38. package/dist/assets/{component-DfQn7Awf.js → component-B2RHEZO0.js} +1 -1
  39. package/dist/assets/{config-mzUmZpxy.js → config-C3tQWDAE.js} +1 -1
  40. package/dist/assets/{config-C-1jeE31.js → config-CkTkraLZ.js} +1 -1
  41. package/dist/assets/config-navigation-Cy2R-qEJ.js +29 -0
  42. package/dist/assets/{config-space-6wpekLZ1.js → config-space-BjgJ--W4.js} +1 -1
  43. package/dist/assets/{confirm-CVR4a5FI.js → confirm-BaiaCWsM.js} +1 -1
  44. package/dist/assets/{connect-DG6frz_Q.js → connect-RNS66o1f.js} +1 -1
  45. package/dist/assets/{connect-D_mrUgoL.js → connect-mVRf-ABx.js} +1 -1
  46. package/dist/assets/{connect-to-BhxyRPHq.js → connect-to-CChFecmc.js} +1 -1
  47. package/dist/assets/{dashboard-DE28EHHN.js → dashboard-BUwFD31P.js} +3 -3
  48. package/dist/assets/{de-nWUnqN3q.js → de-DQLOqs4x.js} +1 -1
  49. package/dist/assets/{delete-confirm-CCY-Xpk5.js → delete-confirm-Bh6Ch3bf.js} +1 -1
  50. package/dist/assets/{did-address-Dx-4WAXQ.js → did-address-DIKoCoBp.js} +1 -1
  51. package/dist/assets/{domain-DHb1Ps_o.js → domain-D2juCz3R.js} +1 -1
  52. package/dist/assets/{domain-action-card-BNfDBQhX.js → domain-action-card-C_--u5r9.js} +1 -1
  53. package/dist/assets/domains-vqaJZbX-.js +1 -0
  54. package/dist/assets/{email-B20szkwm.js → email-DKMhmT65.js} +1 -1
  55. package/dist/assets/{es-C7damQG2.js → es-Wyib4tkS.js} +1 -1
  56. package/dist/assets/{exchange-passport-DbZWgurv.js → exchange-passport-BMfAdTZi.js} +1 -1
  57. package/dist/assets/{form-text-input-BTiyCo4F.js → form-text-input-BKnTJYUO.js} +1 -1
  58. package/dist/assets/{fr-D3MUmftb.js → fr-CTdi8lPh.js} +1 -1
  59. package/dist/assets/{fuel-SLm_JOs-.js → fuel-DGFl2kVF.js} +1 -1
  60. package/dist/assets/{fullpage-50xw6Dda.js → fullpage-kiX9qo3H.js} +1 -1
  61. package/dist/assets/{get-safe-url-C42wIqi-.js → get-safe-url-BvS0hy8W.js} +1 -1
  62. package/dist/assets/{get-safe-url-Cn4KEro2.js → get-safe-url-CXJBjnNj.js} +1 -1
  63. package/dist/assets/{hi-DLH2NuCr.js → hi-Dk3MVpw6.js} +1 -1
  64. package/dist/assets/{home-CUlFLl78.js → home-CfRR-l78.js} +1 -1
  65. package/dist/assets/{id-C_OpwsKG.js → id-BqyOVEFD.js} +1 -1
  66. package/dist/assets/{iframe-BfxIVBTL.js → iframe-C0FAfo1V.js} +1 -1
  67. package/dist/assets/{index-CPUTxynZ.js → index-B4PgdoaR.js} +14 -14
  68. package/dist/assets/{index-DNxvGCUa.js → index-BlGUkC5j.js} +1 -1
  69. package/dist/assets/{index-Do_PTy2g.js → index-C8sg0Ts_.js} +9 -9
  70. package/dist/assets/{index-DOilqSvA.js → index-CHzM6Ehl.js} +1 -1
  71. package/dist/assets/{index-B6Y7SW3z.js → index-Co79YnZI.js} +1 -1
  72. package/dist/assets/{index-mkd7rmEP.js → index-D-RS3D7s.js} +1 -1
  73. package/dist/assets/{index-F9fg_Rq5.js → index-D5rqbUOM.js} +1 -1
  74. package/dist/assets/{index-CbiypPHS.js → index-DF1FIm9G.js} +1 -1
  75. package/dist/assets/{index-xfe9Dcxz.js → index-DMqGxTc4.js} +1 -1
  76. package/dist/assets/{index-D_zMGAKU.js → index-DQKEK30u.js} +1 -1
  77. package/dist/assets/{index-BCtCJuih.js → index-DRzvuBvI.js} +1 -1
  78. package/dist/assets/index-DneJ5oOQ.js +220 -0
  79. package/dist/assets/{index-CyTMvqg2.js → index-DsfwDSo4.js} +1 -1
  80. package/dist/assets/{index-CKGdCheG.js → index-DxtGslY8.js} +1 -1
  81. package/dist/assets/{index-DI6dvNrm.js → index-Hc4fe8tE.js} +1 -1
  82. package/dist/assets/{index-BFV3n5Hy.js → index-okPJPuPc.js} +1 -1
  83. package/dist/assets/{index-D3BxoukB.js → index-wWAZioAD.js} +1 -1
  84. package/dist/assets/{invitation-BuB1-TxL.js → invitation-3fNTl35Q.js} +1 -1
  85. package/dist/assets/{invite-C8_Fxnwn.js → invite-vSXLKXaC.js} +1 -1
  86. package/dist/assets/{issue-passport-BjcOuQDv.js → issue-passport-iTVcPmbK.js} +1 -1
  87. package/dist/assets/{item-3tNefK7M.js → item-BKw13HQ1.js} +1 -1
  88. package/dist/assets/{ja-rh-7J19i.js → ja-BIiN349J.js} +1 -1
  89. package/dist/assets/{ko-DxXSLIu1.js → ko-D9z_sjE3.js} +1 -1
  90. package/dist/assets/{layout-ceT4Awul.js → layout-MdeSR5MO.js} +1 -1
  91. package/dist/assets/{list-BaQMMWrO.js → list-BYBgvMRq.js} +2 -1
  92. package/dist/assets/localization-Cf41fenL.js +1 -0
  93. package/dist/assets/{log-CNHqg8uo.js → log-Djo2s0oZ.js} +1 -1
  94. package/dist/assets/{login-DXKAfWij.js → login-BqLbwYZb.js} +1 -1
  95. package/dist/assets/{login-oauth-callback-20hVf_bH.js → login-oauth-callback-DAKHXtVv.js} +1 -1
  96. package/dist/assets/{logo-uploader-Dh1aL_OF.js → logo-uploader-DtUHte5C.js} +3 -3
  97. package/dist/assets/{lost-passport-CZEU6dJY.js → lost-passport-C_dlQRA5.js} +1 -1
  98. package/dist/assets/{omit-BySqlv7K.js → omit-DVwO9e3E.js} +1 -1
  99. package/dist/assets/{open-window-D4nELhWH.js → open-window-yeboX1Ru.js} +1 -1
  100. package/dist/assets/{overview-xXsfHZEs.js → overview-Ct6FaHVl.js} +1 -1
  101. package/dist/assets/{page-header-C2MPWR-H.js → page-header-DyeTxe1U.js} +1 -1
  102. package/dist/assets/{permission-DXzAY72t.js → permission-ZvUR5Tj-.js} +1 -1
  103. package/dist/assets/{preferences-D2Jg5k10.js → preferences-Dx29Tgc2.js} +1 -1
  104. package/dist/assets/{profile-embed-BDQR5OIg.js → profile-embed-C_yYlnVt.js} +1 -1
  105. package/dist/assets/{pt-q0ZSfFth.js → pt-DbNy95wU.js} +1 -1
  106. package/dist/assets/publish-resource-wn5vCulN.js +1 -0
  107. package/dist/assets/{react-beautiful-dnd.esm-Z01y4hUy.js → react-beautiful-dnd.esm-DcDZ_Ghe.js} +1 -1
  108. package/dist/assets/{relative-time-wZZM9yTU.js → relative-time-CYqHHkvJ.js} +1 -1
  109. package/dist/assets/{ru-CK3mPXUk.js → ru-BEliZjDL.js} +1 -1
  110. package/dist/assets/sdk-CVa22Xgm.js +1 -0
  111. package/dist/assets/{session-BcGa2Lwu.js → session-CD9NaM-v.js} +1 -1
  112. package/dist/assets/setup-BDulmyU9.js +19 -0
  113. package/dist/assets/{start-nMBbzJog.js → start-CUVz5ZKQ.js} +1 -1
  114. package/dist/assets/{status-CW8cLZwc.js → status-i0njxvUg.js} +1 -1
  115. package/dist/assets/{step-actions-D4sVdJ5W.js → step-actions-Zukntbkg.js} +1 -1
  116. package/dist/assets/{studio-oozJB1Q3.js → studio-Cb_GlvSi.js} +1 -1
  117. package/dist/assets/{switch-control-G4nR-MQG.js → switch-control-CJ1duVKM.js} +1 -1
  118. package/dist/assets/{th-DBezSIJU.js → th-KPXdcBJ0.js} +1 -1
  119. package/dist/assets/{traffic-ChHSyQUx.js → traffic-DBvn8sNu.js} +1 -1
  120. package/dist/assets/{transfer-AGCuXVp7.js → transfer-DLvipuQf.js} +1 -1
  121. package/dist/assets/{unsubscribe-D2HmFcyp.js → unsubscribe-Nax9Uwlj.js} +1 -1
  122. package/dist/assets/{useAsync-CDzQ0uN6.js → useAsync-D2OhgEkV.js} +1 -1
  123. package/dist/assets/{useAsyncRetry-CcF3e_P6.js → useAsyncRetry-CEJwVPZ6.js} +1 -1
  124. package/dist/assets/{useLocalStorage-Nwt6lPBi.js → useLocalStorage-CtbpqE0c.js} +1 -1
  125. package/dist/assets/{user-center-Q-dkmQTy.js → user-center-dlERaSQ2.js} +1 -1
  126. package/dist/assets/{util-ChHwCleX.js → util-CzgwETtC.js} +1 -1
  127. package/dist/assets/{util-DfhJqpch.js → util-DHw5muRJ.js} +1 -1
  128. package/dist/assets/{vendor-arcblock-BkdpkIRL.js → vendor-arcblock-E5QJEgSK.js} +1 -1
  129. package/dist/assets/{vendor-hooks-DbRTDIFw.js → vendor-hooks-CYyfK9g3.js} +1 -1
  130. package/dist/assets/{vendor-utils-DJ1bmiuG.js → vendor-utils-CbeKtci8.js} +1 -1
  131. package/dist/assets/{vendor-ux-did-connect-BUS40ceY.js → vendor-ux-did-connect-D75Zatzm.js} +44 -44
  132. package/dist/assets/{vi-hjA0ec5w.js → vi-ChkGdSKU.js} +1 -1
  133. package/dist/assets/wrap-locale-gZlt-kQa.js +1 -0
  134. package/dist/assets/{zh-BIwal6DF.js → zh-DDAGRLEd.js} +1 -1
  135. package/dist/assets/{zh-tw-Bj9DYpoo.js → zh-tw-DIWT2k6_.js} +1 -1
  136. package/dist/images/banner.png +0 -0
  137. package/dist/index.html +5 -5
  138. package/dist/service-worker.js +1 -1
  139. package/package.json +28 -28
  140. package/dist/assets/add-component-core-BJzkE6_k.js +0 -765
  141. package/dist/assets/add-resource-CFUb5VgO.js +0 -1
  142. package/dist/assets/api-D2GjOmnt.js +0 -1
  143. package/dist/assets/cloneDeep-SKWOTeUJ.js +0 -1
  144. package/dist/assets/config-navigation-Dm_JpS-L.js +0 -26
  145. package/dist/assets/domains-CO5BsFN8.js +0 -1
  146. package/dist/assets/index-Bm1Z6vIr.js +0 -220
  147. package/dist/assets/localization-UtRmFKb1.js +0 -1
  148. package/dist/assets/publish-resource-DDV8cXFW.js +0 -1
  149. package/dist/assets/sdk-msG4TyIo.js +0 -1
  150. package/dist/assets/setup-C9iZjtRd.js +0 -19
  151. package/dist/assets/wrap-locale-DnXm9Rv3.js +0 -1
package/api/libs/email.js CHANGED
@@ -1,8 +1,8 @@
1
1
  const { Joi } = require('@arcblock/validator');
2
2
  const { render } = require('@react-email/components');
3
- const { emailConfigSchema } = require('@blocklet/sdk/lib/validators/email');
4
3
  const getBlockletInfo = require('@blocklet/meta/lib/info');
5
- const omit = require('lodash/omit');
4
+ const { getEmailServiceProvider } = require('@abtnode/auth/lib/email');
5
+ const { sendEmailWithLauncher } = require('@abtnode/auth/lib/launcher');
6
6
 
7
7
  const logger = require('./logger')('blocklet-services:notification');
8
8
  const { NotificationEmail } = require('../emails/pages/notification');
@@ -15,7 +15,7 @@ const validateEmail = schemaEmail.validateAsync.bind(schemaEmail);
15
15
  async function sendEmail(
16
16
  receiver,
17
17
  notification,
18
- { teamDid, node, locale, unsubscribeToken = '', userInfo = {}, raw = false }
18
+ { teamDid, node, locale, unsubscribeToken = '', userInfo = {}, raw = false, launcher = false }
19
19
  ) {
20
20
  if (!receiver) {
21
21
  throw new Error('receiver is required');
@@ -30,68 +30,88 @@ async function sendEmail(
30
30
  logger.warn(`Failed to get blocklet: ${teamDid}`);
31
31
  throw new Error(`Failed to get blocklet: ${teamDid}`);
32
32
  }
33
- const config = blocklet.settings?.notification?.email || {};
34
33
 
35
- if (!config.enabled) {
36
- // skip send email
37
- throw new Error('Email Service is not Enabled.');
34
+ const provider = getEmailServiceProvider(blocklet);
35
+ logger.debug('service.sendEmail', { teamDid, provider, raw, launcher });
36
+ if (!provider || (provider === 'launcher' && !launcher)) {
37
+ throw new Error('Email Service is not available.');
38
38
  }
39
39
 
40
- const { error, value } = emailConfigSchema.validate(omit(config, 'enabled'));
41
- if (error) {
42
- throw new Error(error.message);
43
- }
40
+ if (provider === 'service') {
41
+ const config = blocklet.settings?.notification?.email;
42
+ const info = getBlockletInfo(blocklet);
43
+ const logo = `${info.appUrl}/.well-known/service/blocklet/logo-rect?imageFilter=convert&f=png`;
44
+
45
+ const appInfo = notification.appInfo || {
46
+ logo,
47
+ description: info.description,
48
+ title: info.name,
49
+ version: info.version,
50
+ url: info.appUrl,
51
+ };
44
52
 
45
- const info = getBlockletInfo(blocklet);
46
- const logo = `${info.appUrl}/.well-known/service/blocklet/logo-rect?imageFilter=convert&f=png`;
47
-
48
- const appInfo = notification.appInfo || {
49
- logo,
50
- description: info.description,
51
- title: info.name,
52
- version: info.version,
53
- url: info.appUrl,
54
- };
55
-
56
- const subject = `${
57
- notification.title ||
58
- { zh: '您收到了一个通知', en: 'You have received a notification' }[locale] ||
59
- 'You have received a notification'
60
- }`;
61
-
62
- const html = render(
63
- NotificationEmail({
53
+ const subject = `${
54
+ notification.title ||
55
+ { zh: '您收到了一个通知', en: 'You have received a notification' }[locale] ||
56
+ 'You have received a notification'
57
+ }`;
58
+
59
+ const html = render(
60
+ NotificationEmail({
61
+ subject,
62
+ appInfo,
63
+ ...notification,
64
+ locale,
65
+ raw,
66
+ unsubscribeToken,
67
+ userInfo: {
68
+ ...userInfo,
69
+ email: receiver,
70
+ },
71
+ })
72
+ );
73
+
74
+ const emailData = {
75
+ from: `"${appInfo.title}" <${config.from}>`,
76
+ to: receiver,
77
+ title: notification.title,
64
78
  subject,
65
- appInfo,
66
- ...notification,
67
- locale,
68
- raw,
69
- unsubscribeToken,
70
- userInfo: {
71
- ...userInfo,
72
- email: receiver,
73
- },
74
- })
75
- );
76
- const emailData = {
77
- from: `"${appInfo.title}" <${value.from}>`,
78
- to: receiver,
79
- title: notification.title,
80
- subject,
81
- html,
82
- replyTo: value.from,
83
- };
84
- if (process.env.NODE_ENV === 'test') {
85
- return {
86
- messageId: 'test-message-id',
87
- accepted: [emailData.to],
88
- rejected: [],
89
- response: 'Test environment - Email skipped',
79
+ html,
80
+ replyTo: config.from,
90
81
  };
82
+
83
+ if (process.env.NODE_ENV === 'test') {
84
+ return {
85
+ messageId: 'test-message-id',
86
+ accepted: [emailData.to],
87
+ rejected: [],
88
+ response: 'Test environment - Email skipped',
89
+ };
90
+ }
91
+ const transporter = cache.getTransport({ did: teamDid, config });
92
+ const result = await transporter.sendMail(emailData);
93
+ return result;
91
94
  }
92
- const transporter = cache.getTransport({ did: teamDid, config: value });
93
- const result = await transporter.sendMail(emailData);
94
- return result;
95
+
96
+ if (provider === 'launcher') {
97
+ if (!blocklet.controller) {
98
+ throw new Error('Launcher info not available.');
99
+ }
100
+
101
+ const info = await node.getNodeInfo({ useCache: true });
102
+ const result = await sendEmailWithLauncher(info.sk, blocklet.controller, {
103
+ receiver,
104
+ notification,
105
+ options: { locale, raw },
106
+ });
107
+ if (result.error) {
108
+ throw new Error(result.error);
109
+ }
110
+
111
+ return result;
112
+ }
113
+
114
+ throw new Error('Unknown email provider.');
95
115
  }
96
116
 
97
117
  module.exports = {
@@ -18,7 +18,7 @@ const { getTemplate } = require('./template');
18
18
  const { getCacheFilePath } = require('../image');
19
19
  const emoji = require('./emoji');
20
20
 
21
- const TEMPLATES = ['default', 'section', 'cover'];
21
+ const TEMPLATES = ['default', 'section', 'cover', 'banner'];
22
22
  const MAX_TITLE_LENGTH = 128;
23
23
  const MAX_DESCRIPTION_LENGTH = 512;
24
24
  const MAX_IMAGE_SIZE = 5 * 1024 * 1024;
@@ -69,7 +69,11 @@ const schema = Joi.object({
69
69
  // customize logo
70
70
  logo: Joi.string()
71
71
  .uri({ scheme: ['https'] })
72
- .optional(),
72
+ .when('template', {
73
+ is: 'banner',
74
+ then: Joi.required(),
75
+ otherwise: Joi.optional().default(''),
76
+ }),
73
77
  logoRounded: Joi.string().allow('0', '1').optional(),
74
78
 
75
79
  // custom emoji
@@ -110,13 +114,19 @@ const getOgImage = ({ input, info, cacheDir, format, tmpDir }) => {
110
114
  }
111
115
 
112
116
  value.logoRounded = value.logoRounded === '1';
113
- value.background = joinURL(
114
- info.appUrl,
115
- WELLKNOWN_SERVICE_PATH_PREFIX,
116
- `/blocklet/og-image?imageFilter=resize&w=1200&h=630&hash=${info.ogImageHash || ''}`
117
- );
117
+ if (value.template === 'banner') {
118
+ value.background = joinURL(info.appUrl, WELLKNOWN_SERVICE_PATH_PREFIX, '/static/images/banner.png');
119
+ } else {
120
+ value.background = joinURL(
121
+ info.appUrl,
122
+ WELLKNOWN_SERVICE_PATH_PREFIX,
123
+ `/blocklet/og-image?imageFilter=resize&w=1200&h=630&hash=${info.ogImageHash || ''}`
124
+ );
125
+ }
118
126
 
119
- const params = { ...value, width: 1200, height: 630, color, format };
127
+ const width = value.template === 'banner' ? 1280 : 1200;
128
+ const height = value.template === 'banner' ? 441 : 630;
129
+ const params = { ...value, width, height, color, format };
120
130
  const cacheKey = md5(stringify(params));
121
131
  const nocache = input.nocache === '1';
122
132
  const destPath = getCacheFilePath(cacheDir, `${cacheKey}.${format}`);
@@ -166,7 +176,7 @@ const convertExternalImage = (url, dest, height) => {
166
176
  },
167
177
  (res) => {
168
178
  if (res.statusCode && res.statusCode >= 400) {
169
- reject(new CustomError(400, `unexpected external image status: ${res.statusCode}`));
179
+ reject(new CustomError(400, `unexpected external image status: ${res.statusCode} ${url}`));
170
180
  return;
171
181
  }
172
182
 
@@ -207,8 +217,8 @@ const convertExternalImage = (url, dest, height) => {
207
217
  });
208
218
  };
209
219
 
210
- const getCachedExternalImage = (cacheKey, port = process.env.ABT_NODE_SERVICE_PORT) => {
211
- return `http://127.0.0.1:${port}/open-graph/${cacheKey.slice(0, 2)}/${cacheKey.slice(2)}.png`;
220
+ const getCachedExternalImage = (cacheKey) => {
221
+ return `http://127.0.0.1:${process.env.ABT_NODE_SERVICE_PORT}/open-graph/${cacheKey.slice(0, 2)}/${cacheKey.slice(2)}.png`;
212
222
  };
213
223
 
214
224
  const cacheTasks = {};
@@ -83,9 +83,9 @@ const getSectionTemplate = (
83
83
  { width, height, logo, logoRounded, background, color, title, description, section },
84
84
  fn
85
85
  ) => {
86
- return fn` <div
86
+ return fn`<div
87
87
  style="
88
- width: ${width};
88
+ width: ${width}px;
89
89
  height: ${height}px;
90
90
  background-image: url(${background});
91
91
  background-size: cover;
@@ -200,6 +200,42 @@ const getCoverTemplate = ({ width, height, logo, logoRounded, color, title, desc
200
200
  </div>`;
201
201
  };
202
202
 
203
+ const getBannerTemplate = ({ width, height, logo, logoRounded, background, title }, fn) => {
204
+ return fn`<div
205
+ style="
206
+ width: ${width}px;
207
+ height: ${height}px;
208
+ background-image: url(${background});
209
+ background-size: cover;
210
+ background-position: center;
211
+ display: flex;
212
+ flex-direction: row;
213
+ justify-content: center;
214
+ align-items: center;
215
+ position: relative;
216
+ "
217
+ >
218
+ <img
219
+ src="${logo}"
220
+ height="150"
221
+ width="150"
222
+ style="height: 150px; width: 150px; ${logoRounded ? 'border-radius: 50%;' : ''} margin-right: 48px"
223
+ />
224
+ <h2
225
+ style="
226
+ font-size: 72px;
227
+ color: #eee;
228
+ font-weight: 500;
229
+ font-family: Arial, sans-serif;
230
+ text-align: left;
231
+ line-clamp: 1;
232
+ "
233
+ >
234
+ ${title}
235
+ </h2>
236
+ </div>`;
237
+ };
238
+
203
239
  const getTemplate = async (params) => {
204
240
  // eslint-disable-next-line import/no-unresolved
205
241
  const { html } = await import('satori-html');
@@ -214,6 +250,9 @@ const getTemplate = async (params) => {
214
250
  if (params.template === 'cover') {
215
251
  return getCoverTemplate(params, fn);
216
252
  }
253
+ if (params.template === 'banner') {
254
+ return getBannerTemplate(params, fn);
255
+ }
217
256
 
218
257
  throw new Error('Invalid open graph template');
219
258
  };
@@ -362,12 +362,24 @@ module.exports = function createRoutes(node, _, createSessionToken) {
362
362
 
363
363
  // restart blocklet (not use queue)
364
364
  node
365
- .stopBlocklet({ did: appPid })
365
+ .stopBlocklet({ did: appPid, updateStatus: false })
366
366
  .then(() => {
367
- return node.startBlocklet({ did: appPid });
367
+ return node.startBlocklet({ did: appPid, checkHealthImmediately: true, throwOnError: true, atomic: true });
368
+ })
369
+ .then((doc) => {
370
+ logger.info('restart blocklet success after transfer ownership', { appPid });
371
+ return node.createAuditLog(
372
+ {
373
+ action: 'restartBlocklet',
374
+ args: { did: appPid },
375
+ context: formatContext(req),
376
+ result: doc,
377
+ },
378
+ node
379
+ );
368
380
  })
369
381
  .catch((error) => {
370
- logger.error('restart blocklet failed', { appPid, error });
382
+ logger.error('restart blocklet failed after transfer ownership', { appPid, error });
371
383
  });
372
384
 
373
385
  await sleep(3000);
@@ -113,6 +113,7 @@ const init = ({ node }) => {
113
113
  node,
114
114
  locale: req.query.locale,
115
115
  raw: true,
116
+ launcher: true,
116
117
  }
117
118
  );
118
119
  logger.info('send verify code', { teamDid, result });
@@ -458,13 +458,14 @@ const sendToMail = async ({ sender, receiver, notification, options, node, pushO
458
458
 
459
459
  const notifications = parseNotification({ id, ...rest }, senderInfo);
460
460
 
461
- const { locale = 'en' } = options || {};
461
+ const { locale = 'en', raw = false } = options || {};
462
462
  const results = await Promise.allSettled(
463
463
  receivers.map((email) => {
464
464
  return sendEmail(email, notifications[0], {
465
465
  teamDid: sender.appDid,
466
466
  node,
467
467
  locale,
468
+ raw,
468
469
  ...(unsubscribeToken ? { unsubscribeToken } : {}),
469
470
  ...(userInfo ? { userInfo } : {}),
470
471
  });
@@ -1 +1 @@
1
- import{a1 as e,j as t}from"./vendor-mui-core-O22FPGM4.js";import{r as a}from"./vendor-ux-did-connect-BUS40ceY.js";var r={},o=e;Object.defineProperty(r,"__esModule",{value:!0});var u=r.default=void 0,i=o(a()),p=t;u=r.default=(0,i.default)((0,p.jsx)("path",{d:"m7 10 5 5 5-5z"}),"ArrowDropDown");export{u as d};
1
+ import{a1 as e,j as t}from"./vendor-mui-core-O22FPGM4.js";import{r as a}from"./vendor-ux-did-connect-D75Zatzm.js";var r={},o=e;Object.defineProperty(r,"__esModule",{value:!0});var u=r.default=void 0,i=o(a()),p=t;u=r.default=(0,i.default)((0,p.jsx)("path",{d:"m7 10 5 5 5-5z"}),"ArrowDropDown");export{u as d};
@@ -1 +1 @@
1
- import{a1 as r,j as t}from"./vendor-mui-core-O22FPGM4.js";import{r as a}from"./vendor-ux-did-connect-BUS40ceY.js";var e={},o=r;Object.defineProperty(e,"__esModule",{value:!0});var u=e.default=void 0,i=o(a()),l=t;u=e.default=(0,i.default)((0,l.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m-2 15-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8z"}),"CheckCircle");export{u as d};
1
+ import{a1 as r,j as t}from"./vendor-mui-core-O22FPGM4.js";import{r as a}from"./vendor-ux-did-connect-D75Zatzm.js";var e={},o=r;Object.defineProperty(e,"__esModule",{value:!0});var u=e.default=void 0,i=o(a()),l=t;u=e.default=(0,i.default)((0,l.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m-2 15-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8z"}),"CheckCircle");export{u as d};
@@ -1 +1 @@
1
- import{a1 as r,j as t}from"./vendor-mui-core-O22FPGM4.js";import{r as a}from"./vendor-ux-did-connect-BUS40ceY.js";var e={},o=r;Object.defineProperty(e,"__esModule",{value:!0});var u=e.default=void 0,f=o(a()),i=t;u=e.default=(0,f.default)((0,i.jsx)("path",{d:"M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z"}),"ChevronLeft");export{u as d};
1
+ import{a1 as r,j as t}from"./vendor-mui-core-O22FPGM4.js";import{r as a}from"./vendor-ux-did-connect-D75Zatzm.js";var e={},o=r;Object.defineProperty(e,"__esModule",{value:!0});var u=e.default=void 0,f=o(a()),i=t;u=e.default=(0,f.default)((0,i.jsx)("path",{d:"M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z"}),"ChevronLeft");export{u as d};
@@ -1 +1 @@
1
- import{a1 as r,j as t}from"./vendor-mui-core-O22FPGM4.js";import{r as a}from"./vendor-ux-did-connect-BUS40ceY.js";var e={},o=r;Object.defineProperty(e,"__esModule",{value:!0});var u=e.default=void 0,i=o(a()),v=t;u=e.default=(0,i.default)((0,v.jsx)("path",{d:"M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"}),"ChevronRight");export{u as d};
1
+ import{a1 as r,j as t}from"./vendor-mui-core-O22FPGM4.js";import{r as a}from"./vendor-ux-did-connect-D75Zatzm.js";var e={},o=r;Object.defineProperty(e,"__esModule",{value:!0});var u=e.default=void 0,i=o(a()),v=t;u=e.default=(0,i.default)((0,v.jsx)("path",{d:"M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"}),"ChevronRight");export{u as d};
@@ -1 +1 @@
1
- import{a1 as t,j as r}from"./vendor-mui-core-O22FPGM4.js";import{r as a}from"./vendor-ux-did-connect-BUS40ceY.js";var e={},u=t;Object.defineProperty(e,"__esModule",{value:!0});var o=e.default=void 0,i=u(a()),l=r;o=e.default=(0,i.default)((0,l.jsx)("path",{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6zM8 9h8v10H8zm7.5-5-1-1h-5l-1 1H5v2h14V4z"}),"DeleteOutline");export{o as d};
1
+ import{a1 as t,j as r}from"./vendor-mui-core-O22FPGM4.js";import{r as a}from"./vendor-ux-did-connect-D75Zatzm.js";var e={},u=t;Object.defineProperty(e,"__esModule",{value:!0});var o=e.default=void 0,i=u(a()),l=r;o=e.default=(0,i.default)((0,l.jsx)("path",{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6zM8 9h8v10H8zm7.5-5-1-1h-5l-1 1H5v2h14V4z"}),"DeleteOutline");export{o as d};
@@ -1 +1 @@
1
- import{a1 as r,j as t}from"./vendor-mui-core-O22FPGM4.js";import{r as a}from"./vendor-ux-did-connect-BUS40ceY.js";var e={},o=r;Object.defineProperty(e,"__esModule",{value:!0});var u=e.default=void 0,i=o(a()),l=t;u=e.default=(0,i.default)((0,l.jsx)("path",{d:"M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z"}),"Done");export{u as d};
1
+ import{a1 as r,j as t}from"./vendor-mui-core-O22FPGM4.js";import{r as a}from"./vendor-ux-did-connect-D75Zatzm.js";var e={},o=r;Object.defineProperty(e,"__esModule",{value:!0});var u=e.default=void 0,i=o(a()),l=t;u=e.default=(0,i.default)((0,l.jsx)("path",{d:"M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z"}),"Done");export{u as d};
@@ -1 +1 @@
1
- import{a1 as r,j as a}from"./vendor-mui-core-O22FPGM4.js";import{r as t}from"./vendor-ux-did-connect-BUS40ceY.js";var e={},o=r;Object.defineProperty(e,"__esModule",{value:!0});var u=e.default=void 0,d=o(t()),i=a;u=e.default=(0,d.default)((0,i.jsx)("path",{d:"M5 20h14v-2H5zM19 9h-4V3H9v6H5l7 7z"}),"Download");export{u as d};
1
+ import{a1 as r,j as a}from"./vendor-mui-core-O22FPGM4.js";import{r as t}from"./vendor-ux-did-connect-D75Zatzm.js";var e={},o=r;Object.defineProperty(e,"__esModule",{value:!0});var u=e.default=void 0,d=o(t()),i=a;u=e.default=(0,d.default)((0,i.jsx)("path",{d:"M5 20h14v-2H5zM19 9h-4V3H9v6H5l7 7z"}),"Download");export{u as d};
@@ -1 +1 @@
1
- import{a1 as e,j as t}from"./vendor-mui-core-O22FPGM4.js";import{r as a}from"./vendor-ux-did-connect-BUS40ceY.js";var r={},o=e;Object.defineProperty(r,"__esModule",{value:!0});var u=r.default=void 0,i=o(a()),s=t;u=r.default=(0,i.default)((0,s.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 15h-2v-2h2zm0-4h-2V7h2z"}),"Error");export{u as d};
1
+ import{a1 as e,j as t}from"./vendor-mui-core-O22FPGM4.js";import{r as a}from"./vendor-ux-did-connect-D75Zatzm.js";var r={},o=e;Object.defineProperty(r,"__esModule",{value:!0});var u=r.default=void 0,i=o(a()),s=t;u=r.default=(0,i.default)((0,s.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 15h-2v-2h2zm0-4h-2V7h2z"}),"Error");export{u as d};
@@ -1 +1 @@
1
- import{a1 as r,j as a}from"./vendor-mui-core-O22FPGM4.js";import{r as t}from"./vendor-ux-did-connect-BUS40ceY.js";var e={},o=r;Object.defineProperty(e,"__esModule",{value:!0});var s=e.default=void 0,u=o(t()),d=a;s=e.default=(0,u.default)((0,d.jsx)("path",{d:"m12 8-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"}),"ExpandLess");export{s as d};
1
+ import{a1 as r,j as a}from"./vendor-mui-core-O22FPGM4.js";import{r as t}from"./vendor-ux-did-connect-D75Zatzm.js";var e={},o=r;Object.defineProperty(e,"__esModule",{value:!0});var s=e.default=void 0,u=o(t()),d=a;s=e.default=(0,u.default)((0,d.jsx)("path",{d:"m12 8-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"}),"ExpandLess");export{s as d};