@bobfrankston/rmfmail 1.2.113 → 1.2.114

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 (33) hide show
  1. package/TODO.md +5 -5
  2. package/bin/mailx.js +72 -3
  3. package/bin/mailx.js.map +1 -1
  4. package/bin/mailx.ts +62 -3
  5. package/client/android-bootstrap.bundle.js +60 -3
  6. package/client/android-bootstrap.bundle.js.map +2 -2
  7. package/client/app.bundle.js +42 -0
  8. package/client/app.bundle.js.map +2 -2
  9. package/client/app.js +58 -0
  10. package/client/app.js.map +1 -1
  11. package/client/app.ts +60 -0
  12. package/client/compose/compose.ts +13 -5
  13. package/package.json +1 -1
  14. package/packages/mailx-imap/index.d.ts +4 -1
  15. package/packages/mailx-imap/index.d.ts.map +1 -1
  16. package/packages/mailx-imap/index.js +59 -5
  17. package/packages/mailx-imap/index.js.map +1 -1
  18. package/packages/mailx-imap/index.ts +55 -5
  19. package/packages/mailx-imap/package-lock.json +2 -2
  20. package/packages/mailx-imap/package.json +1 -1
  21. package/packages/mailx-store-web/android-bootstrap.js +48 -3
  22. package/packages/mailx-store-web/android-bootstrap.js.map +1 -1
  23. package/packages/mailx-store-web/android-bootstrap.ts +47 -4
  24. package/packages/mailx-store-web/package.json +1 -1
  25. package/packages/mailx-store-web/web-service.d.ts +21 -0
  26. package/packages/mailx-store-web/web-service.d.ts.map +1 -1
  27. package/packages/mailx-store-web/web-service.js +11 -0
  28. package/packages/mailx-store-web/web-service.js.map +1 -1
  29. package/packages/mailx-store-web/web-service.ts +11 -0
  30. package/packages/mailx-types/mailx-api.d.ts +22 -0
  31. package/packages/mailx-types/mailx-api.d.ts.map +1 -1
  32. package/packages/mailx-types/mailx-api.ts +7 -0
  33. package/packages/mailx-types/package.json +1 -1
@@ -6386,6 +6386,9 @@ ${bodyEncoded}`;
6386
6386
  getThreadMessages(_accountId, _threadId) {
6387
6387
  return [];
6388
6388
  }
6389
+ async getMessageSource(_accountId, _uid, _folderId) {
6390
+ return this.notImpl("getMessageSource");
6391
+ }
6389
6392
  async getAttachment(_accountId, _uid, _attachmentId, _folderId) {
6390
6393
  return this.notImpl("getAttachment");
6391
6394
  }
@@ -6433,6 +6436,20 @@ ${bodyEncoded}`;
6433
6436
  reauthGoogleScopes() {
6434
6437
  return { cleared: 0 };
6435
6438
  }
6439
+ /** No per-folder sync lane on Android — a folder "sync now" refreshes the
6440
+ * whole account (cheap: Gmail incremental sync / one IMAP pass). */
6441
+ async syncFolderNow(accountId, _folderId) {
6442
+ await this.syncAccount(accountId);
6443
+ }
6444
+ cancelServerSearch() {
6445
+ }
6446
+ async copyMessages(_accountId, _uids, _folderIds, _targetFolderId) {
6447
+ this.notImpl("copyMessages");
6448
+ }
6449
+ /** `{}` = play the built-in chime — no custom sound files on Android. */
6450
+ async getReminderSound() {
6451
+ return {};
6452
+ }
6436
6453
  // Contacts extensions. The contacts.jsonc mutation logic is shared with
6437
6454
  // the desktop service — see mailx-types/contacts-config.ts. These used
6438
6455
  // to be `notImpl()` stubs, so the phone's ★ / ⊘ autocomplete buttons did
