@bobfrankston/rmfmail 1.2.123 → 1.2.125

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.
Files changed (58) hide show
  1. package/README.md +6 -0
  2. package/TODO.md +2 -0
  3. package/bin/mailx.js +51 -0
  4. package/bin/mailx.js.map +1 -1
  5. package/bin/mailx.ts +45 -1
  6. package/bin/popout-server.js +40 -2
  7. package/bin/popout-server.js.map +1 -1
  8. package/bin/popout-server.ts +36 -2
  9. package/client/android-bootstrap.bundle.js +29 -21
  10. package/client/android-bootstrap.bundle.js.map +3 -3
  11. package/client/app.bundle.js +41 -3
  12. package/client/app.bundle.js.map +3 -3
  13. package/client/app.js +16 -0
  14. package/client/app.js.map +1 -1
  15. package/client/app.ts +15 -0
  16. package/client/components/folder-tree.js +31 -3
  17. package/client/components/folder-tree.js.map +1 -1
  18. package/client/components/folder-tree.ts +24 -3
  19. package/client/components/message-viewer.js +1 -1
  20. package/client/components/message-viewer.js.map +1 -1
  21. package/client/components/message-viewer.ts +1 -1
  22. package/client/compose/compose.bundle.js +7 -0
  23. package/client/compose/compose.bundle.js.map +2 -2
  24. package/client/index.html +2 -0
  25. package/client/lib/api-client.js +8 -0
  26. package/client/lib/api-client.js.map +1 -1
  27. package/client/lib/api-client.ts +8 -0
  28. package/client/lib/mailxapi.js +4 -0
  29. package/client/lib/popout-bridge.js +14 -0
  30. package/client/lib/popout-bridge.js.map +1 -1
  31. package/client/lib/popout-bridge.ts +12 -0
  32. package/package.json +9 -9
  33. package/packages/mailx-imap/index.d.ts.map +1 -1
  34. package/packages/mailx-imap/index.js +23 -2
  35. package/packages/mailx-imap/index.js.map +1 -1
  36. package/packages/mailx-imap/index.ts +21 -2
  37. package/packages/mailx-imap/package-lock.json +2 -2
  38. package/packages/mailx-imap/package.json +1 -1
  39. package/packages/mailx-service/index.d.ts +21 -0
  40. package/packages/mailx-service/index.d.ts.map +1 -1
  41. package/packages/mailx-service/index.js +28 -2
  42. package/packages/mailx-service/index.js.map +1 -1
  43. package/packages/mailx-service/index.ts +28 -2
  44. package/packages/mailx-service/jsonrpc.js +2 -0
  45. package/packages/mailx-service/jsonrpc.js.map +1 -1
  46. package/packages/mailx-service/jsonrpc.ts +2 -0
  47. package/packages/mailx-service/sync-queue.d.ts +8 -0
  48. package/packages/mailx-service/sync-queue.d.ts.map +1 -1
  49. package/packages/mailx-service/sync-queue.js +10 -0
  50. package/packages/mailx-service/sync-queue.js.map +1 -1
  51. package/packages/mailx-service/sync-queue.ts +11 -0
  52. package/packages/mailx-settings/package.json +1 -1
  53. package/packages/mailx-store-web/package.json +1 -1
  54. package/packages/mailx-store-web/web-service.d.ts.map +1 -1
  55. package/packages/mailx-store-web/web-service.js +9 -2
  56. package/packages/mailx-store-web/web-service.js.map +1 -1
  57. package/packages/mailx-store-web/web-service.ts +9 -2
  58. package/packages/mailx-types/package.json +1 -1
