Я разрабатываю расширение chrome, которое использует API-интерфейс chrome времени выполнения для отправки одноразовых сообщений назад и вперед между расширением и страницами, в которые вставляется скрипт содержимого. Проблема в том, что мне нужны некоторые сообщения, чтобы иметь приоритет в этой системе. Я реализовал пользовательский порт для передачи сообщений о приоритетах, однако не могу воспроизвести API sendResponse
с решением для порта.
Поток
Клиент вызывает метод, который возвращает обещание, в котором хранится одноразовый номер для метода запроса и разрешения, отправляет сообщение своему родителю через parent.postMessage({data}, '*')
, а затем разрешает его, когда прослушиватель window
s message
вызывается с данные, содержащие одноразовый номер.
Скрипт содержимого расширения прослушивает сообщения:
const port = chrome.runtime.connect({name: 'priorityPort'})
function getResponse(data) {
return new Promise((resolve, reject) => {
if (priority) {
port.postMessage({data})
port.onMessage.addListener(msg => {
resolve(msg)
})
} else {
chrome.runtime.sendMessage({data}, resolve)
}
})
}
window.addEventListener('message', async event => {
const response = await getResponse(event.data)
event.source.postMessage({response})
})
и тогда фоновая страница выступает в качестве другой стороны соединения
// normal
chrome.runtime.onMessage.addListener((obj, sender, sendResponse: data => {
;(async () => {
sendResponse({ status: 'success', body })
})()
return true
})
// priority
chrome.runtime.onConnect.addListener((port) => {
;(async () => {
port.onMessage.addListener(async msg => {
port.postMessage({ status: 'successs', body })
})
})()
return true
})
Однако, это не возвращает ответ запрашивающей стороне, как sendResponse
. Любая помощь очень ценится.