@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.
- package/README.md +6 -0
- package/TODO.md +2 -0
- package/bin/mailx.js +51 -0
- package/bin/mailx.js.map +1 -1
- package/bin/mailx.ts +45 -1
- package/bin/popout-server.js +40 -2
- package/bin/popout-server.js.map +1 -1
- package/bin/popout-server.ts +36 -2
- package/client/android-bootstrap.bundle.js +29 -21
- package/client/android-bootstrap.bundle.js.map +3 -3
- package/client/app.bundle.js +41 -3
- package/client/app.bundle.js.map +3 -3
- package/client/app.js +16 -0
- package/client/app.js.map +1 -1
- package/client/app.ts +15 -0
- package/client/components/folder-tree.js +31 -3
- package/client/components/folder-tree.js.map +1 -1
- package/client/components/folder-tree.ts +24 -3
- package/client/components/message-viewer.js +1 -1
- package/client/components/message-viewer.js.map +1 -1
- package/client/components/message-viewer.ts +1 -1
- package/client/compose/compose.bundle.js +7 -0
- package/client/compose/compose.bundle.js.map +2 -2
- package/client/index.html +2 -0
- package/client/lib/api-client.js +8 -0
- package/client/lib/api-client.js.map +1 -1
- package/client/lib/api-client.ts +8 -0
- package/client/lib/mailxapi.js +4 -0
- package/client/lib/popout-bridge.js +14 -0
- package/client/lib/popout-bridge.js.map +1 -1
- package/client/lib/popout-bridge.ts +12 -0
- package/package.json +9 -9
- package/packages/mailx-imap/index.d.ts.map +1 -1
- package/packages/mailx-imap/index.js +23 -2
- package/packages/mailx-imap/index.js.map +1 -1
- package/packages/mailx-imap/index.ts +21 -2
- package/packages/mailx-imap/package-lock.json +2 -2
- package/packages/mailx-imap/package.json +1 -1
- package/packages/mailx-service/index.d.ts +21 -0
- package/packages/mailx-service/index.d.ts.map +1 -1
- package/packages/mailx-service/index.js +28 -2
- package/packages/mailx-service/index.js.map +1 -1
- package/packages/mailx-service/index.ts +28 -2
- package/packages/mailx-service/jsonrpc.js +2 -0
- package/packages/mailx-service/jsonrpc.js.map +1 -1
- package/packages/mailx-service/jsonrpc.ts +2 -0
- package/packages/mailx-service/sync-queue.d.ts +8 -0
- package/packages/mailx-service/sync-queue.d.ts.map +1 -1
- package/packages/mailx-service/sync-queue.js +10 -0
- package/packages/mailx-service/sync-queue.js.map +1 -1
- package/packages/mailx-service/sync-queue.ts +11 -0
- package/packages/mailx-settings/package.json +1 -1
- package/packages/mailx-store-web/package.json +1 -1
- package/packages/mailx-store-web/web-service.d.ts.map +1 -1
- package/packages/mailx-store-web/web-service.js +9 -2
- package/packages/mailx-store-web/web-service.js.map +1 -1
- package/packages/mailx-store-web/web-service.ts +9 -2
- 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:
|
|
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
|
package/bin/popout-server.js
CHANGED
|
@@ -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);
|
package/bin/popout-server.js.map
CHANGED
|
@@ -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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"}
|
package/bin/popout-server.ts
CHANGED
|
@@ -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
|
|
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:
|
|
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
|
-
|
|
7247
|
+
const api = bridge();
|
|
7248
|
+
this.streamId = await api.tcp.connect(host, port, tls);
|
|
7241
7249
|
this._connected = true;
|
|
7242
|
-
|
|
7250
|
+
api.tcp.onData(this.streamId, (data) => {
|
|
7243
7251
|
if (this.dataHandler)
|
|
7244
7252
|
this.dataHandler(this.encoder.encode(data));
|
|
7245
7253
|
});
|
|
7246
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
10740
|
-
if (!
|
|
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
|
|
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
|
|
10776
|
+
const bridge2 = window._nativeBridge;
|
|
10769
10777
|
let deviceId = "android-unknown";
|
|
10770
|
-
if (
|
|
10778
|
+
if (bridge2?.app?.getAndroidId) {
|
|
10771
10779
|
try {
|
|
10772
|
-
const androidId = await
|
|
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
|
|
11286
|
-
if (
|
|
11287
|
-
return
|
|
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
|
|
11333
|
-
if (
|
|
11334
|
-
await
|
|
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();
|