package/bin/mailx.ts CHANGED
@@ -1964,7 +1964,7 @@ RFC 5322 with CRLF line endings. Bodies are quoted-printable encoded (readable i
1964
1964
  // events (app.ts opens the editable compose there — the popout page has no
1965
1965
  // IPC bridge so it can't host compose itself). `sendToClient` is late-bound:
1966
1966
  // the ServiceHandle doesn't exist yet at this point in startup.
1967
- let popoutInfo: { port: number; token: string } | null = null;
1967
+ let popoutInfo: import("./popout-server.js").PopoutServerInfo | null = null;
1968
1968
  let sendToClient: ((msg: any) => void) | null = null;
1969
1969
  const popoutWindows = new Map<string, ReturnType<typeof showMessageBoxEx>>();
1970
1970
  // Timestamp of the most recent popout close — reported as a delta in the
@@ -2168,6 +2168,38 @@ RFC 5322 with CRLF line endings. Bodies are quoted-printable encoded (readable i
2168
2168
  if (h && !h.closed) { try { h.close(); } catch { /* already gone */ } }
2169
2169
  },
2170
2170
  });
2171
+ // Secondary MAIN windows (View → New window) — the full app served
2172
+ // through the popout server. Request/response IPC all works over the
2173
+ // HTTP bridge; push events don't reach these windows (no live
2174
+ // new-mail update), which is fine for the side-by-side folder-view
2175
+ // use case (Bob 2026-07-12: Drafts and Sent in separate OS windows).
2176
+ let mainPopoutSeq = 0;
2177
+ svc.setMainPopoutFn(async (target?: { accountId?: string; folderId?: number; name?: string }) => {
2178
+ const key = `main|${++mainPopoutSeq}`;
2179
+ const q = target?.accountId
2180
+ ? `?goAccount=${encodeURIComponent(target.accountId)}&goFolder=${target.folderId ?? ""}&goName=${encodeURIComponent(target.name || "")}`
2181
+ : "";
2182
+ const url = `http://127.0.0.1:${pi.port}/app/${pi.token}/client/index.html${q}`;
2183
+ const h = showMessageBoxEx({
2184
+ title: target?.name ? `rmfmail — ${target.name}` : `rmfmail v${rootPkgVersion} — window ${mainPopoutSeq + 1}`,
2185
+ url,
2186
+ size: { width: 1400, height: 1000 },
2187
+ icon: __iconPathRuntime,
2188
+ aumid: "com.frankston.rmfmail",
2189
+ escapeCloses: false,
2190
+ focusOnCreate: true,
2191
+ });
2192
+ popoutWindows.set(key, h);
2193
+ if (typeof h.pid === "number") addChildPid(h.pid);
2194
+ console.log(` [popout] main window OPEN pid=${h.pid ?? "?"} key=${key}`);
2195
+ void h.result.catch((e: any) => { console.log(` [popout] main window result rejected key=${key}: ${e?.message || e}`); }).finally(() => {
2196
+ popoutWindows.delete(key);
2197
+ if (typeof h.pid === "number") removeChildPid(h.pid);
2198
+ lastPopoutClose = { at: Date.now(), key };
2199
+ console.log(` [popout] main window CLOSED pid=${h.pid ?? "?"} key=${key}`);
2200
+ });
2201
+ return { ok: true };
2202
+ });
2171
2203
  }
2172
2204
  _tick("calling showService (WebView opens here)");
