UNPKG

@cliz/cp

Version:

Online pbcopy + pbpaste

62 lines (61 loc) 2.55 kB
"use strict"; 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;