-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnative-messaging.js
More file actions
94 lines (81 loc) · 1.96 KB
/
Copy pathnative-messaging.js
File metadata and controls
94 lines (81 loc) · 1.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// Native messaging port management
let port = null;
let pending = [];
let intentionalDisconnect = false;
/**
* Establish connection to native host
*/
export function ensureNativePort(onMessage, onDisconnect) {
if (port) return port;
console.log("[BG] Connecting native host...");
port = chrome.runtime.connectNative("com.redactosaurus.native");
intentionalDisconnect = false;
port.onMessage.addListener((msg) => {
console.log("[BG] From native:", msg);
if (onMessage) onMessage(msg);
});
port.onDisconnect.addListener(() => {
const lastError = chrome.runtime.lastError;
const wasIntentional = intentionalDisconnect;
intentionalDisconnect = false;
console.log("[BG] Native disconnected:", lastError, {
intentional: wasIntentional,
});
port = null;
if (onDisconnect) onDisconnect(lastError, { intentional: wasIntentional });
});
return port;
}
/**
* Send message to native host
*/
export function sendToNative(message) {
if (!port) {
throw new Error("Native port not connected");
}
port.postMessage(message);
}
/**
* Track pending promise for request/response
*/
export function addPending(promiseCallbacks) {
pending.push(promiseCallbacks);
}
/**
* Resolve all pending promises with a response
*/
export function flushPending(response) {
const list = pending;
pending = [];
for (const p of list) p.resolve(response);
}
/**
* Reject all pending promises with an error
*/
export function rejectAllPending(error) {
const list = pending;
pending = [];
for (const p of list) p.reject(error);
}
/**
* Disconnect from native host intentionally.
*/
export function disconnectNativePort() {
if (!port) {
intentionalDisconnect = false;
return false;
}
intentionalDisconnect = true;
try {
port.disconnect();
} catch {
// Best effort.
}
return true;
}
/**
* Check if a native port is currently connected.
*/
export function isNativePortConnected() {
return port !== null;
}