2173
2205
  const handle = showService({
@@ -2191,6 +2223,18 @@ RFC 5322 with CRLF line endings. Bodies are quoted-printable encoded (readable i
2191
2223
  // Late-bind the popout-action forwarder now that the main window's
2192
2224
  // service channel exists.
2193
2225
  sendToClient = (m: any) => handle.send(m);
2226
+ // Mirror every _event push to popout-served windows (SSE) so secondary
2227
+ // main windows and popouts live-update like the primary. Wrapping send()
2228
+ // covers all event call sites (and future ones) at a single seam; RPC
2229
+ // responses (_cbid) are not events and are not mirrored.
2230
+ if (popoutInfo) {
2231
+ const pi2 = popoutInfo;
2232
+ const origSend = handle.send.bind(handle);
2233
+ (handle as any).send = (m: any) => {
2234
+ if (m && m._event) { try { pi2.broadcastEvent(m); } catch { /* SSE client gone */ } }
2235
+ return origSend(m);
2236
+ };
2237
+ }
2194
2238
 
2195
2239
  // Register ourselves as the live instance so subsequent `rmfmail`
2196
2240
  // invocations can detect version-mismatch and upgrade us (see top of
@@ -35,6 +35,8 @@ export async function startPopoutServer(svc, onAction) {
35
35
  // client/ can reach ../styles, ../../node_modules etc. exactly as they do
36
36
  // through msger's custom protocol.
37
37
  const appRoot = path.resolve(import.meta.dirname, "..");
38
+ // Connected SSE subscribers (secondary windows / popouts).
39
+ const sseClients = new Set();
38
40
  const server = http.createServer(async (req, res) => {
39
41
  try {
40
42
  const url = new URL(req.url || "/", "http://127.0.0.1");
@@ -55,6 +57,21 @@ export async function startPopoutServer(svc, onAction) {
55
57
  res.writeHead(403).end("forbidden");
56
58
  return;
57
59
  }
60
+ // Server-sent events: daemon → popout/secondary windows. The
61
+ // bridge subscribes with EventSource and feeds each payload to
62
+ // _msgapiServiceEvent — same shape the msger service channel
63
+ // delivers to the main window.
64
+ if (req.method === "GET" && url.pathname === "/events") {
65
+ res.writeHead(200, {
66
+ "content-type": "text/event-stream",
67
+ "cache-control": "no-store",
68
+ "connection": "keep-alive",
69
+ });
70
+ res.write(":connected\n\n");
71
+ sseClients.add(res);
72
+ req.on("close", () => sseClients.delete(res));
73
+ return;
74
+ }
58
75
  // Full mailxapi surface over HTTP: the popout compose page's
59
76
  // bridge (client/lib/popout-bridge.ts) posts the SAME
60
77
  // { _action, _cbid, ...params } payload the WebView IPC channel
@@ -137,6 +154,27 @@ export async function startPopoutServer(svc, onAction) {
137
154
  catch { /* */ }
138
155
  }
139
156
  });
157
+ const broadcastEvent = (evt) => {
158
+ if (sseClients.size === 0)
159
+ return;
160
+ let payload;
161
+ try {
162
+ payload = `data: ${JSON.stringify(evt)}
163
+
164
+ `;
165
+ }
166
+ catch {
167
+ return;
168
+ }
169
+ for (const c of sseClients) {
170
+ try {
171
+ c.write(payload);
172
+ }
173
+ catch {
174
+ sseClients.delete(c);
175
+ }
176
+ }
177
+ };
140
178
  return new Promise((resolve) => {
141
179
  server.once("error", (e) => {
142
180
  console.error(` [popout] server failed to start: ${e?.message || e}`);
@@ -147,7 +185,7 @@ export async function startPopoutServer(svc, onAction) {
147
185
  const port = typeof addr === "object" && addr ? addr.port : 0;
148
186
  if (port) {
149
187
  console.log(` [popout] window server on http://127.0.0.1:${port} (loopback, token-gated)`);
150
- resolve({ port, token });
188
+ resolve({ port, token, broadcastEvent });
151
189
  }
152
190
  else {
153
191
  resolve(null);
@@ -201,7 +239,7 @@ async function serveStatic(appRoot, relRaw, token, res) {
201
239
  // after parse but in DOCUMENT ORDER, so the bridge still executes
202
240
  // before the page's own module (compose.bundle.js) makes any RPC.
203
241
  // mailxapi.js stays classic — it's the same file every host injects.
204
- const inject = `<script>window.__rmfPopoutRpc={url:"/rpc?t=${token}"};</script>`
242
+ const inject = `<script>window.__rmfPopoutRpc={url:"/rpc?t=${token}",events:"/events?t=${token}"};</script>`
205
243
  + `<script type="module" src="/app/${token}/client/lib/popout-bridge.js"></script>`
206
244
  + `<script src="/app/${token}/client/lib/mailxapi.js"></script>`;
207
245
  const html = data.toString("utf-8").replace(/<head([^>]*)>/i, (m) => m + inject);
@@ -1 +1 @@
1
- {"version":3,"file":"popout-server.js","sourceRoot":"","sources":["popout-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"popout-server.js","sourceRoot":"","sources":["popout-server.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,11 @@ import { dispatch } from "@bobfrankston/mailx-service/jsonrpc.js";
29
29
  export interface PopoutServerInfo {
30
30
  port: number;
31
31
  token: string;
32
+ /** Push a daemon event to every connected popout/secondary window
33
+ * (SSE). The main window gets events over the msger service channel;
34
+ * popout-served pages subscribe to GET /events and receive the same
35
+ * payloads, so secondary windows live-update too. */
36
+ broadcastEvent: (evt: any) => void;
32
37
  }
33
38
 
34
39
  export interface PopoutAction {
@@ -48,6 +53,8 @@ export async function startPopoutServer(svc: any, onAction?: (act: PopoutAction)
48
53
  // client/ can reach ../styles, ../../node_modules etc. exactly as they do
49
54
  // through msger's custom protocol.
50
55
  const appRoot = path.resolve(import.meta.dirname, "..");
56
+ // Connected SSE subscribers (secondary windows / popouts).
57
+ const sseClients = new Set<http.ServerResponse>();
51
58
 
52
59
  const server = http.createServer(async (req, res) => {
53
60
  try {
@@ -72,6 +79,22 @@ export async function startPopoutServer(svc: any, onAction?: (act: PopoutAction)
72
79
  return;
73
80
  }
74
81
 
82
+ // Server-sent events: daemon → popout/secondary windows. The
83
+ // bridge subscribes with EventSource and feeds each payload to
84
+ // _msgapiServiceEvent — same shape the msger service channel
85
+ // delivers to the main window.
86
+ if (req.method === "GET" && url.pathname === "/events") {
87
+ res.writeHead(200, {
88
+ "content-type": "text/event-stream",
89
+ "cache-control": "no-store",
90
+ "connection": "keep-alive",
91
+ });
92
+ res.write(":connected\n\n");
93
+ sseClients.add(res);
94
+ req.on("close", () => sseClients.delete(res));
95
+ return;
96
+ }
97
+
75
98
  // Full mailxapi surface over HTTP: the popout compose page's
76
99
  // bridge (client/lib/popout-bridge.ts) posts the SAME
77
100
  // { _action, _cbid, ...params } payload the WebView IPC channel
@@ -139,6 +162,17 @@ export async function startPopoutServer(svc: any, onAction?: (act: PopoutAction)
139
162
  }
140
163
  });
141
164
 
165
+ const broadcastEvent = (evt: any): void => {
166
+ if (sseClients.size === 0) return;
167
+ let payload: string;
168
+ try { payload = `data: ${JSON.stringify(evt)}
169
+
170
+ `; } catch { return; }
171
+ for (const c of sseClients) {
172
+ try { c.write(payload); } catch { sseClients.delete(c); }
173
+ }
174
+ };
175
+
142
176
  return new Promise((resolve) => {
143
177
  server.once("error", (e: any) => {
144
178
  console.error(` [popout] server failed to start: ${e?.message || e}`);
@@ -149,7 +183,7 @@ export async function startPopoutServer(svc: any, onAction?: (act: PopoutAction)
149
183
  const port = typeof addr === "object" && addr ? addr.port : 0;
150
184
  if (port) {
151
185
  console.log(` [popout] window server on http://127.0.0.1:${port} (loopback, token-gated)`);
152
- resolve({ port, token });
186
+ resolve({ port, token, broadcastEvent });
153
187
  } else {
154
188
  resolve(null);
155
189
  }
@@ -203,7 +237,7 @@ async function serveStatic(appRoot: string, relRaw: string, token: string, res:
203
237
  // after parse but in DOCUMENT ORDER, so the bridge still executes
204
238
  // before the page's own module (compose.bundle.js) makes any RPC.
205
239
  // mailxapi.js stays classic — it's the same file every host injects.
206
- const inject = `<script>window.__rmfPopoutRpc={url:"/rpc?t=${token}"};</script>`
240
+ const inject = `<script>window.__rmfPopoutRpc={url:"/rpc?t=${token}",events:"/events?t=${token}"};</script>`
207
241
  + `<script type="module" src="/app/${token}/client/lib/popout-bridge.js"></script>`
208
242
  + `<script src="/app/${token}/client/lib/mailxapi.js"></script>`;
209
243
  const html = data.toString("utf-8").replace(/<head([^>]*)>/i, (m) => m + inject);
@@ -5822,13 +5822,13 @@ var WebMailxService = class _WebMailxService {
5822
5822
  raw = await this.syncManager.fetchMessageBody(accountId, envelope.folderId, envelope.uid);
5823
5823
  } catch (fetchErr) {
5824
5824
  const rawErr = fetchErr.message || "fetch failed";
5825
- const isTransient = /connection|Too many|UNAVAILABLE|rate|429|5\d\d|timeout|ENOTFOUND|ECONNRESET|ETIMEDOUT/i.test(rawErr);
5825
+ const serverSaysGone = /no such message|not found|does not exist|nonexistent|expunged|invalid uid/i.test(rawErr);
5826
5826
  return {
5827
5827
  ...envelope,
5828
5828
  bodyHtml: "",
5829
5829
  bodyText: "",
5830
5830
  bodyError: rawErr,
5831
- bodyErrorTransient: isTransient,
5831
+ bodyErrorTransient: !serverSaysGone,
5832
5832
  hasRemoteContent: false,
5833
5833
  remoteAllowed: false,
5834
5834
  attachments: [],
@@ -7226,6 +7226,13 @@ Accept: application/json\r
7226
7226
  };
7227
7227
 
7228
7228
  // ../../MailApps/tcp-transport/bridge-tcp-transport.js
7229
+ function bridge() {
7230
+ const g = globalThis;
7231
+ const api = g.msgapi || g._nativeBridge;
7232
+ if (!api?.tcp)
7233
+ throw new Error("TCP bridge not available \u2014 host has not injected msgapi/_nativeBridge (yet)");
7234
+ return api;
7235
+ }
7229
7236
  var BridgeTcpTransport = class {
7230
7237
  streamId = null;
7231
7238
  dataHandler = null;
@@ -7237,18 +7244,19 @@ var BridgeTcpTransport = class {
7237
7244
  return this._connected;
7238
7245
  }
7239
7246
  async connect(host, port, tls, _servername) {
7240
- this.streamId = await msgapi.tcp.connect(host, port, tls);
7247
+ const api = bridge();
7248
+ this.streamId = await api.tcp.connect(host, port, tls);
7241
7249
  this._connected = true;
7242
- msgapi.tcp.onData(this.streamId, (data) => {
7250
+ api.tcp.onData(this.streamId, (data) => {
7243
7251
  if (this.dataHandler)
7244
7252
  this.dataHandler(this.encoder.encode(data));
7245
7253
  });
7246
- msgapi.tcp.onClose(this.streamId, (hadError) => {
7254
+ api.tcp.onClose(this.streamId, (hadError) => {
7247
7255
  this._connected = false;
7248
7256
  if (this.closeHandler)
7249
7257
  this.closeHandler(hadError);
7250
7258
  });
7251
- msgapi.tcp.onError(this.streamId, (message) => {
7259
+ api.tcp.onError(this.streamId, (message) => {
7252
7260
  if (this.errorHandler)
7253
7261
  this.errorHandler(new Error(message));
7254
7262
  });
@@ -7256,13 +7264,13 @@ var BridgeTcpTransport = class {
7256
7264
  async upgradeTLS(servername) {
7257
7265
  if (this.streamId == null)
7258
7266
  throw new Error("Not connected");
7259
- await msgapi.tcp.upgradeTLS(this.streamId, servername || "");
7267
+ await bridge().tcp.upgradeTLS(this.streamId, servername || "");
7260
7268
  }
7261
7269
  async write(data) {
7262
7270
  if (this.streamId == null)
7263
7271
  throw new Error("Not connected");
7264
7272
  const s = typeof data === "string" ? data : new TextDecoder().decode(data);
7265
- await msgapi.tcp.write(this.streamId, s);
7273
+ await bridge().tcp.write(this.streamId, s);
7266
7274
  }
7267
7275
  onData(handler) {
7268
7276
  this.dataHandler = handler;
@@ -7276,7 +7284,7 @@ var BridgeTcpTransport = class {
7276
7284
  close() {
7277
7285
  if (this.streamId != null) {
7278
7286
  try {
7279
- msgapi.tcp.close(this.streamId);
7287
+ bridge().tcp.close(this.streamId);
7280
7288
  } catch {
7281
7289
  }
7282
7290
  this.streamId = null;
@@ -10736,8 +10744,8 @@ function createNativeTokenProvider(email) {
10736
10744
  }
10737
10745
  }
10738
10746
  }
10739
- const bridge = window._nativeBridge;
10740
- if (!bridge?.app?.startOAuth) {
10747
+ const bridge2 = window._nativeBridge;
10748
+ if (!bridge2?.app?.startOAuth) {
10741
10749
  throw new Error("No native OAuth bridge");
10742
10750
  }
10743
10751
  const authUrl = `${OAUTH_CLIENT.authUri}?` + new URLSearchParams({
@@ -10750,7 +10758,7 @@ function createNativeTokenProvider(email) {
10750
10758
  login_hint: email
10751
10759
  }).toString();
10752
10760
  console.log(`[oauth] Starting browser consent for ${email}`);
10753
- const code = await bridge.app.startOAuth(authUrl);
10761
+ const code = await bridge2.app.startOAuth(authUrl);
10754
10762
  const tokens = await exchangeCodeForTokens(code);
10755
10763
  const token = {
10756
10764
  access_token: tokens.access_token,
@@ -10765,11 +10773,11 @@ function createNativeTokenProvider(email) {
10765
10773
  async function registerDeviceInGDrive(tokenProvider2, folderId, accountIds) {
10766
10774
  try {
10767
10775
  const token = await tokenProvider2();
10768
- const bridge = window._nativeBridge;
10776
+ const bridge2 = window._nativeBridge;
10769
10777
  let deviceId = "android-unknown";
10770
- if (bridge?.app?.getAndroidId) {
10778
+ if (bridge2?.app?.getAndroidId) {
10771
10779
  try {
10772
- const androidId = await bridge.app.getAndroidId();
10780
+ const androidId = await bridge2.app.getAndroidId();
10773
10781
  deviceId = `android-${androidId.substring(0, 12)}`;
10774
10782
  } catch {
10775
10783
  deviceId = `android-${getDeviceId().substring(0, 8)}`;
@@ -11282,9 +11290,9 @@ function installBridge() {
11282
11290
  return { ok: true };
11283
11291
  },
11284
11292
  getDeviceAccounts: async () => {
11285
- const bridge = window._nativeBridge;
11286
- if (bridge?.app?.getDeviceAccounts) {
11287
- return bridge.app.getDeviceAccounts();
11293
+ const bridge2 = window._nativeBridge;
11294
+ if (bridge2?.app?.getDeviceAccounts) {
11295
+ return bridge2.app.getDeviceAccounts();
11288
11296
  }
11289
11297
  return [];
11290
11298
  },
@@ -11329,9 +11337,9 @@ function installBridge() {
11329
11337
  repairAccounts: async () => ({ ok: false, error: "Use desktop for repair" }),
11330
11338
  resetStore: () => resetStore(),
11331
11339
  resetAll: async () => {
11332
- const bridge = window._nativeBridge;
11333
- if (bridge?.app?.resetAll) {
11334
- await bridge.app.resetAll();
11340
+ const bridge2 = window._nativeBridge;
11341
+ if (bridge2?.app?.resetAll) {
11342
+ await bridge2.app.resetAll();
11335
11343
  } else {
11336
11344
  await resetStore();
11337
11345
  location.reload();