@@ -6501,6 +6518,9 @@ ${bodyEncoded}`;
6501
6518
  async getCalendarEvents(_fromMs, _toMs) {
6502
6519
  return [];
6503
6520
  }
6521
+ async getCalendars() {
6522
+ return [];
6523
+ }
6504
6524
  async createCalendarEvent(_ev) {
6505
6525
  return this.notImpl("createCalendarEvent");
6506
6526
  }
@@ -11133,7 +11153,10 @@ function installBridge() {
11133
11153
  },
11134
11154
  getAccounts: () => service.getAccounts(),
11135
11155
  getFolders: (accountId) => service.getFolders(accountId),
11136
- getMessages: (accountId, folderId, page, pageSize) => service.getMessages(accountId, folderId, page, pageSize),
11156
+ // Full arg pass-through this adapter used to stop at pageSize, so
11157
+ // sort toggles and the per-folder search box silently did nothing on
11158
+ // the phone (service.getMessages supports all seven).
11159
+ getMessages: (accountId, folderId, page, pageSize, sort, sortDir, search) => service.getMessages(accountId, folderId, page, pageSize, sort, sortDir, search),
11137
11160
  getUnifiedInbox: (page, pageSize) => service.getUnifiedInbox(page, pageSize),
11138
11161
  getMessage: (accountId, uid, allowRemote, folderId) => service.getMessage(accountId, uid, allowRemote, folderId),
11139
11162
  updateFlags: async (accountId, uid, flags) => {
@@ -11169,7 +11192,9 @@ function installBridge() {
11169
11192
  await service.deleteDraft(accountId, draftUid);
11170
11193
  return { ok: true };
11171
11194
  },
11172
- searchMessages: (query, page, pageSize) => service.search(query, page, pageSize),
11195
+ // Full arg pass-through dropping scope/accountId/folderId made every
11196
+ // Android search behave as all-mailboxes regardless of the UI scope.
11197
+ searchMessages: (query, page, pageSize, scope, accountId, folderId, includeTrashSpam) => service.searchMessages(query, page, pageSize, scope, accountId, folderId, includeTrashSpam),
11173
11198
  searchContacts: (query) => service.searchContacts(query),
11174
11199
  listContacts: (query, page = 1, pageSize = 100) => service.listContacts(query || "", page, pageSize),
11175
11200
  upsertContact: (name, email) => service.upsertContact(name || "", email),
@@ -11317,11 +11342,43 @@ function installBridge() {
11317
11342
  },
11318
11343
  onEvent: (handler) => {
11319
11344
  eventHandlers.push(handler);
11345
+ },
11346
+ // ── Wire-shape adapters (C154) ──
11347
+ // These service methods return the raw value, but api-client (and the
11348
+ // desktop jsonrpc dispatcher) speak a wrapped shape on the wire —
11349
+ // adapt here so both platforms answer identically.
11350
+ readJsoncFile: async (name) => ({ content: await service.readJsoncFile(name) }),
11351
+ writeJsoncFile: async (name, content) => {
11352
+ await service.writeJsoncFile(name, content);
11353
+ return { ok: true };
11354
+ },
11355
+ formatJsonc: async (content) => ({ content: await service.formatJsonc(content) }),
11356
+ readConfigHelp: async (name) => ({ content: await service.readConfigHelp(name) }),
11357
+ drainStoreSync: async () => {
11358
+ await service.drainStoreSync();
11359
+ return { ok: true };
11360
+ },
11361
+ syncFolderNow: async (accountId, folderId) => {
11362
+ await service.syncFolderNow(accountId, folderId);
11363
+ return { ok: true };
11320
11364
  }
11321
11365
  };
11366
+ const svcAny = service;
11367
+ const svcNames = /* @__PURE__ */ new Set([
11368
+ ...Object.getOwnPropertyNames(Object.getPrototypeOf(service)),
11369
+ ...Object.getOwnPropertyNames(service)
11370
+ ]);
11371
+ let backfilled = 0;
11372
+ for (const name of svcNames) {
11373
+ if (name === "constructor" || name === "notImpl") continue;
11374
+ if (typeof svcAny[name] !== "function") continue;
11375
+ if (name in api) continue;
11376
+ api[name] = (...args) => svcAny[name](...args);
11377
+ backfilled++;
11378
+ }
11322
11379
  window.mailxapi = api;
11323
11380
  window.dispatchEvent(new CustomEvent("mailxapiready"));
11324
- console.log("[android] mailxapi bridge installed");
11381
+ console.log(`[android] mailxapi bridge installed (${backfilled} contract methods backfilled)`);
11325
11382
  }
11326
11383
  export {
11327
11384
  initAndroid,