@bobfrankston/rmfmail 1.1.203 → 1.1.205
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/client/compose/compose.bundle.js +100 -25
- package/client/compose/compose.bundle.js.map +3 -3
- package/client/lib/rmf-tiny.js +121 -25
- package/package.json +3 -3
- package/packages/mailx-imap/index.d.ts +22 -0
- package/packages/mailx-imap/index.d.ts.map +1 -1
- package/packages/mailx-imap/index.js +45 -30
- package/packages/mailx-imap/index.js.map +1 -1
- package/packages/mailx-imap/index.ts +47 -31
- package/packages/mailx-imap/package-lock.json +2 -2
- package/packages/mailx-imap/package.json +1 -1
- /package/packages/mailx-imap/{node_modules.npmglobalize-stash-18260 → node_modules.npmglobalize-stash-32632}/.package-lock.json +0 -0
package/client/lib/rmf-tiny.js
CHANGED
|
@@ -81,6 +81,31 @@ export async function createTinyMceEditor(container, opts = {}) {
|
|
|
81
81
|
target.id = `rmf-tiny-${Math.random().toString(36).slice(2, 10)}`;
|
|
82
82
|
target.style.cssText = "width:100%;height:100%;";
|
|
83
83
|
container.appendChild(target);
|
|
84
|
+
// Code-block languages — shared by the stock codesample dialog
|
|
85
|
+
// (codesample_languages) AND our custom "Insert code" dialog below, so a
|
|
86
|
+
// language added here shows up in both. "Text" first = default (no
|
|
87
|
+
// highlighting, which would mangle plain pasted snippets — Bob 2026-05-24).
|
|
88
|
+
// PowerShell added 2026-05-31 (Bob: ".ps1 is another file type").
|
|
89
|
+
const CODE_LANGS = [
|
|
90
|
+
{ text: "Text", value: "text" },
|
|
91
|
+
{ text: "HTML/XML", value: "markup" },
|
|
92
|
+
{ text: "JavaScript", value: "javascript" },
|
|
93
|
+
{ text: "TypeScript", value: "typescript" },
|
|
94
|
+
{ text: "CSS", value: "css" },
|
|
95
|
+
{ text: "JSON", value: "json" },
|
|
96
|
+
{ text: "Python", value: "python" },
|
|
97
|
+
{ text: "Java", value: "java" },
|
|
98
|
+
{ text: "C", value: "c" },
|
|
99
|
+
{ text: "C++", value: "cpp" },
|
|
100
|
+
{ text: "C#", value: "csharp" },
|
|
101
|
+
{ text: "Go", value: "go" },
|
|
102
|
+
{ text: "Rust", value: "rust" },
|
|
103
|
+
{ text: "Ruby", value: "ruby" },
|
|
104
|
+
{ text: "PHP", value: "php" },
|
|
105
|
+
{ text: "Shell", value: "bash" },
|
|
106
|
+
{ text: "PowerShell", value: "powershell" },
|
|
107
|
+
{ text: "SQL", value: "sql" },
|
|
108
|
+
];
|
|
84
109
|
const editor = await new Promise((resolve) => {
|
|
85
110
|
tinymce.init({
|
|
86
111
|
target,
|
|
@@ -93,7 +118,7 @@ export async function createTinyMceEditor(container, opts = {}) {
|
|
|
93
118
|
plugins: "paste lists advlist link table code codesample image searchreplace autolink wordcount emoticons charmap insertdatetime quickbars nonbreaking directionality help",
|
|
94
119
|
toolbar: [
|
|
95
120
|
"undo redo | bold italic underline strikethrough | forecolor backcolor",
|
|
96
|
-
"bullist numlist outdent indent | link table image code
|
|
121
|
+
"bullist numlist outdent indent | link table image code rmfcode | emoticons charmap | help",
|
|
97
122
|
].join(" | "),
|
|
98
123
|
// Include "tools" so wordcount and searchreplace are reachable.
|
|
99
124
|
menubar: "file edit view insert format tools",
|
|
@@ -120,25 +145,7 @@ export async function createTinyMceEditor(container, opts = {}) {
|
|
|
120
145
|
// which mangles unrelated paste content (Bob 2026-05-24).
|
|
121
146
|
// Adding Text first so it's the default; rest are the modern
|
|
122
147
|
// languages we actually paste.
|
|
123
|
-
codesample_languages:
|
|
124
|
-
{ text: "Text", value: "text" },
|
|
125
|
-
{ text: "HTML/XML", value: "markup" },
|
|
126
|
-
{ text: "JavaScript", value: "javascript" },
|
|
127
|
-
{ text: "TypeScript", value: "typescript" },
|
|
128
|
-
{ text: "CSS", value: "css" },
|
|
129
|
-
{ text: "JSON", value: "json" },
|
|
130
|
-
{ text: "Python", value: "python" },
|
|
131
|
-
{ text: "Java", value: "java" },
|
|
132
|
-
{ text: "C", value: "c" },
|
|
133
|
-
{ text: "C++", value: "cpp" },
|
|
134
|
-
{ text: "C#", value: "csharp" },
|
|
135
|
-
{ text: "Go", value: "go" },
|
|
136
|
-
{ text: "Rust", value: "rust" },
|
|
137
|
-
{ text: "Ruby", value: "ruby" },
|
|
138
|
-
{ text: "PHP", value: "php" },
|
|
139
|
-
{ text: "Shell", value: "bash" },
|
|
140
|
-
{ text: "SQL", value: "sql" },
|
|
141
|
-
],
|
|
148
|
+
codesample_languages: CODE_LANGS,
|
|
142
149
|
// WebView's native spell-check (red underlines, right-click
|
|
143
150
|
// "Add to dictionary"). Free; same UX as Quill's spellcheck=true.
|
|
144
151
|
// Premium tinymcespellchecker plugin would replace this with a
|
|
@@ -156,6 +163,17 @@ export async function createTinyMceEditor(container, opts = {}) {
|
|
|
156
163
|
statusbar: false,
|
|
157
164
|
branding: false,
|
|
158
165
|
license_key: "gpl",
|
|
166
|
+
// Keep URLs verbatim. TinyMCE defaults to convert_urls:true +
|
|
167
|
+
// relative_urls:true, which rewrites an absolute href
|
|
168
|
+
// (https://github.com/…) to be RELATIVE to the editor's base URL
|
|
169
|
+
// (the msger custom-protocol page). A link that worked in the
|
|
170
|
+
// original message arrives in the reply quote rewritten/dead
|
|
171
|
+
// (Bob 2026-05-31: "URL works in the original but not in the
|
|
172
|
+
// reply"). false on both = hrefs travel into the sent message
|
|
173
|
+
// exactly as the sender wrote them.
|
|
174
|
+
convert_urls: false,
|
|
175
|
+
relative_urls: false,
|
|
176
|
+
remove_script_host: false,
|
|
159
177
|
paste_data_images: true,
|
|
160
178
|
// Permissive valid_elements — preserve as much of the source
|
|
161
179
|
// formatting as possible. The default is more aggressive about
|
|
@@ -250,6 +268,67 @@ export async function createTinyMceEditor(container, opts = {}) {
|
|
|
250
268
|
applyZoom();
|
|
251
269
|
saveZoom();
|
|
252
270
|
};
|
|
271
|
+
// Custom "Insert code" — wraps the stock codesample plugin
|
|
272
|
+
// (keeps its Prism highlighting + edit-in-place) but adds a
|
|
273
|
+
// "Box it in" border checkbox so a snippet is visually
|
|
274
|
+
// demarcated from surrounding prose. The border is applied as
|
|
275
|
+
// an INLINE style on the <pre>, NOT a content_style class, so
|
|
276
|
+
// it survives into the sent email where the recipient has none
|
|
277
|
+
// of our editor CSS. Bob 2026-05-31.
|
|
278
|
+
const BORDER_STYLES = { "border": "1px solid #888", "border-radius": "4px", "padding": "10px" };
|
|
279
|
+
const openCodeDialog = () => {
|
|
280
|
+
const cs = ed.plugins.codesample;
|
|
281
|
+
const preEl = ed.dom.getParent(ed.selection.getNode(), "pre");
|
|
282
|
+
let curLang = "text";
|
|
283
|
+
let curBorder = false;
|
|
284
|
+
if (preEl) {
|
|
285
|
+
const m = (preEl.className || "").match(/language-([\w-]+)/);
|
|
286
|
+
if (m)
|
|
287
|
+
curLang = m[1];
|
|
288
|
+
curBorder = !!(preEl.style && preEl.style.border && preEl.style.border !== "none");
|
|
289
|
+
}
|
|
290
|
+
const curCode = (cs && cs.getCurrentCode) ? (cs.getCurrentCode(ed) || "") : "";
|
|
291
|
+
ed.windowManager.open({
|
|
292
|
+
title: "Insert code",
|
|
293
|
+
size: "large",
|
|
294
|
+
body: {
|
|
295
|
+
type: "panel",
|
|
296
|
+
items: [
|
|
297
|
+
{ type: "listbox", name: "language", label: "Language", items: CODE_LANGS },
|
|
298
|
+
{ type: "textarea", name: "code", label: "Code" },
|
|
299
|
+
{ type: "checkbox", name: "border", label: "Box it in (border around the code)" },
|
|
300
|
+
],
|
|
301
|
+
},
|
|
302
|
+
initialData: { language: curLang, code: curCode, border: curBorder },
|
|
303
|
+
buttons: [
|
|
304
|
+
{ type: "cancel", text: "Cancel" },
|
|
305
|
+
{ type: "submit", text: "Save", primary: true },
|
|
306
|
+
],
|
|
307
|
+
onSubmit: (api) => {
|
|
308
|
+
const data = api.getData();
|
|
309
|
+
if (cs && cs.insertCodeSample)
|
|
310
|
+
cs.insertCodeSample(data.language, data.code);
|
|
311
|
+
const pre = ed.dom.getParent(ed.selection.getNode(), "pre");
|
|
312
|
+
if (pre) {
|
|
313
|
+
if (data.border)
|
|
314
|
+
ed.dom.setStyles(pre, BORDER_STYLES);
|
|
315
|
+
else
|
|
316
|
+
ed.dom.setStyles(pre, { "border": "", "border-radius": "", "padding": "" });
|
|
317
|
+
}
|
|
318
|
+
api.close();
|
|
319
|
+
},
|
|
320
|
+
});
|
|
321
|
+
};
|
|
322
|
+
ed.ui.registry.addButton("rmfcode", {
|
|
323
|
+
icon: "code-sample",
|
|
324
|
+
tooltip: "Insert/edit code block",
|
|
325
|
+
onAction: openCodeDialog,
|
|
326
|
+
});
|
|
327
|
+
ed.ui.registry.addMenuItem("rmfcode", {
|
|
328
|
+
icon: "code-sample",
|
|
329
|
+
text: "Code block…",
|
|
330
|
+
onAction: openCodeDialog,
|
|
331
|
+
});
|
|
253
332
|
ed.ui.registry.addMenuItem("zoomIn", {
|
|
254
333
|
text: "Zoom in", shortcut: "Ctrl+=",
|
|
255
334
|
onAction: () => bumpZoom(ZOOM_STEP),
|
|
@@ -326,11 +405,28 @@ export async function createTinyMceEditor(container, opts = {}) {
|
|
|
326
405
|
}
|
|
327
406
|
if (tail.toString().length > 0)
|
|
328
407
|
return;
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
408
|
+
// Move the caret to just after the link. Use TinyMCE's
|
|
409
|
+
// own selection API rather than a raw
|
|
410
|
+
// removeAllRanges/addRange: the raw mutation ran ahead
|
|
411
|
+
// of TinyMCE's beforeinput handling and desynced its
|
|
412
|
+
// UndoManager, leaving Ctrl+Z erratic (Bob 2026-05-31:
|
|
413
|
+
// "^z is very broken in TinyMCE"). Going through
|
|
414
|
+
// ed.selection keeps TinyMCE's selection + undo state
|
|
415
|
+
// consistent. Raw range as a fallback if it throws.
|
|
416
|
+
const parent = link.parentNode;
|
|
417
|
+
const idx = parent ? Array.prototype.indexOf.call(parent.childNodes, link) + 1 : -1;
|
|
418
|
+
if (parent && idx >= 0) {
|
|
419
|
+
try {
|
|
420
|
+
ed.selection.setCursorLocation(parent, idx);
|
|
421
|
+
}
|
|
422
|
+
catch {
|
|
423
|
+
const after = doc.createRange();
|
|
424
|
+
after.setStartAfter(link);
|
|
425
|
+
after.collapse(true);
|
|
426
|
+
sel.removeAllRanges();
|
|
427
|
+
sel.addRange(after);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
334
430
|
}, true);
|
|
335
431
|
};
|
|
336
432
|
ed.on("init", installLinkEscape);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bobfrankston/rmfmail",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.205",
|
|
4
4
|
"description": "Local-first email client with IMAP sync and standalone native app",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "bin/mailx.js",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"@bobfrankston/msger": "^0.1.384",
|
|
46
46
|
"@bobfrankston/node-tcp-transport": "^0.1.8",
|
|
47
47
|
"@bobfrankston/oauthsupport": "^1.0.31",
|
|
48
|
-
"@bobfrankston/rmf-tiny": "^0.1.
|
|
48
|
+
"@bobfrankston/rmf-tiny": "^0.1.27",
|
|
49
49
|
"@bobfrankston/smtp-direct": "^0.1.8",
|
|
50
50
|
"@bobfrankston/tcp-transport": "^0.1.6",
|
|
51
51
|
"@capacitor/android": "^8.3.0",
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
"@bobfrankston/msger": "^0.1.384",
|
|
126
126
|
"@bobfrankston/node-tcp-transport": "^0.1.8",
|
|
127
127
|
"@bobfrankston/oauthsupport": "^1.0.31",
|
|
128
|
-
"@bobfrankston/rmf-tiny": "^0.1.
|
|
128
|
+
"@bobfrankston/rmf-tiny": "^0.1.27",
|
|
129
129
|
"@bobfrankston/smtp-direct": "^0.1.8",
|
|
130
130
|
"@bobfrankston/tcp-transport": "^0.1.6",
|
|
131
131
|
"@capacitor/android": "^8.3.0",
|
|
@@ -479,6 +479,28 @@ export declare class ImapManager extends EventEmitter {
|
|
|
479
479
|
* sending/queued/ on every send — that write is gone now, so scanning the
|
|
480
480
|
* directory is safe again. Any legitimate files that land there (crash
|
|
481
481
|
* recovery, manual drop) will get sent. */
|
|
482
|
+
/** Recover stale `.sending-<host>-<pid>` claims for an account back to
|
|
483
|
+
* plain `.ltr` so the next tick can retry. A claim is stale if:
|
|
484
|
+
* (a) the PID is dead — original owner crashed/was replaced mid-send;
|
|
485
|
+
* (b) the PID is alive but it's not us and the file mtime is older than
|
|
486
|
+
* STALE_CLAIM_MS — `process.kill(pid,0)` only proves *some* process
|
|
487
|
+
* owns that PID, not our long-dead daemon (OS recycles PIDs); the
|
|
488
|
+
* age guard stops an unrelated Node (statusline/msger/npm) inheriting
|
|
489
|
+
* a recycled PID from pinning the claim forever (Bob's 7-hour stuck
|
|
490
|
+
* `.sending-rmf39-63196`);
|
|
491
|
+
* (c) it's our PID — never sweep our own live claim.
|
|
492
|
+
* Foreign hosts are left alone (we can't probe their PIDs); cross-host
|
|
493
|
+
* recovery is the IMAP-folder sweeper's job.
|
|
494
|
+
*
|
|
495
|
+
* CRITICAL: this is a local filesystem op with NO network I/O, so it MUST
|
|
496
|
+
* run independently of send-backoff. It used to live inside
|
|
497
|
+
* processLocalQueue, which the outbox worker SKIPS when an account is in
|
|
498
|
+
* backoff — so a persistently-erroring account (e.g. Dovecot "Not
|
|
499
|
+
* connected" storms) never recovered its claims, leaving a message stuck
|
|
500
|
+
* "sending…" forever while healthy accounts drained. Bob 2026-05-31:
|
|
501
|
+
* "stuck while others are getting sent." Now called every tick for every
|
|
502
|
+
* account before the backoff gate. */
|
|
503
|
+
private recoverStaleClaims;
|
|
482
504
|
private processLocalQueue;
|
|
483
505
|
/** Send a raw RFC 2822 message via SMTP for a given account.
|
|
484
506
|
* Uses @bobfrankston/smtp-direct with the same TransportFactory as IMAP —
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,OAAO,EAAW,gBAAgB,EAA+C,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAE1H,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAgB,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACtG,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAqF3C,yCAAyC;AACzC,MAAM,WAAW,iBAAiB;IAC9B,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;IACrF,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3E,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;IAC5G,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACzF,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;+EAC2E;IAC3E,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1F;;;8EAG0E;IAC1E,YAAY,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC7C;0DACsD;IACtD,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC1E;AAED;0DAC0D;AAC1D,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,kEAAkE;AAClE,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpF;AA0FD,qBAAa,WAAY,SAAQ,YAAY;IACzC,OAAO,CAAC,OAAO,CAAmE;IAClF,OAAO,CAAC,QAAQ,CAAsC;IAQtD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,YAAY,CAA+B;IACnD;;;;;;;6DAOyD;IACzD,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,KAAK,EAAE,GAAqC;IACnD,OAAO,KAAK,SAAS,GAAqD;IAC1E,OAAO,CAAC,aAAa,CAA0D;IAC/E,2FAA2F;IAC3F,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;IAC7B;;;2DAGuD;IACvD,OAAO,CAAC,UAAU,CAAsB;IACxC,yEAAyE;IACzE,eAAe,UAAS;IAOxB;;;;yDAIqD;IACrD,OAAO,CAAC,WAAW,CAAyC;IAE5D,OAAO,CAAC,mBAAmB;IAS3B;;sEAEkE;IAClE,OAAO,CAAC,WAAW;IAkBnB,4EAA4E;IAC5E,sBAAsB,IAAI,kBAAkB,EAAE;IAI9C,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,gBAAgB;IAoC5D,4DAA4D;IACtD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAM9D,uEAAuE;IACvE,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,yFAAyF;IACzF,OAAO,CAAC,iBAAiB,CAA6B;IAEtD,yGAAyG;IACnG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4CzD,+FAA+F;IACzF,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvF,iEAAiE;IAC3D,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAM9F;;;;;uDAKmD;IAC7C,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA0BxH,kFAAkF;IAC5E,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAazD;;mCAE+B;IAC/B,OAAO,CAAC,UAAU,CAA0B;IAC5C;;;;;;qDAMiD;IACjD,OAAO,CAAC,WAAW,CAA0B;IAC7C;;;2EAGuE;IACvE,OAAO,CAAC,SAAS,CAA+B;IAChD;;;;4DAIwD;IACxD,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAK;IAEzC;;;;;qEAKiE;YACnD,aAAa;IA4B3B;;gDAE4C;YAC9B,YAAY;IAI1B,wFAAwF;IACxF;;;;;;;;;;;;wCAYoC;IAC9B,cAAc,CAAC,CAAC,EAClB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,EAC/B,IAAI,GAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAClD,OAAO,CAAC,CAAC,CAAC;IAiDb;;;qBAGiB;IACjB,OAAO,CAAC,aAAa;IAkBrB;;;qCAGiC;IACjC,OAAO,CAAC,eAAe;IAwBvB;8DAC0D;IAC1D,OAAO,CAAC,WAAW,CAAoC;IAEvD;;;;uEAImE;YACrD,SAAS;IA8DvB;;;;4CAIwC;IAClC,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvD;sBACkB;IACZ,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBrD;;qEAEiE;IAC3D,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAG5D;;6DAEyD;YAC3C,YAAY;IAG1B,OAAO,CAAC,WAAW;IAEnB,yCAAyC;IACzC,eAAe,IAAI,MAAM;IAEzB,0BAA0B;IACpB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAwGvD,sEAAsE;IACtE,OAAO,CAAC,cAAc;IAOtB,sFAAsF;IACtF,OAAO,CAAC,gBAAgB;IAMxB,mFAAmF;IACnF,OAAO,CAAC,kBAAkB;IAmB1B,sCAAsC;IAChC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA0ErE,yFAAyF;YAC3E,aAAa;IAwG3B;;;;;;;;;mEAS+D;IACzD,wBAAwB,CAC1B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EACpC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EAAE,GAChB,OAAO,CAAC,IAAI,CAAC;IAkDhB,0CAA0C;IAC1C;;;;;;;;;;;;;;;8DAe0D;IAC1D,OAAO,CAAC,eAAe,CAAsC;IAEvD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;YAkBtE,eAAe;IAyjB7B,wCAAwC;IAClC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAahB,QAAQ;IA8BtB,mEAAmE;YACrD,WAAW;IA2MzB,8DAA8D;YAChD,iBAAiB;IAmD/B,iDAAiD;YACnC,gBAAgB;IAuH9B,uCAAuC;IACvC,OAAO,CAAC,gBAAgB;IA2DxB,sDAAsD;YACxC,YAAY;IAO1B;;;;;yEAKqE;IACrE,OAAO,CAAC,eAAe;IAwBvB;;;;mEAI+D;IACzD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCxD,iEAAiE;IAC3D,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAiChC;;;4EAGwE;IACxE,OAAO,CAAC,eAAe,CAAsC;IAC7D,OAAO,CAAC,iBAAiB,CAAqB;IAE9C;;yFAEqF;YACvE,UAAU;IAyBxB,sFAAsF;IAChF,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAKhD,cAAc;YAqBd,eAAe;IA4B7B,kDAAkD;IAC5C,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtC,0BAA0B;IAC1B,iBAAiB,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI;IAkGhD;;sEAEkE;IAC5D,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAYlC,yBAAyB;IACzB,gBAAgB,IAAI,IAAI;IAOxB,gFAAgF;IAChF,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAK1C;;;6EAGyE;IACnE,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAuGpC,6BAA6B;IACvB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAQnC;;kEAE8D;IAC9D;;;;;;oDAMgD;IAChD,OAAO,CAAC,eAAe,CAAoD;IAC3E;;;;;;wEAMoE;IACpE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAe;IAEhE,OAAO,CAAC,+BAA+B;YAyCzB,cAAc;IAQ5B;;;;;;;;;;6CAUyC;IACnC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgDhG;;;2EAGuE;YACzD,sBAAsB;IAwCpC;;;;yEAIqE;IACrE;;;gFAG4E;IAC5E,OAAO,CAAC,mBAAmB,CAAqB;IAEhD;;;;;;;4EAOwE;IACxE,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAe;IACtD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAK;IAE5C,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,iBAAiB;IAIzB;;;;;;;;;;;;;uDAamD;IACnD,OAAO,CAAC,gBAAgB,CAA2D;IACnF,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,eAAe;IASvB;;;;;6BAKyB;IACzB,OAAO,CAAC,kBAAkB;IAI1B;;;0EAGsE;IAChE,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAgBxC,eAAe;IA0R7B,2CAA2C;IAC3C,YAAY,IAAI,gBAAgB;IAIhC;;;;iEAI6D;IAC7D,OAAO,CAAC,mBAAmB,CAAqB;IAC1C,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCrE,qEAAqE;IAC/D,uBAAuB,CACzB,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EACxD,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GACxC,OAAO,CAAC,IAAI,CAAC;IAyBhB,kDAAkD;IAC5C,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyM1D,oDAAoD;IACpD,OAAO,CAAC,UAAU;IAalB,2DAA2D;IACrD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/E;2EACuE;IACjE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmFpI;;yEAEqE;IAC/D,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0EvF;;;;;;iFAM6E;IAC7E,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAyC/D;;iFAE6E;IAC7E,eAAe,IAAI,YAAY;IAyD/B,4DAA4D;IAC5D,OAAO,CAAC,gBAAgB;IAIxB,uEAAuE;IACvE,OAAO,CAAC,eAAe,CAAqB;IAE5C,wFAAwF;YAC1E,kBAAkB;YAOlB,mBAAmB;IA6BjC,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAE1C,oDAAoD;YACtC,YAAY;IAuB1B,mFAAmF;IACnF,OAAO,CAAC,eAAe;IAevB;;;;6DAIyD;IACzD,OAAO,CAAC,oBAAoB;IAiC5B;;;wEAGoE;IACpE,OAAO,CAAC,kBAAkB;IAiB1B,gFAAgF;IAC1E,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyDlF;;;;;gDAK4C;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|
|
@@ -4089,34 +4089,35 @@ export class ImapManager extends EventEmitter {
|
|
|
4089
4089
|
* sending/queued/ on every send — that write is gone now, so scanning the
|
|
4090
4090
|
* directory is safe again. Any legitimate files that land there (crash
|
|
4091
4091
|
* recovery, manual drop) will get sent. */
|
|
4092
|
-
|
|
4093
|
-
|
|
4094
|
-
|
|
4095
|
-
|
|
4096
|
-
|
|
4097
|
-
|
|
4098
|
-
|
|
4099
|
-
|
|
4100
|
-
|
|
4101
|
-
|
|
4102
|
-
|
|
4103
|
-
|
|
4104
|
-
|
|
4105
|
-
|
|
4106
|
-
|
|
4107
|
-
|
|
4108
|
-
|
|
4109
|
-
|
|
4110
|
-
|
|
4111
|
-
|
|
4112
|
-
|
|
4113
|
-
|
|
4114
|
-
// got recycled. Earlier 1h was a band-aid that left Bob's
|
|
4115
|
-
// outbox stuck for hours when an SMTP wedge crashed the
|
|
4116
|
-
// worker mid-flight.
|
|
4092
|
+
/** Recover stale `.sending-<host>-<pid>` claims for an account back to
|
|
4093
|
+
* plain `.ltr` so the next tick can retry. A claim is stale if:
|
|
4094
|
+
* (a) the PID is dead — original owner crashed/was replaced mid-send;
|
|
4095
|
+
* (b) the PID is alive but it's not us and the file mtime is older than
|
|
4096
|
+
* STALE_CLAIM_MS — `process.kill(pid,0)` only proves *some* process
|
|
4097
|
+
* owns that PID, not our long-dead daemon (OS recycles PIDs); the
|
|
4098
|
+
* age guard stops an unrelated Node (statusline/msger/npm) inheriting
|
|
4099
|
+
* a recycled PID from pinning the claim forever (Bob's 7-hour stuck
|
|
4100
|
+
* `.sending-rmf39-63196`);
|
|
4101
|
+
* (c) it's our PID — never sweep our own live claim.
|
|
4102
|
+
* Foreign hosts are left alone (we can't probe their PIDs); cross-host
|
|
4103
|
+
* recovery is the IMAP-folder sweeper's job.
|
|
4104
|
+
*
|
|
4105
|
+
* CRITICAL: this is a local filesystem op with NO network I/O, so it MUST
|
|
4106
|
+
* run independently of send-backoff. It used to live inside
|
|
4107
|
+
* processLocalQueue, which the outbox worker SKIPS when an account is in
|
|
4108
|
+
* backoff — so a persistently-erroring account (e.g. Dovecot "Not
|
|
4109
|
+
* connected" storms) never recovered its claims, leaving a message stuck
|
|
4110
|
+
* "sending…" forever while healthy accounts drained. Bob 2026-05-31:
|
|
4111
|
+
* "stuck while others are getting sent." Now called every tick for every
|
|
4112
|
+
* account before the backoff gate. */
|
|
4113
|
+
recoverStaleClaims(accountId) {
|
|
4117
4114
|
const STALE_CLAIM_MS = 5 * 60_000;
|
|
4118
4115
|
const myPid = process.pid;
|
|
4119
|
-
|
|
4116
|
+
const dirs = [
|
|
4117
|
+
path.join(getConfigDir(), "outbox", accountId),
|
|
4118
|
+
path.join(getConfigDir(), "sending", accountId, "queued"),
|
|
4119
|
+
];
|
|
4120
|
+
for (const dir of dirs) {
|
|
4120
4121
|
if (!fs.existsSync(dir))
|
|
4121
4122
|
continue;
|
|
4122
4123
|
for (const f of fs.readdirSync(dir)) {
|
|
@@ -4140,9 +4141,8 @@ export class ImapManager extends EventEmitter {
|
|
|
4140
4141
|
ageMs = Date.now() - fs.statSync(path.join(dir, f)).mtimeMs;
|
|
4141
4142
|
}
|
|
4142
4143
|
catch { /* */ }
|
|
4143
|
-
// Live PID + recent mtime →
|
|
4144
|
-
// Live PID + ancient mtime → PID
|
|
4145
|
-
// Dead PID → sweep regardless of age.
|
|
4144
|
+
// Live PID + recent mtime → genuine sibling owner, leave it.
|
|
4145
|
+
// Live PID + ancient mtime → recycled PID, sweep. Dead PID → sweep.
|
|
4146
4146
|
if (alive && ageMs < STALE_CLAIM_MS)
|
|
4147
4147
|
continue;
|
|
4148
4148
|
try {
|
|
@@ -4153,6 +4153,14 @@ export class ImapManager extends EventEmitter {
|
|
|
4153
4153
|
catch { /* ignore */ }
|
|
4154
4154
|
}
|
|
4155
4155
|
}
|
|
4156
|
+
}
|
|
4157
|
+
async processLocalQueue(accountId) {
|
|
4158
|
+
const outboxDir = path.join(getConfigDir(), "outbox", accountId);
|
|
4159
|
+
const queuedDir = path.join(getConfigDir(), "sending", accountId, "queued");
|
|
4160
|
+
// Recovery also runs unconditionally in the worker tick (before the
|
|
4161
|
+
// backoff gate); keep it here too for the direct-call path from
|
|
4162
|
+
// queueOutgoing. Idempotent — a no-op when nothing is stale.
|
|
4163
|
+
this.recoverStaleClaims(accountId);
|
|
4156
4164
|
const filesToSend = [];
|
|
4157
4165
|
for (const dir of [outboxDir, queuedDir]) {
|
|
4158
4166
|
if (!fs.existsSync(dir))
|
|
@@ -4634,7 +4642,14 @@ export class ImapManager extends EventEmitter {
|
|
|
4634
4642
|
// per-account sweep picks them up below.
|
|
4635
4643
|
this.routeGeneralOutbox();
|
|
4636
4644
|
for (const [accountId] of this.configs) {
|
|
4637
|
-
//
|
|
4645
|
+
// Recover stale claims FIRST, unconditionally — it's a local
|
|
4646
|
+
// FS op with no network, so it must not be gated by send
|
|
4647
|
+
// backoff. Otherwise an account stuck in backoff (Dovecot "Not
|
|
4648
|
+
// connected" storms) never unclaims an orphaned .sending- file,
|
|
4649
|
+
// and a message sits "sending…" forever while other accounts
|
|
4650
|
+
// drain (Bob 2026-05-31).
|
|
4651
|
+
this.recoverStaleClaims(accountId);
|
|
4652
|
+
// Skip the SEND for accounts in backoff (network ops only).
|
|
4638
4653
|
const retryAfter = this.outboxBackoff.get(accountId) || 0;
|
|
4639
4654
|
if (now < retryAfter)
|
|
4640
4655
|
continue;
|