@social-mail/social-mail-web-server 1.5.455 → 1.7.2

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 (168) hide show
  1. package/dist/server/model/SocialMailContext.d.ts +2 -2
  2. package/dist/server/model/SocialMailContext.js +2 -2
  3. package/dist/server/model/SocialMailContextEvents.js +2 -2
  4. package/dist/server/model/entities/AppFile.d.ts +2 -0
  5. package/dist/server/model/entities/AppFile.d.ts.map +1 -1
  6. package/dist/server/model/entities/AppFile.js.map +1 -1
  7. package/dist/server/model/entities/{MailboxEmail.d.ts → ChannelEmail.d.ts} +5 -2
  8. package/dist/server/model/entities/ChannelEmail.d.ts.map +1 -0
  9. package/dist/server/model/entities/{MailboxEmail.js → ChannelEmail.js} +26 -13
  10. package/dist/server/model/entities/ChannelEmail.js.map +1 -0
  11. package/dist/server/model/entities/Email.d.ts +2 -2
  12. package/dist/server/model/entities/Email.d.ts.map +1 -1
  13. package/dist/server/model/entities/Email.js.map +1 -1
  14. package/dist/server/model/entities/EmailAddress.d.ts +2 -0
  15. package/dist/server/model/entities/EmailAddress.d.ts.map +1 -1
  16. package/dist/server/model/entities/EmailAddress.js.map +1 -1
  17. package/dist/server/model/entities/Mailbox.d.ts +2 -2
  18. package/dist/server/model/entities/MailboxContactEmail.d.ts +1 -1
  19. package/dist/server/model/entities/MailboxContactEmail.d.ts.map +1 -1
  20. package/dist/server/model/entities/MailboxContactEmail.js +5 -0
  21. package/dist/server/model/entities/MailboxContactEmail.js.map +1 -1
  22. package/dist/server/model/events/AppFileEvents.d.ts +3 -0
  23. package/dist/server/model/events/AppFileEvents.d.ts.map +1 -1
  24. package/dist/server/model/events/AppFileEvents.js +25 -5
  25. package/dist/server/model/events/AppFileEvents.js.map +1 -1
  26. package/dist/server/model/events/AppFileTagEvents.d.ts.map +1 -1
  27. package/dist/server/model/events/AppFileTagEvents.js +2 -3
  28. package/dist/server/model/events/AppFileTagEvents.js.map +1 -1
  29. package/dist/server/model/events/EmailAddressEvents.d.ts.map +1 -1
  30. package/dist/server/model/events/EmailAddressEvents.js +2 -4
  31. package/dist/server/model/events/EmailAddressEvents.js.map +1 -1
  32. package/dist/server/model/events/EmailEngagementEvents.js +1 -1
  33. package/dist/server/model/events/EmailEngagementEvents.js.map +1 -1
  34. package/dist/server/model/events/EmailEvents.js +6 -6
  35. package/dist/server/model/events/EmailEvents.js.map +1 -1
  36. package/dist/server/model/events/EmailLogEvents.js +1 -1
  37. package/dist/server/model/events/EmailLogEvents.js.map +1 -1
  38. package/dist/server/model/events/EmailRecipientEvents.js +1 -1
  39. package/dist/server/model/events/EmailRecipientEvents.js.map +1 -1
  40. package/dist/server/model/events/EmailTagEvents.js +1 -1
  41. package/dist/server/model/events/EmailTagEvents.js.map +1 -1
  42. package/dist/server/model/events/FileContentEvents.d.ts.map +1 -1
  43. package/dist/server/model/events/FileContentEvents.js +2 -3
  44. package/dist/server/model/events/FileContentEvents.js.map +1 -1
  45. package/dist/server/model/events/MailboxContactEvents.js +4 -4
  46. package/dist/server/model/events/MailboxContactEvents.js.map +1 -1
  47. package/dist/server/model/events/MailboxEmailEvents.d.ts +9 -6
  48. package/dist/server/model/events/MailboxEmailEvents.d.ts.map +1 -1
  49. package/dist/server/model/events/MailboxEmailEvents.js +11 -2
  50. package/dist/server/model/events/MailboxEmailEvents.js.map +1 -1
  51. package/dist/server/model/events/MailboxEvents.d.ts.map +1 -1
  52. package/dist/server/model/events/MailboxEvents.js +6 -6
  53. package/dist/server/model/events/MailboxEvents.js.map +1 -1
  54. package/dist/server/model/events/TagEvents.js +1 -1
  55. package/dist/server/model/events/TagEvents.js.map +1 -1
  56. package/dist/server/model/events/TextDocumentEvents.js +2 -2
  57. package/dist/server/model/events/TextDocumentEvents.js.map +1 -1
  58. package/dist/server/model/events/ThreadParticipantEvents.js +1 -1
  59. package/dist/server/model/events/ThreadParticipantEvents.js.map +1 -1
  60. package/dist/server/seed/ui/seed-ui.js +1 -1
  61. package/dist/server/seed/ui/seed-ui.js.map +1 -1
  62. package/dist/server/services/channels/ChannelPageService.d.ts +3 -1
  63. package/dist/server/services/channels/ChannelPageService.d.ts.map +1 -1
  64. package/dist/server/services/channels/ChannelPageService.js +21 -17
  65. package/dist/server/services/channels/ChannelPageService.js.map +1 -1
  66. package/dist/server/services/dom/HtmlSanitizer.js +5 -5
  67. package/dist/server/services/dom/HtmlSanitizer.js.map +1 -1
  68. package/dist/server/services/puppeteer/PuppeteerServer.d.ts +1 -19
  69. package/dist/server/services/puppeteer/PuppeteerServer.d.ts.map +1 -1
  70. package/dist/server/services/puppeteer/PuppeteerServer.js +176 -268
  71. package/dist/server/services/puppeteer/PuppeteerServer.js.map +1 -1
  72. package/dist/server/services/puppeteer/PuppeteerService.d.ts +1 -1
  73. package/dist/server/services/puppeteer/PuppeteerService.d.ts.map +1 -1
  74. package/dist/server/services/puppeteer/PuppeteerService.js +2 -1
  75. package/dist/server/services/puppeteer/PuppeteerService.js.map +1 -1
  76. package/dist/server/smtp/services/CachedEmailService.js +1 -1
  77. package/dist/server/smtp/services/EmailReferenceService.d.ts.map +1 -1
  78. package/dist/server/smtp/services/EmailReferenceService.js +34 -35
  79. package/dist/server/smtp/services/EmailReferenceService.js.map +1 -1
  80. package/dist/server/smtp/services/EngagementService.js +1 -1
  81. package/dist/server/workflows/channel/BroadcastEmail.d.ts.map +1 -1
  82. package/dist/server/workflows/channel/BroadcastEmail.js +16 -8
  83. package/dist/server/workflows/channel/BroadcastEmail.js.map +1 -1
  84. package/dist/server/workflows/repair/channel/RepairChannelEmailCountsWorkflow.js +1 -1
  85. package/dist/server/workflows/repair/counts/RepairEmailCountsWorkflow.js +1 -1
  86. package/dist/server/workflows/repair/counts/RepairEmailCountsWorkflow.js.map +1 -1
  87. package/dist/server/workflows/repair/tags/RepairEmailTagsWorkflow.js +1 -1
  88. package/dist/server/workflows/repair/tags/RepairEmailTagsWorkflow.js.map +1 -1
  89. package/dist/server/workflows/smtp/DispatchEmailToMX.d.ts +1 -1
  90. package/dist/server/workflows/smtp/DispatchEmailToMX.d.ts.map +1 -1
  91. package/dist/server/workflows/smtp/DispatchEmailToMX.js +9 -7
  92. package/dist/server/workflows/smtp/DispatchEmailToMX.js.map +1 -1
  93. package/dist/server/workflows/smtp/MailDispatcherService.d.ts +3 -2
  94. package/dist/server/workflows/smtp/MailDispatcherService.d.ts.map +1 -1
  95. package/dist/server/workflows/smtp/MailDispatcherService.js +4 -4
  96. package/dist/server/workflows/smtp/MailDispatcherService.js.map +1 -1
  97. package/dist/server/workflows/smtp/PrepareEmailToSend.d.ts +1 -1
  98. package/dist/server/workflows/smtp/PrepareEmailToSend.js +1 -1
  99. package/dist/server/workflows/smtp/PrepareEmailToSend.js.map +1 -1
  100. package/dist/server/workflows/sync/SyncMailboxWorkflow.js +2 -2
  101. package/dist/server/workflows/sync/SyncMailboxWorkflow.js.map +1 -1
  102. package/dist/server/workflows/web-hooks/InvokeWebHookWorkflow.js +1 -1
  103. package/dist/server/workflows/web-hooks/InvokeWebHookWorkflow.js.map +1 -1
  104. package/dist/tsconfig.tsbuildinfo +1 -1
  105. package/dist/wwwroot/routes/api/emails/channel/content/attachment/index.js +2 -2
  106. package/dist/wwwroot/routes/api/emails/channel/content/attachment/index.js.map +1 -1
  107. package/dist/wwwroot/routes/api/emails/channel/content/html/index.js +6 -6
  108. package/dist/wwwroot/routes/api/emails/channel/content/html/index.js.map +1 -1
  109. package/dist/wwwroot/routes/social-mail/public/email/attachment/index.d.ts.map +1 -1
  110. package/dist/wwwroot/routes/social-mail/public/email/attachment/index.js +2 -1
  111. package/dist/wwwroot/routes/social-mail/public/email/attachment/index.js.map +1 -1
  112. package/dist/wwwroot/routes/social-mail/social/buttons/get.d.ts +1 -25
  113. package/dist/wwwroot/routes/social-mail/social/buttons/get.d.ts.map +1 -1
  114. package/dist/wwwroot/routes/social-mail/social/buttons/get.js +106 -120
  115. package/dist/wwwroot/routes/social-mail/social/buttons/get.js.map +1 -1
  116. package/dist/wwwroot/routes/social-mail/social/buttons-3x/get.d.ts +1 -26
  117. package/dist/wwwroot/routes/social-mail/social/buttons-3x/get.d.ts.map +1 -1
  118. package/dist/wwwroot/routes/social-mail/social/buttons-3x/get.js +116 -130
  119. package/dist/wwwroot/routes/social-mail/social/buttons-3x/get.js.map +1 -1
  120. package/package.json +2 -3
  121. package/src/server/model/SocialMailContext.ts +2 -2
  122. package/src/server/model/SocialMailContextEvents.ts +2 -2
  123. package/src/server/model/entities/AppFile.ts +2 -2
  124. package/src/server/model/entities/{MailboxEmail.ts → ChannelEmail.ts} +16 -2
  125. package/src/server/model/entities/Email.ts +3 -2
  126. package/src/server/model/entities/EmailAddress.ts +2 -0
  127. package/src/server/model/entities/Mailbox.ts +2 -2
  128. package/src/server/model/entities/MailboxContactEmail.ts +5 -1
  129. package/src/server/model/events/AppFileEvents.ts +24 -5
  130. package/src/server/model/events/AppFileTagEvents.ts +4 -5
  131. package/src/server/model/events/EmailAddressEvents.ts +5 -8
  132. package/src/server/model/events/EmailEngagementEvents.ts +1 -1
  133. package/src/server/model/events/EmailEvents.ts +6 -6
  134. package/src/server/model/events/EmailLogEvents.ts +1 -1
  135. package/src/server/model/events/EmailRecipientEvents.ts +1 -1
  136. package/src/server/model/events/EmailTagEvents.ts +1 -1
  137. package/src/server/model/events/FileContentEvents.ts +3 -4
  138. package/src/server/model/events/MailboxContactEvents.ts +4 -4
  139. package/src/server/model/events/MailboxEmailEvents.ts +16 -7
  140. package/src/server/model/events/MailboxEvents.ts +7 -6
  141. package/src/server/model/events/TagEvents.ts +2 -2
  142. package/src/server/model/events/TextDocumentEvents.ts +3 -3
  143. package/src/server/model/events/ThreadParticipantEvents.ts +1 -1
  144. package/src/server/seed/ui/seed-ui.ts +1 -1
  145. package/src/server/services/channels/ChannelPageService.tsx +22 -17
  146. package/src/server/services/dom/HtmlSanitizer.tsx +6 -6
  147. package/src/server/services/emails/UnreadCountService.ts +1 -1
  148. package/src/server/services/puppeteer/PuppeteerServer.ts +194 -194
  149. package/src/server/services/puppeteer/PuppeteerService.ts +1 -1
  150. package/src/server/smtp/services/CachedEmailService.ts +1 -1
  151. package/src/server/smtp/services/EmailReferenceService.ts +36 -37
  152. package/src/server/smtp/services/EngagementService.ts +1 -1
  153. package/src/server/workflows/channel/BroadcastEmail.ts +21 -8
  154. package/src/server/workflows/repair/channel/RepairChannelEmailCountsWorkflow.ts +1 -1
  155. package/src/server/workflows/repair/counts/RepairEmailCountsWorkflow.ts +1 -1
  156. package/src/server/workflows/repair/tags/RepairEmailTagsWorkflow.ts +1 -1
  157. package/src/server/workflows/smtp/DispatchEmailToMX.ts +11 -8
  158. package/src/server/workflows/smtp/MailDispatcherService.ts +5 -5
  159. package/src/server/workflows/smtp/PrepareEmailToSend.ts +1 -1
  160. package/src/server/workflows/sync/SyncMailboxWorkflow.ts +2 -2
  161. package/src/server/workflows/web-hooks/InvokeWebHookWorkflow.ts +1 -1
  162. package/src/wwwroot/routes/api/emails/channel/content/attachment/index.ts +2 -2
  163. package/src/wwwroot/routes/api/emails/channel/content/html/index.ts +6 -6
  164. package/src/wwwroot/routes/social-mail/public/email/attachment/index.ts +3 -1
  165. package/src/wwwroot/routes/social-mail/social/buttons/get.tsx +130 -130
  166. package/src/wwwroot/routes/social-mail/social/buttons-3x/get.tsx +143 -143
  167. package/dist/server/model/entities/MailboxEmail.d.ts.map +0 -1
  168. package/dist/server/model/entities/MailboxEmail.js.map +0 -1
