diff --git a/deno/ddln_server.ts b/deno/ddln_server.ts index 917f98e..9090590 100644 --- a/deno/ddln_server.ts +++ b/deno/ddln_server.ts @@ -139,6 +139,8 @@ function hello2Handler(m:Hello2Message, socket:WebSocket) { peerSockets.set(m.peer_id, socket); // TODO:MAYBEBUG - what happens with multiple windows each with their own websocket? socketPeers.set(socket, m.peer_id); + console.log(userPeers.get(m.user_id)); + if (!m.is_bootstrap_peer) { return JSON.stringify({ type: 'hello2', bootstrapPeers: [...bootstrapPeers.values()] }); diff --git a/src/PeerManager.ts b/src/PeerManager.ts index 01a0724..d10d7d7 100644 --- a/src/PeerManager.ts +++ b/src/PeerManager.ts @@ -33,11 +33,16 @@ export class PeerManager { websocket: WebSocket | null = null; bootstrapPeerID: string | null = null; - connectPromise: { resolve: Function, reject: Function } | null = null; + connectPromiseCallbacks: { resolve: Function, reject: Function } | null = null; + connectPromise: Promise | null = null; pingPeers: RTCPeerConnection[] = []; watchdogPeriodSeconds: number = 10; eventListeners: Map = new Map(); + reconnectPeriod: number = 10; + messageSuperlog = false; + watchdogInterval: number = 0; + reconnectTimer: number | null = null; // async watchdog() { // // Check that we're connected to at least N peers. If not, reconnect to the bootstrap server. @@ -60,7 +65,7 @@ export class PeerManager { return; } - console.log.apply(null, log("<-signaler:", message)); + this.messageSuperlog && console.log.apply(null, log("<-signaler:", message)); this.websocket.send(messageJSON); } @@ -77,7 +82,7 @@ export class PeerManager { throw new Error(); } - console.log.apply(null, log("->signaler:", message)); + this.messageSuperlog && console.log.apply(null, log("->signaler:", message)); if (message.type === "hello2") { @@ -105,7 +110,15 @@ export class PeerManager { } if (!peerConnection) { - peerConnection = this.onConnectRequest(message); + let remotePeerID = message.from; + let newPeer = new PeerConnection(this, remotePeerID, this.websocketSendPeerMessage.bind(this)); + if (this.isBootstrapPeer) { + newPeer.setPolite(false); + } + peerConnection = newPeer; + this.peers.set(newPeer.remotePeerID, newPeer); + + this.onConnectRequest(newPeer); } } @@ -119,35 +132,36 @@ export class PeerManager { } } - onConnectRequest(message: any) { - let remotePeerID = message.from; - let newPeer = new PeerConnection(this, remotePeerID, this.websocketSendPeerMessage.bind(this)); - if (this.isBootstrapPeer) { - newPeer.setPolite(false); - } - newPeer.connect(); - this.peers.set(remotePeerID, newPeer); + async onConnectRequest(newPeer: PeerConnection) { + // let remotePeerID = message.from; + // let newPeer = new PeerConnection(this, remotePeerID, this.websocketSendPeerMessage.bind(this)); + // if (this.isBootstrapPeer) { + // newPeer.setPolite(false); + // } + await newPeer.connect(); + this.onPeerConnected(newPeer.remotePeerID); return newPeer; } async onHello2Received(bootstrapPeerID: string) { if (this.isBootstrapPeer) { - this.connectPromise?.resolve(); + this.connectPromiseCallbacks?.resolve(); return; } if (!bootstrapPeerID) { - console.log.apply(null, log("Didn't get bootstrap peer, waiting 10 seconds...")); - setTimeout(async (e: Event) => { await this.sendHello2() }, 10_000); + // console.log.apply(null, log("Didn't get bootstrap peer, waiting 10 seconds...")); + // let callSendHello2OnTimeout = () => { console.log(this, "jajajajaj");this.sendHello2() }; + // setTimeout(callSendHello2OnTimeout, 5_000); return; } this.bootstrapPeerConnection = await this.connectToPeer(bootstrapPeerID); - this.connectPromise?.resolve(); + this.connectPromiseCallbacks?.resolve(); } - async sendHello2() { + sendHello2() { this.websocketSend({ type: "hello2", user_id: this.userID, @@ -195,45 +209,34 @@ export class PeerManager { } } - - connect() { - // setInterval(this.watchdog.bind(this), this.watchdogPeriodSeconds * 1000); - - setInterval(()=>{ - - - if (!this.isBootstrapPeer && this.peers.size === 0) { - console.log.apply(null, log("No peers connected :(")); - if (this.websocket?.readyState === WebSocket.OPEN) { - this.sendHello2(); - } - } - - let output = `local peerID:${logID(this.peerID)}` + "\n"; - for (let [peerID, peer] of this.peers) { - output += `${logID(peerID)}: ${peer.rtcPeer?.connectionState}` + "\n"; - } - - console.log.apply(null, log(output)); - - - - }, 5000); - - let connectPromise = new Promise((resolve, reject) => { - this.connectPromise = { resolve, reject }; - }); + connectWebSocket() { try { let hostname = globalThis?.location?.hostname ?? 'ddln.app'; - let port = globalThis?.location?.port ?? '443'; - let wsURL = `wss://${hostname}:${port}/ws`; - console.log(`wsURL: ${wsURL}`); + console.log.apply(null, log(`Attempting to connect websocket to URL: ${wsURL}`)); this.websocket = new WebSocket(wsURL); + // this.websocket.onclose = (e: CloseEvent) => { + + // let closedUnexpectedly = !e.wasClean; + + // if (closedUnexpectedly) { + // console.log.apply(null, log(`Websocket closed unexpectedly. Will try to reconnect in ${this.reconnectPeriod} seconds`)); + // // let alreadyReconnecting = this.reconnectTimer !== null; + // // if (!alreadyReconnecting) { + // this.reconnectTimer = globalThis.setTimeout(() => { + // console.log.apply(null, log(`Reconnecting web socket`)); + + // this.reconnectTimer = null; + // this.connectWebSocket(); + // }, this.reconnectPeriod * 1000) + // }; + // } + // } + } catch (error: any) { throw new Error(error.message); } @@ -244,6 +247,52 @@ export class PeerManager { }; this.websocket.onmessage = this.onWebsocketMessage.bind(this); + } + + connect() { + // setInterval(this.watchdog.bind(this), this.watchdogPeriodSeconds * 1000); + + + // Side effects :( + if (!this.watchdogInterval) { + this.watchdogInterval = setInterval(() => { + + + if (!this.isBootstrapPeer && this.peers.size === 0) { + console.log.apply(null, log(`No peers connected, will attempt to reconnect in ${this.reconnectPeriod} seconds...`)); + + // Websocket reconnect + if (this.websocket?.readyState === WebSocket.OPEN) { + this.sendHello2(); + } + + if (this.websocket?.readyState === WebSocket.CLOSED) { + this.connectWebSocket(); + } + + + } + + let output = `local peerID:${logID(this.peerID)}` + "\n"; + for (let [peerID, peer] of this.peers) { + output += `${logID(peerID)}: ${peer.rtcPeer?.connectionState}` + "\n"; + } + + console.log.apply(null, log(output)); + }, this.reconnectPeriod * 1000); + } + + let connectPromise = this.connectPromise; + + if (!connectPromise) { + connectPromise = new Promise((resolve, reject) => { + this.connectPromiseCallbacks = { resolve, reject }; + }); + + this.connectPromise = connectPromise; + } + + this.connectWebSocket(); return connectPromise; @@ -257,7 +306,7 @@ export class PeerManager { async connectToPeer(remotePeerID: string) { // Connect to the peer that has the peer id remotePeerID. // TODO how do multiple windows / tabs from the same peer and user work? - // Need to decide if they shold all get a unique connection. A peer should only be requesting and writing + // Need to decide if they should all get a unique connection. A peer should only be requesting and writing // Data once though, so it probably need to be solved on the client side as the data is shared obv // Maybe use BroadcastChannel to proxy all calls to peermanager? That will probably really complicate things. // What if we just user session+peerID for the connections? Then we might have two windows making requests @@ -274,10 +323,11 @@ export class PeerManager { } onPeerConnected(peerID: PeerID) { - this.dispatchEvent(PeerEventTypes.PEER_CONNECTED, {peerID:peerID}); + console.log.apply(null, log(`PeerManager: Successfully connected to peer ${peerID}`)); + this.dispatchEvent(PeerEventTypes.PEER_CONNECTED, { peerID: peerID }); } - dispatchEvent(event:PeerEventTypes, parameters:any) { + dispatchEvent(event: PeerEventTypes, parameters: any) { let listeners = this.eventListeners.get(event); if (!listeners) { @@ -290,7 +340,7 @@ export class PeerManager { } - addEventListener(eventName:PeerEventTypes, func:Function) { + addEventListener(eventName: PeerEventTypes, func: Function) { let listeners = this.eventListeners.get(eventName); if (!listeners) { this.eventListeners.set(eventName, [func]); @@ -315,7 +365,7 @@ export class PeerManager { this.bootstrapPeerConnection = null; } - this.dispatchEvent(PeerEventTypes.PEER_DISCONNECTED, {peerID:remotePeerID}); + this.dispatchEvent(PeerEventTypes.PEER_DISCONNECTED, { peerID: remotePeerID }); } @@ -326,7 +376,7 @@ export class PeerManager { console.log.apply(null, log(`PeerManager.disconnect: couldn't find peer ${remotePeerID}`)); return; } - + console.log.apply(null, log(`PeerManager.disconnect: disconnecting peer ${remotePeerID}`)); await peer.disconnect(); this.peers.delete(remotePeerID); @@ -388,7 +438,7 @@ interface Message { } class PeerConnection { - private remotePeerID: string; + remotePeerID: string; // private signaler: Signaler; private peerManager: PeerManager; private dataChannel: RTCDataChannel | null = null; @@ -398,6 +448,8 @@ class PeerConnection { private ignoreOffer: boolean = false; private isSettingRemoteAnswerPending: boolean = false; private polite = true; + private webRTCSuperlog = false; + private dataChannelSuperlog = false; // private makingOffer:boolean = false; // private ignoreOffer:boolean = false; @@ -407,7 +459,7 @@ class PeerConnection { static config = { iceServers: [ { urls: "stun:ddln.app" }, - // { urls: "turn:ddln.app", username: "a", credential: "b" }, + { urls: "turn:ddln.app", username: "a", credential: "b" }, { urls: "stun:stun.l.google.com" }, // keeping this for now as my STUN server is not return ipv6 // { urls: "stun:stun1.l.google.com" }, // { urls: "stun:stun2.l.google.com" }, @@ -420,7 +472,7 @@ class PeerConnection { string, { resolve: Function; reject: Function; functionName: string } > = new Map(); - messageSuperlog: boolean = true; + messageSuperlog: boolean = false; connectionPromise: { resolve: (value?: unknown) => void; reject: (reason?: any) => void; } | null = null; async RPCHandler(message: any) { @@ -451,42 +503,45 @@ class PeerConnection { if (!this.dataChannel) { throw new Error(); } - console.log.apply(null, log("data channel is open to: ", this.remotePeerID, " from: ", this.peerManager.peerID)); - this.send({ type: "hello datachannel", from: this.peerManager.peerID, to: this.remotePeerID}); + this.dataChannelSuperlog && console.log.apply(null, log("data channel is open to: ", this.remotePeerID, " from: ", this.peerManager.peerID)); + this.send({ type: "hello datachannel", from: this.peerManager.peerID, to: this.remotePeerID }); // this.dataChannel?.send(`{typeHello datachannel from: ${this.peerManager.peerID}`); console.log.apply(null, log([...this.peerManager.peers.keys()])); if (this.peerManager.isBootstrapPeer) { - this.send({ type: 'initial_peers', from: this.peerManager.peerID, peers: [...this.peerManager.peers.keys()].filter(entry => entry !== this.remotePeerID) }) + this.send({ type: 'initial_peers', from: this.peerManager.peerID, peers: [...this.peerManager.peers.keys()].filter(entry => entry !== this.remotePeerID) }); // this.dataChannel.send(JSON.stringify()); } - this.connectionPromise?.resolve(); + this.connectionPromise?.resolve(this.remotePeerID); + + //globalThis.setTimeout(()=>this.connectionPromise?.resolve(this.remotePeerID), 5000); + } this.dataChannel.onmessage = (e: MessageEvent) => { - console.log.apply(null, log("->datachannel: ", e.data)) + this.dataChannelSuperlog && console.log.apply(null, log("->datachannel: ", e.data)); this.onMessage(e.data); } this.dataChannel.onclose = (e: Event) => { - console.log.apply(null, log(`datachannel from peer ${this.remotePeerID} closed, disconnecting peer.`)); + this.dataChannelSuperlog && console.log.apply(null, log(`datachannel from peer ${this.remotePeerID} closed, disconnecting peer.`)); this.peerManager.disconnectFromPeer(this.remotePeerID); } } async connect() { - let connectionPromise = new Promise((resolve, reject) => this.connectionPromise = { resolve, reject }); + let connectionPromise = new Promise((resolve, reject) => { this.connectionPromise = { resolve, reject } }); this.rtcPeer = new RTCPeerConnection(PeerConnection.config); this.rtcPeer.onconnectionstatechange = async (e: any) => { - console.log.apply(null, log(`rtcPeer: onconnectionstatechange: ${this.rtcPeer?.connectionState}: ${this.remotePeerID}`)); + this.webRTCSuperlog && console.log.apply(null, log(`rtcPeer: onconnectionstatechange: ${this.rtcPeer?.connectionState}: ${this.remotePeerID}`)); if (!this.rtcPeer) { throw new Error("onconnectionstatechange"); } - + // When the connection is closed, tell the peer manager that this connection has gone away if (this.rtcPeer.connectionState === "failed") { this.peerManager.onPeerDisconnected(this.remotePeerID); @@ -507,7 +562,7 @@ class PeerConnection { let localCandidate = stats.get(candidatePair.localCandidateId); let remoteCandidate = stats.get(candidatePair.remoteCandidateId); - console.log.apply(null, log("Connected candidates\n", localCandidate, remoteCandidate)); + this.webRTCSuperlog && console.log.apply(null, log("Connected candidates\n", localCandidate, remoteCandidate)); } } } @@ -536,12 +591,12 @@ class PeerConnection { this.rtcPeer.onicecandidate = ({ candidate }) => { - console.log.apply(null, log(candidate)); + this.webRTCSuperlog && console.log.apply(null, log(candidate)); this.sendPeerMessage(this.remotePeerID, { type: "rtc_candidate", candidate: candidate }); } this.rtcPeer.onnegotiationneeded = async (event) => { - console.log.apply(null, log("on negotiation needed fired")); + this.webRTCSuperlog && console.log.apply(null, log("on negotiation needed fired")); if (!this.rtcPeer) { throw new Error(); @@ -709,4 +764,4 @@ class PeerConnection { // this.peerManger.onMessage(this.remotePeerID, message); } -} \ No newline at end of file +} diff --git a/src/Sync.ts b/src/Sync.ts new file mode 100644 index 0000000..076dee8 --- /dev/null +++ b/src/Sync.ts @@ -0,0 +1,35 @@ +export class Sync { + static async getFollowing(userID: string): Promise { + + // Rob + if (userID === 'b38b623c-c3fa-4351-9cab-50233c99fa4e') { + return [ + 'b38b623c-c3fa-4351-9cab-50233c99fa4e', + '6d774268-16cd-4e86-8bbe-847a0328893d', // Sean + '05a495a0-0dd8-4186-94c3-b8309ba6fc4c', // Martin + 'a0e42390-08b5-4b07-bc2b-787f8e5f1297', // BMO + 'bba3ad24-9181-4e22-90c8-c265c80873ea', // Harry + '8f6802be-c3b6-46c1-969c-5f90cbe01479', // Fiona + ] + } + + // Martin + if (userID === '05a495a0-0dd8-4186-94c3-b8309ba6fc4c') { + return [ + 'b38b623c-c3fa-4351-9cab-50233c99fa4e', + 'a0e42390-08b5-4b07-bc2b-787f8e5f1297', // BMO + ] + } + + // Fiona + if (userID === '8f6802be-c3b6-46c1-969c-5f90cbe01479') { + return [ + 'b38b623c-c3fa-4351-9cab-50233c99fa4e', // Rob + 'a0e42390-08b5-4b07-bc2b-787f8e5f1297', // BMO + '05a495a0-0dd8-4186-94c3-b8309ba6fc4c', // Martin + ] + } + + return ['a0e42390-08b5-4b07-bc2b-787f8e5f1297']; // Follow BMO by default :) + } +} \ No newline at end of file diff --git a/src/main2.ts b/src/main2.ts index cc9311c..39bb00b 100644 --- a/src/main2.ts +++ b/src/main2.ts @@ -34,6 +34,7 @@ Restruucture the app around the data. App/WS split is messy. Clean it up. import { openDatabase, getData, addData, addDataArray, clearData, deleteData, mergeDataArray, getAllData, checkPostIds, getAllIds, getPostsByIds } from "db"; import { generateID } from "IDUtils"; import { PeerManager, PeerEventTypes } from "PeerManager"; +import { Sync } from "Sync"; import { log, logID, renderLog, setLogVisibility } from "log" @@ -748,7 +749,7 @@ class App { console.log.apply(null, log(`[app]: peer connected:${event.peerID}`)); // rpc saying what peers we have }) - + console.log.apply(null, log("*************** before peerManager.connect")); // We use promises here to only return from this call once we're connected to the boostrap peer @@ -759,6 +760,11 @@ class App { // Would be lovely to show a little display of peers connecting, whether you're connected directly to a friend's peer etc. // Basically that live "dandelion" display. + this.peerManager.registerRPC('getPeersForUser', (userID: any) => { + return [1, 2, 3, 4, 5]; + }); + + this.peerManager.registerRPC('getPostIDsForUser', (userID: any) => { return [1, 2, 3, 4, 5] }); @@ -767,12 +773,45 @@ class App { console.log.apply(null, log("*************** after peerManager.connect"));; - if (!this.isBootstrapPeer) { - let postIDs = await this.peerManager.rpc.getPostIDsForUser(this.peerManager.bootstrapPeerID, this.userID); - console.log.apply(null, log("peerManager.rpc.getPostIDsForUser", postIDs)); + if (this.isBootstrapPeer) { + return; + } + + let usersToSync = await Sync.getFollowing(this.userID); + + for (let userID of usersToSync) { + console.log(userID); + // this.peerManager.rpc.getPeersForUser(userID); } + // for (let userID in this.sync.usersToSync()) { + // let peers = await this.peerManager.rpc.getPeersForUser(userID); + + // for (let peer in peers) { + // let peer = await this.peerManager.connectToPeer(userID); + + // let postIDs = peer.getPostIDsForUser(userID); + + // let postIDsNeeded = this.sync.checkPostIds(userID, postIDs); + + // if (postIDs.length === 0) { + // continue; + // } + + // let posts = peer.rpc.getPostsForUser(userID, postIDs); + + // this.sync.writePostsForUser(userID, posts); + + // this.render(); + // } + + // } + + let postIDs = await this.peerManager.rpc.getPostIDsForUser(this.peerManager.bootstrapPeerID, this.userID); + + + console.log.apply(null, log("peerManager.rpc.getPostIDsForUser", postIDs)); } @@ -1538,10 +1577,10 @@ class App { return { id: this.peerID, user: this.userID, user_name: this.username, peer_name: this.peername }; }); - if (!this.isBootstrapPeer) { - let pong = await this.peerManager.rpc.ping(this.peerManager.bootstrapPeerID); - console.log.apply(null, log('pong from: ', pong)); - } + // if (!this.isBootstrapPeer) { + // let pong = await this.peerManager.rpc.ping(this.peerManager.bootstrapPeerID); + // console.log.apply(null, log('pong from: ', pong)); + // } @@ -1557,13 +1596,18 @@ class App { throw new Error(); } - this.peerManager.registerRPC('getPostIDsForUser', (args: any) => { - return [1, 2, 3, 4, 5] + this.peerManager.registerRPC('getPeersForUser', (userID: any) => { + return [1, 2, 3, 4, 5]; }); - let postIDs = await this.peerManager.rpc.getPostIDsForUser("dummy_peer", "bloop"); - console.log.apply(null, log("peerManager.rpc.getPostIDsForUser", postIDs)); + // this.peerManager.registerRPC('getPostIDsForUser', (args: any) => { + // return [1, 2, 3, 4, 5]; + // }); + + // let postIDs = await this.peerManager.rpc.getPostIDsForUser("dummy_peer", "bloop"); + + // console.log.apply(null, log("peerManager.rpc.getPostIDsForUser", postIDs)); // this.peerManager.registerSearchQuery('find_peers_for_user', this.query_findPeersForUser); diff --git a/static/index.html b/static/index.html index 9200cee..e495029 100644 --- a/static/index.html +++ b/static/index.html @@ -13,7 +13,8 @@ "db": "/static/db.js", "IDUtils": "/static/IDUtils.js", "PeerManager": "/static/PeerManager.js", - "log": "/static/log.js" + "log": "/static/log.js", + "Sync": "/static/Sync.js" } } diff --git a/static/main2.js b/static/main2.js index e7d0dec..01b18a9 100644 --- a/static/main2.js +++ b/static/main2.js @@ -29,6 +29,7 @@ Restruucture the app around the data. App/WS split is messy. Clean it up. import { openDatabase, getData, addData, deleteData, mergeDataArray, getAllData, checkPostIds, getAllIds, getPostsByIds } from "db"; import { generateID } from "IDUtils"; import { PeerManager, PeerEventTypes } from "PeerManager"; +import { Sync } from "Sync"; import { log, logID, renderLog, setLogVisibility } from "log"; // let posts:any; // let keyBase = "dandelion_posts_v1_" @@ -584,16 +585,39 @@ class App { // we could return progress information as we connect and have the app subscribe to that? // Would be lovely to show a little display of peers connecting, whether you're connected directly to a friend's peer etc. // Basically that live "dandelion" display. + this.peerManager.registerRPC('getPeersForUser', (userID) => { + return [1, 2, 3, 4, 5]; + }); this.peerManager.registerRPC('getPostIDsForUser', (userID) => { return [1, 2, 3, 4, 5]; }); await this.peerManager.connect(); console.log.apply(null, log("*************** after peerManager.connect")); ; - if (!this.isBootstrapPeer) { - let postIDs = await this.peerManager.rpc.getPostIDsForUser(this.peerManager.bootstrapPeerID, this.userID); - console.log.apply(null, log("peerManager.rpc.getPostIDsForUser", postIDs)); + if (this.isBootstrapPeer) { + return; } + let usersToSync = await Sync.getFollowing(this.userID); + for (let userID of usersToSync) { + console.log(userID); + // this.peerManager.rpc.getPeersForUser(userID); + } + // for (let userID in this.sync.usersToSync()) { + // let peers = await this.peerManager.rpc.getPeersForUser(userID); + // for (let peer in peers) { + // let peer = await this.peerManager.connectToPeer(userID); + // let postIDs = peer.getPostIDsForUser(userID); + // let postIDsNeeded = this.sync.checkPostIds(userID, postIDs); + // if (postIDs.length === 0) { + // continue; + // } + // let posts = peer.rpc.getPostsForUser(userID, postIDs); + // this.sync.writePostsForUser(userID, posts); + // this.render(); + // } + // } + let postIDs = await this.peerManager.rpc.getPostIDsForUser(this.peerManager.bootstrapPeerID, this.userID); + console.log.apply(null, log("peerManager.rpc.getPostIDsForUser", postIDs)); } getPreferentialUserID() { return this.router.userID.length !== 0 ? this.router.userID : this.userID; @@ -1175,10 +1199,10 @@ class App { this.peerManager.registerRPC('ping', (args) => { return { id: this.peerID, user: this.userID, user_name: this.username, peer_name: this.peername }; }); - if (!this.isBootstrapPeer) { - let pong = await this.peerManager.rpc.ping(this.peerManager.bootstrapPeerID); - console.log.apply(null, log('pong from: ', pong)); - } + // if (!this.isBootstrapPeer) { + // let pong = await this.peerManager.rpc.ping(this.peerManager.bootstrapPeerID); + // console.log.apply(null, log('pong from: ', pong)); + // } // this.peerManager.registerRPC('getPostIDsForUser', (args: any) => { // this.sync.getPostsForUser // }); @@ -1187,11 +1211,14 @@ class App { if (!this.peerManager) { throw new Error(); } - this.peerManager.registerRPC('getPostIDsForUser', (args) => { + this.peerManager.registerRPC('getPeersForUser', (userID) => { return [1, 2, 3, 4, 5]; }); - let postIDs = await this.peerManager.rpc.getPostIDsForUser("dummy_peer", "bloop"); - console.log.apply(null, log("peerManager.rpc.getPostIDsForUser", postIDs)); + // this.peerManager.registerRPC('getPostIDsForUser', (args: any) => { + // return [1, 2, 3, 4, 5]; + // }); + // let postIDs = await this.peerManager.rpc.getPostIDsForUser("dummy_peer", "bloop"); + // console.log.apply(null, log("peerManager.rpc.getPostIDsForUser", postIDs)); // this.peerManager.registerSearchQuery('find_peers_for_user', this.query_findPeersForUser); // let peers = await this.peerManager.search('find_peers_for_user', { 'user_id': 'bloop' }); }