Compare commits
6 Commits
v0.1.0-dev
...
v0.1.0-dev
Author | SHA1 | Date |
---|---|---|
semantic-release-bot | 384ef16e22 | |
Derrick Hammer | d675a44b4e | |
Derrick Hammer | 8bcb788286 | |
Derrick Hammer | d1e1ce624d | |
Derrick Hammer | 2eef5099c8 | |
Derrick Hammer | 9882489bd9 |
12
CHANGELOG.md
12
CHANGELOG.md
|
@ -1,3 +1,15 @@
|
|||
# [0.1.0-develop.4](https://git.lumeweb.com/LumeWeb/kernel-handshake-node/compare/v0.1.0-develop.3...v0.1.0-develop.4) (2023-08-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* use removeListener ([2eef509](https://git.lumeweb.com/LumeWeb/kernel-handshake-node/commit/2eef5099c8277624e88b9a310aed14adf78e4b3f))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add dns query api that uses mock sockets and a dedicated hyper proxy for DNS (port 53) requests ([d675a44](https://git.lumeweb.com/LumeWeb/kernel-handshake-node/commit/d675a44b4e77a1c0aa2210f5bea3d538476f63ac))
|
||||
|
||||
# [0.1.0-develop.3](https://git.lumeweb.com/LumeWeb/kernel-handshake-node/compare/v0.1.0-develop.2...v0.1.0-develop.3) (2023-07-29)
|
||||
|
||||
|
||||
|
|
|
@ -1,26 +1,28 @@
|
|||
{
|
||||
"name": "@lumeweb/kernel-handshake-node",
|
||||
"version": "0.1.0-develop.3",
|
||||
"version": "0.1.0-develop.4",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@lumeweb/kernel-handshake-node",
|
||||
"version": "0.1.0-develop.3",
|
||||
"version": "0.1.0-develop.4",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"@i2labs/dns": "^1.0.1",
|
||||
"@lumeweb/kernel-network-registry-client": "^0.1.0-develop.5",
|
||||
"@lumeweb/kernel-protomux-client": "^0.0.2-develop.15",
|
||||
"@lumeweb/kernel-swarm-client": "^0.1.0-develop.5",
|
||||
"@lumeweb/libhyperproxy": "^0.0.2-develop.2",
|
||||
"@lumeweb/libhyperproxy": "^0.0.2-develop.4",
|
||||
"@lumeweb/libkernel": "^0.1.0-develop.31",
|
||||
"assert": "^2.0.0",
|
||||
"hsd": "^5.0.1",
|
||||
"p-defer": "^4.0.0"
|
||||
"p-defer": "^4.0.0",
|
||||
"streamx": "^2.15.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@lumeweb/presetter-kernel-module-preset": "^0.1.0-develop.43",
|
||||
"@lumeweb/presetter-kernel-module-preset": "^0.1.0-develop.44",
|
||||
"@types/streamx": "^2.9.1",
|
||||
"patch-package": "^7.0.0",
|
||||
"presetter": "*",
|
||||
"timers-browserify": "^2.0.12",
|
||||
|
@ -1726,9 +1728,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@lumeweb/libhyperproxy": {
|
||||
"version": "0.0.2-develop.2",
|
||||
"resolved": "https://registry.npmjs.org/@lumeweb/libhyperproxy/-/libhyperproxy-0.0.2-develop.2.tgz",
|
||||
"integrity": "sha512-3OjOzvxddYJn4i9XYgSHn0PWqm5z0eYW54cMOytuDyeDVs7MYc2EZh2XavUbWLDbtb8hN+lmrSoYJtG8/H7pOg==",
|
||||
"version": "0.0.2-develop.4",
|
||||
"resolved": "https://registry.npmjs.org/@lumeweb/libhyperproxy/-/libhyperproxy-0.0.2-develop.4.tgz",
|
||||
"integrity": "sha512-OW8uuIAwnjlM6yCSlXdgRDewOMsvjvMfrM4gsrMIJiz2FfqyO3lH2S/pQM6ThalP5g09tMV9w3Tlp39oKYszZw==",
|
||||
"dependencies": {
|
||||
"binconv": "^0.2.0",
|
||||
"compact-encoding": "^2.12.0",
|
||||
|
@ -1817,9 +1819,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@lumeweb/presetter-kernel-module-preset": {
|
||||
"version": "0.1.0-develop.43",
|
||||
"resolved": "https://registry.npmjs.org/@lumeweb/presetter-kernel-module-preset/-/presetter-kernel-module-preset-0.1.0-develop.43.tgz",
|
||||
"integrity": "sha512-cRbE+P1R+qc2nUZZRjRcNuqab9bf8cecMp2QGAiqc/OM3C8VsSRatquB77wO+3VyyYNLbo71SBQ2TIxx1q6Mow==",
|
||||
"version": "0.1.0-develop.44",
|
||||
"resolved": "https://registry.npmjs.org/@lumeweb/presetter-kernel-module-preset/-/presetter-kernel-module-preset-0.1.0-develop.44.tgz",
|
||||
"integrity": "sha512-e5vMyTQW/gS93mt9qWqvJTcRYS0Dhi+PdpZR3FMO8y7CEp6f56dwKGz60EXOQOQVBDUqDuipf2KXRDnf0/gjDw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@lumeweb/node-library-preset": "0.2.7",
|
||||
|
@ -3343,8 +3345,7 @@
|
|||
"node_modules/@types/node": {
|
||||
"version": "20.3.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.3.tgz",
|
||||
"integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==",
|
||||
"peer": true
|
||||
"integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw=="
|
||||
},
|
||||
"node_modules/@types/normalize-package-data": {
|
||||
"version": "2.4.1",
|
||||
|
@ -3369,6 +3370,15 @@
|
|||
"integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/@types/streamx": {
|
||||
"version": "2.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/streamx/-/streamx-2.9.1.tgz",
|
||||
"integrity": "sha512-9bywzhouyedmci7WCIPFwJ8zASDnxt2gaVUy52X0p0Tt085IJSAEP0L6j4SSNeDMSLzpYu6cPz0GrJZ7kPJ6Bg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/strip-bom": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz",
|
||||
|
|
10
package.json
10
package.json
|
@ -10,7 +10,7 @@
|
|||
"email": "contact@lumeweb.com"
|
||||
},
|
||||
"type": "module",
|
||||
"version": "0.1.0-develop.3",
|
||||
"version": "0.1.0-develop.4",
|
||||
"readme": "ERROR: No README data found!",
|
||||
"scripts": {
|
||||
"prepare": "presetter bootstrap",
|
||||
|
@ -19,7 +19,8 @@
|
|||
"postinstall": "patch-package"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@lumeweb/presetter-kernel-module-preset": "^0.1.0-develop.43",
|
||||
"@lumeweb/presetter-kernel-module-preset": "^0.1.0-develop.44",
|
||||
"@types/streamx": "^2.9.1",
|
||||
"patch-package": "^7.0.0",
|
||||
"presetter": "*",
|
||||
"timers-browserify": "^2.0.12",
|
||||
|
@ -30,10 +31,11 @@
|
|||
"@lumeweb/kernel-network-registry-client": "^0.1.0-develop.5",
|
||||
"@lumeweb/kernel-protomux-client": "^0.0.2-develop.15",
|
||||
"@lumeweb/kernel-swarm-client": "^0.1.0-develop.5",
|
||||
"@lumeweb/libhyperproxy": "^0.0.2-develop.2",
|
||||
"@lumeweb/libhyperproxy": "^0.0.2-develop.4",
|
||||
"@lumeweb/libkernel": "^0.1.0-develop.31",
|
||||
"assert": "^2.0.0",
|
||||
"hsd": "^5.0.1",
|
||||
"p-defer": "^4.0.0"
|
||||
"p-defer": "^4.0.0",
|
||||
"streamx": "^2.15.0"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,132 @@
|
|||
import { Client as Base, TCPSocket } from "bns/lib/internal/net.js";
|
||||
import IP from "binet";
|
||||
import { Duplex } from "streamx";
|
||||
import { MultiSocketProxy } from "@lumeweb/libhyperproxy";
|
||||
import defer from "p-defer";
|
||||
|
||||
class Stream extends Duplex {
|
||||
public remoteAddress = "127.0.0.1";
|
||||
public family = "IPv4";
|
||||
public port = 0;
|
||||
public remotePort = 0;
|
||||
public parent: any;
|
||||
|
||||
constructor(options) {
|
||||
super(options);
|
||||
this.parent = options.parent;
|
||||
}
|
||||
|
||||
setNoDelay() {}
|
||||
|
||||
connect() {
|
||||
setTimeout(() => {
|
||||
// @ts-ignore
|
||||
this.emit("connect");
|
||||
}, 1);
|
||||
}
|
||||
|
||||
unref() {}
|
||||
}
|
||||
|
||||
const PROTOCOL = "lumeweb.proxy.handshake.dns";
|
||||
|
||||
export default class TCPClient extends Base {
|
||||
private node: any;
|
||||
private proxy: MultiSocketProxy;
|
||||
private peerConnected = defer();
|
||||
|
||||
constructor(options) {
|
||||
super(options);
|
||||
|
||||
this.node = options.node;
|
||||
this.proxy = new MultiSocketProxy({
|
||||
protocol: PROTOCOL,
|
||||
swarm: options.swarm,
|
||||
server: false,
|
||||
autostart: true,
|
||||
listen: true,
|
||||
});
|
||||
|
||||
this.proxy.on("peerChannelOpen", () => {
|
||||
this.peerConnected.resolve();
|
||||
});
|
||||
}
|
||||
|
||||
protected declare sockets: Map<any, any>;
|
||||
|
||||
async write(msg, port, host) {
|
||||
const local = host === "127.0.0.1";
|
||||
const key = IP.toHost(host, port);
|
||||
const cache = this.sockets.get(key);
|
||||
|
||||
if (cache) {
|
||||
cache.write(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
let socket: any = null;
|
||||
|
||||
try {
|
||||
if (local) {
|
||||
socket = await this.createLocalSocket();
|
||||
} else {
|
||||
await this.peerConnected.promise;
|
||||
socket = new TCPSocket(this);
|
||||
socket.socket = this.proxy.createSocket({
|
||||
host,
|
||||
port,
|
||||
});
|
||||
socket.socket.remoteAddress = host;
|
||||
socket.socket.remotePort = port;
|
||||
|
||||
await socket.connect();
|
||||
}
|
||||
} catch (e) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.sockets.has(key)) {
|
||||
socket.destroy();
|
||||
socket = this.sockets.get(key);
|
||||
} else {
|
||||
socket.parent = this;
|
||||
this.sockets.set(key, socket);
|
||||
}
|
||||
|
||||
socket.write(msg);
|
||||
}
|
||||
|
||||
async createLocalSocket() {
|
||||
const socket = new TCPSocket(this);
|
||||
const remoteSocket = new Stream({
|
||||
parent: this,
|
||||
write: (data, cb) => {
|
||||
// @ts-ignore
|
||||
socket.socket.push(data);
|
||||
cb?.(null);
|
||||
},
|
||||
});
|
||||
// @ts-ignore
|
||||
socket.socket = new Stream({
|
||||
parent: this,
|
||||
write: (data, cb) => {
|
||||
// @ts-ignore
|
||||
remoteSocket.push(data);
|
||||
cb?.(null);
|
||||
},
|
||||
});
|
||||
const port = this.node.rs.hns.getAuthority().servers.slice().pop().port;
|
||||
remoteSocket.port = port;
|
||||
remoteSocket.remotePort = port;
|
||||
// @ts-ignore
|
||||
socket.socket.port = port;
|
||||
// @ts-ignore
|
||||
socket.socket.remotePort = port;
|
||||
|
||||
await socket.connect();
|
||||
|
||||
this.node.ns.server.server.emit("connection", remoteSocket);
|
||||
|
||||
return socket;
|
||||
}
|
||||
}
|
37
src/index.ts
37
src/index.ts
|
@ -12,6 +12,8 @@ import { SPVNode } from "hsd/lib/node";
|
|||
import defer from "p-defer";
|
||||
import dns from "@i2labs/dns";
|
||||
import assert from "assert";
|
||||
import { wire } from "bns";
|
||||
import TCPClient from "./dns/tcpClient.js";
|
||||
|
||||
const PROTOCOL = "lumeweb.proxy.handshake";
|
||||
const TYPES = ["blockchain"];
|
||||
|
@ -29,6 +31,7 @@ addHandler("status", handleStatus, { receiveUpdates: true });
|
|||
addHandler("name", handleName);
|
||||
addHandler("ready", handleReady);
|
||||
addHandler("query", handleQuery);
|
||||
addHandler("dnsQuery", handleDnsQuery);
|
||||
|
||||
let swarm;
|
||||
let proxy: MultiSocketProxy;
|
||||
|
@ -75,7 +78,6 @@ async function handlePresentKey(aq: ActiveQuery) {
|
|||
config: false,
|
||||
argv: false,
|
||||
env: false,
|
||||
noDns: true,
|
||||
memory: false,
|
||||
logFile: false,
|
||||
logConsole: true,
|
||||
|
@ -143,6 +145,10 @@ async function handlePresentKey(aq: ActiveQuery) {
|
|||
node.http.http.listen = (port: number, host: string, cb: Function) => cb();
|
||||
}
|
||||
|
||||
node.rs.hns.forceTCP = true;
|
||||
node.rs.hns.socket = new TCPClient({ node, swarm });
|
||||
node.rs.hns.init();
|
||||
|
||||
proxy = new MultiSocketProxy({
|
||||
protocol: PROTOCOL,
|
||||
swarm,
|
||||
|
@ -196,6 +202,33 @@ async function handleQuery(aq: ActiveQuery) {
|
|||
}
|
||||
}
|
||||
|
||||
async function handleDnsQuery(aq: ActiveQuery) {
|
||||
if (!node.chain.synced || !node.pool.peers.head()) {
|
||||
aq.reject("not ready");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!("fqdn" in aq.callerInput)) {
|
||||
aq.reject("fqdn required");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!("type" in aq.callerInput)) {
|
||||
aq.reject("type required");
|
||||
return;
|
||||
}
|
||||
|
||||
const msg = new wire.Message();
|
||||
const q = new wire.Question(aq.callerInput.fqdn, aq.callerInput.type);
|
||||
msg.question.push(q);
|
||||
|
||||
const ret = await node.rs.answer(msg);
|
||||
|
||||
aq.respond(
|
||||
ret.collect(aq.callerInput.fqdn, wire.stringToType(aq.callerInput.type)),
|
||||
);
|
||||
}
|
||||
|
||||
async function handleRegister(aq: ActiveQuery) {
|
||||
await networkRegistry.registerNetwork(TYPES);
|
||||
|
||||
|
@ -228,7 +261,7 @@ async function handleStatus(aq: ActiveQuery) {
|
|||
}
|
||||
|
||||
aq.setReceiveUpdate?.(() => {
|
||||
node.chain.off("tip", chainProgressListener);
|
||||
node.chain.removeListener("tip", chainProgressListener);
|
||||
node.pool.off("peer", peersListener);
|
||||
node.pool.off("peer close", peersListener);
|
||||
aq.respond();
|
||||
|
|
Loading…
Reference in New Issue