convex-notifications 1.9.0 → 1.9.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/README.md +9 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +19 -9
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/component.d.ts +5 -1
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/crons.d.ts.map +1 -1
- package/dist/component/crons.js +13 -3
- package/dist/component/crons.js.map +1 -1
- package/dist/component/fallback.d.ts +10 -0
- package/dist/component/fallback.d.ts.map +1 -1
- package/dist/component/fallback.js +33 -0
- package/dist/component/fallback.js.map +1 -1
- package/dist/component/inbox.d.ts +5 -1
- package/dist/component/inbox.d.ts.map +1 -1
- package/dist/component/inbox.js +17 -5
- package/dist/component/inbox.js.map +1 -1
- package/dist/component/notifications.d.ts +10 -0
- package/dist/component/notifications.d.ts.map +1 -1
- package/dist/component/notifications.js +44 -1
- package/dist/component/notifications.js.map +1 -1
- package/dist/component/retry.d.ts.map +1 -1
- package/dist/component/retry.js +5 -1
- package/dist/component/retry.js.map +1 -1
- package/dist/component/scheduled.d.ts.map +1 -1
- package/dist/component/scheduled.js +5 -1
- package/dist/component/scheduled.js.map +1 -1
- package/dist/component/webhooks/resend.d.ts.map +1 -1
- package/dist/component/webhooks/resend.js +4 -0
- package/dist/component/webhooks/resend.js.map +1 -1
- package/dist/component/webhooks/twilio.d.ts.map +1 -1
- package/dist/component/webhooks/twilio.js +4 -0
- package/dist/component/webhooks/twilio.js.map +1 -1
- package/package.json +15 -8
- package/src/client/index.ts +22 -16
- package/src/component/_generated/component.ts +2 -2
- package/src/component/crons.ts +25 -3
- package/src/component/fallback.ts +36 -0
- package/src/component/inbox.ts +17 -5
- package/src/component/notifications.ts +51 -1
- package/src/component/retry.ts +5 -1
- package/src/component/scheduled.ts +5 -1
- package/src/component/webhooks/resend.ts +5 -0
- package/src/component/webhooks/twilio.ts +5 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/component/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA2BH;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;mEAgDrB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;KAgB5B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB;;oBAgB9B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,kBAAkB;;iBAW7B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/component/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA2BH;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;mEAgDrB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;KAgB5B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB;;oBAgB9B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,kBAAkB;;iBAW7B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;GA+C1B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;KAaxB,CAAC"}
|
package/dist/component/retry.js
CHANGED
|
@@ -136,11 +136,15 @@ export const markRetryFailed = internalMutation({
|
|
|
136
136
|
}
|
|
137
137
|
const nextAttempt = retry.attempt + 1;
|
|
138
138
|
if (nextAttempt > retry.maxAttempts) {
|
|
139
|
-
// Max attempts reached
|
|
139
|
+
// Max attempts reached — mark retry as exhausted and delivery as failed
|
|
140
140
|
await ctx.db.patch(args.id, {
|
|
141
141
|
status: "exhausted",
|
|
142
142
|
lastError: args.error,
|
|
143
143
|
});
|
|
144
|
+
await ctx.db.patch(retry.deliveryLogId, {
|
|
145
|
+
status: "failed",
|
|
146
|
+
error: `Exhausted after ${retry.maxAttempts} attempts: ${args.error}`,
|
|
147
|
+
});
|
|
144
148
|
return { willRetry: false, exhausted: true };
|
|
145
149
|
}
|
|
146
150
|
// Schedule next retry
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/component/retry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/component/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduled.d.ts","sourceRoot":"","sources":["../../src/component/scheduled.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"scheduled.d.ts","sourceRoot":"","sources":["../../src/component/scheduled.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;wEAyC/B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;KAyC3C,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,uBAAuB;;oBAgBlC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;iBAa5B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;iBAc9B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,2BAA2B;;;;oBA8BtC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;KAuDpC,CAAC"}
|
|
@@ -27,11 +27,15 @@ export const scheduleNotification = internalMutation({
|
|
|
27
27
|
},
|
|
28
28
|
returns: v.id("scheduledNotifications"),
|
|
29
29
|
handler: async (ctx, args) => {
|
|
30
|
-
// Validate scheduledFor is in the future
|
|
30
|
+
// Validate scheduledFor is in the future but not too far out
|
|
31
31
|
const now = Date.now();
|
|
32
|
+
const MAX_SCHEDULE_MS = 365 * 24 * 60 * 60 * 1000; // 1 year
|
|
32
33
|
if (args.scheduledFor <= now) {
|
|
33
34
|
throw new Error("scheduledFor must be in the future");
|
|
34
35
|
}
|
|
36
|
+
if (args.scheduledFor > now + MAX_SCHEDULE_MS) {
|
|
37
|
+
throw new Error("scheduledFor cannot be more than 1 year in the future");
|
|
38
|
+
}
|
|
35
39
|
return await ctx.db.insert("scheduledNotifications", {
|
|
36
40
|
tenantId: args.tenantId,
|
|
37
41
|
userId: args.userId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduled.js","sourceRoot":"","sources":["../../src/component/scheduled.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEzE;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;IACnD,IAAI,EAAE;QACJ,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACzB,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE;QACjB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACtC,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KACzC;IACD,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC;IACvC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,
|
|
1
|
+
{"version":3,"file":"scheduled.js","sourceRoot":"","sources":["../../src/component/scheduled.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEzE;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;IACnD,IAAI,EAAE;QACJ,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACzB,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE;QACjB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACtC,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KACzC;IACD,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC;IACvC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,6DAA6D;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,eAAe,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;QAC5D,IAAI,IAAI,CAAC,YAAY,IAAI,GAAG,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,GAAG,GAAG,GAAG,eAAe,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QAED,OAAO,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,wBAAwB,EAAE;YACnD,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,aAAa,CAAC;IAC5D,IAAI,EAAE;QACJ,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAClC;IACD,OAAO,EAAE,CAAC,CAAC,KAAK,CACd,CAAC,CAAC,MAAM,CAAC;QACP,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC;QACnC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;QACzB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACzB,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE;QACjB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACtC,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,EAAE,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EACvB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EACjB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EACnB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CACvB;QACD,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7B,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KACpC,CAAC,CACH;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,OAAO,MAAM,GAAG,CAAC,EAAE;aAChB,KAAK,CAAC,wBAAwB,CAAC;aAC/B,SAAS,CAAC,wBAAwB,EAAE,CAAC,CAAC,EAAE,EAAE,CACzC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CACnD;aACA,IAAI,CAAC,SAAS,CAAC,CAAC;IACrB,CAAC;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,gBAAgB,CAAC;IACtD,IAAI,EAAE;QACJ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC;KACnC;IACD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACvD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE;YAC1B,MAAM,EAAE,YAAY;SACrB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;IAChD,IAAI,EAAE;QACJ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC;QAClC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC;KACtC;IACD,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE;IACjB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE;YAC1B,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;IAClD,IAAI,EAAE;QACJ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC;QAClC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;KAClB;IACD,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE;IACjB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE;YAC1B,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,gBAAgB,CAAC;IAC1D,IAAI,EAAE;QACJ,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC;QAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,uBAAuB;KAC5C;IACD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE/C,mBAAmB;QACnB,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,kDAAkD;QAClD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,YAAY,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3E,OAAO,KAAK,CAAC;QACf,CAAC;QAED,wCAAwC;QACxC,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE;YAC1B,MAAM,EAAE,WAAW;YACnB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,aAAa,CAAC;IACrD,IAAI,EAAE;QACJ,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAChB,CAAC,CAAC,KAAK,CACL,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EACvB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EACjB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EACnB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CACvB,CACF;KACF;IACD,OAAO,EAAE,CAAC,CAAC,KAAK,CACd,CAAC,CAAC,MAAM,CAAC;QACP,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC;QACnC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;QACzB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACzB,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE;QACjB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACtC,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,EAAE,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EACvB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EACjB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EACnB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CACvB;QACD,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7B,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KACpC,CAAC,CACH;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,MAAM,GAAG,CAAC,EAAE;iBAChB,KAAK,CAAC,wBAAwB,CAAC;iBAC/B,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CACnC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAO,CAAC,CACvD;iBACA,OAAO,EAAE,CAAC;QACf,CAAC;QAED,OAAO,MAAM,GAAG,CAAC,EAAE;aAChB,KAAK,CAAC,wBAAwB,CAAC;aAC/B,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;aAC1D,OAAO,EAAE,CAAC;IACf,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resend.d.ts","sourceRoot":"","sources":["../../../src/component/webhooks/resend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAyIH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"resend.d.ts","sourceRoot":"","sources":["../../../src/component/webhooks/resend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAyIH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,aAAa,0CA2DxB,CAAC"}
|
|
@@ -131,6 +131,10 @@ export const resendWebhook = httpAction(async (ctx, request) => {
|
|
|
131
131
|
return new Response("Invalid signature", { status: 401 });
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
|
+
else {
|
|
135
|
+
console.warn("[notifications] RESEND_WEBHOOK_SECRET not set — webhook signature verification is disabled. " +
|
|
136
|
+
"This is insecure in production. Set the environment variable to enable verification.");
|
|
137
|
+
}
|
|
134
138
|
// Parse the webhook payload
|
|
135
139
|
let payload;
|
|
136
140
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resend.js","sourceRoot":"","sources":["../../../src/component/webhooks/resend.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"resend.js","sourceRoot":"","sources":["../../../src/component/webhooks/resend.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twilio.d.ts","sourceRoot":"","sources":["../../../src/component/webhooks/twilio.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAyFH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"twilio.d.ts","sourceRoot":"","sources":["../../../src/component/webhooks/twilio.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAyFH;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,aAAa,0CAuExB,CAAC"}
|
|
@@ -111,6 +111,10 @@ export const twilioWebhook = httpAction(async (ctx, request) => {
|
|
|
111
111
|
return new Response("Invalid signature", { status: 401 });
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
|
+
else {
|
|
115
|
+
console.warn("[notifications] TWILIO_AUTH_TOKEN not set — webhook signature verification is disabled. " +
|
|
116
|
+
"This is insecure in production. Set the environment variable to enable verification.");
|
|
117
|
+
}
|
|
114
118
|
const messageSid = params["MessageSid"] ?? null;
|
|
115
119
|
const messageStatus = (params["MessageStatus"] ?? null);
|
|
116
120
|
const errorCode = params["ErrorCode"] ?? null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twilio.js","sourceRoot":"","sources":["../../../src/component/webhooks/twilio.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"twilio.js","sourceRoot":"","sources":["../../../src/component/webhooks/twilio.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"registry": "https://registry.npmjs.org/",
|
|
12
12
|
"provenance": true
|
|
13
13
|
},
|
|
14
|
-
"version": "1.9.
|
|
14
|
+
"version": "1.9.2",
|
|
15
15
|
"license": "Apache-2.0",
|
|
16
16
|
"keywords": [
|
|
17
17
|
"convex",
|
|
@@ -34,6 +34,11 @@
|
|
|
34
34
|
"test:watch": "vitest --typecheck --clearScreen false",
|
|
35
35
|
"test:debug": "vitest --inspect-brk --no-file-parallelism",
|
|
36
36
|
"test:coverage": "vitest run --coverage --coverage.reporter=text",
|
|
37
|
+
"check:exports": "publint",
|
|
38
|
+
"check:types": "attw --pack . --profile esm-only",
|
|
39
|
+
"check:package": "npm run check:exports && npm run check:types",
|
|
40
|
+
"test:consumer": "bash consumer-test/run.sh",
|
|
41
|
+
"test:all": "npm run test && npm run check:package && npm run test:consumer",
|
|
37
42
|
"prepublishOnly": "npm run build",
|
|
38
43
|
"semantic-release": "semantic-release"
|
|
39
44
|
},
|
|
@@ -76,11 +81,11 @@
|
|
|
76
81
|
}
|
|
77
82
|
},
|
|
78
83
|
"peerDependencies": {
|
|
79
|
-
"convex": "^1.31.6",
|
|
80
|
-
"react": "^18.3.1 || ^19.0.0",
|
|
81
84
|
"@convex-dev/expo-push-notifications": ">=0.3.0",
|
|
82
85
|
"@convex-dev/resend": ">=0.2.0",
|
|
83
|
-
"@convex-dev/twilio": ">=0.2.0"
|
|
86
|
+
"@convex-dev/twilio": ">=0.2.0",
|
|
87
|
+
"convex": "^1.31.6",
|
|
88
|
+
"react": "^18.3.1 || ^19.0.0"
|
|
84
89
|
},
|
|
85
90
|
"peerDependenciesMeta": {
|
|
86
91
|
"@convex-dev/expo-push-notifications": {
|
|
@@ -97,10 +102,11 @@
|
|
|
97
102
|
}
|
|
98
103
|
},
|
|
99
104
|
"devDependencies": {
|
|
105
|
+
"@arethetypeswrong/cli": "^0.18.2",
|
|
106
|
+
"@convex-dev/eslint-plugin": "^1.1.1",
|
|
100
107
|
"@convex-dev/expo-push-notifications": "^0.3.1",
|
|
101
108
|
"@convex-dev/resend": "^0.2.3",
|
|
102
109
|
"@convex-dev/twilio": "^0.2.1",
|
|
103
|
-
"@convex-dev/eslint-plugin": "^1.1.1",
|
|
104
110
|
"@edge-runtime/vm": "^5.0.0",
|
|
105
111
|
"@eslint/eslintrc": "^3.3.3",
|
|
106
112
|
"@eslint/js": "9.39.2",
|
|
@@ -124,6 +130,7 @@
|
|
|
124
130
|
"path-exists-cli": "2.0.0",
|
|
125
131
|
"pkg-pr-new": "^0.0.62",
|
|
126
132
|
"prettier": "3.8.1",
|
|
133
|
+
"publint": "^0.3.17",
|
|
127
134
|
"react": "^19.2.4",
|
|
128
135
|
"react-dom": "^19.2.4",
|
|
129
136
|
"semantic-release": "^25.0.2",
|
|
@@ -135,9 +142,9 @@
|
|
|
135
142
|
"types": "./dist/client/index.d.ts",
|
|
136
143
|
"module": "./dist/client/index.js",
|
|
137
144
|
"dependencies": {
|
|
138
|
-
"@convex-dev/expo-push-notifications": "
|
|
139
|
-
"@convex-dev/resend": "
|
|
140
|
-
"@convex-dev/twilio": "
|
|
145
|
+
"@convex-dev/expo-push-notifications": ">=0.3.0",
|
|
146
|
+
"@convex-dev/resend": ">=0.2.0",
|
|
147
|
+
"@convex-dev/twilio": ">=0.2.0",
|
|
141
148
|
"convex-helpers": "^0.1.111"
|
|
142
149
|
}
|
|
143
150
|
}
|
package/src/client/index.ts
CHANGED
|
@@ -247,10 +247,16 @@ export class Notifications {
|
|
|
247
247
|
|
|
248
248
|
async markAllRead(ctx: RunMutationCtx) {
|
|
249
249
|
const { userId, tenantId } = await this.resolveAuth(ctx);
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
250
|
+
// Loop in batches to avoid transaction limits with large unread counts
|
|
251
|
+
let hasMore = true;
|
|
252
|
+
while (hasMore) {
|
|
253
|
+
const result = await ctx.runMutation(this.component.inbox.markAllRead, {
|
|
254
|
+
tenantId,
|
|
255
|
+
userId,
|
|
256
|
+
});
|
|
257
|
+
hasMore = result.hasMore;
|
|
258
|
+
}
|
|
259
|
+
return null;
|
|
254
260
|
}
|
|
255
261
|
|
|
256
262
|
async archive(ctx: RunMutationCtx, notificationId: NotificationId) {
|
|
@@ -354,10 +360,14 @@ export class Notifications {
|
|
|
354
360
|
? args.scheduledFor.getTime()
|
|
355
361
|
: args.scheduledFor;
|
|
356
362
|
|
|
357
|
-
// Validate scheduledFor is in the future
|
|
363
|
+
// Validate scheduledFor is in the future but not too far out
|
|
364
|
+
const MAX_SCHEDULE_MS = 365 * 24 * 60 * 60 * 1000; // 1 year
|
|
358
365
|
if (scheduledFor <= Date.now()) {
|
|
359
366
|
throw new Error("scheduledFor must be in the future");
|
|
360
367
|
}
|
|
368
|
+
if (scheduledFor > Date.now() + MAX_SCHEDULE_MS) {
|
|
369
|
+
throw new Error("scheduledFor cannot be more than 1 year in the future");
|
|
370
|
+
}
|
|
361
371
|
|
|
362
372
|
// Render inbox template for storage
|
|
363
373
|
const inboxTemplate = definition.channels.inbox;
|
|
@@ -604,9 +614,8 @@ export class Notifications {
|
|
|
604
614
|
);
|
|
605
615
|
} else {
|
|
606
616
|
// Log stub message for development
|
|
607
|
-
console.
|
|
608
|
-
`[notifications]
|
|
609
|
-
renderedEmail,
|
|
617
|
+
console.warn(
|
|
618
|
+
`[notifications] Email client not configured — skipping dispatch. Configure options.clients.email to enable.`,
|
|
610
619
|
);
|
|
611
620
|
result = {
|
|
612
621
|
channel: "email",
|
|
@@ -637,9 +646,8 @@ export class Notifications {
|
|
|
637
646
|
pushConfig?.allowUnregisteredTokens ?? true,
|
|
638
647
|
);
|
|
639
648
|
} else {
|
|
640
|
-
console.
|
|
641
|
-
`[notifications]
|
|
642
|
-
renderedPush,
|
|
649
|
+
console.warn(
|
|
650
|
+
`[notifications] Push client not configured — skipping dispatch. Configure options.clients.push to enable.`,
|
|
643
651
|
);
|
|
644
652
|
result = {
|
|
645
653
|
channel: "push",
|
|
@@ -704,9 +712,8 @@ export class Notifications {
|
|
|
704
712
|
error: "Scheduled for async delivery",
|
|
705
713
|
};
|
|
706
714
|
} else {
|
|
707
|
-
console.
|
|
715
|
+
console.warn(
|
|
708
716
|
`[notifications] SMS requires action context. Configure smsDispatchAction for async delivery.`,
|
|
709
|
-
renderedSms,
|
|
710
717
|
);
|
|
711
718
|
result = {
|
|
712
719
|
channel: "sms",
|
|
@@ -717,9 +724,8 @@ export class Notifications {
|
|
|
717
724
|
}
|
|
718
725
|
}
|
|
719
726
|
} else {
|
|
720
|
-
console.
|
|
721
|
-
`[notifications]
|
|
722
|
-
renderedSms,
|
|
727
|
+
console.warn(
|
|
728
|
+
`[notifications] SMS client not configured — skipping dispatch. Configure options.clients.sms to enable.`,
|
|
723
729
|
);
|
|
724
730
|
result = {
|
|
725
731
|
channel: "sms",
|
|
@@ -65,8 +65,8 @@ export type ComponentApi<
|
|
|
65
65
|
markAllRead: FunctionReference<
|
|
66
66
|
"mutation",
|
|
67
67
|
"internal",
|
|
68
|
-
{ tenantId?: string; userId: string },
|
|
69
|
-
|
|
68
|
+
{ tenantId?: string; userId: string; batchSize?: number },
|
|
69
|
+
{ marked: number; hasMore: boolean },
|
|
70
70
|
Name
|
|
71
71
|
>;
|
|
72
72
|
markRead: FunctionReference<
|
package/src/component/crons.ts
CHANGED
|
@@ -22,7 +22,7 @@ crons.interval(
|
|
|
22
22
|
"process scheduled notifications",
|
|
23
23
|
{ minutes: 1 },
|
|
24
24
|
internal.notifications.processScheduledNotifications,
|
|
25
|
-
{ batchSize:
|
|
25
|
+
{ batchSize: 200 },
|
|
26
26
|
);
|
|
27
27
|
|
|
28
28
|
/**
|
|
@@ -33,7 +33,7 @@ crons.interval(
|
|
|
33
33
|
"process retry queue",
|
|
34
34
|
{ minutes: 1 },
|
|
35
35
|
internal.notifications.processRetryQueue,
|
|
36
|
-
{ batchSize:
|
|
36
|
+
{ batchSize: 200 },
|
|
37
37
|
);
|
|
38
38
|
|
|
39
39
|
/**
|
|
@@ -45,7 +45,29 @@ crons.interval(
|
|
|
45
45
|
"process channel fallbacks",
|
|
46
46
|
{ minutes: 1 },
|
|
47
47
|
internal.fallback.processFallbacks,
|
|
48
|
-
{ batchSize:
|
|
48
|
+
{ batchSize: 200 },
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Clean up completed retry queue entries every 6 hours.
|
|
53
|
+
* Removes "succeeded" and "exhausted" entries older than 7 days.
|
|
54
|
+
*/
|
|
55
|
+
crons.interval(
|
|
56
|
+
"cleanup completed retries",
|
|
57
|
+
{ hours: 6 },
|
|
58
|
+
internal.notifications.cleanupRetryQueue,
|
|
59
|
+
{ batchSize: 500 },
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Clean up completed fallback queue entries every 6 hours.
|
|
64
|
+
* Removes "cancelled" and "triggered" entries older than 7 days.
|
|
65
|
+
*/
|
|
66
|
+
crons.interval(
|
|
67
|
+
"cleanup completed fallbacks",
|
|
68
|
+
{ hours: 6 },
|
|
69
|
+
internal.fallback.cleanupFallbackQueue,
|
|
70
|
+
{ batchSize: 500 },
|
|
49
71
|
);
|
|
50
72
|
|
|
51
73
|
export default crons;
|
|
@@ -216,3 +216,39 @@ export const getTriggeredFallbacks = internalQuery({
|
|
|
216
216
|
}));
|
|
217
217
|
},
|
|
218
218
|
});
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Clean up completed fallback queue entries older than 7 days.
|
|
222
|
+
* Removes entries with status "cancelled" or "triggered" to prevent table bloat.
|
|
223
|
+
*/
|
|
224
|
+
export const cleanupFallbackQueue = internalMutation({
|
|
225
|
+
args: {
|
|
226
|
+
batchSize: v.optional(v.number()),
|
|
227
|
+
},
|
|
228
|
+
returns: v.object({
|
|
229
|
+
deleted: v.number(),
|
|
230
|
+
hasMore: v.boolean(),
|
|
231
|
+
}),
|
|
232
|
+
handler: async (ctx, args) => {
|
|
233
|
+
const batchSize = args.batchSize ?? 500;
|
|
234
|
+
const cutoff = Date.now() - 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
235
|
+
let deleted = 0;
|
|
236
|
+
|
|
237
|
+
for (const status of ["cancelled", "triggered"] as const) {
|
|
238
|
+
if (deleted >= batchSize) break;
|
|
239
|
+
const entries = await ctx.db
|
|
240
|
+
.query("fallbackQueue")
|
|
241
|
+
.withIndex("by_status_fallbackAt", (q) => q.eq("status", status))
|
|
242
|
+
.take(batchSize - deleted + 1);
|
|
243
|
+
|
|
244
|
+
for (const entry of entries) {
|
|
245
|
+
if (entry._creationTime < cutoff && deleted < batchSize) {
|
|
246
|
+
await ctx.db.delete(entry._id);
|
|
247
|
+
deleted++;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return { deleted, hasMore: deleted >= batchSize };
|
|
253
|
+
},
|
|
254
|
+
});
|
package/src/component/inbox.ts
CHANGED
|
@@ -43,6 +43,9 @@ export const list = internalQuery({
|
|
|
43
43
|
|
|
44
44
|
const result = await q
|
|
45
45
|
.order("desc")
|
|
46
|
+
// filterWith runs in JS after loading from the index. This is necessary
|
|
47
|
+
// because Convex doesn't support "field is undefined" in compound indexes.
|
|
48
|
+
// For most apps this is efficient since archived+unread is rare.
|
|
46
49
|
.filterWith(async (n) => n.archivedAt === undefined)
|
|
47
50
|
.paginate(args.paginationOpts);
|
|
48
51
|
|
|
@@ -68,7 +71,9 @@ export const unreadCount = internalQuery({
|
|
|
68
71
|
.withIndex("by_userId_unread", (q) =>
|
|
69
72
|
q.eq("userId", args.userId).eq("readAt", undefined),
|
|
70
73
|
);
|
|
71
|
-
//
|
|
74
|
+
// Stream and count in-place rather than .collect() to avoid loading all
|
|
75
|
+
// unread notifications into memory. The archivedAt filter is applied in JS
|
|
76
|
+
// since archived+unread is a rare edge case (users typically archive after reading).
|
|
72
77
|
let count = 0;
|
|
73
78
|
for await (const n of q) {
|
|
74
79
|
if (n.archivedAt === undefined) count++;
|
|
@@ -116,9 +121,14 @@ export const markAllRead = internalMutation({
|
|
|
116
121
|
args: {
|
|
117
122
|
tenantId: v.optional(v.string()),
|
|
118
123
|
userId: v.string(),
|
|
124
|
+
batchSize: v.optional(v.number()),
|
|
119
125
|
},
|
|
120
|
-
returns: v.
|
|
126
|
+
returns: v.object({
|
|
127
|
+
marked: v.number(),
|
|
128
|
+
hasMore: v.boolean(),
|
|
129
|
+
}),
|
|
121
130
|
handler: async (ctx, args) => {
|
|
131
|
+
const batchSize = args.batchSize ?? 100;
|
|
122
132
|
const q = args.tenantId !== undefined
|
|
123
133
|
? ctx.db
|
|
124
134
|
.query("notifications")
|
|
@@ -130,9 +140,11 @@ export const markAllRead = internalMutation({
|
|
|
130
140
|
.withIndex("by_userId_unread", (q) =>
|
|
131
141
|
q.eq("userId", args.userId).eq("readAt", undefined),
|
|
132
142
|
);
|
|
133
|
-
const unread = await q.
|
|
143
|
+
const unread = await q.take(batchSize + 1);
|
|
144
|
+
const hasMore = unread.length > batchSize;
|
|
145
|
+
const batch = unread.slice(0, batchSize);
|
|
134
146
|
const now = Date.now();
|
|
135
|
-
for (const n of
|
|
147
|
+
for (const n of batch) {
|
|
136
148
|
await ctx.db.patch(n._id, { readAt: now });
|
|
137
149
|
|
|
138
150
|
// Cancel any pending fallbacks for this notification
|
|
@@ -146,7 +158,7 @@ export const markAllRead = internalMutation({
|
|
|
146
158
|
await ctx.db.patch(fallback._id, { status: "cancelled" });
|
|
147
159
|
}
|
|
148
160
|
}
|
|
149
|
-
return
|
|
161
|
+
return { marked: batch.length, hasMore };
|
|
150
162
|
},
|
|
151
163
|
});
|
|
152
164
|
|
|
@@ -235,8 +235,22 @@ export const processRetryQueue = internalMutation({
|
|
|
235
235
|
readyForRetry: v.array(v.id("retryQueue")),
|
|
236
236
|
}),
|
|
237
237
|
handler: async (ctx, args) => {
|
|
238
|
-
const batchSize = args.batchSize ??
|
|
238
|
+
const batchSize = args.batchSize ?? 200;
|
|
239
239
|
const now = Date.now();
|
|
240
|
+
const STALE_THRESHOLD_MS = 5 * 60 * 1000; // 5 minutes
|
|
241
|
+
|
|
242
|
+
// Reset stale "processing" entries back to pending.
|
|
243
|
+
// Uses nextRetryAt as a proxy for when the entry was last touched.
|
|
244
|
+
const stale = await ctx.db
|
|
245
|
+
.query("retryQueue")
|
|
246
|
+
.withIndex("by_status_nextRetryAt", (q) =>
|
|
247
|
+
q.eq("status", "processing").lte("nextRetryAt", now - STALE_THRESHOLD_MS),
|
|
248
|
+
)
|
|
249
|
+
.take(batchSize);
|
|
250
|
+
|
|
251
|
+
for (const entry of stale) {
|
|
252
|
+
await ctx.db.patch(entry._id, { status: "pending", nextRetryAt: now });
|
|
253
|
+
}
|
|
240
254
|
|
|
241
255
|
// Get pending retries that are ready
|
|
242
256
|
const pending = await ctx.db
|
|
@@ -260,3 +274,39 @@ export const processRetryQueue = internalMutation({
|
|
|
260
274
|
};
|
|
261
275
|
},
|
|
262
276
|
});
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Clean up completed retry queue entries older than 7 days.
|
|
280
|
+
* Removes entries with status "succeeded" or "exhausted" to prevent table bloat.
|
|
281
|
+
*/
|
|
282
|
+
export const cleanupRetryQueue = internalMutation({
|
|
283
|
+
args: {
|
|
284
|
+
batchSize: v.optional(v.number()),
|
|
285
|
+
},
|
|
286
|
+
returns: v.object({
|
|
287
|
+
deleted: v.number(),
|
|
288
|
+
hasMore: v.boolean(),
|
|
289
|
+
}),
|
|
290
|
+
handler: async (ctx, args) => {
|
|
291
|
+
const batchSize = args.batchSize ?? 500;
|
|
292
|
+
const cutoff = Date.now() - 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
293
|
+
let deleted = 0;
|
|
294
|
+
|
|
295
|
+
for (const status of ["succeeded", "exhausted"] as const) {
|
|
296
|
+
if (deleted >= batchSize) break;
|
|
297
|
+
const entries = await ctx.db
|
|
298
|
+
.query("retryQueue")
|
|
299
|
+
.withIndex("by_status_nextRetryAt", (q) => q.eq("status", status))
|
|
300
|
+
.take(batchSize - deleted + 1);
|
|
301
|
+
|
|
302
|
+
for (const entry of entries) {
|
|
303
|
+
if (entry._creationTime < cutoff && deleted < batchSize) {
|
|
304
|
+
await ctx.db.delete(entry._id);
|
|
305
|
+
deleted++;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return { deleted, hasMore: deleted >= batchSize };
|
|
311
|
+
},
|
|
312
|
+
});
|
package/src/component/retry.ts
CHANGED
|
@@ -165,11 +165,15 @@ export const markRetryFailed = internalMutation({
|
|
|
165
165
|
const nextAttempt = retry.attempt + 1;
|
|
166
166
|
|
|
167
167
|
if (nextAttempt > retry.maxAttempts) {
|
|
168
|
-
// Max attempts reached
|
|
168
|
+
// Max attempts reached — mark retry as exhausted and delivery as failed
|
|
169
169
|
await ctx.db.patch(args.id, {
|
|
170
170
|
status: "exhausted",
|
|
171
171
|
lastError: args.error,
|
|
172
172
|
});
|
|
173
|
+
await ctx.db.patch(retry.deliveryLogId, {
|
|
174
|
+
status: "failed",
|
|
175
|
+
error: `Exhausted after ${retry.maxAttempts} attempts: ${args.error}`,
|
|
176
|
+
});
|
|
173
177
|
return { willRetry: false, exhausted: true };
|
|
174
178
|
}
|
|
175
179
|
|
|
@@ -29,11 +29,15 @@ export const scheduleNotification = internalMutation({
|
|
|
29
29
|
},
|
|
30
30
|
returns: v.id("scheduledNotifications"),
|
|
31
31
|
handler: async (ctx, args) => {
|
|
32
|
-
// Validate scheduledFor is in the future
|
|
32
|
+
// Validate scheduledFor is in the future but not too far out
|
|
33
33
|
const now = Date.now();
|
|
34
|
+
const MAX_SCHEDULE_MS = 365 * 24 * 60 * 60 * 1000; // 1 year
|
|
34
35
|
if (args.scheduledFor <= now) {
|
|
35
36
|
throw new Error("scheduledFor must be in the future");
|
|
36
37
|
}
|
|
38
|
+
if (args.scheduledFor > now + MAX_SCHEDULE_MS) {
|
|
39
|
+
throw new Error("scheduledFor cannot be more than 1 year in the future");
|
|
40
|
+
}
|
|
37
41
|
|
|
38
42
|
return await ctx.db.insert("scheduledNotifications", {
|
|
39
43
|
tenantId: args.tenantId,
|
|
@@ -200,6 +200,11 @@ export const resendWebhook = httpAction(async (ctx, request) => {
|
|
|
200
200
|
if (!isValid) {
|
|
201
201
|
return new Response("Invalid signature", { status: 401 });
|
|
202
202
|
}
|
|
203
|
+
} else {
|
|
204
|
+
console.warn(
|
|
205
|
+
"[notifications] RESEND_WEBHOOK_SECRET not set — webhook signature verification is disabled. " +
|
|
206
|
+
"This is insecure in production. Set the environment variable to enable verification.",
|
|
207
|
+
);
|
|
203
208
|
}
|
|
204
209
|
|
|
205
210
|
// Parse the webhook payload
|
|
@@ -152,6 +152,11 @@ export const twilioWebhook = httpAction(async (ctx, request) => {
|
|
|
152
152
|
if (!isValid) {
|
|
153
153
|
return new Response("Invalid signature", { status: 401 });
|
|
154
154
|
}
|
|
155
|
+
} else {
|
|
156
|
+
console.warn(
|
|
157
|
+
"[notifications] TWILIO_AUTH_TOKEN not set — webhook signature verification is disabled. " +
|
|
158
|
+
"This is insecure in production. Set the environment variable to enable verification.",
|
|
159
|
+
);
|
|
155
160
|
}
|
|
156
161
|
|
|
157
162
|
const messageSid = params["MessageSid"] ?? null;
|