libhyperproxy/dist/peer.js

78 lines
2.6 KiB
JavaScript

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const socket_js_1 = __importDefault(require("./socket.js"));
const buffer_1 = require("buffer");
class Peer {
_proxy;
_peer;
_muxer;
_socket;
_onopen;
_onreceive;
_onsend;
_onclose;
_emulateWebsocket;
_channel;
constructor({ proxy, peer, muxer, onopen, onreceive, onsend, onclose, emulateWebsocket = false, }) {
this._proxy = proxy;
this._peer = peer;
this._muxer = muxer;
this._onopen = onopen?.bind(this);
this._onreceive = onreceive?.bind(this);
this._onsend = onsend?.bind(this);
this._onclose = onclose?.bind(this);
this._emulateWebsocket = emulateWebsocket;
}
async init() {
const write = async (data, cb) => {
pipe.send(data);
await this._onsend?.(data);
cb();
};
const self = this;
this._channel = this._muxer.createChannel({
protocol: this._proxy.protocol,
async onopen(m) {
if (!m) {
m = buffer_1.Buffer.from([]);
}
if (m instanceof Uint8Array) {
m = buffer_1.Buffer.from(m);
}
self._socket = new socket_js_1.default({
remoteAddress: self._peer.rawStream.remoteHost,
remotePort: self._peer.rawStream.remotePort,
remotePublicKey: self._peer.remotePublicKey,
write,
emulateWebsocket: self._emulateWebsocket,
});
self._socket.on("end", () => this._channel.close());
let ret = await self._onopen?.(self._socket, m);
if (!ret || (ret && ret.connect === false)) {
// @ts-ignore
self._socket.emit("connect");
}
self._socket.emit("data", m);
},
async onclose() {
self._socket?.destroy();
await self._onclose?.(self._socket);
},
});
const pipe = this._channel.addMessage({
async onmessage(m) {
if (m instanceof Uint8Array) {
m = buffer_1.Buffer.from(m);
}
self._socket.emit("data", m);
await self._onreceive?.(m);
},
});
await this._channel.open();
}
}
exports.default = Peer;