@btraut/browser-bridge 0.12.0 → 0.12.1
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/CHANGELOG.md +10 -0
- package/README.md +6 -8
- package/extension/assets/ui.css +13 -89
- package/extension/dist/background.js +46 -0
- package/extension/dist/background.js.map +2 -2
- package/extension/dist/popup-ui.js +12 -78
- package/extension/dist/popup-ui.js.map +2 -2
- package/extension/manifest.json +1 -1
- package/package.json +1 -1
- package/skills/browser-bridge/skill.json +1 -1
|
@@ -8,23 +8,15 @@
|
|
|
8
8
|
}
|
|
9
9
|
return el;
|
|
10
10
|
};
|
|
11
|
-
var
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
};
|
|
21
|
-
var setText = (id, value) => {
|
|
22
|
-
byId(id).textContent = value;
|
|
23
|
-
};
|
|
24
|
-
var setStateBadge = (state) => {
|
|
25
|
-
const badge = byId("bb-conn-state");
|
|
26
|
-
badge.textContent = state;
|
|
27
|
-
badge.setAttribute("data-state", state);
|
|
11
|
+
var setConnectedIndicator = (state) => {
|
|
12
|
+
const connected = state === "connected";
|
|
13
|
+
const indicator = byId("bb-conn-indicator");
|
|
14
|
+
indicator.setAttribute("data-connected", connected ? "true" : "false");
|
|
15
|
+
indicator.setAttribute(
|
|
16
|
+
"aria-label",
|
|
17
|
+
connected ? "Connected" : "Disconnected"
|
|
18
|
+
);
|
|
19
|
+
indicator.setAttribute("title", connected ? "Connected" : state);
|
|
28
20
|
};
|
|
29
21
|
var getConnectionStatus = async () => {
|
|
30
22
|
const response = await new Promise(
|
|
@@ -42,35 +34,8 @@
|
|
|
42
34
|
}
|
|
43
35
|
return response.result;
|
|
44
36
|
};
|
|
45
|
-
var copyToClipboard = async (text) => {
|
|
46
|
-
if (navigator.clipboard?.writeText) {
|
|
47
|
-
await navigator.clipboard.writeText(text);
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
const area = document.createElement("textarea");
|
|
51
|
-
area.value = text;
|
|
52
|
-
area.setAttribute("readonly", "true");
|
|
53
|
-
area.style.position = "fixed";
|
|
54
|
-
area.style.left = "-9999px";
|
|
55
|
-
document.body.appendChild(area);
|
|
56
|
-
area.select();
|
|
57
|
-
document.execCommand("copy");
|
|
58
|
-
document.body.removeChild(area);
|
|
59
|
-
};
|
|
60
37
|
var renderStatus = (status) => {
|
|
61
|
-
|
|
62
|
-
setText(
|
|
63
|
-
"bb-conn-endpoint",
|
|
64
|
-
status.ws_url ?? (status.endpoint ? `ws://${status.endpoint.host}:${status.endpoint.port}/drive` : "Unknown")
|
|
65
|
-
);
|
|
66
|
-
const source = status.endpoint?.portSource ?? "unknown";
|
|
67
|
-
setText("bb-conn-source", source);
|
|
68
|
-
const lastConnected = formatTime(status.last_connected_at);
|
|
69
|
-
setText("bb-conn-last-ok", lastConnected);
|
|
70
|
-
const lastFailure = status.last_error_message ? `${status.last_error_message} (${formatTime(status.last_error_at)})` : "None";
|
|
71
|
-
setText("bb-conn-last-fail", lastFailure);
|
|
72
|
-
const nextRetry = status.retry_at ? formatTime(status.retry_at) : "n/a";
|
|
73
|
-
setText("bb-conn-next-retry", nextRetry);
|
|
38
|
+
setConnectedIndicator(status.state);
|
|
74
39
|
};
|
|
75
40
|
var openOptionsPopupWindow = async () => {
|
|
76
41
|
const chromeAny = chrome;
|
|
@@ -114,23 +79,12 @@
|
|
|
114
79
|
window.open(url, "_blank", "noopener");
|
|
115
80
|
};
|
|
116
81
|
var main = () => {
|
|
117
|
-
const copyButton = byId("bb-copy-diagnostics");
|
|
118
|
-
let latestStatus = null;
|
|
119
82
|
const refreshStatus = async () => {
|
|
120
83
|
try {
|
|
121
84
|
const status = await getConnectionStatus();
|
|
122
|
-
latestStatus = status;
|
|
123
85
|
renderStatus(status);
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
const message = error instanceof Error ? error.message : "Failed to read connection status.";
|
|
127
|
-
latestStatus = null;
|
|
128
|
-
renderStatus({
|
|
129
|
-
state: "disconnected",
|
|
130
|
-
consecutive_failures: 0
|
|
131
|
-
});
|
|
132
|
-
setStateBadge("disconnected");
|
|
133
|
-
setText("bb-conn-error", message);
|
|
86
|
+
} catch {
|
|
87
|
+
renderStatus({ state: "disconnected" });
|
|
134
88
|
}
|
|
135
89
|
};
|
|
136
90
|
const interval = window.setInterval(() => {
|
|
@@ -139,26 +93,6 @@
|
|
|
139
93
|
window.addEventListener("unload", () => {
|
|
140
94
|
clearInterval(interval);
|
|
141
95
|
});
|
|
142
|
-
copyButton.addEventListener("click", () => {
|
|
143
|
-
void (async () => {
|
|
144
|
-
if (!latestStatus) {
|
|
145
|
-
setText("bb-copy-status", "Connection status unavailable.");
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
const payload = {
|
|
149
|
-
generated_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
150
|
-
extension_version: chrome.runtime.getManifest().version,
|
|
151
|
-
connection: latestStatus,
|
|
152
|
-
user_agent: navigator.userAgent
|
|
153
|
-
};
|
|
154
|
-
try {
|
|
155
|
-
await copyToClipboard(JSON.stringify(payload, null, 2));
|
|
156
|
-
setText("bb-copy-status", "Copied diagnostics.");
|
|
157
|
-
} catch {
|
|
158
|
-
setText("bb-copy-status", "Copy failed.");
|
|
159
|
-
}
|
|
160
|
-
})();
|
|
161
|
-
});
|
|
162
96
|
byId("bb-settings").addEventListener("click", (e) => {
|
|
163
97
|
e.preventDefault();
|
|
164
98
|
void openOptionsPopupWindow().finally(() => window.close());
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/popup-ui.ts"],
|
|
4
|
-
"sourcesContent": ["type DriveConnectionState =\n | 'connecting'\n | 'connected'\n | 'disconnected'\n | 'backoff';\n\ntype DriveConnectionStatus = {\n state: DriveConnectionState;\n
|
|
5
|
-
"mappings": ";;;
|
|
4
|
+
"sourcesContent": ["type DriveConnectionState =\n | 'connecting'\n | 'connected'\n | 'disconnected'\n | 'backoff';\n\ntype DriveConnectionStatus = {\n state: DriveConnectionState;\n};\n\ntype DriveConnectionStatusResponse = {\n ok: boolean;\n result?: DriveConnectionStatus;\n};\n\nconst byId = <T extends HTMLElement>(id: string): T => {\n const el = document.getElementById(id);\n if (!el) {\n throw new Error(`Missing element: ${id}`);\n }\n return el as T;\n};\n\nconst setConnectedIndicator = (state: DriveConnectionState): void => {\n const connected = state === 'connected';\n const indicator = byId<HTMLElement>('bb-conn-indicator');\n indicator.setAttribute('data-connected', connected ? 'true' : 'false');\n indicator.setAttribute(\n 'aria-label',\n connected ? 'Connected' : 'Disconnected'\n );\n indicator.setAttribute('title', connected ? 'Connected' : state);\n};\n\nconst getConnectionStatus = async (): Promise<DriveConnectionStatus> => {\n const response = await new Promise<DriveConnectionStatusResponse>(\n (resolve) => {\n chrome.runtime.sendMessage(\n { action: 'drive.connection_status' },\n (message: DriveConnectionStatusResponse) => {\n resolve(message);\n }\n );\n }\n );\n\n if (!response?.ok || !response.result) {\n throw new Error('Connection status is unavailable.');\n }\n\n return response.result;\n};\n\nconst renderStatus = (status: DriveConnectionStatus): void => {\n setConnectedIndicator(status.state);\n};\n\nconst openOptionsPopupWindow = async (): Promise<void> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const chromeAny = chrome as any;\n const url = chromeAny.runtime.getURL('options.html');\n\n if (chromeAny.windows?.create) {\n await new Promise<void>((resolve) => {\n chromeAny.windows.create(\n {\n type: 'popup',\n url,\n focused: true,\n width: 900,\n height: 720,\n },\n () => resolve()\n );\n });\n return;\n }\n\n if (chromeAny.runtime?.openOptionsPage) {\n await chromeAny.runtime.openOptionsPage();\n return;\n }\n if (chromeAny.tabs?.create) {\n await new Promise<void>((resolve) => {\n chromeAny.tabs.create({ url }, () => resolve());\n });\n return;\n }\n\n window.open(url, '_blank', 'noopener');\n};\n\nconst openGithub = async (): Promise<void> => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const chromeAny = chrome as any;\n const url = 'https://github.com/btraut/browser-bridge';\n if (chromeAny.tabs?.create) {\n await new Promise<void>((resolve) => {\n chromeAny.tabs.create({ url }, () => resolve());\n });\n return;\n }\n window.open(url, '_blank', 'noopener');\n};\n\nconst main = (): void => {\n const refreshStatus = async (): Promise<void> => {\n try {\n const status = await getConnectionStatus();\n renderStatus(status);\n } catch {\n renderStatus({ state: 'disconnected' });\n }\n };\n\n const interval = window.setInterval(() => {\n void refreshStatus();\n }, 1500);\n\n window.addEventListener('unload', () => {\n clearInterval(interval);\n });\n\n byId<HTMLAnchorElement>('bb-settings').addEventListener('click', (e) => {\n e.preventDefault();\n void openOptionsPopupWindow().finally(() => window.close());\n });\n\n byId<HTMLAnchorElement>('bb-about').addEventListener('click', (e) => {\n e.preventDefault();\n void openGithub().finally(() => window.close());\n });\n\n void refreshStatus();\n};\n\nmain();\n\nexport {};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/extension/manifest.json
CHANGED
package/package.json
CHANGED