write TODO list and TypeScript map format has changed
This commit is contained in:
39
main.go
39
main.go
@@ -1,3 +1,41 @@
|
||||
// TODO
|
||||
// 1. Convery network messages to flatbuffers so we don't need to parse JSON in Go.
|
||||
// Use binary WS messages. Generate for Go and JS and use that everywhere. We can
|
||||
// also use this for WebRTC messages.
|
||||
// 2. Keep a list of all nodes that bootstrapped in the last N minutes.
|
||||
// 3. When a node bootstraps, send it a random list of the nodes we know about.
|
||||
// 4. Do the signalling to connect those nodes.
|
||||
// 5. Each node will know about N other nodes. To find get the data for a feed,
|
||||
// a node will need to find another node that has that data. To do that we'll need to
|
||||
// implement a search message that is sent to all currently connected nodes, and they
|
||||
// forward to all their nodes, passing back the address of the node that has the data.
|
||||
// Once we find it, we'll do the signalling to connect to it via Web RTC via our existing connected nodes.
|
||||
// -----
|
||||
// Feeds. People can curate feeds which can be any combination of hashtags, serch terms and users.
|
||||
// Invite-only communities. Just block everyone else even if they post to it.
|
||||
// Limit to friends and friends of friends
|
||||
|
||||
// MVP
|
||||
// You connect to the person you want to get the post from to get the post
|
||||
// they give you the post
|
||||
// If they're offline, you can't get their updates.
|
||||
// This is very stupid, but it's simplest thing.
|
||||
// The bootstrap server connects you to them directly via WebRTC
|
||||
// This will make the thing actually function as a little toy for people to play with.
|
||||
// This will let us test whether background tabs respond to webrtc requests.
|
||||
|
||||
// THEN
|
||||
// Need to have identity sorted out
|
||||
// When you read someone's posts, you also cache them locally
|
||||
// cache priority goes mutuals->people you follow->people who you folllow, follow, so you're always
|
||||
// caching your mutual's posts
|
||||
// Posts are samll, so caching per-post will work fine.
|
||||
// Then the process is for the bootstrap server to remember all nodes and what they're caching
|
||||
// This will allow distributed content delivery but put a memory and bendwidth strain on the
|
||||
// bootstrap sever. Look into Web Transport for the raspberry pi overhead. Could buy a few more RPIs
|
||||
// and make a little cluster
|
||||
// Domain name so we can get a certificate and serve HTTPS / HTTP3
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
@@ -34,6 +72,7 @@ func handleWebSocket(w http.ResponseWriter, r *http.Request) {
|
||||
break
|
||||
}
|
||||
log.Printf("recv: %s", message)
|
||||
|
||||
err = conn.WriteMessage(mt, message)
|
||||
if err != nil {
|
||||
log.Println("Write error:", err)
|
||||
|
||||
2
sw.js
2
sw.js
@@ -51,4 +51,4 @@ addEventListener("message", async (e) => {
|
||||
break;
|
||||
}
|
||||
});
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzcmMvc3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHlCQUF5QjtBQUN6QixNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQztBQUV2QyxNQUFNLGNBQWMsR0FBRztJQUN2QixhQUFhO0lBQ2IsVUFBVTtJQUNWLGdCQUFnQjtJQUNoQixRQUFRO0lBQ1IsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixjQUFjO0NBQ2IsQ0FBQztBQUVGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFLLEVBQUUsRUFBRTtJQUN6QyxDQUFDLENBQUMsU0FBUyxDQUNULENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDVixNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FDVCxxREFBcUQsRUFDckQsY0FBYyxDQUNmLENBQUM7UUFDRixNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDckMsQ0FBQyxDQUFDLEVBQUUsQ0FDTCxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBSyxFQUFFLEVBQUU7SUFDdkMsQ0FBQyxDQUFDLFdBQVcsQ0FDWCxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ1YsTUFBTSxDQUFDLEdBQUcsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsRUFBRTtZQUNMLE9BQU8sQ0FBQyxHQUFHLENBQ1QsNENBQTRDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQzVELENBQUM7WUFDRixPQUFPLENBQUMsQ0FBQztTQUNWO1FBRUQsSUFBSSxRQUFRLENBQUM7UUFDYixJQUFJO1lBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FDVCw4REFBOEQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FDOUUsQ0FBQztZQUVGLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkM7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDakI7UUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FDVCw4Q0FBOEMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FDOUQsQ0FBQztRQUVGLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUE7U0FDOUQ7UUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkMsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FDTCxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUM7QUFFSCxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRTNDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDbkIsS0FBSyxZQUFZO1lBQ2YsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0RBQWdELENBQUMsQ0FBQztZQUM5RCxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDdEMsTUFBTTtLQUNUO0FBQ0gsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBFc3RhYmxpc2ggYSBjYWNoZSBuYW1lXG5jb25zdCBjYWNoZU5hbWUgPSBcImRhbmRlbGlvbl9jYWNoZV92MVwiO1xuXG5jb25zdCBjb250ZW50VG9DYWNoZSA9IFtcblwiL2luZGV4Lmh0bWxcIixcblwiL21haW4uanNcIixcblwiL21hcmtlZC5taW4uanNcIixcblwiL2RiLmpzXCIsXG5cIi9ib29rZXJseS53b2ZmMlwiLFxuXCIvdmlyZ2lsLndvZmYyXCIsXG5cIi9mYXZpY29uLmljb1wiXG5dO1xuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnN0YWxsXCIsIChlOmFueSkgPT4ge1xuICBlLndhaXRVbnRpbChcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCBjYWNoZXMub3BlbihjYWNoZU5hbWUpO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIFwiW1NlcnZpY2UgV29ya2VyXSBDYWNoaW5nIGFsbDogYXBwIHNoZWxsIGFuZCBjb250ZW50XCIsXG4gICAgICAgIGNvbnRlbnRUb0NhY2hlXG4gICAgICApO1xuICAgICAgYXdhaXQgY2FjaGUuYWRkQWxsKGNvbnRlbnRUb0NhY2hlKTtcbiAgICB9KSgpXG4gICk7XG59KTtcblxuc2VsZi5hZGRFdmVudExpc3RlbmVyKFwiZmV0Y2hcIiwgKGU6YW55KSA9PiB7XG4gIGUucmVzcG9uZFdpdGgoXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBjYWNoZXMubWF0Y2goZS5yZXF1ZXN0KTtcbiAgICAgIGlmIChyKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBbU2VydmljZSBXb3JrZXJdIENhY2hlIGhpdCBmb3IgcmVzb3VyY2U6ICR7ZS5yZXF1ZXN0LnVybH1gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuXG4gICAgICBsZXQgcmVzcG9uc2U7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgW1NlcnZpY2UgV29ya2VyXSBDYWNoZSBtaXNzLCBhdHRlbXB0aW5nIHRvIGZldGNoIHJlc291cmNlOiAke2UucmVxdWVzdC51cmx9YFxuICAgICAgICApO1xuXG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZS5yZXF1ZXN0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgICAgfVxuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCBjYWNoZXMub3BlbihjYWNoZU5hbWUpO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBbU2VydmljZSBXb3JrZXJdIEFkZGluZyByZXNvdXJjZSB0byBjYWNoZTogJHtlLnJlcXVlc3QudXJsfWBcbiAgICAgICk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggcmVzb3VyY2U6ICR7ZS5yZXF1ZXN0LnVybH1gKVxuICAgICAgfVxuICAgICAgY2FjaGUucHV0KGUucmVxdWVzdCwgcmVzcG9uc2UuY2xvbmUoKSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSkoKVxuICApO1xufSk7XG5cbmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGFzeW5jIChlKSA9PiB7XG4gIGNvbnNvbGUubG9nKGBNZXNzYWdlIHJlY2VpdmVkOiAke2UuZGF0YX1gKTtcblxuICBzd2l0Y2ggKGUuZGF0YS50eXBlKSB7XG4gICAgY2FzZSBcInVwZGF0ZU1haW5cIjpcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgY2FjaGVzLm9wZW4oY2FjaGVOYW1lKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbU2VydmljZSBXb3JrZXJdIENhY2hpbmcgbmV3IHJlc291cmNlOiBtYWluLmpzYCk7XG4gICAgICBjYWNoZS5wdXQoXCIvbWFpbi5qc1wiLCBuZXcgUmVzcG9uc2UoKSk7XG4gICAgICBicmVhaztcbiAgfVxufSk7XG4iXX0=
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzcmMvc3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHlCQUF5QjtBQUN6QixNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQztBQUV2QyxNQUFNLGNBQWMsR0FBRztJQUN2QixhQUFhO0lBQ2IsVUFBVTtJQUNWLGdCQUFnQjtJQUNoQixRQUFRO0lBQ1IsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixjQUFjO0NBQ2IsQ0FBQztBQUVGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFLLEVBQUUsRUFBRTtJQUN6QyxDQUFDLENBQUMsU0FBUyxDQUNULENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDVixNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FDVCxxREFBcUQsRUFDckQsY0FBYyxDQUNmLENBQUM7UUFDRixNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDckMsQ0FBQyxDQUFDLEVBQUUsQ0FDTCxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBSyxFQUFFLEVBQUU7SUFDdkMsQ0FBQyxDQUFDLFdBQVcsQ0FDWCxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ1YsTUFBTSxDQUFDLEdBQUcsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ04sT0FBTyxDQUFDLEdBQUcsQ0FDVCw0Q0FBNEMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FDNUQsQ0FBQztZQUNGLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztRQUVELElBQUksUUFBUSxDQUFDO1FBQ2IsSUFBSSxDQUFDO1lBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FDVCw4REFBOEQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FDOUUsQ0FBQztZQUVGLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FDVCw4Q0FBOEMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FDOUQsQ0FBQztRQUVGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUMvRCxDQUFDO1FBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQ0wsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDO0FBRUgsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtJQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUUzQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEIsS0FBSyxZQUFZO1lBQ2YsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0RBQWdELENBQUMsQ0FBQztZQUM5RCxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDdEMsTUFBTTtJQUNWLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEVzdGFibGlzaCBhIGNhY2hlIG5hbWVcbmNvbnN0IGNhY2hlTmFtZSA9IFwiZGFuZGVsaW9uX2NhY2hlX3YxXCI7XG5cbmNvbnN0IGNvbnRlbnRUb0NhY2hlID0gW1xuXCIvaW5kZXguaHRtbFwiLFxuXCIvbWFpbi5qc1wiLFxuXCIvbWFya2VkLm1pbi5qc1wiLFxuXCIvZGIuanNcIixcblwiL2Jvb2tlcmx5LndvZmYyXCIsXG5cIi92aXJnaWwud29mZjJcIixcblwiL2Zhdmljb24uaWNvXCJcbl07XG5cbnNlbGYuYWRkRXZlbnRMaXN0ZW5lcihcImluc3RhbGxcIiwgKGU6YW55KSA9PiB7XG4gIGUud2FpdFVudGlsKFxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IGNhY2hlcy5vcGVuKGNhY2hlTmFtZSk7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgXCJbU2VydmljZSBXb3JrZXJdIENhY2hpbmcgYWxsOiBhcHAgc2hlbGwgYW5kIGNvbnRlbnRcIixcbiAgICAgICAgY29udGVudFRvQ2FjaGVcbiAgICAgICk7XG4gICAgICBhd2FpdCBjYWNoZS5hZGRBbGwoY29udGVudFRvQ2FjaGUpO1xuICAgIH0pKClcbiAgKTtcbn0pO1xuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoXCJmZXRjaFwiLCAoZTphbnkpID0+IHtcbiAgZS5yZXNwb25kV2l0aChcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgciA9IGF3YWl0IGNhY2hlcy5tYXRjaChlLnJlcXVlc3QpO1xuICAgICAgaWYgKHIpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYFtTZXJ2aWNlIFdvcmtlcl0gQ2FjaGUgaGl0IGZvciByZXNvdXJjZTogJHtlLnJlcXVlc3QudXJsfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG5cbiAgICAgIGxldCByZXNwb25zZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBbU2VydmljZSBXb3JrZXJdIENhY2hlIG1pc3MsIGF0dGVtcHRpbmcgdG8gZmV0Y2ggcmVzb3VyY2U6ICR7ZS5yZXF1ZXN0LnVybH1gXG4gICAgICAgICk7XG5cbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChlLnJlcXVlc3QpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IGNhY2hlcy5vcGVuKGNhY2hlTmFtZSk7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFtTZXJ2aWNlIFdvcmtlcl0gQWRkaW5nIHJlc291cmNlIHRvIGNhY2hlOiAke2UucmVxdWVzdC51cmx9YFxuICAgICAgKTtcblxuICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCByZXNvdXJjZTogJHtlLnJlcXVlc3QudXJsfWApXG4gICAgICB9XG4gICAgICBjYWNoZS5wdXQoZS5yZXF1ZXN0LCByZXNwb25zZS5jbG9uZSgpKTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9KSgpXG4gICk7XG59KTtcblxuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgYXN5bmMgKGUpID0+IHtcbiAgY29uc29sZS5sb2coYE1lc3NhZ2UgcmVjZWl2ZWQ6ICR7ZS5kYXRhfWApO1xuXG4gIHN3aXRjaCAoZS5kYXRhLnR5cGUpIHtcbiAgICBjYXNlIFwidXBkYXRlTWFpblwiOlxuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCBjYWNoZXMub3BlbihjYWNoZU5hbWUpO1xuICAgICAgY29uc29sZS5sb2coYFtTZXJ2aWNlIFdvcmtlcl0gQ2FjaGluZyBuZXcgcmVzb3VyY2U6IG1haW4uanNgKTtcbiAgICAgIGNhY2hlLnB1dChcIi9tYWluLmpzXCIsIG5ldyBSZXNwb25zZSgpKTtcbiAgICAgIGJyZWFrO1xuICB9XG59KTtcbiJdfQ==
|
||||
Reference in New Issue
Block a user