The desktop client will be executed outside of an internet navigator like Chrome or Firefox,
and the explorer-website will not be used.
Currently, to log in into the world, you must enter through explorer-website (or
derived), and the authentication happens with exchanges of messages between
kernel and website.
On Desktop, website will not be used, and those exchanges will be with
kernel and renderer. So explorer-desktop must implement
a way to communicate those to be able to log in.
The problem is how to execute kernel without a navigator and communicate it with
the renderer.
Launching kernel with Chromium headless
Launching kernel with NodeJS
Launching kernel with Chromium headless is the most compatible with
what currently explorer has. But executing kernel in
NodeJS is inevitable because it will execute kernel unit tests and
other cases. Taking advantage of this approach is the best option not to rewrite code and
isolate it as much as possible.
Removing explorer-website from the Desktop Client Project is required. So the
communication with kernel and renderer to authenticate will be
implemented without other options.
To implement what it's described above the team decided the following flows:
sequenceDiagram
participant R as Desktop renderer
participant N as NodeJS
participant K as Kernel
L->R: open process
R->N: Spawn NodeJS process
N->N: Load kernel
N->K: Initialize WS Connection
R-->K: WS Connection details
K->R: WS Connection
sequenceDiagram
participant K as Kernel
R->K: StartAuthentication_Native {provider=null,isGuest=true}
K->K: Load or create guest session
K->R: Authenticated
sequenceDiagram
participant K as Kernel
participant B as WalletConnectBridge
R->K: StartAuthentication_Native\n{provider="wallet_connect",isGuest=false}
K->K: Create WC provider
B-->K: Get QR
K->R: QR Code
K->K: Wait until login is successful
R-->B: (login with mobile phone, scan QR)
B-->K: Login succesful
K->R: Authenticated
Some pseudo code of how explorer-website and explorer-desktop will
start:
// shell=explorer-website (browser)
import Renderer from "..."
import Kernel from "..."
const kernel = new Kernel({
renderer: new Renderer()
})
await kernel.authenticate(provider, (isGuest = true))
// kernel emits a message to start the renderer
// shell=explorer-desktop (NodeJS)
import Renderer from "..."
import Kernel from "..."
const renderer = new WebSocket_Remote_Renderer("ws://localhost:8000")
const kernel = new Kernel({
renderer
})
renderer.onAuthenticateMessage((message) => {
await kernel.authenticate(message.provider, message.isGuest)
})