*Initial version
This commit is contained in:
parent
72787e9cdd
commit
2a881417f2
|
@ -0,0 +1,15 @@
|
|||
diff --git a/src/index.js b/src/index.js
|
||||
index bf4c57f259df2e16761b45e2636db307c89ba419..a23827c73f2da725294298467fc3a07a0e4df34a 100644
|
||||
--- a/src/index.js
|
||||
+++ b/src/index.js
|
||||
@@ -3,8 +3,5 @@
|
||||
* treat as a browser.
|
||||
*/
|
||||
|
||||
-if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {
|
||||
- module.exports = require('./browser.js');
|
||||
-} else {
|
||||
- module.exports = require('./node.js');
|
||||
-}
|
||||
+module.exports = require('./node.js');
|
||||
+
|
|
@ -0,0 +1,29 @@
|
|||
{
|
||||
"name": "@lumeweb/relay-plugin-discovery-bittorrent",
|
||||
"version": "0.1.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"build": "rollup -c rollup.config.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",
|
||||
"object-merger": "^1.0.3",
|
||||
"prettier": "^2.8.1",
|
||||
"rollup": "^3.7.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"@lumeweb/relay-plugin-rollup-preset": "https://git.lumeweb.com/LumeWeb/relay-plugin-rollup-preset.git",
|
||||
"b4a": "^1.6.1",
|
||||
"bittorrent-dht": "^11.0.1",
|
||||
"bittorrent-dht-sodium": "^1.2.0",
|
||||
"sha.js": "^2.4.11"
|
||||
},
|
||||
"resolutions": {
|
||||
"debug@^4.3.4": "patch:debug@npm%3A4.3.4#./.yarn/patches/debug-npm-4.3.4-4513954577.patch",
|
||||
"debug@4": "patch:debug@npm%3A4.3.4#./.yarn/patches/debug-npm-4.3.4-4513954577.patch",
|
||||
"debug@^4.1.0": "patch:debug@npm%3A4.3.4#./.yarn/patches/debug-npm-4.3.4-4513954577.patch",
|
||||
"debug@^4.3.3": "patch:debug@npm%3A4.3.4#./.yarn/patches/debug-npm-4.3.4-4513954577.patch"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"plugins": [
|
||||
"discovery-bittorrent"
|
||||
]
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
import { defineConfig } from "rollup";
|
||||
import preset from "@lumeweb/relay-plugin-rollup-preset";
|
||||
import merger from "object-merger";
|
||||
|
||||
export default defineConfig(
|
||||
merger(preset(), {
|
||||
input: "src/index.ts",
|
||||
output: {
|
||||
file: "dist/discovery-bittorrent.js",
|
||||
format: "cjs",
|
||||
},
|
||||
})
|
||||
);
|
|
@ -0,0 +1,85 @@
|
|||
import type { Plugin, PluginAPI } from "@lumeweb/relay-types";
|
||||
import DHT from "bittorrent-dht";
|
||||
import eddsa from "bittorrent-dht-sodium";
|
||||
import type { Peer } from "@lumeweb/peer-discovery";
|
||||
import b4a from "b4a";
|
||||
import sha from "sha.js";
|
||||
|
||||
async function get(dht: DHT, api: PluginAPI) {
|
||||
return new Promise((resolve, reject) => {
|
||||
dht.get(getHash(api.identity.publicKeyRaw), (err, res) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
|
||||
resolve(res);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function put(dht: DHT, api: PluginAPI) {
|
||||
let existing;
|
||||
let seq = 1;
|
||||
|
||||
try {
|
||||
existing = await get(dht, api);
|
||||
seq = existing.seq;
|
||||
} catch (e) {
|
||||
api.logger.debug(e);
|
||||
}
|
||||
|
||||
let data = getData(api);
|
||||
|
||||
if (existing) {
|
||||
let existingData = JSON.parse(existing.v.toString());
|
||||
if (data.host !== existingData.host || data.port !== existingData.port) {
|
||||
seq++;
|
||||
}
|
||||
}
|
||||
|
||||
dht.put(
|
||||
{
|
||||
k: api.identity.publicKeyRaw,
|
||||
seq,
|
||||
v: getDataEncoded(api),
|
||||
sign: function (buf) {
|
||||
let key = b4a.alloc(64);
|
||||
b4a.copy(api.identity.privateKey, key);
|
||||
b4a.copy(api.identity.publicKeyRaw, key, 32);
|
||||
return eddsa.sign(buf, key);
|
||||
},
|
||||
},
|
||||
function (err) {
|
||||
if (err) {
|
||||
api.logger.error(err);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
function getData(api: PluginAPI): Peer {
|
||||
return {
|
||||
host: api.config.str("domain"),
|
||||
port: api.config.uint("port"),
|
||||
};
|
||||
}
|
||||
function getDataEncoded(api: PluginAPI): Buffer {
|
||||
return b4a.from(JSON.stringify(getData(api))) as Buffer;
|
||||
}
|
||||
|
||||
function getHash(pubkey): string {
|
||||
return sha("sha1").update(pubkey).digest();
|
||||
}
|
||||
|
||||
const plugin: Plugin = {
|
||||
name: "discovery-bittorrent",
|
||||
async plugin(api: PluginAPI): Promise<void> {
|
||||
debugger;
|
||||
const dht = new DHT({ verify: eddsa.verify });
|
||||
await put(dht, api);
|
||||
|
||||
setTimeout(() => put(dht, api), 1000 * 60 * 60);
|
||||
},
|
||||
};
|
||||
|
||||
export default plugin;
|
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"module": "esnext",
|
||||
"target": "esnext",
|
||||
"esModuleInterop": true,
|
||||
"outDir": "dist",
|
||||
"declaration": true,
|
||||
"moduleResolution": "node"
|
||||
},
|
||||
"include": ["src"],
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
]
|
||||
}
|
Loading…
Reference in New Issue