*Initial version
This commit is contained in:
parent
ea6d51e42d
commit
852abf5b6a
|
@ -0,0 +1,5 @@
|
|||
nodeLinker: node-modules
|
||||
|
||||
plugins:
|
||||
- path: .yarn/plugins/@yarnpkg/plugin-typescript.cjs
|
||||
spec: "@yarnpkg/plugin-typescript"
|
|
@ -0,0 +1,9 @@
|
|||
import esbuild from "esbuild";
|
||||
|
||||
esbuild.buildSync({
|
||||
entryPoints: ["src/index.ts"],
|
||||
outfile: "dist/discovery-irc.js",
|
||||
format: "cjs",
|
||||
bundle: true,
|
||||
platform: "node",
|
||||
});
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"name": "@lumeweb/relay-plugin-discovery-irc",
|
||||
"version": "0.1.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"build": "node build.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@lumeweb/peer-discovery": "https://git.lumeweb.com/LumeWeb/peer-discovery.git",
|
||||
"@lumeweb/relay-types": "https://git.lumeweb.com/LumeWeb/relay-types.git",
|
||||
"@types/b4a": "^1.6.0",
|
||||
"@types/prettier": "^2",
|
||||
"esbuild": "^0.16.10",
|
||||
"prettier": "^2.8.1",
|
||||
"rollup": "^3.7.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"@ctrl/irc": "^2.1.0",
|
||||
"b4a": "^1.6.1",
|
||||
"json-stringify-deterministic": "^1.0.8"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"plugin": {
|
||||
"discoveryirc": {
|
||||
"networks": [
|
||||
{
|
||||
"host": "irc.ergo.chat",
|
||||
"port": 6697,
|
||||
"ssl" : true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"plugins": ["discovery-irc"]
|
||||
}
|
|
@ -0,0 +1,68 @@
|
|||
import type { Plugin, PluginAPI } from "@lumeweb/relay-types";
|
||||
import type { Peer } from "@lumeweb/peer-discovery";
|
||||
import { IrcClient } from "@ctrl/irc";
|
||||
import b4a from "b4a";
|
||||
import jsonStringify from "json-stringify-deterministic";
|
||||
import type { Message } from "@ctrl/irc/dist/src/parseMessage";
|
||||
|
||||
interface SignedPeerResponse extends Peer {
|
||||
timestamp: number;
|
||||
signature?: string;
|
||||
}
|
||||
|
||||
interface Network {
|
||||
host: string;
|
||||
port: number;
|
||||
ssl: boolean;
|
||||
}
|
||||
|
||||
const plugin: Plugin = {
|
||||
name: "discovery-irc",
|
||||
async plugin(api: PluginAPI): Promise<void> {
|
||||
for (const network of api.pluginConfig.array("networks", []) as Network[]) {
|
||||
let client = new IrcClient(undefined, api.identity.fingerprintHex, {
|
||||
host: network.host,
|
||||
port: network.port,
|
||||
secure: network.ssl,
|
||||
channels: ["#lumeweb"],
|
||||
});
|
||||
client.addListener("message", function (from, to, message) {
|
||||
const pubkey = b4a.from(message, "hex");
|
||||
if (!b4a.equals(api.identity.publicKeyRaw, pubkey)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const host = api.config.str("domain");
|
||||
const port = api.config.uint("port");
|
||||
const timestamp = Date.now();
|
||||
|
||||
let data = {
|
||||
host,
|
||||
port,
|
||||
timestamp,
|
||||
} as SignedPeerResponse;
|
||||
|
||||
let json = jsonStringify(data);
|
||||
|
||||
data.signature = b4a
|
||||
.from(api.identity.sign(b4a.from(jsonStringify(data))))
|
||||
.toString("hex");
|
||||
|
||||
api.logger.info(api.identity.verify(b4a.from(json), data.signature));
|
||||
|
||||
client.say(from, jsonStringify(data));
|
||||
});
|
||||
client.addListener("error", (message: Message) => {
|
||||
api.logger.error(message);
|
||||
});
|
||||
|
||||
client.connect();
|
||||
|
||||
process.on("SIGTERM", () => {
|
||||
client.end();
|
||||
});
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
export default plugin;
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"module": "esnext",
|
||||
"target": "esnext",
|
||||
"esModuleInterop": true,
|
||||
"outDir": "dist",
|
||||
"moduleResolution": "node"
|
||||
},
|
||||
"include": ["src"],
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
]
|
||||
}
|
Loading…
Reference in New Issue