Sincronicidad de JavaScript: combinación de onAuthRequired Listener y masaje nativo

tengo estoproblema ... y he estado tratando de pasar un par de nombre de usuario y contraseña a background.js de mi extensión. El proceso es el siguiente:

Se inicia un servidor de credenciales (CS) con tokens de credenciales cifradosSelenium abre el navegador con extensión personalizadaLa extensión se activa enAuthRequiredEl host de mensajería nativa (NMH) se inicia y luego recibe un mensaje "listo"El NMH usa un protocolo simple para solicitar tokens del CSEl NMH descifra los tokensEl NMH pasa las credenciales a background.jsbackground.js devuelve las credenciales a ChromeLa magia de autenticación ocurre en el servidor remoto

He resuelto todo hasta 6 ... quizás 7. El problema es que no puedo capturar lo que el NMH está enviando. Parece ser que las credenciales no están formateadas correctamente, por lo tanto, se están rechazando o hay un problema con la forma en que se combina el lado de JavaScript, por lo que es solo un caso de código roto. También es posible que lo que pretendo no sea posible ... aunque dudo que sea así.

Proporcionaré todo el código que pueda ... y aunque agradezco cualquier ayuda, me complace obtener un ejemplo genérico que se puede modificar en mi propio tiempo.

¿Tienes un mejor enfoque? ¡Soy todo oídos! Feliz de crear una nueva pregunta para abordar otras ideas.

EDITAR 1.0: debo agregar que, cuando se ejecuta, la alerta en la línea 9 aparece. Cuando se modifica para leer:

window.alert(String(response));

yo obtengo[object Object]

EDITAR 2.0: cambiéwindow.alert(String(response)); awindow.alert(JSON.stringify(response)); y produjo el resultado esperado:{"username":"\"some_user\"","password":"\"1Password\"} Espero que esto se traduzca a '{username: "some_user", password: "1Password"}'

Parece haber un problema al pasar el valor de respuesta a creds ya que el NMH no se ejecuta en absoluto una vez que intento acceder a la propiedad de nombre de usuario / contraseña de creds fuera de la devolución de llamada. Este es probablemente un problema de alcance ...

Edición 3.0: Encontré el problema, es un problema de sincronía. Encontré muchas, muchas preguntas sobre esto; responderé esto cuando se me ocurra un trabajo a mi alrededor. Siéntase libre de responder con una solución, si tiene una.

Actualbackground.js (no funciona)

chrome.webRequest.onAuthRequired.addListener(() => {
 var hostName = "aardvark_nm_host";
 var creds = null;

 chrome.runtime.sendNativeMessage(
   hostName,
   { text: "Ready" },
   function(response){
     window.alert("response");
     console.log(response);
     creds = JSON.parse(response);
   }
 );
 return {authCredentials: creds};
},
 {urls: ["<all_urls>"]},
 ['blocking']
);

Actual aardvark_nm_host.py (Probablemente funcionando)

#!/usr/bin/env python

from locksmith import decrypt_token, KEYFILE
import socket
import struct
import sys
import json

PORT = 9999
ADDR = 'localhost'

ERRMSG = {"username":"ERROR", "password":"password"}

def report_string(string):
  def transceive(signal):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server = (ADDR, PORT)
    sock.connect(server)

    try:
      sock.sendall(signal)
    except Exception as e:
      print >>sys.stderr, e
      sock.close()
    try:
      sock.sendall(string)
      sock.close()
    except Exception as e:
      print >>sys.stderr, e
      sock.close()

  transceive('S')

def get_tokens():
  def recv_burst(sock):
    total_data = []
    while True:
      data = sock.recv(1024)
      if not data:
        break
      total_data.append(data)
    return ''.join(total_data)

  def transceive(signal):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server = (ADDR, PORT)
    sock.connect(server)

    try:
      sock.sendall(signal)
      message = recv_burst(sock)

    except Exception as e:
      report_string(e)

    finally:
      sock.close()
      
    return message

  try:
    username = transceive('U')
    username = decrypt_token(username)
    report_string(username)
  except Exception as e:
    report_string(str(e))
    username = "TOKEN_ERROR"
  try:
    password = transceive('P')
    password = decrypt_token(password)
    report_string(password)
  except Exception as e:
    report_string(str(e))
    password = "TOKEN_ERROR"

  return {"username":username, "password":password}

def read_message():
  text_length = sys.stdin.read(4)
  if len(text_length) == 0:
    sys.exit(0)

  text_length = struct.unpack('@I', text_length)[0]
  text = sys.stdin.read(text_length)
  return json.loads(text)
  
def encode_message(message):
  encoded_content = json.dumps(message)
  encoded_length = struct.pack('@I', len(encoded_content))
  return {'length': encoded_length, 'content': encoded_content}
  
def send_message(encoded_message):
  sys.stdout.write(encoded_message['length'])
  sys.stdout.write(encoded_message['content'])
  sys.stdout.flush()

def interpretation(message):
  return message["text"] == "Ready"

while True:
  received_message = read_message()
  report_string(received_message)

  if interpretation(received_message):
    creds = get_tokens()
    send_message(encode_message(creds))
    creds = None
  else:
    send_message(encode_message(ERRMSG))

Extensión actual manifest.json

{
    "version": "1.0.0",
    "manifest_version": 2,
    "name": "authvark",
    "permissions": [
        "<all_urls>",
        "webRequest",
        "webRequestBlocking",
        "nativeMessaging"
    ],
    "background": {
        "scripts": ["background.js"],
        "persistent": false
    }
}

hosts-mensajería-nativos / manifest.json

{
  "name": "aardvark_nm_host",
  "description": "Intermediary Credential Host",
  "path": "/path/to/aardvark_nm_host.py",
  "type": "stdio",
  "allowed_origins": [
    "chrome-extension://.../"
  ]
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta