backend-manager 5.9.19 → 5.9.21
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.
- package/package.json +1 -1
- package/src/manager/events/cron/daily/marketing-prune.js +121 -29
- package/src/manager/libraries/email/constants.js +2 -2
- package/src/manager/libraries/email/data/disposable-domains.json +49 -0
- package/src/manager/libraries/email/marketing/index.js +27 -27
- package/src/test/fixtures/firebase-project/.temp/test-mode.json +1 -1
- package/src/test/fixtures/firebase-project/database-debug.log +8 -8
- package/src/test/fixtures/firebase-project/firestore-debug.log +51 -61
- package/src/test/fixtures/firebase-project/pubsub-debug.log +3 -3
package/package.json
CHANGED
|
@@ -5,12 +5,14 @@
|
|
|
5
5
|
* Two-stage process using SSOT segment keys from constants.js:
|
|
6
6
|
*
|
|
7
7
|
* Stage 1 (engagement_inactive_5m):
|
|
8
|
-
* → Send re-engagement email via sendCampaign
|
|
8
|
+
* → Send re-engagement email via sendCampaign (brand-scoped internally)
|
|
9
9
|
* → Excludes engagement_inactive_6m (those get pruned instead)
|
|
10
10
|
*
|
|
11
11
|
* Stage 2 (engagement_inactive_6m):
|
|
12
|
-
* →
|
|
13
|
-
* →
|
|
12
|
+
* → Create brand-scoped temp segment via createBrandScopedSegment
|
|
13
|
+
* → Export contacts, exclude paying customers, bulk delete
|
|
14
|
+
* → Log deleted emails to Firestore for recoverability
|
|
15
|
+
* → Remove from Beehiiv (same emails)
|
|
14
16
|
*
|
|
15
17
|
* Segment keys are resolved to provider-specific IDs at runtime.
|
|
16
18
|
* Requires marketing.prune.enabled = true in backend-manager-config.json.
|
|
@@ -19,8 +21,7 @@
|
|
|
19
21
|
*/
|
|
20
22
|
const sendgridProvider = require('../../../libraries/email/providers/sendgrid.js');
|
|
21
23
|
|
|
22
|
-
module.exports = async ({ Manager, assistant }) => {
|
|
23
|
-
// Only run on the 1st of the month
|
|
24
|
+
module.exports = async ({ Manager, assistant, libraries }) => {
|
|
24
25
|
if (new Date().getDate() !== 1) {
|
|
25
26
|
return;
|
|
26
27
|
}
|
|
@@ -30,20 +31,29 @@ module.exports = async ({ Manager, assistant }) => {
|
|
|
30
31
|
return;
|
|
31
32
|
}
|
|
32
33
|
|
|
33
|
-
|
|
34
|
+
const brand = Manager.config?.brand;
|
|
35
|
+
|
|
36
|
+
assistant.log(`Marketing prune: Starting monthly prune cycle for ${brand?.id || 'unknown'}`);
|
|
34
37
|
|
|
35
38
|
// --- Stage 1: Re-engagement email ---
|
|
36
|
-
|
|
39
|
+
try {
|
|
40
|
+
await stageReengage(Manager, assistant);
|
|
41
|
+
} catch (e) {
|
|
42
|
+
assistant.error('Marketing prune: Stage 1 (re-engagement) failed:', e.message);
|
|
43
|
+
}
|
|
37
44
|
|
|
38
45
|
// --- Stage 2: Delete inactive contacts ---
|
|
39
|
-
await stagePrune(Manager, assistant);
|
|
46
|
+
await stagePrune(Manager, assistant, libraries);
|
|
40
47
|
|
|
41
|
-
assistant.log(
|
|
48
|
+
assistant.log(`Marketing prune: Completed for ${brand?.id || 'unknown'}`);
|
|
42
49
|
};
|
|
43
50
|
|
|
44
51
|
/**
|
|
45
52
|
* Stage 1: Send re-engagement email to contacts inactive 5+ months
|
|
46
|
-
* (excluding 6+ months — those get pruned in stage 2)
|
|
53
|
+
* (excluding 6+ months — those get pruned in stage 2).
|
|
54
|
+
*
|
|
55
|
+
* sendCampaign handles brand-scoping internally via _resolveAudience →
|
|
56
|
+
* createBrandScopedSegment, so this stage is already brand-safe.
|
|
47
57
|
*/
|
|
48
58
|
async function stageReengage(Manager, assistant) {
|
|
49
59
|
assistant.log('Marketing prune: Stage 1 — Re-engagement');
|
|
@@ -76,26 +86,51 @@ async function stageReengage(Manager, assistant) {
|
|
|
76
86
|
}
|
|
77
87
|
|
|
78
88
|
/**
|
|
79
|
-
* Stage 2: Delete contacts inactive 6+ months.
|
|
80
|
-
*
|
|
81
|
-
*
|
|
89
|
+
* Stage 2: Delete contacts inactive 6+ months (brand-scoped).
|
|
90
|
+
*
|
|
91
|
+
* Uses createBrandScopedSegment to AND the engagement_inactive_6m query
|
|
92
|
+
* with brand_id = '<brandId>' — each brand only prunes its own contacts.
|
|
93
|
+
* Excludes paying customers (subscription_paid segment).
|
|
94
|
+
* Logs deleted emails to Firestore for recoverability.
|
|
82
95
|
*/
|
|
83
|
-
async function stagePrune(Manager, assistant) {
|
|
96
|
+
async function stagePrune(Manager, assistant, libraries) {
|
|
84
97
|
assistant.log('Marketing prune: Stage 2 — Prune');
|
|
85
98
|
|
|
86
99
|
const marketing = Manager.config?.marketing || {};
|
|
100
|
+
const brand = Manager.config?.brand;
|
|
101
|
+
const { admin } = libraries;
|
|
87
102
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
103
|
+
if (!brand?.id) {
|
|
104
|
+
assistant.error('Marketing prune: brand.id is missing — aborting to prevent account-global deletion');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
92
107
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
108
|
+
if (marketing.campaigns?.enabled === false || !process.env.SENDGRID_API_KEY) {
|
|
109
|
+
assistant.log('Marketing prune: SendGrid not configured, skipping');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const segmentIdMap = await sendgridProvider.resolveSegmentIds();
|
|
114
|
+
const pruneSegmentId = segmentIdMap['engagement_inactive_6m'];
|
|
97
115
|
|
|
98
|
-
|
|
116
|
+
if (!pruneSegmentId) {
|
|
117
|
+
assistant.error('Marketing prune: engagement_inactive_6m segment not found in SendGrid');
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Brand-scope the prune segment
|
|
122
|
+
const tempPrune = await sendgridProvider.createBrandScopedSegment(
|
|
123
|
+
[pruneSegmentId],
|
|
124
|
+
brand.id,
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
if (!tempPrune) {
|
|
128
|
+
assistant.error('Marketing prune: Failed to create brand-scoped prune segment');
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
try {
|
|
133
|
+
const exportResult = await sendgridProvider.getSegmentContacts(tempPrune.segmentId, 180000);
|
|
99
134
|
|
|
100
135
|
if (!exportResult.success) {
|
|
101
136
|
assistant.error('Marketing prune: Failed to export segment:', exportResult.error);
|
|
@@ -107,9 +142,45 @@ async function stagePrune(Manager, assistant) {
|
|
|
107
142
|
return;
|
|
108
143
|
}
|
|
109
144
|
|
|
110
|
-
|
|
145
|
+
// Exclude paying customers
|
|
146
|
+
let contactsToPrune = exportResult.contacts;
|
|
147
|
+
let skippedPaid = 0;
|
|
148
|
+
|
|
149
|
+
const paidSegmentId = segmentIdMap['subscription_paid'];
|
|
150
|
+
|
|
151
|
+
if (paidSegmentId) {
|
|
152
|
+
const tempPaid = await sendgridProvider.createBrandScopedSegment(
|
|
153
|
+
[paidSegmentId],
|
|
154
|
+
brand.id,
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
if (tempPaid) {
|
|
158
|
+
try {
|
|
159
|
+
const paidExport = await sendgridProvider.getSegmentContacts(tempPaid.segmentId, 180000);
|
|
160
|
+
|
|
161
|
+
if (paidExport.success && paidExport.contacts.length > 0) {
|
|
162
|
+
const paidEmails = new Set(paidExport.contacts.map(c => c.email));
|
|
163
|
+
contactsToPrune = contactsToPrune.filter(c => !paidEmails.has(c.email));
|
|
164
|
+
skippedPaid = exportResult.contacts.length - contactsToPrune.length;
|
|
165
|
+
assistant.log(`Marketing prune: Excluded ${skippedPaid} paying customers`);
|
|
166
|
+
}
|
|
167
|
+
} finally {
|
|
168
|
+
await tempPaid.cleanup();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (contactsToPrune.length === 0) {
|
|
174
|
+
assistant.log('Marketing prune: No contacts to prune after paid exclusion');
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const emails = contactsToPrune.map(c => c.email).filter(Boolean);
|
|
179
|
+
|
|
180
|
+
assistant.log(`Marketing prune: Deleting ${contactsToPrune.length} contacts for ${brand.id}`);
|
|
111
181
|
|
|
112
|
-
|
|
182
|
+
// Delete from SendGrid
|
|
183
|
+
const ids = contactsToPrune.map(c => c.id).filter(Boolean);
|
|
113
184
|
let totalDeleted = 0;
|
|
114
185
|
|
|
115
186
|
for (let i = 0; i < ids.length; i += 100) {
|
|
@@ -123,18 +194,39 @@ async function stagePrune(Manager, assistant) {
|
|
|
123
194
|
}
|
|
124
195
|
}
|
|
125
196
|
|
|
126
|
-
assistant.log(`Marketing prune: Deleted ${totalDeleted} SendGrid contacts`);
|
|
197
|
+
assistant.log(`Marketing prune: Deleted ${totalDeleted} SendGrid contacts for ${brand.id}`);
|
|
127
198
|
|
|
128
|
-
//
|
|
199
|
+
// Remove from Beehiiv (before Firestore log — a failed log shouldn't skip BH cleanup)
|
|
129
200
|
if (marketing.newsletter?.enabled !== false && process.env.BEEHIIV_API_KEY) {
|
|
130
201
|
const beehiivProvider = require('../../../libraries/email/providers/beehiiv.js');
|
|
131
|
-
const emails = exportResult.contacts.map(c => c.email).filter(Boolean);
|
|
132
202
|
|
|
133
|
-
assistant.log(`Marketing prune: Removing ${emails.length} contacts from Beehiiv`);
|
|
203
|
+
assistant.log(`Marketing prune: Removing ${emails.length} contacts from Beehiiv for ${brand.id}`);
|
|
134
204
|
|
|
135
205
|
await Promise.allSettled(
|
|
136
206
|
emails.map(email => beehiivProvider.removeContact(email))
|
|
137
207
|
);
|
|
138
208
|
}
|
|
209
|
+
|
|
210
|
+
// Log to Firestore for recoverability (non-fatal — don't abort if write fails)
|
|
211
|
+
try {
|
|
212
|
+
const now = new Date();
|
|
213
|
+
const logKey = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}`;
|
|
214
|
+
|
|
215
|
+
await admin.firestore()
|
|
216
|
+
.doc(`marketing-prune-logs/${brand.id}/runs/${logKey}`)
|
|
217
|
+
.set({
|
|
218
|
+
brandId: brand.id,
|
|
219
|
+
date: now.toISOString(),
|
|
220
|
+
count: emails.length,
|
|
221
|
+
emails,
|
|
222
|
+
skippedPaid,
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
assistant.log(`Marketing prune: Logged ${emails.length} pruned emails to Firestore (${logKey})`);
|
|
226
|
+
} catch (e) {
|
|
227
|
+
assistant.error('Marketing prune: Failed to write Firestore log:', e.message);
|
|
228
|
+
}
|
|
229
|
+
} finally {
|
|
230
|
+
await tempPrune.cleanup();
|
|
139
231
|
}
|
|
140
232
|
}
|
|
@@ -317,8 +317,8 @@ const SEGMENTS = {
|
|
|
317
317
|
engagement_active_30d: { display: 'Engaged Last 30 Days', conditions: [{ type: 'engagement', op: 'opened_or_clicked', value: '30d' }] },
|
|
318
318
|
engagement_active_90d: { display: 'Engaged Last 90 Days', conditions: [{ type: 'engagement', op: 'opened_or_clicked', value: '90d' }] },
|
|
319
319
|
engagement_inactive_90d: { display: 'Inactive 90+ Days', conditions: [{ type: 'engagement', op: 'not_opened', value: '90d' }] },
|
|
320
|
-
engagement_inactive_5m: { display: 'Inactive 5+ Months', conditions: [{ type: 'engagement', op: '
|
|
321
|
-
engagement_inactive_6m: { display: 'Inactive 6+ Months', conditions: [{ type: 'engagement', op: '
|
|
320
|
+
engagement_inactive_5m: { display: 'Inactive 5+ Months', conditions: [{ type: 'engagement', op: 'not_opened_or_clicked', value: '150d' }, { type: 'engagement', op: 'received_gte', value: '5' }, { field: 'user_metadata_signup_date', op: 'not_within', value: '150d' }] },
|
|
321
|
+
engagement_inactive_6m: { display: 'Inactive 6+ Months', conditions: [{ type: 'engagement', op: 'not_opened_or_clicked', value: '180d' }, { type: 'engagement', op: 'received_gte', value: '5' }, { field: 'user_metadata_signup_date', op: 'not_within', value: '180d' }] },
|
|
322
322
|
|
|
323
323
|
// Test
|
|
324
324
|
test_admin: { display: 'Test Admin', conditions: [{ type: 'contact', op: 'email_is', value: 'hello@itwcreativeworks.com' }] },
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"01022.hk",
|
|
16
16
|
"01130.hk",
|
|
17
17
|
"027168.com",
|
|
18
|
+
"045692.xyz",
|
|
18
19
|
"062e.com",
|
|
19
20
|
"0815.ru",
|
|
20
21
|
"0815.su",
|
|
@@ -211,6 +212,7 @@
|
|
|
211
212
|
"3littlemiracles.com",
|
|
212
213
|
"3mail.ga",
|
|
213
214
|
"3trtretgfrfe.tk",
|
|
215
|
+
"3xu.studio",
|
|
214
216
|
"4-n.us",
|
|
215
217
|
"401010.xyz",
|
|
216
218
|
"4057.com",
|
|
@@ -521,6 +523,7 @@
|
|
|
521
523
|
"aligamel.com",
|
|
522
524
|
"alightmotion.cloud",
|
|
523
525
|
"alightmotion.id",
|
|
526
|
+
"alightmotion.top",
|
|
524
527
|
"aligroup.uk",
|
|
525
528
|
"alilot.com",
|
|
526
529
|
"alin.cc.cd",
|
|
@@ -720,6 +723,7 @@
|
|
|
720
723
|
"ashnkarsh.life",
|
|
721
724
|
"asia-hq.jo3.org",
|
|
722
725
|
"asimarif.com",
|
|
726
|
+
"asistx.net",
|
|
723
727
|
"ask-mail.com",
|
|
724
728
|
"asleepity.com",
|
|
725
729
|
"asorent.com",
|
|
@@ -749,6 +753,7 @@
|
|
|
749
753
|
"autofixmax.com",
|
|
750
754
|
"automisly.org",
|
|
751
755
|
"automizelymail.info",
|
|
756
|
+
"automizly.net",
|
|
752
757
|
"autorobotica.com",
|
|
753
758
|
"autosouvenir39.ru",
|
|
754
759
|
"autotwollow.com",
|
|
@@ -906,6 +911,7 @@
|
|
|
906
911
|
"bahlill.cfd",
|
|
907
912
|
"baicai1145.online",
|
|
908
913
|
"baicai1145.shop",
|
|
914
|
+
"baidoxe.com",
|
|
909
915
|
"baileybridge.org",
|
|
910
916
|
"baiyucraft.sbs",
|
|
911
917
|
"baizoto.shop",
|
|
@@ -932,6 +938,7 @@
|
|
|
932
938
|
"baserda.net",
|
|
933
939
|
"basketrise.com",
|
|
934
940
|
"basscode.org",
|
|
941
|
+
"batdongsanhatinh.org",
|
|
935
942
|
"bathdf.co.uk",
|
|
936
943
|
"batiinsaat.net",
|
|
937
944
|
"bauwerke-online.com",
|
|
@@ -1012,6 +1019,7 @@
|
|
|
1012
1019
|
"bhuxp.org",
|
|
1013
1020
|
"bidourlnks.com",
|
|
1014
1021
|
"big1.us",
|
|
1022
|
+
"bigmail.lol",
|
|
1015
1023
|
"bigprofessor.so",
|
|
1016
1024
|
"bigstring.com",
|
|
1017
1025
|
"bigwhoop.co.za",
|
|
@@ -1095,6 +1103,7 @@
|
|
|
1095
1103
|
"borged.com",
|
|
1096
1104
|
"borged.net",
|
|
1097
1105
|
"borged.org",
|
|
1106
|
+
"bosakun.com",
|
|
1098
1107
|
"bot.cd",
|
|
1099
1108
|
"bot.nu",
|
|
1100
1109
|
"botasky.eu.cc",
|
|
@@ -1160,6 +1169,7 @@
|
|
|
1160
1169
|
"bugmenever.com",
|
|
1161
1170
|
"bugmenot.com",
|
|
1162
1171
|
"bukanimers.com",
|
|
1172
|
+
"bukatv8.com",
|
|
1163
1173
|
"bukhariansiddur.com",
|
|
1164
1174
|
"bulrushpress.com",
|
|
1165
1175
|
"bultoc.com",
|
|
@@ -1169,6 +1179,7 @@
|
|
|
1169
1179
|
"bunchofidiots.com",
|
|
1170
1180
|
"bund.us",
|
|
1171
1181
|
"bundes-li.ga",
|
|
1182
|
+
"bunmail.one",
|
|
1172
1183
|
"bunsenhoneydew.com",
|
|
1173
1184
|
"burangir.com",
|
|
1174
1185
|
"burnermail.bond",
|
|
@@ -1206,6 +1217,7 @@
|
|
|
1206
1217
|
"bytonf.com",
|
|
1207
1218
|
"c-eric.fr.nf",
|
|
1208
1219
|
"c-newstv.ru",
|
|
1220
|
+
"c-pkk.icu",
|
|
1209
1221
|
"c-tta.top",
|
|
1210
1222
|
"c14.mobi",
|
|
1211
1223
|
"c1ph3r.xyz",
|
|
@@ -1256,6 +1268,7 @@
|
|
|
1256
1268
|
"caqcut.top",
|
|
1257
1269
|
"car101.pro",
|
|
1258
1270
|
"carbtc.net",
|
|
1271
|
+
"care-breath.com",
|
|
1259
1272
|
"carpin.org",
|
|
1260
1273
|
"cars2.club",
|
|
1261
1274
|
"carsencyclopedia.com",
|
|
@@ -1274,6 +1287,7 @@
|
|
|
1274
1287
|
"cazlg.com",
|
|
1275
1288
|
"cbair.com",
|
|
1276
1289
|
"cbasosbr.top",
|
|
1290
|
+
"cbdol.mx",
|
|
1277
1291
|
"cbes.net",
|
|
1278
1292
|
"cbty.ru",
|
|
1279
1293
|
"cbty.store",
|
|
@@ -1366,6 +1380,7 @@
|
|
|
1366
1380
|
"chong-mail.com",
|
|
1367
1381
|
"chong-mail.net",
|
|
1368
1382
|
"chong-mail.org",
|
|
1383
|
+
"chongqilai.cc",
|
|
1369
1384
|
"chophim.com",
|
|
1370
1385
|
"chosenx.com",
|
|
1371
1386
|
"chotgo.com",
|
|
@@ -1572,6 +1587,7 @@
|
|
|
1572
1587
|
"currentmail.com",
|
|
1573
1588
|
"curryworld.de",
|
|
1574
1589
|
"cursor13402.xyz",
|
|
1590
|
+
"cuscuscuspen.life",
|
|
1575
1591
|
"cust.in",
|
|
1576
1592
|
"cutefrogs.xyz",
|
|
1577
1593
|
"cutevi.us",
|
|
@@ -1819,6 +1835,7 @@
|
|
|
1819
1835
|
"dkz.opik.net",
|
|
1820
1836
|
"dldweb.info",
|
|
1821
1837
|
"dlemail.ru",
|
|
1838
|
+
"dmail.one",
|
|
1822
1839
|
"dmarc.ro",
|
|
1823
1840
|
"dmcelements.org",
|
|
1824
1841
|
"dmts.fr.nf",
|
|
@@ -1969,6 +1986,7 @@
|
|
|
1969
1986
|
"dwse.edu.pl",
|
|
1970
1987
|
"dwseal.com",
|
|
1971
1988
|
"dyceroprojects.com",
|
|
1989
|
+
"dyclsr.xyz",
|
|
1972
1990
|
"dyebkj.eu.cc",
|
|
1973
1991
|
"dyera.studio",
|
|
1974
1992
|
"dyfgiavcrw.eu.cc",
|
|
@@ -2058,6 +2076,7 @@
|
|
|
2058
2076
|
"eligou.store",
|
|
2059
2077
|
"elitevipatlantamodels.com",
|
|
2060
2078
|
"elixora.cfd",
|
|
2079
|
+
"eljawir.com",
|
|
2061
2080
|
"elki-mkzn.ru",
|
|
2062
2081
|
"elobits.com",
|
|
2063
2082
|
"elondonteam.work.gd",
|
|
@@ -2368,6 +2387,7 @@
|
|
|
2368
2387
|
"fastchrysler.com",
|
|
2369
2388
|
"fasternet.biz",
|
|
2370
2389
|
"fastestflex.com",
|
|
2390
|
+
"fastinbox.one",
|
|
2371
2391
|
"fastkawasaki.com",
|
|
2372
2392
|
"fastmail.edu.pl",
|
|
2373
2393
|
"fastmazda.com",
|
|
@@ -2443,6 +2463,7 @@
|
|
|
2443
2463
|
"filzmail.com",
|
|
2444
2464
|
"finacenter.com",
|
|
2445
2465
|
"findemail.info",
|
|
2466
|
+
"findids.net",
|
|
2446
2467
|
"findmeghana.org",
|
|
2447
2468
|
"findu.pl",
|
|
2448
2469
|
"finews.biz",
|
|
@@ -2577,6 +2598,7 @@
|
|
|
2577
2598
|
"frostypeak.info",
|
|
2578
2599
|
"fruitservice.xyz",
|
|
2579
2600
|
"frwdmail.com",
|
|
2601
|
+
"frza.me",
|
|
2580
2602
|
"fsercure.online",
|
|
2581
2603
|
"fsitip.com",
|
|
2582
2604
|
"fthcapital.com",
|
|
@@ -2787,6 +2809,7 @@
|
|
|
2787
2809
|
"gladogmi.fr.nf",
|
|
2788
2810
|
"glaventra.cfd",
|
|
2789
2811
|
"glaviu.icu",
|
|
2812
|
+
"glcspp.top",
|
|
2790
2813
|
"gli.dpdns.org",
|
|
2791
2814
|
"glitch.sx",
|
|
2792
2815
|
"globalbizflow.com",
|
|
@@ -2809,6 +2832,7 @@
|
|
|
2809
2832
|
"gmailxsn.space",
|
|
2810
2833
|
"gmatch.org",
|
|
2811
2834
|
"gmeenramy.com",
|
|
2835
|
+
"gmel.biz.id",
|
|
2812
2836
|
"gmel.my.id",
|
|
2813
2837
|
"gmells.com",
|
|
2814
2838
|
"gmial.com",
|
|
@@ -2970,6 +2994,7 @@
|
|
|
2970
2994
|
"gptmail.us.ci",
|
|
2971
2995
|
"gptmail.webredirect.org",
|
|
2972
2996
|
"gptworkone.dev",
|
|
2997
|
+
"gpxmail.win",
|
|
2973
2998
|
"grabafilafoundation.org",
|
|
2974
2999
|
"gracetvglobal.com",
|
|
2975
3000
|
"grandmamail.com",
|
|
@@ -3663,6 +3688,7 @@
|
|
|
3663
3688
|
"kadokawa.tk",
|
|
3664
3689
|
"kaengu.ru",
|
|
3665
3690
|
"kagi.be",
|
|
3691
|
+
"kajaib.social",
|
|
3666
3692
|
"kaka0.kr",
|
|
3667
3693
|
"kakadua.net",
|
|
3668
3694
|
"kakao-mail.com",
|
|
@@ -3901,6 +3927,7 @@
|
|
|
3901
3927
|
"lazerbade.store",
|
|
3902
3928
|
"lazyinbox.com",
|
|
3903
3929
|
"lazyinbox.us",
|
|
3930
|
+
"lbrmail666.site",
|
|
3904
3931
|
"lcvfdvynb.top",
|
|
3905
3932
|
"ldaho.biz",
|
|
3906
3933
|
"ldkll.cn",
|
|
@@ -4294,6 +4321,7 @@
|
|
|
4294
4321
|
"mailpull.com",
|
|
4295
4322
|
"mailquack.com",
|
|
4296
4323
|
"mailrock.biz",
|
|
4324
|
+
"mailrun.one",
|
|
4297
4325
|
"mailsa.biz.id",
|
|
4298
4326
|
"mailsa.my.id",
|
|
4299
4327
|
"mailsac.com",
|
|
@@ -4502,6 +4530,7 @@
|
|
|
4502
4530
|
"misterpinball.de",
|
|
4503
4531
|
"mitico.org",
|
|
4504
4532
|
"mitrabisa.com",
|
|
4533
|
+
"mitraprem.online",
|
|
4505
4534
|
"miucce.com",
|
|
4506
4535
|
"miwacle.com",
|
|
4507
4536
|
"mixmail.site",
|
|
@@ -5057,6 +5086,7 @@
|
|
|
5057
5086
|
"nubescontrol.com",
|
|
5058
5087
|
"nucleant.org",
|
|
5059
5088
|
"nulla.de5.net",
|
|
5089
|
+
"nullbox.asia",
|
|
5060
5090
|
"nullbox.info",
|
|
5061
5091
|
"nuoifb.com",
|
|
5062
5092
|
"nuox.eu.org",
|
|
@@ -5089,6 +5119,7 @@
|
|
|
5089
5119
|
"obobbo.com",
|
|
5090
5120
|
"oborudovanieizturcii.ru",
|
|
5091
5121
|
"obxpestcontrol.com",
|
|
5122
|
+
"oceva.site",
|
|
5092
5123
|
"octovie.com",
|
|
5093
5124
|
"odaymail.com",
|
|
5094
5125
|
"odeask.com",
|
|
@@ -5121,6 +5152,7 @@
|
|
|
5121
5152
|
"oky.ovh",
|
|
5122
5153
|
"okzk.com",
|
|
5123
5154
|
"oldao.com",
|
|
5155
|
+
"oliespace.id",
|
|
5124
5156
|
"olimp-case.ru",
|
|
5125
5157
|
"olisup.cyou",
|
|
5126
5158
|
"oliviadiffuser.store",
|
|
@@ -5205,6 +5237,7 @@
|
|
|
5205
5237
|
"ordinaryamerican.net",
|
|
5206
5238
|
"ordite.com",
|
|
5207
5239
|
"oreidresume.com",
|
|
5240
|
+
"orgmail.pro",
|
|
5208
5241
|
"orgmbx.cc",
|
|
5209
5242
|
"oroki.de",
|
|
5210
5243
|
"oronny.com",
|
|
@@ -5300,6 +5333,7 @@
|
|
|
5300
5333
|
"pcbb.lol",
|
|
5301
5334
|
"pckage.com",
|
|
5302
5335
|
"pdf-cutter.com",
|
|
5336
|
+
"pdood.com",
|
|
5303
5337
|
"pe.hu",
|
|
5304
5338
|
"peakinbox.net",
|
|
5305
5339
|
"pecinan.com",
|
|
@@ -5493,6 +5527,7 @@
|
|
|
5493
5527
|
"priyomail.us",
|
|
5494
5528
|
"priyor.com",
|
|
5495
5529
|
"priyp.com",
|
|
5530
|
+
"prkmail.xyz",
|
|
5496
5531
|
"pro-tag.org",
|
|
5497
5532
|
"pro5g.com",
|
|
5498
5533
|
"procrackers.com",
|
|
@@ -5545,6 +5580,7 @@
|
|
|
5545
5580
|
"put2.net",
|
|
5546
5581
|
"puttanamaiala.tk",
|
|
5547
5582
|
"putthisinyourspamdatabase.com",
|
|
5583
|
+
"puxa.top",
|
|
5548
5584
|
"pvnmax.space",
|
|
5549
5585
|
"pwpwa.com",
|
|
5550
5586
|
"pwrby.com",
|
|
@@ -5653,6 +5689,7 @@
|
|
|
5653
5689
|
"re-gister.com",
|
|
5654
5690
|
"reality-concept.club",
|
|
5655
5691
|
"reallymymail.com",
|
|
5692
|
+
"realmail.co",
|
|
5656
5693
|
"realman.mywire.org",
|
|
5657
5694
|
"realmka.io",
|
|
5658
5695
|
"realquickemail.com",
|
|
@@ -5811,6 +5848,7 @@
|
|
|
5811
5848
|
"sad23321adja.cn",
|
|
5812
5849
|
"sadfg.indevs.in",
|
|
5813
5850
|
"sadrain.shop",
|
|
5851
|
+
"sads-ads-awe.top",
|
|
5814
5852
|
"saeoil.com",
|
|
5815
5853
|
"safaat.cf",
|
|
5816
5854
|
"safermail.info",
|
|
@@ -5852,6 +5890,7 @@
|
|
|
5852
5890
|
"saungadaid.pro",
|
|
5853
5891
|
"sausen.com",
|
|
5854
5892
|
"save4now.com",
|
|
5893
|
+
"savemydinar.com",
|
|
5855
5894
|
"savests.com",
|
|
5856
5895
|
"say0.com",
|
|
5857
5896
|
"saynotospams.com",
|
|
@@ -6100,6 +6139,7 @@
|
|
|
6100
6139
|
"snapbx.com",
|
|
6101
6140
|
"snapmail.cc",
|
|
6102
6141
|
"snapmail.site",
|
|
6142
|
+
"snapmail.xyz",
|
|
6103
6143
|
"snapwet.com",
|
|
6104
6144
|
"sneakmail.de",
|
|
6105
6145
|
"snece.com",
|
|
@@ -6582,6 +6622,7 @@
|
|
|
6582
6622
|
"tevstart.com",
|
|
6583
6623
|
"texify.online",
|
|
6584
6624
|
"tgduck.com",
|
|
6625
|
+
"thaihp.net",
|
|
6585
6626
|
"thaitudang.xyz",
|
|
6586
6627
|
"thalarex.cfd",
|
|
6587
6628
|
"thameschamberorchestra.co.uk",
|
|
@@ -6742,6 +6783,7 @@
|
|
|
6742
6783
|
"tokenmail.de",
|
|
6743
6784
|
"tokfly.org",
|
|
6744
6785
|
"tokmail.net",
|
|
6786
|
+
"tokobibit.co",
|
|
6745
6787
|
"tokyo112.top",
|
|
6746
6788
|
"tokyoflarex.tokyo",
|
|
6747
6789
|
"tommyfommy.site",
|
|
@@ -6770,6 +6812,7 @@
|
|
|
6770
6812
|
"topren.cyou",
|
|
6771
6813
|
"topren.top",
|
|
6772
6814
|
"toprumours.com",
|
|
6815
|
+
"topupgg.app",
|
|
6773
6816
|
"topvu.net",
|
|
6774
6817
|
"tormail.org",
|
|
6775
6818
|
"torrent411.fr.nf",
|
|
@@ -7186,6 +7229,8 @@
|
|
|
7186
7229
|
"voerpemww.click",
|
|
7187
7230
|
"voicesforchangeinc.org",
|
|
7188
7231
|
"voidbay.com",
|
|
7232
|
+
"voidmail.one",
|
|
7233
|
+
"voidpop.win",
|
|
7189
7234
|
"volaj.com",
|
|
7190
7235
|
"volku.org",
|
|
7191
7236
|
"voltaer.com",
|
|
@@ -7238,6 +7283,7 @@
|
|
|
7238
7283
|
"walkmail.net",
|
|
7239
7284
|
"walkmail.ru",
|
|
7240
7285
|
"wallm.com",
|
|
7286
|
+
"wanai.biz.id",
|
|
7241
7287
|
"wanaofamouscar.com",
|
|
7242
7288
|
"wanko.be",
|
|
7243
7289
|
"wanting2work.org.uk",
|
|
@@ -7628,6 +7674,7 @@
|
|
|
7628
7674
|
"ysgdjd.fun",
|
|
7629
7675
|
"yshdnhh.click",
|
|
7630
7676
|
"yspend.com",
|
|
7677
|
+
"ysuhd.art",
|
|
7631
7678
|
"yszmy.cn",
|
|
7632
7679
|
"ytkj.us.ci",
|
|
7633
7680
|
"ytnhy.com",
|
|
@@ -7668,6 +7715,7 @@
|
|
|
7668
7715
|
"zainmax.net",
|
|
7669
7716
|
"zaktouni.fr",
|
|
7670
7717
|
"zalesie.net.pl",
|
|
7718
|
+
"zapmail.one",
|
|
7671
7719
|
"zarabotokdoma11.ru",
|
|
7672
7720
|
"zarkbin.store",
|
|
7673
7721
|
"zasod.com",
|
|
@@ -7713,6 +7761,7 @@
|
|
|
7713
7761
|
"zipcad.com",
|
|
7714
7762
|
"zipcatfish.com",
|
|
7715
7763
|
"ziping.me",
|
|
7764
|
+
"zipmail.one",
|
|
7716
7765
|
"zipo1.gq",
|
|
7717
7766
|
"zippymail.info",
|
|
7718
7767
|
"zipsendtest.com",
|
|
@@ -505,39 +505,39 @@ async function _sendCampaignSendGrid(Manager, settings, contentHtml) {
|
|
|
505
505
|
// --- Audience ---
|
|
506
506
|
const { sendTo, excludeSegments, cleanup } = await _resolveAudience(settings, brand);
|
|
507
507
|
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
508
|
+
try {
|
|
509
|
+
// --- Create Single Send ---
|
|
510
|
+
const createResult = await sendgridProvider.createSingleSend({
|
|
511
|
+
name: settings.name,
|
|
512
|
+
subject: settings.subject,
|
|
513
|
+
from,
|
|
514
|
+
sendTo,
|
|
515
|
+
excludeSegments,
|
|
516
|
+
asmGroupId: groupId,
|
|
517
|
+
categories,
|
|
518
|
+
htmlContent: rendered.html,
|
|
519
|
+
});
|
|
519
520
|
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
}
|
|
521
|
+
if (!createResult.success) {
|
|
522
|
+
return createResult;
|
|
523
|
+
}
|
|
524
524
|
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
}
|
|
525
|
+
// --- Schedule ---
|
|
526
|
+
if (!settings.sendAt) {
|
|
527
|
+
return { success: true, id: createResult.id, scheduled: false };
|
|
528
|
+
}
|
|
530
529
|
|
|
531
|
-
|
|
532
|
-
|
|
530
|
+
const sendAt = settings.sendAt === 'now' ? 'now' : new Date(settings.sendAt).toISOString();
|
|
531
|
+
const scheduleResult = await sendgridProvider.scheduleSingleSend(createResult.id, sendAt);
|
|
533
532
|
|
|
534
|
-
|
|
533
|
+
if (!scheduleResult.success) {
|
|
534
|
+
return { success: false, id: createResult.id, error: scheduleResult.error };
|
|
535
|
+
}
|
|
535
536
|
|
|
536
|
-
|
|
537
|
-
|
|
537
|
+
return { success: true, id: createResult.id, scheduled: true };
|
|
538
|
+
} finally {
|
|
539
|
+
await cleanup();
|
|
538
540
|
}
|
|
539
|
-
|
|
540
|
-
return { success: true, id: createResult.id, scheduled: true };
|
|
541
541
|
}
|
|
542
542
|
|
|
543
543
|
/**
|
|
@@ -2,11 +2,11 @@ WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
|
|
|
2
2
|
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by akka.util.Unsafe (file:/Users/ian/.cache/firebase/emulators/firebase-database-emulator-v4.11.2.jar)
|
|
3
3
|
WARNING: Please consider reporting this to the maintainers of class akka.util.Unsafe
|
|
4
4
|
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
04:14:42.031 [NamespaceSystem-akka.actor.default-dispatcher-4] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started
|
|
6
|
+
04:14:42.131 [main] INFO com.firebase.server.forge.App$ - Listening at 127.0.0.1:9000
|
|
7
|
+
04:14:51.750 [NamespaceSystem-akka.actor.default-dispatcher-4] INFO com.firebase.core.namespace.NamespaceActor - demo-backend-manager-default-rtdb successfully activated FBKV (SurveyIdle(0)) wait: 75ms, init: 0ms
|
|
8
|
+
04:14:51.778 [NamespaceSystem-blocking-namespace-operation-dispatcher-6] INFO com.firebase.core.namespace.StateManager - Namespace demo-backend-manager-default-rtdb status Active to Active
|
|
9
|
+
04:15:02.979 [Thread-0] INFO com.firebase.server.forge.App$ - Attempting graceful shutdown.
|
|
10
|
+
04:15:03.025 [NamespaceSystem-akka.actor.default-dispatcher-7] INFO com.firebase.core.namespace.Terminator$Terminator - 1 actors left to terminate: demo-backend-manager-default-rtdb
|
|
11
|
+
04:15:03.028 [NamespaceSystem-akka.actor.default-dispatcher-5] INFO com.firebase.core.namespace.NamespaceActor - stopped namespace actor for demo-backend-manager-default-rtdb
|
|
12
|
+
04:15:03.034 [Thread-0] INFO com.firebase.server.forge.App$ - Graceful shutdown complete.
|
|
@@ -2,7 +2,7 @@ WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
|
|
|
2
2
|
WARNING: sun.misc.Unsafe::allocateMemory has been called by io.netty.util.internal.PlatformDependent0$2 (file:/Users/ian/.cache/firebase/emulators/cloud-firestore-emulator-v1.21.0.jar)
|
|
3
3
|
WARNING: Please consider reporting this to the maintainers of class io.netty.util.internal.PlatformDependent0$2
|
|
4
4
|
WARNING: sun.misc.Unsafe::allocateMemory will be removed in a future release
|
|
5
|
-
Jun
|
|
5
|
+
Jun 27, 2026 4:14:40 AM com.google.cloud.datastore.emulator.firestore.websocket.WebSocketServer start
|
|
6
6
|
INFO: Started WebSocket server on ws://127.0.0.1:9150
|
|
7
7
|
|
|
8
8
|
API endpoint: http://127.0.0.1:8080
|
|
@@ -20,115 +20,105 @@ If you are running a Firestore in Datastore Mode project, run:
|
|
|
20
20
|
Note: Support for Datastore Mode is in preview. If you encounter any bugs please file at https://github.com/firebase/firebase-tools/issues.
|
|
21
21
|
Dev App Server is now running.
|
|
22
22
|
|
|
23
|
-
Jun
|
|
23
|
+
Jun 27, 2026 4:14:51 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
24
24
|
INFO: Detected non-HTTP/2 connection.
|
|
25
|
-
Jun
|
|
25
|
+
Jun 27, 2026 4:14:51 AM io.grpc.netty.TcpMetrics loadEpollInfo
|
|
26
26
|
INFO: Epoll available during static init of TcpMetrics:false
|
|
27
|
-
Jun
|
|
27
|
+
Jun 27, 2026 4:14:51 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
28
28
|
INFO: Detected HTTP/2 connection.
|
|
29
|
-
Jun
|
|
29
|
+
Jun 27, 2026 4:14:52 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
30
30
|
INFO: Detected HTTP/2 connection.
|
|
31
|
-
Jun
|
|
31
|
+
Jun 27, 2026 4:14:53 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
32
32
|
INFO: Detected HTTP/2 connection.
|
|
33
|
-
Jun
|
|
33
|
+
Jun 27, 2026 4:15:00 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
34
34
|
INFO: Detected HTTP/2 connection.
|
|
35
|
-
Jun
|
|
35
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
36
36
|
INFO: Detected HTTP/2 connection.
|
|
37
|
-
Jun
|
|
37
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
38
38
|
INFO: Detected HTTP/2 connection.
|
|
39
|
-
Jun
|
|
39
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
40
40
|
INFO: Detected HTTP/2 connection.
|
|
41
|
-
Jun
|
|
41
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
42
42
|
INFO: Detected HTTP/2 connection.
|
|
43
|
-
Jun
|
|
43
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
44
44
|
INFO: Detected HTTP/2 connection.
|
|
45
|
-
Jun
|
|
45
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
46
46
|
INFO: Detected HTTP/2 connection.
|
|
47
|
-
Jun
|
|
47
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
48
48
|
INFO: Detected HTTP/2 connection.
|
|
49
|
-
Jun
|
|
49
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
50
50
|
INFO: Detected HTTP/2 connection.
|
|
51
|
-
Jun
|
|
51
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
52
52
|
INFO: Detected HTTP/2 connection.
|
|
53
|
-
Jun
|
|
53
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
54
54
|
INFO: Detected HTTP/2 connection.
|
|
55
|
-
Jun
|
|
55
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
56
56
|
INFO: Detected HTTP/2 connection.
|
|
57
|
-
Jun
|
|
57
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
58
58
|
INFO: Detected HTTP/2 connection.
|
|
59
|
-
Jun
|
|
59
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
60
60
|
INFO: Detected HTTP/2 connection.
|
|
61
|
-
Jun
|
|
61
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
62
62
|
INFO: Detected HTTP/2 connection.
|
|
63
|
-
Jun
|
|
63
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
64
64
|
INFO: Detected HTTP/2 connection.
|
|
65
|
-
Jun
|
|
65
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
66
66
|
INFO: Detected HTTP/2 connection.
|
|
67
|
-
Jun
|
|
67
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
68
68
|
INFO: Detected HTTP/2 connection.
|
|
69
|
-
Jun
|
|
69
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
70
70
|
INFO: Detected HTTP/2 connection.
|
|
71
|
-
Jun
|
|
71
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
72
72
|
INFO: Detected HTTP/2 connection.
|
|
73
|
-
Jun
|
|
73
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
74
74
|
INFO: Detected HTTP/2 connection.
|
|
75
|
-
Jun
|
|
75
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
76
76
|
INFO: Detected HTTP/2 connection.
|
|
77
|
-
Jun
|
|
77
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
78
78
|
INFO: Detected HTTP/2 connection.
|
|
79
|
-
Jun
|
|
79
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
80
80
|
INFO: Detected HTTP/2 connection.
|
|
81
|
-
Jun
|
|
81
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
82
82
|
INFO: Detected HTTP/2 connection.
|
|
83
|
-
Jun
|
|
83
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
84
84
|
INFO: Detected HTTP/2 connection.
|
|
85
|
-
Jun
|
|
85
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
86
86
|
INFO: Detected HTTP/2 connection.
|
|
87
|
-
Jun
|
|
87
|
+
Jun 27, 2026 4:15:01 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
88
88
|
INFO: Detected HTTP/2 connection.
|
|
89
|
-
Jun
|
|
89
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
90
90
|
INFO: Detected HTTP/2 connection.
|
|
91
|
-
Jun
|
|
91
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
92
92
|
INFO: Detected HTTP/2 connection.
|
|
93
|
-
Jun
|
|
93
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
94
94
|
INFO: Detected HTTP/2 connection.
|
|
95
|
-
Jun
|
|
95
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
96
96
|
INFO: Detected HTTP/2 connection.
|
|
97
|
-
Jun
|
|
97
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
98
98
|
INFO: Detected HTTP/2 connection.
|
|
99
|
-
Jun
|
|
99
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
100
100
|
INFO: Detected HTTP/2 connection.
|
|
101
|
-
Jun
|
|
101
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
102
102
|
INFO: Detected HTTP/2 connection.
|
|
103
|
-
Jun
|
|
103
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
104
104
|
INFO: Detected HTTP/2 connection.
|
|
105
|
-
Jun
|
|
105
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
106
106
|
INFO: Detected HTTP/2 connection.
|
|
107
|
-
Jun
|
|
107
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
108
108
|
INFO: Detected HTTP/2 connection.
|
|
109
|
-
Jun
|
|
109
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
110
110
|
INFO: Detected HTTP/2 connection.
|
|
111
|
-
Jun
|
|
111
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
112
112
|
INFO: Detected HTTP/2 connection.
|
|
113
|
-
Jun
|
|
113
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
114
114
|
INFO: Detected HTTP/2 connection.
|
|
115
|
-
Jun
|
|
115
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
116
116
|
INFO: Detected HTTP/2 connection.
|
|
117
|
-
Jun
|
|
117
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
118
118
|
INFO: Detected HTTP/2 connection.
|
|
119
|
-
Jun
|
|
119
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
120
120
|
INFO: Detected HTTP/2 connection.
|
|
121
|
-
Jun
|
|
122
|
-
INFO: Detected HTTP/2 connection.
|
|
123
|
-
Jun 26, 2026 5:06:09 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
124
|
-
INFO: Detected HTTP/2 connection.
|
|
125
|
-
Jun 26, 2026 5:06:09 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
126
|
-
INFO: Detected HTTP/2 connection.
|
|
127
|
-
Jun 26, 2026 5:06:09 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
128
|
-
INFO: Detected HTTP/2 connection.
|
|
129
|
-
Jun 26, 2026 5:06:09 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
130
|
-
INFO: Detected HTTP/2 connection.
|
|
131
|
-
Jun 26, 2026 5:06:10 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
121
|
+
Jun 27, 2026 4:15:02 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
132
122
|
INFO: Detected HTTP/2 connection.
|
|
133
123
|
*** shutting down gRPC server since JVM is shutting down
|
|
134
124
|
*** server shut down
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
This is the Google Pub/Sub fake.
|
|
2
2
|
Implementation may be incomplete or differ from the real system.
|
|
3
|
-
Jun
|
|
3
|
+
Jun 27, 2026 4:14:45 AM com.google.cloud.pubsub.testing.v1.Main main
|
|
4
4
|
INFO: IAM integration is disabled. IAM policy methods and ACL checks are not supported
|
|
5
5
|
SLF4J(W): No SLF4J providers were found.
|
|
6
6
|
SLF4J(W): Defaulting to no-operation (NOP) logger implementation
|
|
@@ -9,9 +9,9 @@ WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
|
|
|
9
9
|
WARNING: sun.misc.Unsafe::allocateMemory has been called by io.netty.util.internal.PlatformDependent0$2 (file:/Users/ian/.cache/firebase/emulators/pubsub-emulator-0.8.33/pubsub-emulator/lib/cloud-pubsub-emulator-0.8.33-all.jar)
|
|
10
10
|
WARNING: Please consider reporting this to the maintainers of class io.netty.util.internal.PlatformDependent0$2
|
|
11
11
|
WARNING: sun.misc.Unsafe::allocateMemory will be removed in a future release
|
|
12
|
-
Jun
|
|
12
|
+
Jun 27, 2026 4:14:45 AM com.google.cloud.pubsub.testing.v1.Main main
|
|
13
13
|
INFO: Server started, listening on 8085
|
|
14
|
-
Jun
|
|
14
|
+
Jun 27, 2026 4:14:51 AM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
|
|
15
15
|
INFO: Detected HTTP/2 connection.
|
|
16
16
|
*** shutting down gRPC server since JVM is shutting down
|
|
17
17
|
*** server shut down
|