@bobfrankston/rmfmail 1.0.467
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 +429 -0
- package/bin/build-icon-ico.js +283 -0
- package/bin/lean-accounts.js +172 -0
- package/bin/mailx.js +1580 -0
- package/bin/mailx.js.map +1 -0
- package/bin/mailx.ts +1549 -0
- package/bin/postinstall.js +39 -0
- package/bin/postinstall.js.map +1 -0
- package/bin/postinstall.ts +41 -0
- package/bin/tsconfig.json +10 -0
- package/client/.gitattributes +10 -0
- package/client/.msger-window.json +1 -0
- package/client/android.html +226 -0
- package/client/app.js +3400 -0
- package/client/app.js.map +1 -0
- package/client/app.ts +3190 -0
- package/client/components/address-book.js +199 -0
- package/client/components/address-book.js.map +1 -0
- package/client/components/address-book.ts +204 -0
- package/client/components/alarms.js +299 -0
- package/client/components/alarms.js.map +1 -0
- package/client/components/alarms.ts +276 -0
- package/client/components/calendar-sidebar.js +508 -0
- package/client/components/calendar-sidebar.js.map +1 -0
- package/client/components/calendar-sidebar.ts +474 -0
- package/client/components/calendar.js +217 -0
- package/client/components/calendar.js.map +1 -0
- package/client/components/calendar.ts +211 -0
- package/client/components/context-menu.js +80 -0
- package/client/components/context-menu.js.map +1 -0
- package/client/components/context-menu.ts +95 -0
- package/client/components/folder-picker.js +119 -0
- package/client/components/folder-picker.js.map +1 -0
- package/client/components/folder-picker.ts +127 -0
- package/client/components/folder-tree.js +1093 -0
- package/client/components/folder-tree.js.map +1 -0
- package/client/components/folder-tree.ts +1069 -0
- package/client/components/message-list.js +1140 -0
- package/client/components/message-list.js.map +1 -0
- package/client/components/message-list.ts +1129 -0
- package/client/components/message-viewer.js +1291 -0
- package/client/components/message-viewer.js.map +1 -0
- package/client/components/message-viewer.ts +1257 -0
- package/client/components/outbox-view.js +104 -0
- package/client/components/outbox-view.js.map +1 -0
- package/client/components/outbox-view.ts +102 -0
- package/client/components/tasks.js +261 -0
- package/client/components/tasks.js.map +1 -0
- package/client/components/tasks.ts +234 -0
- package/client/compose/compose.css +560 -0
- package/client/compose/compose.html +52 -0
- package/client/compose/compose.js +1289 -0
- package/client/compose/compose.js.map +1 -0
- package/client/compose/compose.ts +1231 -0
- package/client/compose/editor.js +616 -0
- package/client/compose/editor.js.map +1 -0
- package/client/compose/editor.ts +599 -0
- package/client/compose/ghost-text.js +122 -0
- package/client/compose/ghost-text.js.map +1 -0
- package/client/compose/ghost-text.ts +140 -0
- package/client/favicon.svg +11 -0
- package/client/icon.ico +0 -0
- package/client/icon.png +0 -0
- package/client/index.html +230 -0
- package/client/lib/android-bootstrap.js +9 -0
- package/client/lib/android-bootstrap.js.map +1 -0
- package/client/lib/android-bootstrap.ts +9 -0
- package/client/lib/api-client.js +378 -0
- package/client/lib/api-client.js.map +1 -0
- package/client/lib/api-client.ts +439 -0
- package/client/lib/local-service.js +603 -0
- package/client/lib/local-service.js.map +1 -0
- package/client/lib/local-service.ts +646 -0
- package/client/lib/local-store.js +214 -0
- package/client/lib/local-store.js.map +1 -0
- package/client/lib/local-store.ts +283 -0
- package/client/lib/mailxapi.js +304 -0
- package/client/lib/message-state.js +132 -0
- package/client/lib/message-state.js.map +1 -0
- package/client/lib/message-state.ts +160 -0
- package/client/package.json +16 -0
- package/client/styles/components.css +2049 -0
- package/client/styles/layout.css +332 -0
- package/client/styles/variables.css +85 -0
- package/client/tsconfig.json +19 -0
- package/package.json +124 -0
- package/packages/mailx-api/.gitattributes +10 -0
- package/packages/mailx-api/index.d.ts +10 -0
- package/packages/mailx-api/index.d.ts.map +1 -0
- package/packages/mailx-api/index.js +322 -0
- package/packages/mailx-api/index.js.map +1 -0
- package/packages/mailx-api/index.ts +283 -0
- package/packages/mailx-api/package.json +27 -0
- package/packages/mailx-api/tsconfig.json +9 -0
- package/packages/mailx-api/tsconfig.tsbuildinfo +1 -0
- package/packages/mailx-compose/.gitattributes +10 -0
- package/packages/mailx-compose/index.d.ts +21 -0
- package/packages/mailx-compose/index.d.ts.map +1 -0
- package/packages/mailx-compose/index.js +61 -0
- package/packages/mailx-compose/index.js.map +1 -0
- package/packages/mailx-compose/index.ts +85 -0
- package/packages/mailx-compose/package.json +18 -0
- package/packages/mailx-compose/tsconfig.json +9 -0
- package/packages/mailx-core/index.d.ts +139 -0
- package/packages/mailx-core/index.d.ts.map +1 -0
- package/packages/mailx-core/index.js +403 -0
- package/packages/mailx-core/index.js.map +1 -0
- package/packages/mailx-core/index.ts +424 -0
- package/packages/mailx-core/ipc.d.ts +13 -0
- package/packages/mailx-core/ipc.d.ts.map +1 -0
- package/packages/mailx-core/ipc.js +56 -0
- package/packages/mailx-core/ipc.js.map +1 -0
- package/packages/mailx-core/ipc.ts +62 -0
- package/packages/mailx-core/package.json +18 -0
- package/packages/mailx-core/tsconfig.json +9 -0
- package/packages/mailx-host/.gitattributes +10 -0
- package/packages/mailx-host/index.d.ts +21 -0
- package/packages/mailx-host/index.d.ts.map +1 -0
- package/packages/mailx-host/index.js +29 -0
- package/packages/mailx-host/index.js.map +1 -0
- package/packages/mailx-host/index.ts +38 -0
- package/packages/mailx-host/package.json +23 -0
- package/packages/mailx-host/tsconfig.json +9 -0
- package/packages/mailx-host/types-shim.d.ts +14 -0
- package/packages/mailx-imap/.gitattributes +10 -0
- package/packages/mailx-imap/index.d.ts +442 -0
- package/packages/mailx-imap/index.d.ts.map +1 -0
- package/packages/mailx-imap/index.js +3684 -0
- package/packages/mailx-imap/index.js.map +1 -0
- package/packages/mailx-imap/index.ts +3652 -0
- package/packages/mailx-imap/package-lock.json +131 -0
- package/packages/mailx-imap/package.json +28 -0
- package/packages/mailx-imap/providers/gmail-api.d.ts +8 -0
- package/packages/mailx-imap/providers/gmail-api.d.ts.map +1 -0
- package/packages/mailx-imap/providers/gmail-api.js +8 -0
- package/packages/mailx-imap/providers/gmail-api.js.map +1 -0
- package/packages/mailx-imap/providers/gmail-api.ts +8 -0
- package/packages/mailx-imap/providers/outlook-api.ts +7 -0
- package/packages/mailx-imap/providers/types.d.ts +9 -0
- package/packages/mailx-imap/providers/types.d.ts.map +1 -0
- package/packages/mailx-imap/providers/types.js +9 -0
- package/packages/mailx-imap/providers/types.js.map +1 -0
- package/packages/mailx-imap/providers/types.ts +9 -0
- package/packages/mailx-imap/tsconfig.json +9 -0
- package/packages/mailx-imap/tsconfig.tsbuildinfo +1 -0
- package/packages/mailx-send/.gitattributes +10 -0
- package/packages/mailx-send/README.md +217 -0
- package/packages/mailx-send/cli-queue.d.ts +11 -0
- package/packages/mailx-send/cli-queue.d.ts.map +1 -0
- package/packages/mailx-send/cli-queue.js +59 -0
- package/packages/mailx-send/cli-queue.js.map +1 -0
- package/packages/mailx-send/cli-queue.ts +62 -0
- package/packages/mailx-send/cli-send.d.ts +17 -0
- package/packages/mailx-send/cli-send.d.ts.map +1 -0
- package/packages/mailx-send/cli-send.js +75 -0
- package/packages/mailx-send/cli-send.js.map +1 -0
- package/packages/mailx-send/cli-send.ts +83 -0
- package/packages/mailx-send/cli.d.ts +22 -0
- package/packages/mailx-send/cli.d.ts.map +1 -0
- package/packages/mailx-send/cli.js +115 -0
- package/packages/mailx-send/cli.js.map +1 -0
- package/packages/mailx-send/cli.ts +126 -0
- package/packages/mailx-send/index.d.ts +77 -0
- package/packages/mailx-send/index.d.ts.map +1 -0
- package/packages/mailx-send/index.js +264 -0
- package/packages/mailx-send/index.js.map +1 -0
- package/packages/mailx-send/index.ts +333 -0
- package/packages/mailx-send/mailsend/README.md +133 -0
- package/packages/mailx-send/mailsend/cli.d.ts +12 -0
- package/packages/mailx-send/mailsend/cli.d.ts.map +1 -0
- package/packages/mailx-send/mailsend/cli.js +70 -0
- package/packages/mailx-send/mailsend/cli.js.map +1 -0
- package/packages/mailx-send/mailsend/cli.ts +81 -0
- package/packages/mailx-send/mailsend/index.d.ts +77 -0
- package/packages/mailx-send/mailsend/index.d.ts.map +1 -0
- package/packages/mailx-send/mailsend/index.js +264 -0
- package/packages/mailx-send/mailsend/index.js.map +1 -0
- package/packages/mailx-send/mailsend/index.ts +333 -0
- package/packages/mailx-send/mailsend/package-lock.json +65 -0
- package/packages/mailx-send/mailsend/package.json +26 -0
- package/packages/mailx-send/mailsend/tsconfig.json +21 -0
- package/packages/mailx-send/package-lock.json +65 -0
- package/packages/mailx-send/package.json +37 -0
- package/packages/mailx-send/tsconfig.json +21 -0
- package/packages/mailx-server/.gitattributes +10 -0
- package/packages/mailx-server/index.d.ts +8 -0
- package/packages/mailx-server/index.d.ts.map +1 -0
- package/packages/mailx-server/index.js +397 -0
- package/packages/mailx-server/index.js.map +1 -0
- package/packages/mailx-server/index.ts +429 -0
- package/packages/mailx-server/package.json +28 -0
- package/packages/mailx-server/tsconfig.json +9 -0
- package/packages/mailx-server/tsconfig.tsbuildinfo +1 -0
- package/packages/mailx-service/google-sync.d.ts +96 -0
- package/packages/mailx-service/google-sync.d.ts.map +1 -0
- package/packages/mailx-service/google-sync.js +153 -0
- package/packages/mailx-service/google-sync.js.map +1 -0
- package/packages/mailx-service/google-sync.ts +238 -0
- package/packages/mailx-service/index.d.ts +366 -0
- package/packages/mailx-service/index.d.ts.map +1 -0
- package/packages/mailx-service/index.js +2589 -0
- package/packages/mailx-service/index.js.map +1 -0
- package/packages/mailx-service/index.ts +2512 -0
- package/packages/mailx-service/jsonrpc.d.ts +25 -0
- package/packages/mailx-service/jsonrpc.d.ts.map +1 -0
- package/packages/mailx-service/jsonrpc.js +238 -0
- package/packages/mailx-service/jsonrpc.js.map +1 -0
- package/packages/mailx-service/jsonrpc.ts +268 -0
- package/packages/mailx-service/package.json +22 -0
- package/packages/mailx-service/tsconfig.json +9 -0
- package/packages/mailx-settings/.gitattributes +10 -0
- package/packages/mailx-settings/cloud.d.ts +47 -0
- package/packages/mailx-settings/cloud.d.ts.map +1 -0
- package/packages/mailx-settings/cloud.js +408 -0
- package/packages/mailx-settings/cloud.js.map +1 -0
- package/packages/mailx-settings/cloud.ts +393 -0
- package/packages/mailx-settings/index.d.ts +140 -0
- package/packages/mailx-settings/index.d.ts.map +1 -0
- package/packages/mailx-settings/index.js +872 -0
- package/packages/mailx-settings/index.js.map +1 -0
- package/packages/mailx-settings/index.ts +908 -0
- package/packages/mailx-settings/package.json +20 -0
- package/packages/mailx-settings/tsconfig.json +9 -0
- package/packages/mailx-settings/tsconfig.tsbuildinfo +1 -0
- package/packages/mailx-store/.gitattributes +10 -0
- package/packages/mailx-store/db.d.ts +346 -0
- package/packages/mailx-store/db.d.ts.map +1 -0
- package/packages/mailx-store/db.js +1796 -0
- package/packages/mailx-store/db.js.map +1 -0
- package/packages/mailx-store/db.ts +2007 -0
- package/packages/mailx-store/file-store.d.ts +36 -0
- package/packages/mailx-store/file-store.d.ts.map +1 -0
- package/packages/mailx-store/file-store.js +80 -0
- package/packages/mailx-store/file-store.js.map +1 -0
- package/packages/mailx-store/file-store.ts +82 -0
- package/packages/mailx-store/index.d.ts +7 -0
- package/packages/mailx-store/index.d.ts.map +1 -0
- package/packages/mailx-store/index.js +7 -0
- package/packages/mailx-store/index.js.map +1 -0
- package/packages/mailx-store/index.ts +7 -0
- package/packages/mailx-store/package.json +19 -0
- package/packages/mailx-store/tsconfig.json +9 -0
- package/packages/mailx-store/tsconfig.tsbuildinfo +1 -0
- package/packages/mailx-store-web/android-bootstrap.d.ts +16 -0
- package/packages/mailx-store-web/android-bootstrap.d.ts.map +1 -0
- package/packages/mailx-store-web/android-bootstrap.js +1247 -0
- package/packages/mailx-store-web/android-bootstrap.js.map +1 -0
- package/packages/mailx-store-web/android-bootstrap.ts +1262 -0
- package/packages/mailx-store-web/db.d.ts +132 -0
- package/packages/mailx-store-web/db.d.ts.map +1 -0
- package/packages/mailx-store-web/db.js +642 -0
- package/packages/mailx-store-web/db.js.map +1 -0
- package/packages/mailx-store-web/db.ts +756 -0
- package/packages/mailx-store-web/gmail-api-web.d.ts +11 -0
- package/packages/mailx-store-web/gmail-api-web.d.ts.map +1 -0
- package/packages/mailx-store-web/gmail-api-web.js +11 -0
- package/packages/mailx-store-web/gmail-api-web.js.map +1 -0
- package/packages/mailx-store-web/gmail-api-web.ts +11 -0
- package/packages/mailx-store-web/imap-web-provider.d.ts +33 -0
- package/packages/mailx-store-web/imap-web-provider.d.ts.map +1 -0
- package/packages/mailx-store-web/imap-web-provider.js +140 -0
- package/packages/mailx-store-web/imap-web-provider.js.map +1 -0
- package/packages/mailx-store-web/imap-web-provider.ts +156 -0
- package/packages/mailx-store-web/index.d.ts +10 -0
- package/packages/mailx-store-web/index.d.ts.map +1 -0
- package/packages/mailx-store-web/index.js +10 -0
- package/packages/mailx-store-web/index.js.map +1 -0
- package/packages/mailx-store-web/index.ts +10 -0
- package/packages/mailx-store-web/main-thread-host.d.ts +15 -0
- package/packages/mailx-store-web/main-thread-host.d.ts.map +1 -0
- package/packages/mailx-store-web/main-thread-host.js +292 -0
- package/packages/mailx-store-web/main-thread-host.js.map +1 -0
- package/packages/mailx-store-web/main-thread-host.ts +322 -0
- package/packages/mailx-store-web/package.json +23 -0
- package/packages/mailx-store-web/provider-types.d.ts +7 -0
- package/packages/mailx-store-web/provider-types.d.ts.map +1 -0
- package/packages/mailx-store-web/provider-types.js +7 -0
- package/packages/mailx-store-web/provider-types.js.map +1 -0
- package/packages/mailx-store-web/provider-types.ts +7 -0
- package/packages/mailx-store-web/sql-wasm-esm.js +10 -0
- package/packages/mailx-store-web/sql.js.d.ts +29 -0
- package/packages/mailx-store-web/sync-manager.d.ts +68 -0
- package/packages/mailx-store-web/sync-manager.d.ts.map +1 -0
- package/packages/mailx-store-web/sync-manager.js +506 -0
- package/packages/mailx-store-web/sync-manager.js.map +1 -0
- package/packages/mailx-store-web/sync-manager.ts +508 -0
- package/packages/mailx-store-web/tsconfig.json +10 -0
- package/packages/mailx-store-web/web-jsonrpc.d.ts +20 -0
- package/packages/mailx-store-web/web-jsonrpc.d.ts.map +1 -0
- package/packages/mailx-store-web/web-jsonrpc.js +102 -0
- package/packages/mailx-store-web/web-jsonrpc.js.map +1 -0
- package/packages/mailx-store-web/web-jsonrpc.ts +116 -0
- package/packages/mailx-store-web/web-message-store.d.ts +16 -0
- package/packages/mailx-store-web/web-message-store.d.ts.map +1 -0
- package/packages/mailx-store-web/web-message-store.js +89 -0
- package/packages/mailx-store-web/web-message-store.js.map +1 -0
- package/packages/mailx-store-web/web-message-store.ts +97 -0
- package/packages/mailx-store-web/web-service.d.ts +111 -0
- package/packages/mailx-store-web/web-service.d.ts.map +1 -0
- package/packages/mailx-store-web/web-service.js +542 -0
- package/packages/mailx-store-web/web-service.js.map +1 -0
- package/packages/mailx-store-web/web-service.ts +616 -0
- package/packages/mailx-store-web/web-settings.d.ts +83 -0
- package/packages/mailx-store-web/web-settings.d.ts.map +1 -0
- package/packages/mailx-store-web/web-settings.js +491 -0
- package/packages/mailx-store-web/web-settings.js.map +1 -0
- package/packages/mailx-store-web/web-settings.ts +522 -0
- package/packages/mailx-store-web/worker-bundle.js +6838 -0
- package/packages/mailx-store-web/worker-entry.d.ts +8 -0
- package/packages/mailx-store-web/worker-entry.d.ts.map +1 -0
- package/packages/mailx-store-web/worker-entry.js +187 -0
- package/packages/mailx-store-web/worker-entry.js.map +1 -0
- package/packages/mailx-store-web/worker-entry.ts +215 -0
- package/packages/mailx-store-web/worker-tcp-transport.d.ts +28 -0
- package/packages/mailx-store-web/worker-tcp-transport.d.ts.map +1 -0
- package/packages/mailx-store-web/worker-tcp-transport.js +98 -0
- package/packages/mailx-store-web/worker-tcp-transport.js.map +1 -0
- package/packages/mailx-store-web/worker-tcp-transport.ts +101 -0
- package/packages/mailx-types/.gitattributes +10 -0
- package/packages/mailx-types/index.d.ts +319 -0
- package/packages/mailx-types/index.d.ts.map +1 -0
- package/packages/mailx-types/index.js +243 -0
- package/packages/mailx-types/index.js.map +1 -0
- package/packages/mailx-types/index.ts +498 -0
- package/packages/mailx-types/package.json +16 -0
- package/packages/mailx-types/tsconfig.json +9 -0
- package/packages/mailx-types/tsconfig.tsbuildinfo +1 -0
- package/todo.json +13 -0
- package/tsconfig.base.json +31 -0
- package/tsconfig.json +9 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON-RPC dispatcher for MailxService.
|
|
3
|
+
* Maps mailxapi action names to MailxService method calls.
|
|
4
|
+
* Used by msger's bidirectional IPC (Phase 3) and can also
|
|
5
|
+
* serve as a stdio JSON-RPC interface for testing.
|
|
6
|
+
*/
|
|
7
|
+
type ServiceLike = Record<string, (...args: any[]) => any>;
|
|
8
|
+
export interface RpcRequest {
|
|
9
|
+
_action: string;
|
|
10
|
+
_cbid: string;
|
|
11
|
+
[key: string]: any;
|
|
12
|
+
}
|
|
13
|
+
export interface RpcResponse {
|
|
14
|
+
_cbid: string;
|
|
15
|
+
result?: any;
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface RpcEvent {
|
|
19
|
+
_event: string;
|
|
20
|
+
[key: string]: any;
|
|
21
|
+
}
|
|
22
|
+
/** Dispatch an incoming mailxapi call to the appropriate MailxService method */
|
|
23
|
+
export declare function dispatch(svc: ServiceLike, req: RpcRequest): Promise<RpcResponse>;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=jsonrpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonrpc.d.ts","sourceRoot":"","sources":["jsonrpc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;AAE3D,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,gFAAgF;AAChF,wBAAsB,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAQtF"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON-RPC dispatcher for MailxService.
|
|
3
|
+
* Maps mailxapi action names to MailxService method calls.
|
|
4
|
+
* Used by msger's bidirectional IPC (Phase 3) and can also
|
|
5
|
+
* serve as a stdio JSON-RPC interface for testing.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync } from "node:fs";
|
|
8
|
+
import { join, dirname } from "node:path";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
const rootPkg = JSON.parse(readFileSync(join(__dirname, "..", "..", "package.json"), "utf-8"));
|
|
12
|
+
/** Dispatch an incoming mailxapi call to the appropriate MailxService method */
|
|
13
|
+
export async function dispatch(svc, req) {
|
|
14
|
+
const { _action, _cbid, ...params } = req;
|
|
15
|
+
try {
|
|
16
|
+
const result = await dispatchAction(svc, _action, params);
|
|
17
|
+
return { _cbid, result };
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
return { _cbid, error: e.message || String(e) };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async function dispatchAction(svc, action, p) {
|
|
24
|
+
switch (action) {
|
|
25
|
+
// Accounts
|
|
26
|
+
case "getAccounts":
|
|
27
|
+
return svc.getAccounts();
|
|
28
|
+
case "getFolders":
|
|
29
|
+
return svc.getFolders(p.accountId);
|
|
30
|
+
// Messages
|
|
31
|
+
case "getMessages":
|
|
32
|
+
return svc.getMessages(p.accountId, p.folderId, p.page, p.pageSize, p.sort, p.sortDir, p.search, p.flaggedOnly);
|
|
33
|
+
case "getUnifiedInbox":
|
|
34
|
+
return svc.getUnifiedInbox(p.page || 1, p.pageSize || 50);
|
|
35
|
+
case "getMessage":
|
|
36
|
+
return svc.getMessage(p.accountId, p.uid, p.allowRemote, p.folderId);
|
|
37
|
+
// Flags & actions
|
|
38
|
+
case "updateFlags":
|
|
39
|
+
await svc.updateFlags(p.accountId, p.uid, p.flags);
|
|
40
|
+
return { ok: true };
|
|
41
|
+
case "deleteMessage":
|
|
42
|
+
await svc.deleteMessage(p.accountId, p.uid);
|
|
43
|
+
return { ok: true };
|
|
44
|
+
case "deleteMessages":
|
|
45
|
+
await svc.deleteMessages(p.accountId, p.uids);
|
|
46
|
+
return { ok: true, count: p.uids.length };
|
|
47
|
+
case "undeleteMessage":
|
|
48
|
+
await svc.undeleteMessage(p.accountId, p.uid, p.folderId);
|
|
49
|
+
return { ok: true };
|
|
50
|
+
case "moveMessage":
|
|
51
|
+
await svc.moveMessage(p.accountId, p.uid, p.targetFolderId, p.targetAccountId);
|
|
52
|
+
return { ok: true };
|
|
53
|
+
case "moveMessages":
|
|
54
|
+
await svc.moveMessages(p.accountId, p.uids, p.targetFolderId);
|
|
55
|
+
return { ok: true, count: p.uids.length };
|
|
56
|
+
case "markAsSpamMessages":
|
|
57
|
+
return await svc.markAsSpamMessages(p.accountId, p.uids);
|
|
58
|
+
// Folders
|
|
59
|
+
case "markFolderRead":
|
|
60
|
+
svc.markFolderRead(p.folderId);
|
|
61
|
+
return { ok: true };
|
|
62
|
+
case "createFolder":
|
|
63
|
+
await svc.createFolder(p.accountId, p.parentPath, p.name);
|
|
64
|
+
return { ok: true };
|
|
65
|
+
case "renameFolder":
|
|
66
|
+
await svc.renameFolder(p.accountId, p.folderId, p.newName);
|
|
67
|
+
return { ok: true };
|
|
68
|
+
case "deleteFolder":
|
|
69
|
+
await svc.deleteFolder(p.accountId, p.folderId);
|
|
70
|
+
return { ok: true };
|
|
71
|
+
case "emptyFolder":
|
|
72
|
+
await svc.emptyFolder(p.accountId, p.folderId);
|
|
73
|
+
return { ok: true };
|
|
74
|
+
// Compose. sendMessage validates synchronously (fast — regex check on
|
|
75
|
+
// recipient strings), then writes to disk synchronously inside the
|
|
76
|
+
// service. Validation errors come back immediately to the user; once
|
|
77
|
+
// we've ACK'd, the message is durable on disk and the worker drains it.
|
|
78
|
+
// The whole call should be sub-100ms; if it ever isn't, the [send]
|
|
79
|
+
// timing log shows which step ate the budget.
|
|
80
|
+
case "sendMessage":
|
|
81
|
+
await svc.send(p);
|
|
82
|
+
return { ok: true };
|
|
83
|
+
case "saveDraft":
|
|
84
|
+
return svc.saveDraft(p.accountId, p.subject, p.bodyHtml, p.bodyText, p.to, p.cc, p.previousDraftUid, p.draftId);
|
|
85
|
+
case "deleteDraft":
|
|
86
|
+
await svc.deleteDraft(p.accountId, p.draftUid, p.draftId);
|
|
87
|
+
return { ok: true };
|
|
88
|
+
// Sync
|
|
89
|
+
case "syncAll":
|
|
90
|
+
await svc.syncAll();
|
|
91
|
+
return { ok: true };
|
|
92
|
+
case "syncAccount":
|
|
93
|
+
await svc.syncAccount(p.accountId);
|
|
94
|
+
return { ok: true };
|
|
95
|
+
case "getSyncPending":
|
|
96
|
+
return svc.getSyncPending();
|
|
97
|
+
case "getDiagnostics":
|
|
98
|
+
return svc.getDiagnostics();
|
|
99
|
+
case "getPrimaryAccount":
|
|
100
|
+
return svc.getPrimaryAccount(p?.feature);
|
|
101
|
+
// Calendar / Tasks: two-way cache. Reads return local immediately
|
|
102
|
+
// and kick a background refresh that emits updates when done.
|
|
103
|
+
case "getCalendarEvents":
|
|
104
|
+
return await svc.getCalendarEvents(p.fromMs, p.toMs);
|
|
105
|
+
case "createCalendarEvent":
|
|
106
|
+
return { uuid: await svc.createCalendarEventLocal(p) };
|
|
107
|
+
case "updateCalendarEvent":
|
|
108
|
+
await svc.updateCalendarEventLocal(p.uuid, p.patch);
|
|
109
|
+
return { ok: true };
|
|
110
|
+
case "deleteCalendarEvent":
|
|
111
|
+
await svc.deleteCalendarEventLocal(p.uuid);
|
|
112
|
+
return { ok: true };
|
|
113
|
+
case "getTasks":
|
|
114
|
+
return await svc.getTasks(!!p.includeCompleted);
|
|
115
|
+
case "createTask":
|
|
116
|
+
return { uuid: await svc.createTaskLocal(p) };
|
|
117
|
+
case "updateTask":
|
|
118
|
+
await svc.updateTaskLocal(p.uuid, p.patch);
|
|
119
|
+
return { ok: true };
|
|
120
|
+
case "deleteTask":
|
|
121
|
+
await svc.deleteTaskLocal(p.uuid);
|
|
122
|
+
return { ok: true };
|
|
123
|
+
case "drainStoreSync":
|
|
124
|
+
await svc.drainStoreSync();
|
|
125
|
+
return { ok: true };
|
|
126
|
+
case "recordSpamReport":
|
|
127
|
+
return await svc.recordSpamReport(p.accountId, p.uid, p.folderId);
|
|
128
|
+
case "getOutboxStatus":
|
|
129
|
+
return svc.getOutboxStatus();
|
|
130
|
+
case "listQueuedOutgoing":
|
|
131
|
+
return svc.listQueuedOutgoing();
|
|
132
|
+
case "cancelQueuedOutgoing":
|
|
133
|
+
return svc.cancelQueuedOutgoing(p.path);
|
|
134
|
+
case "reauthenticate":
|
|
135
|
+
return { ok: await svc.reauthenticate(p.accountId) };
|
|
136
|
+
case "reauthGoogleScopes":
|
|
137
|
+
return svc.reauthGoogleScopes();
|
|
138
|
+
// Search & contacts
|
|
139
|
+
case "searchMessages":
|
|
140
|
+
return svc.search(p.query, p.page, p.pageSize, p.scope, p.accountId, p.folderId);
|
|
141
|
+
case "searchContacts":
|
|
142
|
+
return svc.searchContacts(p.query);
|
|
143
|
+
case "hasCcHistoryTo":
|
|
144
|
+
return { hasCc: svc.hasCcHistoryTo(p.email) };
|
|
145
|
+
case "hasBccHistoryTo":
|
|
146
|
+
return { hasBcc: svc.hasBccHistoryTo(p.email) };
|
|
147
|
+
case "addContact":
|
|
148
|
+
return { ok: svc.addContact(p.name, p.email) };
|
|
149
|
+
case "listContacts":
|
|
150
|
+
return svc.listContacts(p.query || "", p.page || 1, p.pageSize || 100);
|
|
151
|
+
case "upsertContact":
|
|
152
|
+
return svc.upsertContact(p.name, p.email);
|
|
153
|
+
case "deleteContact":
|
|
154
|
+
return svc.deleteContact(p.email);
|
|
155
|
+
case "addPreferredContact":
|
|
156
|
+
await svc.addPreferredContact({ name: p.name, email: p.email, source: p.source, organization: p.organization });
|
|
157
|
+
return { ok: true };
|
|
158
|
+
case "addToDenylist":
|
|
159
|
+
await svc.addToDenylist(p.email);
|
|
160
|
+
return { ok: true };
|
|
161
|
+
case "loadContactsConfig":
|
|
162
|
+
return { result: await svc.loadContactsConfig() };
|
|
163
|
+
case "openLocalPath":
|
|
164
|
+
return await svc.openLocalPath(p.which);
|
|
165
|
+
case "getThreadMessages":
|
|
166
|
+
return svc.getThreadMessages(p.accountId, p.threadId);
|
|
167
|
+
case "readJsoncFile":
|
|
168
|
+
return { content: await svc.readJsoncFile(p.name) };
|
|
169
|
+
case "writeJsoncFile":
|
|
170
|
+
await svc.writeJsoncFile(p.name, p.content);
|
|
171
|
+
return { ok: true };
|
|
172
|
+
case "formatJsonc":
|
|
173
|
+
return { content: await svc.formatJsonc(p.content) };
|
|
174
|
+
case "readConfigHelp":
|
|
175
|
+
return { content: await svc.readConfigHelp(p.name) };
|
|
176
|
+
case "unsubscribeOneClick":
|
|
177
|
+
return await svc.unsubscribeOneClick(p.url);
|
|
178
|
+
case "openInWord":
|
|
179
|
+
return await svc.openInWord(p.editId, p.html);
|
|
180
|
+
case "closeWordEdit":
|
|
181
|
+
return await svc.closeWordEdit(p.editId);
|
|
182
|
+
// Client-side tracing — lets webview / iframe code ship events to the
|
|
183
|
+
// Node log so a "compose→send→vanished" report can be diagnosed without
|
|
184
|
+
// opening devtools. Every call shows up as `[client] <tag> <data>` in
|
|
185
|
+
// the main log. Keep it on the top of the switch so it's cheap + first
|
|
186
|
+
// to dispatch.
|
|
187
|
+
case "logClientEvent":
|
|
188
|
+
console.log(` [client] ${p.tag || "?"}${p.data ? " " + JSON.stringify(p.data).slice(0, 400) : ""}`);
|
|
189
|
+
return { ok: true };
|
|
190
|
+
// Settings
|
|
191
|
+
case "getSettings":
|
|
192
|
+
return svc.getSettings();
|
|
193
|
+
case "saveSettingsData":
|
|
194
|
+
svc.saveSettings(p);
|
|
195
|
+
return { ok: true };
|
|
196
|
+
case "allowRemoteContent":
|
|
197
|
+
svc.allowRemoteContent(p.type, p.value);
|
|
198
|
+
return { ok: true };
|
|
199
|
+
case "flagSenderOrDomain":
|
|
200
|
+
return await svc.flagSenderOrDomain(p.type, p.value);
|
|
201
|
+
case "getVersion": {
|
|
202
|
+
try {
|
|
203
|
+
const settings = svc.getSettings();
|
|
204
|
+
const storage = svc.getStorageInfo();
|
|
205
|
+
return { version: rootPkg.version || "dev", theme: settings.ui?.theme || "system", storage };
|
|
206
|
+
}
|
|
207
|
+
catch (e) {
|
|
208
|
+
console.error(` [jsonrpc] getVersion error: ${e.message}`);
|
|
209
|
+
return { version: rootPkg.version || "dev", theme: "system", storage: {} };
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Autocomplete
|
|
213
|
+
case "autocomplete":
|
|
214
|
+
return svc.autocomplete(p);
|
|
215
|
+
case "getAutocompleteSettings":
|
|
216
|
+
return svc.getAutocompleteSettings();
|
|
217
|
+
case "saveAutocompleteSettings":
|
|
218
|
+
svc.saveAutocompleteSettings(p);
|
|
219
|
+
return { ok: true };
|
|
220
|
+
// AI transform (translate / proofread / summarize) — gated by per-feature
|
|
221
|
+
// toggles in autocomplete settings, both default false.
|
|
222
|
+
case "aiTransform":
|
|
223
|
+
return svc.aiTransform(p);
|
|
224
|
+
// Attachments
|
|
225
|
+
case "getAttachment": {
|
|
226
|
+
const att = await svc.getAttachment(p.accountId, p.uid, p.attachmentId, p.folderId);
|
|
227
|
+
return { content: att.content.toString("base64"), contentType: att.contentType, filename: att.filename };
|
|
228
|
+
}
|
|
229
|
+
// Setup & Repair
|
|
230
|
+
case "setupAccount":
|
|
231
|
+
return svc.setupAccount(p.name, p.email, p.password);
|
|
232
|
+
case "repairAccounts":
|
|
233
|
+
return svc.repairAccounts();
|
|
234
|
+
default:
|
|
235
|
+
throw new Error(`Unknown action: ${action}`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=jsonrpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["jsonrpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON-RPC dispatcher for MailxService.
|
|
3
|
+
* Maps mailxapi action names to MailxService method calls.
|
|
4
|
+
* Used by msger's bidirectional IPC (Phase 3) and can also
|
|
5
|
+
* serve as a stdio JSON-RPC interface for testing.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { readFileSync } from "node:fs";
|
|
9
|
+
import { join, dirname } from "node:path";
|
|
10
|
+
import { fileURLToPath } from "node:url";
|
|
11
|
+
|
|
12
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
13
|
+
const rootPkg = JSON.parse(readFileSync(join(__dirname, "..", "..", "package.json"), "utf-8"));
|
|
14
|
+
|
|
15
|
+
// Accept any object with the right methods — avoids type conflicts from separate declarations
|
|
16
|
+
type ServiceLike = Record<string, (...args: any[]) => any>;
|
|
17
|
+
|
|
18
|
+
export interface RpcRequest {
|
|
19
|
+
_action: string;
|
|
20
|
+
_cbid: string;
|
|
21
|
+
[key: string]: any;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface RpcResponse {
|
|
25
|
+
_cbid: string;
|
|
26
|
+
result?: any;
|
|
27
|
+
error?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface RpcEvent {
|
|
31
|
+
_event: string;
|
|
32
|
+
[key: string]: any;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Dispatch an incoming mailxapi call to the appropriate MailxService method */
|
|
36
|
+
export async function dispatch(svc: ServiceLike, req: RpcRequest): Promise<RpcResponse> {
|
|
37
|
+
const { _action, _cbid, ...params } = req;
|
|
38
|
+
try {
|
|
39
|
+
const result = await dispatchAction(svc, _action, params);
|
|
40
|
+
return { _cbid, result };
|
|
41
|
+
} catch (e: any) {
|
|
42
|
+
return { _cbid, error: e.message || String(e) };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function dispatchAction(svc: ServiceLike, action: string, p: Record<string, any>): Promise<any> {
|
|
47
|
+
switch (action) {
|
|
48
|
+
// Accounts
|
|
49
|
+
case "getAccounts":
|
|
50
|
+
return svc.getAccounts();
|
|
51
|
+
case "getFolders":
|
|
52
|
+
return svc.getFolders(p.accountId);
|
|
53
|
+
|
|
54
|
+
// Messages
|
|
55
|
+
case "getMessages":
|
|
56
|
+
return svc.getMessages(p.accountId, p.folderId, p.page, p.pageSize, p.sort, p.sortDir, p.search, p.flaggedOnly);
|
|
57
|
+
case "getUnifiedInbox":
|
|
58
|
+
return svc.getUnifiedInbox(p.page || 1, p.pageSize || 50);
|
|
59
|
+
case "getMessage":
|
|
60
|
+
return svc.getMessage(p.accountId, p.uid, p.allowRemote, p.folderId);
|
|
61
|
+
|
|
62
|
+
// Flags & actions
|
|
63
|
+
case "updateFlags":
|
|
64
|
+
await svc.updateFlags(p.accountId, p.uid, p.flags);
|
|
65
|
+
return { ok: true };
|
|
66
|
+
case "deleteMessage":
|
|
67
|
+
await svc.deleteMessage(p.accountId, p.uid);
|
|
68
|
+
return { ok: true };
|
|
69
|
+
case "deleteMessages":
|
|
70
|
+
await svc.deleteMessages(p.accountId, p.uids);
|
|
71
|
+
return { ok: true, count: p.uids.length };
|
|
72
|
+
case "undeleteMessage":
|
|
73
|
+
await svc.undeleteMessage(p.accountId, p.uid, p.folderId);
|
|
74
|
+
return { ok: true };
|
|
75
|
+
case "moveMessage":
|
|
76
|
+
await svc.moveMessage(p.accountId, p.uid, p.targetFolderId, p.targetAccountId);
|
|
77
|
+
return { ok: true };
|
|
78
|
+
case "moveMessages":
|
|
79
|
+
await svc.moveMessages(p.accountId, p.uids, p.targetFolderId);
|
|
80
|
+
return { ok: true, count: p.uids.length };
|
|
81
|
+
case "markAsSpamMessages":
|
|
82
|
+
return await svc.markAsSpamMessages(p.accountId, p.uids);
|
|
83
|
+
|
|
84
|
+
// Folders
|
|
85
|
+
case "markFolderRead":
|
|
86
|
+
svc.markFolderRead(p.folderId);
|
|
87
|
+
return { ok: true };
|
|
88
|
+
case "createFolder":
|
|
89
|
+
await svc.createFolder(p.accountId, p.parentPath, p.name);
|
|
90
|
+
return { ok: true };
|
|
91
|
+
case "renameFolder":
|
|
92
|
+
await svc.renameFolder(p.accountId, p.folderId, p.newName);
|
|
93
|
+
return { ok: true };
|
|
94
|
+
case "deleteFolder":
|
|
95
|
+
await svc.deleteFolder(p.accountId, p.folderId);
|
|
96
|
+
return { ok: true };
|
|
97
|
+
case "emptyFolder":
|
|
98
|
+
await svc.emptyFolder(p.accountId, p.folderId);
|
|
99
|
+
return { ok: true };
|
|
100
|
+
|
|
101
|
+
// Compose. sendMessage validates synchronously (fast — regex check on
|
|
102
|
+
// recipient strings), then writes to disk synchronously inside the
|
|
103
|
+
// service. Validation errors come back immediately to the user; once
|
|
104
|
+
// we've ACK'd, the message is durable on disk and the worker drains it.
|
|
105
|
+
// The whole call should be sub-100ms; if it ever isn't, the [send]
|
|
106
|
+
// timing log shows which step ate the budget.
|
|
107
|
+
case "sendMessage":
|
|
108
|
+
await svc.send(p);
|
|
109
|
+
return { ok: true };
|
|
110
|
+
case "saveDraft":
|
|
111
|
+
return svc.saveDraft(p.accountId, p.subject, p.bodyHtml, p.bodyText, p.to, p.cc, p.previousDraftUid, p.draftId);
|
|
112
|
+
case "deleteDraft":
|
|
113
|
+
await svc.deleteDraft(p.accountId, p.draftUid, p.draftId);
|
|
114
|
+
return { ok: true };
|
|
115
|
+
|
|
116
|
+
// Sync
|
|
117
|
+
case "syncAll":
|
|
118
|
+
await svc.syncAll();
|
|
119
|
+
return { ok: true };
|
|
120
|
+
case "syncAccount":
|
|
121
|
+
await svc.syncAccount(p.accountId);
|
|
122
|
+
return { ok: true };
|
|
123
|
+
case "getSyncPending":
|
|
124
|
+
return svc.getSyncPending();
|
|
125
|
+
case "getDiagnostics":
|
|
126
|
+
return svc.getDiagnostics();
|
|
127
|
+
case "getPrimaryAccount":
|
|
128
|
+
return svc.getPrimaryAccount(p?.feature);
|
|
129
|
+
|
|
130
|
+
// Calendar / Tasks: two-way cache. Reads return local immediately
|
|
131
|
+
// and kick a background refresh that emits updates when done.
|
|
132
|
+
case "getCalendarEvents":
|
|
133
|
+
return await svc.getCalendarEvents(p.fromMs, p.toMs);
|
|
134
|
+
case "createCalendarEvent":
|
|
135
|
+
return { uuid: await svc.createCalendarEventLocal(p) };
|
|
136
|
+
case "updateCalendarEvent":
|
|
137
|
+
await svc.updateCalendarEventLocal(p.uuid, p.patch); return { ok: true };
|
|
138
|
+
case "deleteCalendarEvent":
|
|
139
|
+
await svc.deleteCalendarEventLocal(p.uuid); return { ok: true };
|
|
140
|
+
case "getTasks":
|
|
141
|
+
return await svc.getTasks(!!p.includeCompleted);
|
|
142
|
+
case "createTask":
|
|
143
|
+
return { uuid: await svc.createTaskLocal(p) };
|
|
144
|
+
case "updateTask":
|
|
145
|
+
await svc.updateTaskLocal(p.uuid, p.patch); return { ok: true };
|
|
146
|
+
case "deleteTask":
|
|
147
|
+
await svc.deleteTaskLocal(p.uuid); return { ok: true };
|
|
148
|
+
case "drainStoreSync":
|
|
149
|
+
await svc.drainStoreSync(); return { ok: true };
|
|
150
|
+
case "recordSpamReport":
|
|
151
|
+
return await svc.recordSpamReport(p.accountId, p.uid, p.folderId);
|
|
152
|
+
case "getOutboxStatus":
|
|
153
|
+
return svc.getOutboxStatus();
|
|
154
|
+
case "listQueuedOutgoing":
|
|
155
|
+
return svc.listQueuedOutgoing();
|
|
156
|
+
case "cancelQueuedOutgoing":
|
|
157
|
+
return svc.cancelQueuedOutgoing(p.path);
|
|
158
|
+
case "reauthenticate":
|
|
159
|
+
return { ok: await svc.reauthenticate(p.accountId) };
|
|
160
|
+
case "reauthGoogleScopes":
|
|
161
|
+
return svc.reauthGoogleScopes();
|
|
162
|
+
|
|
163
|
+
// Search & contacts
|
|
164
|
+
case "searchMessages":
|
|
165
|
+
return svc.search(p.query, p.page, p.pageSize, p.scope, p.accountId, p.folderId);
|
|
166
|
+
case "searchContacts":
|
|
167
|
+
return svc.searchContacts(p.query);
|
|
168
|
+
case "hasCcHistoryTo":
|
|
169
|
+
return { hasCc: svc.hasCcHistoryTo(p.email) };
|
|
170
|
+
case "hasBccHistoryTo":
|
|
171
|
+
return { hasBcc: svc.hasBccHistoryTo(p.email) };
|
|
172
|
+
case "addContact":
|
|
173
|
+
return { ok: svc.addContact(p.name, p.email) };
|
|
174
|
+
case "listContacts":
|
|
175
|
+
return svc.listContacts(p.query || "", p.page || 1, p.pageSize || 100);
|
|
176
|
+
case "upsertContact":
|
|
177
|
+
return svc.upsertContact(p.name, p.email);
|
|
178
|
+
case "deleteContact":
|
|
179
|
+
return svc.deleteContact(p.email);
|
|
180
|
+
case "addPreferredContact":
|
|
181
|
+
await svc.addPreferredContact({ name: p.name, email: p.email, source: p.source, organization: p.organization });
|
|
182
|
+
return { ok: true };
|
|
183
|
+
case "addToDenylist":
|
|
184
|
+
await svc.addToDenylist(p.email);
|
|
185
|
+
return { ok: true };
|
|
186
|
+
case "loadContactsConfig":
|
|
187
|
+
return { result: await svc.loadContactsConfig() };
|
|
188
|
+
case "openLocalPath":
|
|
189
|
+
return await svc.openLocalPath(p.which);
|
|
190
|
+
case "getThreadMessages":
|
|
191
|
+
return svc.getThreadMessages(p.accountId, p.threadId);
|
|
192
|
+
case "readJsoncFile":
|
|
193
|
+
return { content: await svc.readJsoncFile(p.name) };
|
|
194
|
+
case "writeJsoncFile":
|
|
195
|
+
await svc.writeJsoncFile(p.name, p.content);
|
|
196
|
+
return { ok: true };
|
|
197
|
+
case "formatJsonc":
|
|
198
|
+
return { content: await svc.formatJsonc(p.content) };
|
|
199
|
+
case "readConfigHelp":
|
|
200
|
+
return { content: await svc.readConfigHelp(p.name) };
|
|
201
|
+
case "unsubscribeOneClick":
|
|
202
|
+
return await svc.unsubscribeOneClick(p.url);
|
|
203
|
+
case "openInWord":
|
|
204
|
+
return await svc.openInWord(p.editId, p.html);
|
|
205
|
+
case "closeWordEdit":
|
|
206
|
+
return await svc.closeWordEdit(p.editId);
|
|
207
|
+
|
|
208
|
+
// Client-side tracing — lets webview / iframe code ship events to the
|
|
209
|
+
// Node log so a "compose→send→vanished" report can be diagnosed without
|
|
210
|
+
// opening devtools. Every call shows up as `[client] <tag> <data>` in
|
|
211
|
+
// the main log. Keep it on the top of the switch so it's cheap + first
|
|
212
|
+
// to dispatch.
|
|
213
|
+
case "logClientEvent":
|
|
214
|
+
console.log(` [client] ${p.tag || "?"}${p.data ? " " + JSON.stringify(p.data).slice(0, 400) : ""}`);
|
|
215
|
+
return { ok: true };
|
|
216
|
+
|
|
217
|
+
// Settings
|
|
218
|
+
case "getSettings":
|
|
219
|
+
return svc.getSettings();
|
|
220
|
+
case "saveSettingsData":
|
|
221
|
+
svc.saveSettings(p);
|
|
222
|
+
return { ok: true };
|
|
223
|
+
case "allowRemoteContent":
|
|
224
|
+
svc.allowRemoteContent(p.type, p.value);
|
|
225
|
+
return { ok: true };
|
|
226
|
+
case "flagSenderOrDomain":
|
|
227
|
+
return await svc.flagSenderOrDomain(p.type, p.value);
|
|
228
|
+
case "getVersion": {
|
|
229
|
+
try {
|
|
230
|
+
const settings = svc.getSettings();
|
|
231
|
+
const storage = svc.getStorageInfo();
|
|
232
|
+
return { version: rootPkg.version || "dev", theme: settings.ui?.theme || "system", storage };
|
|
233
|
+
} catch (e: any) {
|
|
234
|
+
console.error(` [jsonrpc] getVersion error: ${e.message}`);
|
|
235
|
+
return { version: rootPkg.version || "dev", theme: "system", storage: {} };
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Autocomplete
|
|
240
|
+
case "autocomplete":
|
|
241
|
+
return svc.autocomplete(p as any);
|
|
242
|
+
case "getAutocompleteSettings":
|
|
243
|
+
return svc.getAutocompleteSettings();
|
|
244
|
+
case "saveAutocompleteSettings":
|
|
245
|
+
svc.saveAutocompleteSettings(p);
|
|
246
|
+
return { ok: true };
|
|
247
|
+
|
|
248
|
+
// AI transform (translate / proofread / summarize) — gated by per-feature
|
|
249
|
+
// toggles in autocomplete settings, both default false.
|
|
250
|
+
case "aiTransform":
|
|
251
|
+
return svc.aiTransform(p as any);
|
|
252
|
+
|
|
253
|
+
// Attachments
|
|
254
|
+
case "getAttachment": {
|
|
255
|
+
const att = await svc.getAttachment(p.accountId, p.uid, p.attachmentId, p.folderId);
|
|
256
|
+
return { content: att.content.toString("base64"), contentType: att.contentType, filename: att.filename };
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Setup & Repair
|
|
260
|
+
case "setupAccount":
|
|
261
|
+
return svc.setupAccount(p.name, p.email, p.password);
|
|
262
|
+
case "repairAccounts":
|
|
263
|
+
return svc.repairAccounts();
|
|
264
|
+
|
|
265
|
+
default:
|
|
266
|
+
throw new Error(`Unknown action: ${action}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bobfrankston/mailx-service",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"types": "index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc"
|
|
9
|
+
},
|
|
10
|
+
"license": "ISC",
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@bobfrankston/mailx-types": "file:../mailx-types",
|
|
13
|
+
"@bobfrankston/mailx-store": "file:../mailx-store",
|
|
14
|
+
"@bobfrankston/mailx-imap": "file:../mailx-imap",
|
|
15
|
+
"@bobfrankston/mailx-settings": "file:../mailx-settings",
|
|
16
|
+
"mailparser": "^3.7.2"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/BobFrankston/mailx.git"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud storage for mailx settings — Google Drive API (drive.file scope).
|
|
3
|
+
*
|
|
4
|
+
* Uses a single app-owned "mailx" folder on Drive, accessed by folder ID.
|
|
5
|
+
* The drive.file scope only sees files/folders created by this OAuth client,
|
|
6
|
+
* which prevents conflicts with existing folders of the same name.
|
|
7
|
+
* All machines using the same OAuth client ID share the same folder.
|
|
8
|
+
*
|
|
9
|
+
* ── Restoring removed providers ──
|
|
10
|
+
* OneDrive (removed 2026-04-06): Required microsoft-credentials.json in ~/.mailx/,
|
|
11
|
+
* MS_SCOPES = "https://graph.microsoft.com/Files.ReadWrite offline_access",
|
|
12
|
+
* authenticateOAuth with tokenDir ~/.mailx/tokens/microsoft/.
|
|
13
|
+
* Read/write via Graph API: GET/PUT https://graph.microsoft.com/v1.0/me/drive/root:/{path}:/content
|
|
14
|
+
* Azure AD app registration needed: https://portal.azure.com → App registrations → Desktop app
|
|
15
|
+
*
|
|
16
|
+
* Dropbox (removed 2026-04-06): Never implemented — placeholder only.
|
|
17
|
+
* Would need Dropbox OAuth app, token management, and Dropbox API v2 calls.
|
|
18
|
+
*/
|
|
19
|
+
/** Find the settings folder on GDrive, or create a flat "mailx" folder.
|
|
20
|
+
* Supports nested paths from config (e.g. "home/.mailx") by walking each
|
|
21
|
+
* segment. Falls back to the folderId in config if set, so a stale ID that
|
|
22
|
+
* points to the wrong folder gets corrected on next lookup. */
|
|
23
|
+
export declare function gDriveFindOrCreateFolder(): Promise<string | null>;
|
|
24
|
+
export type CloudProvider = "gdrive" | "google" | "local";
|
|
25
|
+
export interface CloudFile {
|
|
26
|
+
/** Read a file. For gdrive, path is just the filename (folder ID is implicit). */
|
|
27
|
+
read(filePath: string): Promise<string | null>;
|
|
28
|
+
/** Write a file. For gdrive, path is just the filename. Throws on failure with a descriptive error. */
|
|
29
|
+
write(filePath: string, content: string): Promise<void>;
|
|
30
|
+
/** Check if a file exists. */
|
|
31
|
+
exists(filePath: string): Promise<boolean>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get a cloud file provider. For gdrive, pass the folder ID.
|
|
35
|
+
* Files are stored flat in the folder (no subdirectory navigation).
|
|
36
|
+
*/
|
|
37
|
+
export declare function getCloudProvider(provider: string, folderId?: string): CloudFile | null;
|
|
38
|
+
/** Fetch the authenticated Google user's profile (name + email) via the People API.
|
|
39
|
+
* Caller must supply an OAuth access token whose scopes include `contacts.readonly`
|
|
40
|
+
* or `userinfo.profile`. The Drive token (drive.file) does NOT have the right scope
|
|
41
|
+
* on its own — use the Gmail/IMAP OAuth token instead (mailx-imap's
|
|
42
|
+
* ImapManager.getOAuthToken). Returns null on failure. */
|
|
43
|
+
export declare function getGoogleProfile(token: string): Promise<{
|
|
44
|
+
name?: string;
|
|
45
|
+
email?: string;
|
|
46
|
+
} | null>;
|
|
47
|
+
//# sourceMappingURL=cloud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["cloud.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAyLH;;;gEAGgE;AAChE,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA6CvE;AA4ED,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE1D,MAAM,WAAW,SAAS;IACtB,kFAAkF;IAClF,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/C,uGAAuG;IACvG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,8BAA8B;IAC9B,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAuBtF;AAED;;;;2DAI2D;AAC3D,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAoBvG"}
|