@cliz/cp
Version:
Online pbcopy + pbpaste
62 lines (61 loc) • 2.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.relay = void 0;
const doreamon_1 = require("@zodash/doreamon");
const WebSocket = require("@znode/websocket");
async function relay(options) {
const logger = doreamon_1.default.logger.getLogger('relay');
const path = (options === null || options === void 0 ? void 0 : options.path) || '/';
const port = +(options === null || options === void 0 ? void 0 : options.port) || 8080;
const app = new WebSocket.Server({
path,
});
const codeSenderMap = new Map();
const idReceiverMap = new Map();
app.on('connection', (_client) => {
const client = _client;
logger.log('client connect:', client.id);
client.on('close', () => {
if (client.isSender) {
codeSenderMap.delete(client.code);
}
else if (client.isReceiver) {
idReceiverMap.delete(client.id);
}
});
client.on('wait.receiver.request', ({ code }) => {
client.isSender = true;
client.code = code;
codeSenderMap.set(code, client);
});
client.on('request.sender.to.paste', ({ code }) => {
client.isReceiver = true;
const receiver = client.id;
logger.log('[receiver] request.sender.to.paste', receiver, code);
if (!codeSenderMap.has(code)) {
return client.emit('paste.failed', { message: `code(${code}) is invalid` });
}
idReceiverMap.set(client.id, client);
const sender = codeSenderMap.get(code);
sender.emit('paste', { receiver });
});
client.on('sender.paste.to.receiver', ({ receiver: receiverId, signature, payload }) => {
logger.log('[sender] sender.paste.to.receiver', receiverId);
if (!idReceiverMap.has(receiverId)) {
return client.emit('error', new Error('invalid receiver'));
}
const receiver = idReceiverMap.get(receiverId);
receiver.emit('paste', { signature, payload });
});
client.on('paste.done', ({ code }) => {
const receiver = client.id;
const sender = codeSenderMap.get(code);
logger.log('[receiver] paste.done', receiver);
sender.emit('paste.done', { receiver });
});
});
app.listen(port, '0.0.0.0', () => {
logger.info(`server start at: http://127.0.0.1:${port}`);
});
}
exports.relay = relay;