mailery 0.16.1 → 0.16.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.
package/dist/index.js CHANGED
@@ -269,6 +269,7 @@ var init_webhook_tolerance = __esm({
269
269
  var sendgrid_exports = {};
270
270
  __export(sendgrid_exports, {
271
271
  SendGridProvider: () => SendGridProvider,
272
+ normalizeSendGridMessageId: () => normalizeSendGridMessageId,
272
273
  normalizeWebhookVerificationKey: () => normalizeWebhookVerificationKey
273
274
  });
274
275
  function normalizeWebhookVerificationKey(input) {
@@ -298,13 +299,18 @@ ${PEM_FOOTER}
298
299
  }
299
300
  return pem;
300
301
  }
302
+ function normalizeSendGridMessageId(raw) {
303
+ const id = String(raw ?? "");
304
+ const marker = /\.(?:filter|recvd)\S*$/i.exec(id);
305
+ return marker ? id.slice(0, marker.index) : id;
306
+ }
301
307
  function normalizeSendGridEvent(e) {
302
308
  const type = mapEventType(e.event);
303
309
  if (!type) return null;
304
310
  return {
305
311
  type,
306
312
  providerEventId: String(e.sg_event_id ?? e["smtp-id"] ?? `${e.event}-${e.timestamp}-${e.email}`),
307
- providerMessageId: String(e.sg_message_id ?? e["smtp-id"] ?? ""),
313
+ providerMessageId: e.sg_message_id != null ? normalizeSendGridMessageId(e.sg_message_id) : String(e["smtp-id"] ?? ""),
308
314
  email: String(e.email ?? "").toLowerCase(),
309
315
  occurredAt: new Date(Number(e.timestamp) * 1e3),
310
316
  details: {
@@ -1741,11 +1747,20 @@ async function processWebhookBacklog(ctx, opts = {}) {
1741
1747
  }
1742
1748
  }
1743
1749
  }
1750
+ async function findSendForEvent(event, ctx) {
1751
+ if (event.providerMessageId) {
1752
+ const byId = await ctx.collections.sends.findOne({ providerMessageId: event.providerMessageId });
1753
+ if (byId) return byId;
1754
+ }
1755
+ if (!event.email) return null;
1756
+ return ctx.collections.sends.findOne({ emailAtSend: event.email, sentAt: { $ne: null } }, { sort: { sentAt: -1 } });
1757
+ }
1758
+ function webhookEventsForMessageId(providerMessageId) {
1759
+ const escaped = providerMessageId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1760
+ return { $or: [{ providerMessageId }, { providerMessageId: { $regex: `^${escaped}\\.` } }] };
1761
+ }
1744
1762
  async function applyWebhookEvent(event, ctx) {
1745
- const send = await ctx.collections.sends.findOne(
1746
- event.providerMessageId ? { $or: [{ providerMessageId: event.providerMessageId }, { emailAtSend: event.email }] } : { emailAtSend: event.email },
1747
- { sort: { queuedAt: -1 } }
1748
- );
1763
+ const send = await findSendForEvent(event, ctx);
1749
1764
  switch (event.type) {
1750
1765
  case "delivered":
1751
1766
  if (send) {
@@ -6499,7 +6514,7 @@ function createAdminApiRouter(mailer, opts = {}) {
6499
6514
  if (!ObjectId.isValid(id)) return res.status(400).json({ error: "bad_id" });
6500
6515
  const send = await c.sends.findOne({ _id: new ObjectId(id) });
6501
6516
  if (!send) return res.status(404).json({ error: "not_found" });
6502
- const events = send.providerMessageId ? await c.webhookEvents.find({ providerMessageId: send.providerMessageId }).sort({ receivedAt: -1 }).limit(100).toArray() : [];
6517
+ const events = send.providerMessageId ? await c.webhookEvents.find(webhookEventsForMessageId(send.providerMessageId)).sort({ receivedAt: -1 }).limit(100).toArray() : [];
6503
6518
  return res.json({ send, webhookEvents: events });
6504
6519
  })
6505
6520
  );
@@ -8238,7 +8253,7 @@ function unitToMs2(value, unit) {
8238
8253
  }
8239
8254
 
8240
8255
  // src/server/api/agent.ts
8241
- var VERSION = "0.16.1" ;
8256
+ var VERSION = "0.16.2" ;
8242
8257
  var MIN_AGENT_TOKEN_LENGTH = 24;
8243
8258
  function createAgentRouter(mailer, opts) {
8244
8259
  if (!opts || !Array.isArray(opts.tokens) || opts.tokens.length === 0) {
@@ -8441,7 +8456,7 @@ function createAgentRouter(mailer, opts) {
8441
8456
  if (reached || Date.now() - started >= timeoutMs) break;
8442
8457
  await sleep2(1e3);
8443
8458
  }
8444
- const webhookEvents = send.providerMessageId ? await c.webhookEvents.find({ providerMessageId: send.providerMessageId }).sort({ receivedAt: 1 }).limit(100).toArray() : [];
8459
+ const webhookEvents = send.providerMessageId ? await c.webhookEvents.find(webhookEventsForMessageId(send.providerMessageId)).sort({ receivedAt: 1 }).limit(100).toArray() : [];
8445
8460
  res.json({ reached, target, waitedMs: Date.now() - started, send: sendSummary(send), webhookEvents });
8446
8461
  })
8447
8462
  );
@@ -9938,7 +9953,7 @@ var DEDUPE_POLICIES = [
9938
9953
  ];
9939
9954
 
9940
9955
  // src/server/index.ts
9941
- var VERSION2 = "0.16.1" ;
9956
+ var VERSION2 = "0.16.2" ;
9942
9957
 
9943
9958
  export { DEDUPE_POLICIES, DEFAULT_BOT_UA_RE, FLOW_STEP_KINDS, FlowOperationError, MIN_AGENT_TOKEN_LENGTH, Mailer, MongoContactAdapter, NullProvider, PREDICATE_KINDS, RESERVED_VAR_KEYS, SEGMENT_FILTER_KINDS, SendGridProvider, TRACKING_SIG_LENGTH, VERSION2 as VERSION, applyTracking, applyWebhookEvent, armFlow, compileMailyTemplate, compileTemplate, computeDeliveryTime, createAdminApiRouter, createAdminRouter, createAgentRouter, createPublicRouter, defaultFlowStep, defaultPredicate, defaultSegmentFilter, defineVars, derivePlaintext, disarmFlow, dispatchSend, drainPendingUnsubscribes, ensureIndexes, gateFlow, getCollections, isCanaryGate, predicateKind, processNewlyFiredEventTriggers, processOneRunStep, referencedPaths, renderForContact, renderTemplate, runTick, sendgridInboundParser, sha256Hex, signTrackingToken, signUnsubscribeToken, simulateFlow, stampWatermarkIfNull, sweepStrandedFlowRuns, ungateFlow, validateSenderDomain, varsJsonSchema, verifyTemplate, verifyTrackingToken, verifyUnsubscribeToken };
9944
9959
  //# sourceMappingURL=index.js.map