@commonpub/server 2.97.0 → 2.97.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"outbox.d.ts","sourceRoot":"","sources":["../../src/comms/outbox.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,aAAa,CAAC;AAO9D,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACxC,QAAQ,EAAE,aAAa,CAAC;IACxB,wDAAwD;IACxD,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB;AAeD,wDAAwD;AACxD,wBAAsB,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhF;AAED,sEAAsE;AACtE,wBAAsB,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpF;AAED,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kCAAkC;IAClC,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,4DAA4D;IAC5D,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAmBD;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,YAAY,EACrB,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,WAAW,CAAC,CA+EtB"}
1
+ {"version":3,"file":"outbox.d.ts","sourceRoot":"","sources":["../../src/comms/outbox.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,aAAa,CAAC;AAO/E,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACxC,QAAQ,EAAE,aAAa,CAAC;IACxB,wDAAwD;IACxD,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB;AAeD,wDAAwD;AACxD,wBAAsB,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhF;AAED,sEAAsE;AACtE,wBAAsB,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpF;AAED,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kCAAkC;IAClC,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,4DAA4D;IAC5D,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAwBD;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,YAAY,EACrB,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,WAAW,CAAC,CAwGtB"}
@@ -23,6 +23,11 @@ export async function enqueueEmails(db, messages) {
23
23
  await db.insert(emailOutbox).values(messages.map(toRow));
24
24
  }
25
25
  const LOCK_TTL_MS = 5 * 60 * 1000;
26
+ // Worst-case budget for one provider call (its HTTP timeout) plus a throttle gap.
27
+ // Used to clamp a tick's row count so the whole tick finishes before its own row
28
+ // lock expires — otherwise a second replica could reclaim and re-send in-flight
29
+ // rows. Slightly above the adapter's 30s HTTP timeout.
30
+ const PER_CALL_BUDGET_MS = 35_000;
26
31
  /** Exponential backoff for the NEXT retry (1→2min, 2→4min, ... capped 1h). */
27
32
  function backoffMs(attempts) {
28
33
  return Math.min(2 ** attempts * 60_000, 60 * 60_000);
@@ -47,7 +52,6 @@ function rowToMessage(row) {
47
52
  * an injected clock. The Nitro plugin just calls this on an interval.
48
53
  */
49
54
  export async function drainEmailOutbox(db, adapter, opts = {}) {
50
- const maxPerTick = opts.maxPerTick ?? 200;
51
55
  const batchSize = Math.min(opts.batchSize ?? 100, 100);
52
56
  const maxAttempts = opts.maxAttempts ?? 6;
53
57
  const maxBatchesPerSecond = opts.maxBatchesPerSecond ?? 5;
@@ -55,6 +59,11 @@ export async function drainEmailOutbox(db, adapter, opts = {}) {
55
59
  const sleep = opts.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
56
60
  const lockExpiry = new Date(now.getTime() + LOCK_TTL_MS);
57
61
  const gapMs = Math.ceil(1000 / Math.max(1, maxBatchesPerSecond));
62
+ // Clamp the tick so its worst-case duration stays under LOCK_TTL_MS: a tick must
63
+ // finish (and mark its rows done) before another replica could treat them as
64
+ // stale and reclaim them. maxChunks * per-chunk-budget < lock TTL.
65
+ const maxChunks = Math.max(1, Math.floor(LOCK_TTL_MS / (PER_CALL_BUDGET_MS + gapMs)));
66
+ const maxPerTick = Math.min(opts.maxPerTick ?? 200, maxChunks * batchSize);
58
67
  // Claim: pending+due rows, plus stale 'sending' rows whose lock expired (a
59
68
  // crashed worker). SKIP LOCKED so parallel workers don't collide.
60
69
  const claimIds = db
@@ -78,41 +87,58 @@ export async function drainEmailOutbox(db, adapter, opts = {}) {
78
87
  chunks.push(claimed.slice(i, i + batchSize));
79
88
  for (let c = 0; c < chunks.length; c++) {
80
89
  const chunk = chunks[c];
90
+ // Per-message outcomes. A thrown error = transport failure where nothing was
91
+ // accepted → treat every message as failed (retry the whole chunk). A returned
92
+ // array attributes each message, so a partial provider acceptance marks only
93
+ // the accepted rows sent and reschedules the rejected ones (no loss, no blind
94
+ // resend of the whole chunk).
95
+ let results;
81
96
  try {
82
- await adapter.sendBatch(chunk.map(rowToMessage));
83
- await db
84
- .update(emailOutbox)
85
- .set({ status: 'sent', sentAt: now, lastError: null })
86
- .where(inArray(emailOutbox.id, chunk.map((r) => r.id)));
87
- sent += chunk.length;
97
+ results = await adapter.sendBatch(chunk.map(rowToMessage));
88
98
  }
89
99
  catch (err) {
90
100
  const msg = err instanceof Error ? err.message : String(err);
91
- // Reschedule (or dead-letter) each row in the failed chunk individually so
92
- // the attempt counter is per-row accurate.
93
- for (const row of chunk) {
94
- const attempts = row.attempts + 1;
95
- if (attempts >= maxAttempts) {
96
- await db
97
- .update(emailOutbox)
98
- .set({ status: 'failed', attempts, lastError: msg })
99
- .where(eq(emailOutbox.id, row.id));
100
- failed++;
101
- }
102
- else {
103
- await db
104
- .update(emailOutbox)
105
- .set({
106
- status: 'pending',
107
- attempts,
108
- lastError: msg,
109
- scheduledAt: new Date(now.getTime() + backoffMs(attempts)),
110
- claimedAt: null,
111
- lockExpiresAt: null,
112
- })
113
- .where(eq(emailOutbox.id, row.id));
114
- }
101
+ results = chunk.map(() => ({ ok: false, error: msg }));
102
+ }
103
+ const okIds = [];
104
+ for (let i = 0; i < chunk.length; i++) {
105
+ const row = chunk[i];
106
+ const res = results[i] ?? { ok: false, error: 'no provider result' };
107
+ if (res.ok) {
108
+ okIds.push(row.id);
109
+ continue;
110
+ }
111
+ // Reschedule (or dead-letter) the failed row, attempt-accurate.
112
+ const attempts = row.attempts + 1;
113
+ if (attempts >= maxAttempts) {
114
+ await db
115
+ .update(emailOutbox)
116
+ .set({ status: 'failed', attempts, lastError: res.error ?? 'send failed' })
117
+ .where(and(eq(emailOutbox.id, row.id), eq(emailOutbox.status, 'sending')));
118
+ failed++;
115
119
  }
120
+ else {
121
+ await db
122
+ .update(emailOutbox)
123
+ .set({
124
+ status: 'pending',
125
+ attempts,
126
+ lastError: res.error ?? 'send failed',
127
+ scheduledAt: new Date(now.getTime() + backoffMs(attempts)),
128
+ claimedAt: null,
129
+ lockExpiresAt: null,
130
+ })
131
+ .where(and(eq(emailOutbox.id, row.id), eq(emailOutbox.status, 'sending')));
132
+ }
133
+ }
134
+ if (okIds.length > 0) {
135
+ // Guard on status='sending': if another replica reclaimed a stale row mid-tick
136
+ // it would no longer be 'sending' as claimed by us, so we won't stomp it sent.
137
+ await db
138
+ .update(emailOutbox)
139
+ .set({ status: 'sent', sentAt: now, lastError: null })
140
+ .where(and(inArray(emailOutbox.id, okIds), eq(emailOutbox.status, 'sending')));
141
+ sent += okIds.length;
116
142
  }
117
143
  // Throttle provider API calls to the rate limit (skip after the last chunk).
118
144
  if (c < chunks.length - 1)
@@ -1 +1 @@
1
- {"version":3,"file":"outbox.js","sourceRoot":"","sources":["../../src/comms/outbox.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"outbox.js","sourceRoot":"","sources":["../../src/comms/outbox.ts"],"names":[],"mappings":"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"}
package/dist/email.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { SmtpEmailAdapter, ResendEmailAdapter, ConsoleEmailAdapter, emailTemplates, } from '@commonpub/infra/email';
2
- export type { EmailAdapter, EmailMessage } from '@commonpub/infra/email';
1
+ export { SmtpEmailAdapter, ResendEmailAdapter, ConsoleEmailAdapter, emailTemplates, EMAIL_HTTP_TIMEOUT_MS, } from '@commonpub/infra/email';
2
+ export type { EmailAdapter, EmailMessage, EmailSendResult } from '@commonpub/infra/email';
3
3
  //# sourceMappingURL=email.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../src/email.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,GACf,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../src/email.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/email.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // Re-export from @commonpub/infra for backward compatibility
2
- export { SmtpEmailAdapter, ResendEmailAdapter, ConsoleEmailAdapter, emailTemplates, } from '@commonpub/infra/email';
2
+ export { SmtpEmailAdapter, ResendEmailAdapter, ConsoleEmailAdapter, emailTemplates, EMAIL_HTTP_TIMEOUT_MS, } from '@commonpub/infra/email';
3
3
  //# sourceMappingURL=email.js.map
package/dist/email.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"email.js","sourceRoot":"","sources":["../src/email.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,GACf,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"email.js","sourceRoot":"","sources":["../src/email.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,qBAAqB,GACtB,MAAM,wBAAwB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@commonpub/server",
3
- "version": "2.97.0",
3
+ "version": "2.97.1",
4
4
  "type": "module",
5
5
  "description": "Framework-agnostic business logic for CommonPub instances",
6
6
  "license": "AGPL-3.0-or-later",
@@ -115,13 +115,13 @@
115
115
  "megalodon": "^10.3.0",
116
116
  "turndown": "^7.2.4",
117
117
  "@commonpub/auth": "0.8.0",
118
- "@commonpub/editor": "0.9.0",
119
- "@commonpub/learning": "0.5.2",
120
118
  "@commonpub/config": "0.24.0",
121
119
  "@commonpub/docs": "0.6.3",
120
+ "@commonpub/infra": "0.10.1",
121
+ "@commonpub/learning": "0.5.2",
122
122
  "@commonpub/protocol": "0.14.0",
123
- "@commonpub/infra": "0.10.0",
124
- "@commonpub/schema": "0.51.0"
123
+ "@commonpub/schema": "0.51.0",
124
+ "@commonpub/editor": "0.9.0"
125
125
  },
126
126
  "peerDependencies": {
127
127
  "drizzle-orm": "^0.45.1"