@@ -1,194 +1,194 @@
1
- /* eslint-disable no-console */
2
- import Inject, { RegisterSingleton } from "@entity-access/entity-access/dist/di/di.js";
3
- import puppeteer, { Page } from "puppeteer-core";
4
- import { globalEnv } from "../../../common/globalEnv.js";
5
- import HtmlSanitizer from "../dom/HtmlSanitizer.js";
6
- import GlobalEvents from "../../../common/GlobalEvents.js";
7
- import { rmdir, writeFile } from "node:fs/promises";
8
- import { existsSync, mkdirSync, unlinkSync } from "node:fs";
9
- import LockFile from "../../storage/LockFile.js";
10
-
11
- const options = [
12
- '--disable-background-networking',
13
- '--disable-background-timer-throttling',
14
- '--disable-backgrounding-occluded-windows',
15
- '--disable-breakpad',
16
- '--disable-client-side-phishing-detection',
17
- '--disable-component-update',
18
- '--disable-default-apps',
19
- '--disable-dev-shm-usage',
20
- '--disable-domain-reliability',
21
- '--disable-extensions',
22
- '--disable-features=AudioServiceOutOfProcess',
23
- '--disable-hang-monitor',
24
- '--disable-ipc-flooding-protection',
25
- '--disable-notifications',
26
- '--disable-offer-store-unmasked-wallet-cards',
27
- '--disable-popup-blocking',
28
- '--disable-print-preview',
29
- '--disable-prompt-on-repost',
30
- '--disable-renderer-backgrounding',
31
- '--disable-setuid-sandbox',
32
- '--disable-speech-api',
33
- '--disable-sync',
34
- '--disk-cache-size=33554432',
35
- // '--hide-scrollbars',
36
- // '--ignore-gpu-blacklist',
37
- // '--metrics-recording-only',
38
- '--mute-audio',
39
- '--no-default-browser-check',
40
- '--no-first-run',
41
- '--no-pings',
42
- '--no-sandbox',
43
- '--no-zygote',
44
- '--password-store=basic',
45
- '--use-mock-keychain',
46
- // '--single-process',
47
- '--autoplay-policy=no-user-gesture-required',
48
- // '--enable-logging=stderr',
49
- // '--v=1',
50
- // '--disable-gpu',
51
- // '--window-size=400,800',
52
- ];
53
-
54
- // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
55
- export type DisposablePage = Partial<Page> & AsyncDisposable ;
56
-
57
- const buffer = Buffer.from("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAtJREFUGFdjYAACAAAFAAGq1chRAAAAAElFTkSuQmCC", "base64");
58
-
59
- @RegisterSingleton
60
- export default class PuppeteerServer {
61
-
62
- @Inject
63
- htmlSanitizer: HtmlSanitizer;
64
-
65
- public async htmlToPdf(content: string, { outputFile, deviceScaleFactor, pdfOptions }: { outputFile: string, pdfOptions?: string, deviceScaleFactor?: number }) {
66
- try {
67
- await using page = await this.newPage({ deviceScaleFactor });
68
- content = this.htmlSanitizer.prepareForPreview(content);
69
- if(typeof pdfOptions === "string") {
70
- pdfOptions = JSON.parse(pdfOptions);
71
- }
72
- await page.pdf({ ... pdfOptions as any,
73
- path: outputFile
74
- });
75
- } catch (error) {
76
- await writeFile(outputFile, buffer);
77
- if (/Node\shas\s0\swidth/i.test(error.message ?? error)) {
78
- return;
79
- }
80
- console.log(content);
81
- console.error(error);
82
- }
83
- }
84
-
85
- public async htmlToPng(content: string, {
86
- selector,
87
- outputFile,
88
- count,
89
- deviceScaleFactor
90
- }: { selector?: string; outputFile: string, count?: string, deviceScaleFactor?: number}) {
91
- try {
92
- await using page = await this.newPage({ deviceScaleFactor });
93
- content = this.htmlSanitizer.prepareForPreview(content);
94
- await page.setContent(content, {
95
- waitUntil: "networkidle2"
96
- });
97
- const element = await page.$(selector);
98
- if (!element) {
99
- await writeFile(buffer, outputFile);
100
- return;
101
- }
102
- if (count) {
103
- await element.evaluate((e, c) => {
104
- const span = e.querySelector(`[data-social-mail-element="count"]`);
105
- if (span) {
106
- span.textContent = c;
107
- }
108
- }, count);
109
- }
110
- await element.scrollIntoView();
111
- const clip = await element.boundingBox();
112
- let top = Math.floor(clip.y);
113
- if (top < clip.y) {
114
- clip.height++;
115
- } else {
116
- top-=2;
117
- clip.height+=4;
118
- }
119
- clip.height = Math.ceil(clip.height);
120
- clip.y = top;
121
- await page.screenshot({
122
- path: outputFile,
123
- clip,
124
- omitBackground: true
125
- });
126
-
127
- // change the dpi...
128
-
129
-
130
- } catch (error) {
131
- await writeFile(outputFile, buffer);
132
- if (/Node\shas\s0\swidth/i.test(error.message ?? error)) {
133
- return;
134
- }
135
- console.log(content);
136
- console.error(error);
137
- }
138
- }
139
-
140
- public async svgToPng(svgFile: string, outputFile: string) {
141
- await using page = await this.newPage();
142
- await page.goto(svgFile, { waitUntil: "networkidle2"});
143
- await page.screenshot({ path: outputFile });
144
- }
145
-
146
- public async newPage({ deviceScaleFactor }: Partial<puppeteer.Viewport> = {}): Promise<DisposablePage> {
147
-
148
- const lf = await LockFile.lock("puppeteer-html-to-image");
149
-
150
- const userDataDir = `/tmp/${Date.now().toString(36)}`;
151
-
152
- if(!existsSync(userDataDir)) {
153
- try {
154
- mkdirSync(userDataDir, { recursive: true });
155
- } catch {
156
- // ignore this...
157
- }
158
- }
159
-
160
- const browser = await puppeteer.launch({
161
- executablePath: globalEnv.puppeteerExecutablePath,
162
- userDataDir,
163
- args: options,
164
- // dumpio: true,
165
- // ignoreHTTPSErrors: true,
166
- ignoreDefaultArgs: ["--mute-audio"]
167
- });
168
-
169
- const page = await browser.newPage();
170
- await page.setViewport({
171
- ... (page.viewport() ?? {} as any),
172
- deviceScaleFactor
173
- });
174
-
175
- // we will kill browser in 15 seconds..
176
- const ct = setTimeout(() => browser.close().catch(console.error), 15000);
177
-
178
- page[Symbol.asyncDispose] = async () => {
179
- clearTimeout(ct);
180
- lf[Symbol.dispose]();
181
- try {
182
- await browser.close();
183
- } catch {
184
- // ignore error.
185
- }
186
- try {
187
- await rmdir(userDataDir);
188
- } catch {
189
- // ignore
190
- }
191
- };
192
- return page as any as DisposablePage;
193
- }
194
- }
1
+ // /* eslint-disable no-console */
2
+ // import Inject, { RegisterSingleton } from "@entity-access/entity-access/dist/di/di.js";
3
+ // import puppeteer, { Page } from "puppeteer-core";
4
+ // import { globalEnv } from "../../../common/globalEnv.js";
5
+ // import HtmlSanitizer from "../dom/HtmlSanitizer.js";
6
+ // import GlobalEvents from "../../../common/GlobalEvents.js";
7
+ // import { rmdir, writeFile } from "node:fs/promises";
8
+ // import { existsSync, mkdirSync, unlinkSync } from "node:fs";
9
+ // import LockFile from "../../storage/LockFile.js";
10
+
11
+ // const options = [
12
+ // '--disable-background-networking',
13
+ // '--disable-background-timer-throttling',
14
+ // '--disable-backgrounding-occluded-windows',
15
+ // '--disable-breakpad',
16
+ // '--disable-client-side-phishing-detection',
17
+ // '--disable-component-update',
18
+ // '--disable-default-apps',
19
+ // '--disable-dev-shm-usage',
20
+ // '--disable-domain-reliability',
21
+ // '--disable-extensions',
22
+ // '--disable-features=AudioServiceOutOfProcess',
23
+ // '--disable-hang-monitor',
24
+ // '--disable-ipc-flooding-protection',
25
+ // '--disable-notifications',
26
+ // '--disable-offer-store-unmasked-wallet-cards',
27
+ // '--disable-popup-blocking',
28
+ // '--disable-print-preview',
29
+ // '--disable-prompt-on-repost',
30
+ // '--disable-renderer-backgrounding',
31
+ // '--disable-setuid-sandbox',
32
+ // '--disable-speech-api',
33
+ // '--disable-sync',
34
+ // '--disk-cache-size=33554432',
35
+ // // '--hide-scrollbars',
36
+ // // '--ignore-gpu-blacklist',
37
+ // // '--metrics-recording-only',
38
+ // '--mute-audio',
39
+ // '--no-default-browser-check',
40
+ // '--no-first-run',
41
+ // '--no-pings',
42
+ // '--no-sandbox',
43
+ // '--no-zygote',
44
+ // '--password-store=basic',
45
+ // '--use-mock-keychain',
46
+ // // '--single-process',
47
+ // '--autoplay-policy=no-user-gesture-required',
48
+ // // '--enable-logging=stderr',
49
+ // // '--v=1',
50
+ // // '--disable-gpu',
51
+ // // '--window-size=400,800',
52
+ // ];
53
+
54
+ // // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
55
+ // export type DisposablePage = Partial<Page> & AsyncDisposable ;
56
+
57
+ // const buffer = Buffer.from("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAtJREFUGFdjYAACAAAFAAGq1chRAAAAAElFTkSuQmCC", "base64");
58
+
59
+ // @RegisterSingleton
60
+ // export default class PuppeteerServer {
61
+
62
+ // @Inject
63
+ // htmlSanitizer: HtmlSanitizer;
64
+
65
+ // public async htmlToPdf(content: string, { outputFile, deviceScaleFactor, pdfOptions }: { outputFile: string, pdfOptions?: string, deviceScaleFactor?: number }) {
66
+ // try {
67
+ // await using page = await this.newPage({ deviceScaleFactor });
68
+ // content = this.htmlSanitizer.prepareForPreview(content);
69
+ // if(typeof pdfOptions === "string") {
70
+ // pdfOptions = JSON.parse(pdfOptions);
71
+ // }
72
+ // await page.pdf({ ... pdfOptions as any,
73
+ // path: outputFile
74
+ // });
75
+ // } catch (error) {
76
+ // await writeFile(outputFile, buffer);
77
+ // if (/Node\shas\s0\swidth/i.test(error.message ?? error)) {
78
+ // return;
79
+ // }
80
+ // console.log(content);
81
+ // console.error(error);
82
+ // }
83
+ // }
84
+
85
+ // public async htmlToPng(content: string, {
86
+ // selector,
87
+ // outputFile,
88
+ // count,
89
+ // deviceScaleFactor
90
+ // }: { selector?: string; outputFile: string, count?: string, deviceScaleFactor?: number}) {
91
+ // try {
92
+ // await using page = await this.newPage({ deviceScaleFactor });
93
+ // content = this.htmlSanitizer.prepareForPreview(content);
94
+ // await page.setContent(content, {
95
+ // waitUntil: "networkidle2"
96
+ // });
97
+ // const element = await page.$(selector);
98
+ // if (!element) {
99
+ // await writeFile(buffer, outputFile);
100
+ // return;
101
+ // }
102
+ // if (count) {
103
+ // await element.evaluate((e, c) => {
104
+ // const span = e.querySelector(`[data-social-mail-element="count"]`);
105
+ // if (span) {
106
+ // span.textContent = c;
107
+ // }
108
+ // }, count);
109
+ // }
110
+ // await element.scrollIntoView();
111
+ // const clip = await element.boundingBox();
112
+ // let top = Math.floor(clip.y);
113
+ // if (top < clip.y) {
114
+ // clip.height++;
115
+ // } else {
116
+ // top-=2;
117
+ // clip.height+=4;
118
+ // }
119
+ // clip.height = Math.ceil(clip.height);
120
+ // clip.y = top;
121
+ // await page.screenshot({
122
+ // path: outputFile,
123
+ // clip,
124
+ // omitBackground: true
125
+ // });
126
+
127
+ // // change the dpi...
128
+
129
+
130
+ // } catch (error) {
131
+ // await writeFile(outputFile, buffer);
132
+ // if (/Node\shas\s0\swidth/i.test(error.message ?? error)) {
133
+ // return;
134
+ // }
135
+ // console.log(content);
136
+ // console.error(error);
137
+ // }
138
+ // }
139
+
140
+ // public async svgToPng(svgFile: string, outputFile: string) {
141
+ // await using page = await this.newPage();
142
+ // await page.goto(svgFile, { waitUntil: "networkidle2"});
143
+ // await page.screenshot({ path: outputFile });
144
+ // }
145
+
146
+ // public async newPage({ deviceScaleFactor }: Partial<puppeteer.Viewport> = {}): Promise<DisposablePage> {
147
+
148
+ // const lf = await LockFile.lock("puppeteer-html-to-image");
149
+
150
+ // const userDataDir = `/tmp/${Date.now().toString(36)}`;
151
+
152
+ // if(!existsSync(userDataDir)) {
153
+ // try {
154
+ // mkdirSync(userDataDir, { recursive: true });
155
+ // } catch {
156
+ // // ignore this...
157
+ // }
158
+ // }
159
+
160
+ // const browser = await puppeteer.launch({
161
+ // executablePath: globalEnv.puppeteerExecutablePath,
162
+ // userDataDir,
163
+ // args: options,
164
+ // // dumpio: true,
165
+ // // ignoreHTTPSErrors: true,
166
+ // ignoreDefaultArgs: ["--mute-audio"]
167
+ // });
168
+
169
+ // const page = await browser.newPage();
170
+ // await page.setViewport({
171
+ // ... (page.viewport() ?? {} as any),
172
+ // deviceScaleFactor
173
+ // });
174
+
175
+ // // we will kill browser in 15 seconds..
176
+ // const ct = setTimeout(() => browser.close().catch(console.error), 15000);
177
+
178
+ // page[Symbol.asyncDispose] = async () => {
179
+ // clearTimeout(ct);
180
+ // lf[Symbol.dispose]();
181
+ // try {
182
+ // await browser.close();
183
+ // } catch {
184
+ // // ignore error.
185
+ // }
186
+ // try {
187
+ // await rmdir(userDataDir);
188
+ // } catch {
189
+ // // ignore
190
+ // }
191
+ // };
192
+ // return page as any as DisposablePage;
193
+ // }
194
+ // }
@@ -1 +1 @@
1
- export { default as PuppeteerService } from "./PuppeteerServer.js";
1
+ // export { default as PuppeteerService } from "./PuppeteerServer.js";
@@ -101,7 +101,7 @@ export default class CachedEmailService {
101
101
  };
