working on replies

This commit is contained in:
2026-04-15 06:05:46 +00:00
parent 0d392c90cc
commit c1de283fb6
15 changed files with 436 additions and 211 deletions

View File

@@ -6,7 +6,6 @@
import { generateID } from "IDUtils";
import { log, logID } from "log";
// import { App } from "./App";
// Use a broadcast channel to only have one peer manager for multiple tabs,
// then we won't need to have a session ID as all queries for a peerID will be coming from the same peer manager
@@ -22,7 +21,6 @@ export class PeerManager {
routingTable: Map<string, string>;
peers: Map<string, PeerConnection>;
// private signaler: Signaler;
searchQueryFunctions: Map<string, Function> = new Map();
RPC_remote: Map<string, Function> = new Map();
rpc: { [key: string]: Function } = {};
@@ -46,14 +44,6 @@ export class PeerManager {
reconnectTimer: number | null = null;
peerStateSuperlog: boolean = true;
// async watchdog() {
// // Check that we're connected to at least N peers. If not, reconnect to the bootstrap server.
// if (this.peers.size === 0) {
// await this.sendHello2();
// }
// }
animals = ['shrew', 'jerboa', 'lemur', 'weasel', 'possum', 'possum', 'marmoset', 'planigale', 'mole', 'narwhal'];
adjectives = ['snazzy', 'whimsical', 'jazzy', 'bonkers', 'wobbly', 'spiffy', 'chirpy', 'zesty', 'bubbly', 'perky', 'sassy'];
snakes = ['mamba', 'cobra', 'python', 'viper', 'krait', 'sidewinder', 'constrictor', 'boa', 'asp', 'anaconda', 'krait']
@@ -108,6 +98,18 @@ export class PeerManager {
}
onPeerMessageFromPeer(remotePeerID: string, messageJSON: any) {
let targetPeer = this.peers.get(messageJSON.to);
if (!targetPeer) {
console.log.apply(null, log("[PeerManager] Coulnd't find peer for onPeerMessageFromPeer:", messageJSON.to));
return;
}
targetPeer.send(messageJSON);
}
onWebsocketMessage(event: MessageEvent) {
let messageJSON = event.data;
let message: any = null;
@@ -149,10 +151,11 @@ export class PeerManager {
if (!peerConnection) {
let remotePeerID = message.from;
let newPeer = new PeerConnection(this, remotePeerID, this.websocketSendPeerMessage.bind(this));
if (this._isBootstrapPeer) {
newPeer.setPolite(false);
}
newPeer.setPoliteFromID(remotePeerID, true);
peerConnection = newPeer;
this.peers.set(newPeer.remotePeerID, newPeer);
this.onConnectRequest(newPeer);
@@ -580,6 +583,12 @@ class PeerConnection {
this.polite = polite;
}
setPoliteFromID(peerID: PeerID, remote = false) {
let polite = (parseInt(peerID.charAt(peerID.length-1), 16) % 2 == 0) && !remote;
this.setPolite(polite);
}
setupDataChannel() {
if (!this.dataChannel) {
throw new Error();
@@ -713,6 +722,7 @@ class PeerConnection {
try {
this.makingOffer = true;
this.setPoliteFromID(this.peerManager.peerID);
await this.rtcPeer.setLocalDescription();
if (!this.rtcPeer.localDescription) {
@@ -801,12 +811,6 @@ class PeerConnection {
} catch (err) {
console.error(err);
}
// };
// */
}
disconnect() {
@@ -884,15 +888,12 @@ class PeerConnection {
}
}
call(functionName: string, args: any) {
let transactionID = generateID(); // make this faster as we will only ever have a small number of in-flight queries on a peer
// Think about a timeout here to auto reject it after a while.
let promise = new Promise((resolve, reject) => {
this.pendingRPCs.set(transactionID, { resolve, reject, functionName });
setTimeout(() => reject(`function:${functionName}[${transactionID}] failed to resolve after 10 seconds.`), 10_000);
let timeoutSeconds = 10;
setTimeout(() => reject(`function:${functionName}[${transactionID}] failed to resolve after ${timeoutSeconds} seconds.`), timeoutSeconds * 1000);
});
let message = {