Some stability improvements and attempt at mitigating multiple instanciation of Services

This commit is contained in:
Sosthene 2024-10-12 23:18:52 +02:00
parent 0918185ad9
commit 86bfc447a8
3 changed files with 54 additions and 75 deletions

View File

@ -4,23 +4,26 @@ document.addEventListener('DOMContentLoaded', async () => {
try { try {
const services = await Services.getInstance(); const services = await Services.getInstance();
let device = await services.getDevice() setTimeout( async () => {
let device = await services.getDevice()
if(!device) { if(!device) {
device = await services.createNewDevice(); device = await services.createNewDevice();
} else { } else {
await services.restoreDevice(device) await services.restoreDevice(device)
} }
await services.recoverInjectHtml(); await services.restoreProcesses();
await services.restoreProcesses(); await services.restoreMessages();
await services.restoreMessages();
const queryString = window.location.search; // const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString) // const urlParams = new URLSearchParams(queryString)
const pairingAddress = urlParams.get('sp_address') // const pairingAddress = urlParams.get('sp_address')
if(pairingAddress) {
await services.sendPairingTx(pairingAddress) // if(pairingAddress) {
} // await services.sendPairingTx(pairingAddress)
// }
}, 500);
} catch (error) { } catch (error) {
console.error(error); console.error(error);
} }

View File

@ -46,6 +46,7 @@ export default class Services {
})(); })();
} }
console.log('initializing services');
Services.instance = await Services.initializing; Services.instance = await Services.initializing;
Services.initializing = null; // Reset for potential future use Services.initializing = null; // Reset for potential future use
return Services.instance; return Services.instance;
@ -54,7 +55,9 @@ export default class Services {
public async init(): Promise<void> { public async init(): Promise<void> {
this.notifications = this.getNotifications(); this.notifications = this.getNotifications();
this.sdkClient = await import("../../dist/pkg/sdk_client"); this.sdkClient = await import("../../dist/pkg/sdk_client");
this.sdkClient.setup();
await this.addWebsocketConnection(wsurl); await this.addWebsocketConnection(wsurl);
await this.recoverInjectHtml();
} }
public async addWebsocketConnection(url: string): Promise<void> { public async addWebsocketConnection(url: string): Promise<void> {
@ -85,9 +88,6 @@ export default class Services {
if(btn) { if(btn) {
this.addSubscription(btn, 'click', 'injectProcessListPage') this.addSubscription(btn, 'click', 'injectProcessListPage')
} }
const localAddress = await this.getDeviceAddress();
this.generateQRCode(localAddress || '')
} }
private generateQRCode = async (text: string) => { private generateQRCode = async (text: string) => {
@ -134,8 +134,7 @@ export default class Services {
} }
const service = await Services.getInstance(); const apiReturn = await this.sdkClient.create_update_transaction(undefined, JSON.stringify(paringTemplate), 1)
const apiReturn = await service.sdkClient.create_update_transaction(undefined, JSON.stringify(paringTemplate), 1)
return apiReturn return apiReturn
} }
@ -161,37 +160,32 @@ export default class Services {
} }
async resetDevice() { async resetDevice() {
const service = await Services.getInstance() await this.sdkClient.reset_device()
await service.sdkClient.reset_device()
} }
async sendNewTxMessage(message: string) { async sendNewTxMessage(message: string) {
const services = await Services.getInstance(); if (!this.websocketConnection) {
if (!services.websocketConnection) {
throw new Error('No websocket connection'); throw new Error('No websocket connection');
} }
// console.log("🚀 ~ WebSocketClient ~ this.ws.onopen= ~ newTxMessage:", message) // console.log("🚀 ~ WebSocketClient ~ this.ws.onopen= ~ newTxMessage:", message)
await services.websocketConnection.sendMessage('NewTx', message) await this.websocketConnection.sendMessage('NewTx', message)
} }
async sendCommitMessage(message: string) { async sendCommitMessage(message: string) {
const services = await Services.getInstance();
// console.log("🚀 ~ WebSocketClient ~ this.ws.onopen= ~ CommitMessage:", message) // console.log("🚀 ~ WebSocketClient ~ this.ws.onopen= ~ CommitMessage:", message)
await services.websocketConnection?.sendMessage('Commit', message) await this.websocketConnection?.sendMessage('Commit', message)
} }
async sendCipherMessages(ciphers: string[]) { async sendCipherMessages(ciphers: string[]) {
const services = await Services.getInstance();
for (let i = 0; i < ciphers.length; i++) { for (let i = 0; i < ciphers.length; i++) {
const cipher = ciphers[i]; const cipher = ciphers[i];
await services.websocketConnection?.sendMessage('Cipher', cipher); await this.websocketConnection?.sendMessage('Cipher', cipher);
} }
} }
async sendFaucetMessage(message: string): Promise<void> { async sendFaucetMessage(message: string): Promise<void> {
const services = await Services.getInstance();
// console.log("🚀 ~ WebSocketClient ~ this.ws.onopen= ~ faucetMessage:", message) // console.log("🚀 ~ WebSocketClient ~ this.ws.onopen= ~ faucetMessage:", message)
await services.websocketConnection?.sendMessage('Faucet', message); await this.websocketConnection?.sendMessage('Faucet', message);
} }
async parseCipher(message: string) { async parseCipher(message: string) {
@ -217,14 +211,13 @@ export default class Services {
async parseNewTx(tx: string) { async parseNewTx(tx: string) {
try { try {
// console.log('==============> sending txxxxxxx parser', tx) // console.log('==============> sending txxxxxxx parser', tx)
const services = await Services.getInstance(); const parsedTx = await this.sdkClient.parse_new_tx(tx, 0, 0.01)
const parsedTx = await services.sdkClient.parse_new_tx(tx, 0, 0.01)
if(parsedTx) { if(parsedTx) {
console.log("🚀 ~ Services ~ parseNewTx ~ parsedTx:", parsedTx) console.log("🚀 ~ Services ~ parseNewTx ~ parsedTx:", parsedTx)
try { try {
await this.handleApiReturn(parsedTx); await this.handleApiReturn(parsedTx);
const newDevice = await this.dumpDevice(); const newDevice = await this.dumpDevice();
await services.saveDevice(newDevice); await this.saveDevice(newDevice);
} catch (e) { } catch (e) {
console.error("Failed to update device with new tx"); console.error("Failed to update device with new tx");
} }
@ -328,22 +321,19 @@ export default class Services {
// } // }
async getAmount() { async getAmount() {
const services = await Services.getInstance(); const amount = await this.sdkClient.get_available_amount()
const amount = await services.sdkClient.get_available_amount()
console.log("🚀 ~ Services ~ getAmount ~ amount:", amount) console.log("🚀 ~ Services ~ getAmount ~ amount:", amount)
return amount return amount
} }
async getDeviceAddress() { async getDeviceAddress() {
const services = await Services.getInstance(); const address = await this.sdkClient.get_address()
const address = await services.sdkClient.get_address()
console.log("🚀 ~ Services ~ getDeviceAddress ~ address:", address) console.log("🚀 ~ Services ~ getDeviceAddress ~ address:", address)
return address return address
} }
async dumpDevice() { async dumpDevice() {
const services = await Services.getInstance(); const device = await this.sdkClient.dump_device()
const device = await services.sdkClient.dump_device()
// console.log("🚀 ~ Services ~ dumpDevice ~ device:", device) // console.log("🚀 ~ Services ~ dumpDevice ~ device:", device)
return device return device
} }
@ -358,15 +348,13 @@ export default class Services {
} }
async dumpWallet() { async dumpWallet() {
const services = await Services.getInstance(); const wallet = await this.sdkClient.dump_wallet()
const wallet = await services.sdkClient.dump_wallet()
console.log("🚀 ~ Services ~ dumpWallet ~ wallet:", wallet) console.log("🚀 ~ Services ~ dumpWallet ~ wallet:", wallet)
return wallet return wallet
} }
async createFaucetMessage() { async createFaucetMessage() {
const services = await Services.getInstance() const message = await this.sdkClient.create_faucet_msg()
const message = await services.sdkClient.create_faucet_msg()
console.log("🚀 ~ Services ~ createFaucetMessage ~ message:", message) console.log("🚀 ~ Services ~ createFaucetMessage ~ message:", message)
return message; return message;
} }
@ -377,26 +365,29 @@ export default class Services {
} }
async createNewDevice() { async createNewDevice() {
const service = await Services.getInstance();
let spAddress = ''; let spAddress = '';
try { try {
spAddress = await service.sdkClient.create_new_device(0, 'regtest') spAddress = await this.sdkClient.create_new_device(0, 'regtest')
const device = await service.dumpDevice() const device = await this.dumpDevice()
console.log("🚀 ~ Services ~ device:", device) console.log("🚀 ~ Services ~ device:", device)
await service.saveDevice(device) await this.saveDevice(device)
} catch (e) { } catch (e) {
console.error("Services ~ Error:", e); console.error("Services ~ Error:", e);
} }
this.generateQRCode(spAddress || '')
return spAddress; return spAddress;
} }
async restoreDevice(device: string) { async restoreDevice(device: string) {
const services = await Services.getInstance(); try {
// const sp_wallet = JSON.parse(address)?.sp_wallet await this.sdkClient.restore_device(device)
console.log("🚀 ~ Services ~ restoreDevice ~ services?.sdkClient:", device) const spAddress = this.sdkClient.get_address();
const res = await services?.sdkClient?.restore_device(device) this.generateQRCode(spAddress || '')
console.log("🚀 ~ Services ~ restoreDevice ~ res:", res) } catch (e) {
console.error(e);
}
} }
private getProcessesCache(): ProcessesCache { private getProcessesCache(): ProcessesCache {
@ -467,9 +458,8 @@ export default class Services {
return; return;
} }
const services = await Services.getInstance();
try { try {
await services.sdkClient.set_process_cache(JSON.stringify(processesCache)); await this.sdkClient.set_process_cache(JSON.stringify(processesCache));
} catch (e) { } catch (e) {
console.error('Services ~ restoreProcesses ~ Error:', e); console.error('Services ~ restoreProcesses ~ Error:', e);
} }
@ -484,9 +474,8 @@ export default class Services {
return; return;
} }
const services = await Services.getInstance();
try { try {
await services.sdkClient.set_message_cache(JSON.stringify(cachedMessages)); await this.sdkClient.set_message_cache(JSON.stringify(cachedMessages));
} catch (e) { } catch (e) {
console.error('Services ~ restoreMessages ~ Error:', e); console.error('Services ~ restoreMessages ~ Error:', e);
} }
@ -511,7 +500,6 @@ export default class Services {
this.cleanSubsciptions() this.cleanSubsciptions()
const services = await Services.getInstance();
// const user = services.sdkClient.create_user('Test', 'test', 10, 1, 'Messaging') // const user = services.sdkClient.create_user('Test', 'test', 10, 1, 'Messaging')
// console.log("🚀 ~ Services ~ injectProcessListPage ~ user:", user) // console.log("🚀 ~ Services ~ injectProcessListPage ~ user:", user)
@ -523,9 +511,9 @@ export default class Services {
newScript.textContent = processScript; newScript.textContent = processScript;
document.head.appendChild(newScript).parentNode?.removeChild(newScript); document.head.appendChild(newScript).parentNode?.removeChild(newScript);
this.processes = await services.getProcesses(); this.processes = await this.getProcesses();
if(this.processes) { if(this.processes) {
services.setProcessesInSelectElement(this.processes) this.setProcessesInSelectElement(this.processes)
} }
} }
@ -566,9 +554,8 @@ export default class Services {
if(elem) { if(elem) {
const cardContent = document.querySelector(".card-content"); const cardContent = document.querySelector(".card-content");
const services = await Services.getInstance();
const processes = await services.getProcesses(); const processes = await this.getProcesses();
console.log("🚀 ~ Services ~ showSelectedProcess ~ processes:", processes) console.log("🚀 ~ Services ~ showSelectedProcess ~ processes:", processes)
const process = processes.find((process: any) => process.name === (elem as any).dataset.value); const process = processes.find((process: any) => process.name === (elem as any).dataset.value);
if (process) { if (process) {

View File

@ -13,15 +13,6 @@ class WebSocketClient {
if(this.ws !== null) { if(this.ws !== null) {
this.ws.onopen = async (event) => { this.ws.onopen = async (event) => {
console.log('WebSocket connection established'); console.log('WebSocket connection established');
// Once the connection is open, send all messages in the queue
// this.sendNormalMessage(faucetMessage)
const service = await Services.getInstance();
const amount = await service.getAmount() as bigint
if(amount === 0n) {
const faucetMessage = await services.createFaucetMessage()
this.sendNormalMessage(faucetMessage)
}
while (this.messageQueue.length > 0) { while (this.messageQueue.length > 0) {
const message = this.messageQueue.shift(); const message = this.messageQueue.shift();
@ -35,15 +26,13 @@ class WebSocketClient {
this.ws.onmessage = (event) => { this.ws.onmessage = (event) => {
const msgData = event.data; const msgData = event.data;
console.log("Received text message: ", msgData); // console.log("Received text message: ", msgData);
(async () => { (async () => {
const services = await Services.getInstance()
if (typeof msgData === 'string') { if (typeof msgData === 'string') {
try { try {
const feeRate = 0.0001; const feeRate = 0.0001;
const parsedMessage = JSON.parse(msgData) const parsedMessage = JSON.parse(msgData)
console.log("🚀 ~ WebSocketClient ~ parsedMessage:", parsedMessage) // console.log("🚀 ~ WebSocketClient ~ parsedMessage:", parsedMessage)
const services = await Services.getInstance() const services = await Services.getInstance()
switch(parsedMessage.flag) { switch(parsedMessage.flag) {
case 'NewTx': case 'NewTx':