102
102
 
103
103
  const ef = await this.cacheService.get({
104
- key: `cached-email-html-a8-${emailID}-${emailAddressID}-${signedFileLogID}`,
104
+ key: `cached-email-html-a9-${emailID}-${emailAddressID}-${signedFileLogID}`,
105
105
  factory,
106
106
  ttl: TimeSpan.fromDays(30)
107
107
  });
@@ -285,7 +285,6 @@ export default class EmailReferenceService {
285
285
  .include((x) => [
286
286
  x.recipients.forEach((r) => r.emailAddress.mailbox),
287
287
  x.senderEmail.mailbox,
288
- x.mailboxes.forEach((r) => r.mailbox),
289
288
  x.thread.lastReply
290
289
  ])
291
290
  .first();
@@ -395,19 +394,19 @@ export default class EmailReferenceService {
395
394
  }
396
395
 
397
396
  // event sent emails are part of mailbox
398
- await db.mailboxEmails.statements.selectOrInsert({
399
- mailboxID: senderID,
400
- emailID
401
- });
397
+ // await db.mailboxEmails.statements.selectOrInsert({
398
+ // mailboxID: senderID,
399
+ // emailID
400
+ // });
402
401
 
403
402
  if (mailbox) {
404
403
 
405
404
  // this is the case when email was sent from the system
406
405
  // we will insert in respective mailboxes here...
407
- await db.mailboxEmails.statements.selectOrInsert({
408
- mailboxID: emailAddressID,
409
- emailID
410
- });
406
+ // await db.mailboxEmails.statements.selectOrInsert({
407
+ // mailboxID: emailAddressID,
408
+ // emailID
409
+ // });
411
410
 
412
411
  saved.add(emailAddressID);
413
412
 
@@ -439,10 +438,10 @@ export default class EmailReferenceService {
439
438
  // we will only store in mailboxes that exist on the system
440
439
  saved.add(emailAddressID);
441
440
  if (mailbox) {
442
- await db.mailboxEmails.statements.selectOrInsert({
443
- mailboxID: emailAddressID,
444
- emailID
445
- });
441
+ // await db.mailboxEmails.statements.selectOrInsert({
442
+ // mailboxID: emailAddressID,
443
+ // emailID
444
+ // });
446
445
  const mailboxID = emailAddressID;
447
446
  await this.updateThread({
448
447
  engagement,
@@ -467,30 +466,30 @@ export default class EmailReferenceService {
467
466
  // or sent as bcc to hosted mailbox
468
467
  // in that case we will put mail in sender's folder
469
468
 
470
- if (email.mailboxes) {
471
- for (const { mailbox } of email.mailboxes) {
472
-
473
- const mailboxID = mailbox.mailboxID;
474
- if (saved.has(mailboxID)) {
475
- continue;
476
- }
477
-
478
- await this.updateThread({
479
- engagement,
480
- mailbox,
481
- mailboxID,
482
- emailAddressID: senderID,
483
- lastEmailID: emailID,
484
- silent,
485
- timeRead,
486
- dateUpdated,
487
- tagIDs,
488
- email,
489
- newOpenThread,
490
- newThread,
491
- });
492
- }
493
- }
469
+ // if (email.mailboxes) {
470
+ // for (const { mailbox } of email.mailboxes) {
471
+
472
+ // const mailboxID = mailbox.mailboxID;
473
+ // if (saved.has(mailboxID)) {
474
+ // continue;
475
+ // }
476
+
477
+ // await this.updateThread({
478
+ // engagement,
479
+ // mailbox,
480
+ // mailboxID,
481
+ // emailAddressID: senderID,
482
+ // lastEmailID: emailID,
483
+ // silent,
484
+ // timeRead,
485
+ // dateUpdated,
486
+ // tagIDs,
487
+ // email,
488
+ // newOpenThread,
489
+ // newThread,
490
+ // });
491
+ // }
492
+ // }
494
493
 
495
494
  return email;
496
495
  }
@@ -195,7 +195,7 @@ export default class EngagementService {
195
195
  const ea = { emailID, engagement };
196
196
 
197
197
  if (email.status === "published") {
198
- await this.db.mailboxEmails.where(ea, (p) => (x) => x.emailID === p.emailID)
198
+ await this.db.channelEmails.where(ea, (p) => (x) => x.emailID === p.emailID)
199
199
  .update(void 0, (p) => (x) => ({
200
200
  engagementCount: x.engagementCount + 1,
201
201
  dateUpdated: Sql.date.now()
@@ -9,6 +9,7 @@ import { randomUUID } from "crypto";
9
9
  import DispatchEmailToMX from "../smtp/DispatchEmailToMX.js";
10
10
  import EmailAddressService from "../../services/EmailAddressService.js";
11
11
  import TimeSpan from "@entity-access/entity-access/dist/types/TimeSpan.js";
12
+ import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
12
13
 
13
14
  /**
14
15
  * Broadcasting Email is done in following manner.
@@ -82,22 +83,34 @@ export default class BroadcastEmail extends Workflow<IBroadcastEmail> {
82
83
  const [email] = await db.emails.where(this.input, (p) => (x) => x.emailID === p.emailID)
83
84
  .updateSelect(void 0, (p) => (x) => ({ status: "published"}));
84
85
 
86
+ // find first attachment
87
+ const types = ["video/%", "image/%"];
88
+
89
+ const firstAttachment = await db.appFiles.where({ types, emailID }, (p) => (x) =>
90
+ x.emailID === p.emailID
91
+ && Sql.text.likeAny(x.contentType, p.types))
92
+ .orderBy(void 0, (p) => (x) => Sql.text.like(x.contentType, "video/%"))
93
+ .first();
94
+
95
+ const previewFileID = firstAttachment?.appFileID;
96
+
85
97
  await db.mailboxes.statements.update({ datePublished }, { mailboxID });
86
98
 
87
99
  // gmail sends in-reply-to for forwarded messages.
88
100
  // ideally in-reply-to must not be set if the message was forwarded
89
101
 
90
102
  let isThread = email.parentID === null;
91
- if(email.parentID) {
92
- const { parentID } = email;
93
- isThread = !(await db.mailboxEmails.where({ mailboxID , parentID}, (p) => (x) => x.emailID === p.parentID && x.mailboxID === p.mailboxID)
94
- .some());
95
- }
96
103
 
97
104
  if (isThread) {
98
- await db.mailboxEmails.statements.update({ isThread: true, datePublished, dateUpdated }, { mailboxID, emailID });
105
+ await db.channelEmails.statements.upsert({ previewFileID, isThread: true, datePublished, dateUpdated,mailboxID, emailID }, (x) => x, { mailboxID, emailID });
99
106
  } else {
100
- await db.mailboxEmails.statements.update({ datePublished, dateUpdated }, { mailboxID, emailID });
107
+ await db.channelEmails.statements.upsert({ previewFileID, datePublished, dateUpdated, mailboxID, emailID }, (x) => x, { mailboxID, emailID });
108
+ }
109
+
110
+ if(email.parentID) {
111
+ const { parentID } = email;
112
+ isThread = !(await db.channelEmails.where({ mailboxID , parentID}, (p) => (x) => x.emailID === p.parentID && x.mailboxID === p.mailboxID)
113
+ .some());
101
114
  }
102
115
 
103
116
  // load email..
@@ -151,7 +164,7 @@ export default class BroadcastEmail extends Workflow<IBroadcastEmail> {
151
164
  const { activityID } = activity;
152
165
 
153
166
  await this.context.queue(DispatchEmailToMX, {
154
- emailAddressID,
167
+ recipientAddressID: emailAddressID,
155
168
  emailID,
156
169
  senderID,
157
170
  external: false,
@@ -36,7 +36,7 @@ export default class RepairChannelEmailCountsWorkflow extends Workflow {
36
36
  for (const iterator of mailboxes) {
37
37
  start = iterator.mailboxID;
38
38
 
39
- await db.mailboxEmails.where(iterator, (p) => (x) => x.mailboxID === p.mailboxID)
39
+ await db.channelEmails.where(iterator, (p) => (x) => x.mailboxID === p.mailboxID)
40
40
  .update(void 0, (p) => (x) => ({
41
41
  isThread: x.email.parentID === null ? true : false,
42
42
  datePublished: Sql.cast.asDateTime( x.email.status === "published" ? x.email.dateSent : null ) as any,
@@ -56,7 +56,7 @@ export default class RepairEmailCountsWorkflow extends Workflow<{ mailboxID? }>
56
56
  const q = db.emails
57
57
  .where({ start, mailboxID }, (p) => (x) => x.emailID > p.start
58
58
  && x.threadID === null
59
- && x.mailboxes.some((t) => t.mailboxID === p.mailboxID)
59
+ && x.mailboxContactEvents.some((t) => t.mailboxID === p.mailboxID)
60
60
  && x.lastReplyID === null
61
61
  );
62
62
  const list = await q
@@ -173,7 +173,7 @@ export default class RepairEmailTagsWorkflow extends Workflow<{ mailboxID? }> {
173
173
 
174
174
  // get last updated...
175
175
  const last = await db.emails.where({ tagID, mailboxID}, (p) => (x) =>
176
- x.mailboxes.some((m) => m.mailboxID === p.mailboxID)
176
+ x.mailboxContactEvents.some((m) => m.mailboxID === p.mailboxID)
177
177
  && x.emailTags.some((t) => t.tagID === p.tagID)
178
178
  ).orderByDescending(void 0, (p) => (x) => x.dateCreated).first();
179
179