From 0cb481360318a4b170e905be5eb8a08874e20a7b Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Wed, 10 Feb 2021 21:15:22 -0700 Subject: [PATCH 1/2] Initial BroadcastProxy work --- src/BroadcastProxyRegistry.js | 55 +++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/BroadcastProxyRegistry.js diff --git a/src/BroadcastProxyRegistry.js b/src/BroadcastProxyRegistry.js new file mode 100644 index 000000000..2995e6860 --- /dev/null +++ b/src/BroadcastProxyRegistry.js @@ -0,0 +1,55 @@ +'use strict'; + +module.exports = class BroadcastProxyRegistry extends Map { + load(requireFn, rootPath, config = {}) { + for (const [name, settings] of Object.entries(config)) { + if (!settings.hasOwnProperty('require')) { + throw new Error(`BroadcastProxyRegistry [${name}] does not specify a 'require'`); + } + + if (typeof settings.require !== 'string') { + throw new TypeError(`BroadcastProxyRegistry [${name}] has an invalid 'require'`); + } + + const sourceConfig = settings.config || {}; + + let proxy; + + // relative path to require + if (settings.require[0] === '.') { + proxy = require(rootPath + '/' + settings.require); + } else if (!settings.require.includes('.')) { + proxy = require(settings.require); + } else { + const [moduleName, exportName] = settings.require.split('.'); + proxy = requireFn(moduleName)[exportName]; + } + + const instance = new proxy(); + + if (typeof instance.configure !== 'function') { + throw new Error(`BroadcastProxyRegistry ${name} requires a 'proxy' method`); + } + + this.set(name, instance); + } + } + + attach(stream) { + const identifier = stream.identifier; + if (!stream.identifier) { + throw new Error("TransportStreams must define a 'identifier' getter."); + } + + const proxyInstance = this.get(identifier); + if (!proxyInstance) { + throw new Error(`No BroadcastProxies are defined for identifier: ${identifier}`); + } + + Object.assign(stream, { + broadcastProxy(target, message, options) { + proxyInstance.proxy(target, message, options); + } + }); + } +}; \ No newline at end of file From 39163c24b8cd89b81e99fcde76cf0abcfee6ed48 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Wed, 10 Feb 2021 21:26:08 -0700 Subject: [PATCH 2/2] Initial Broadcast.js changes --- src/Broadcast.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Broadcast.js b/src/Broadcast.js index e3c5add24..b587b893b 100644 --- a/src/Broadcast.js +++ b/src/Broadcast.js @@ -36,13 +36,21 @@ class Broadcast { } if (target.socket._prompted) { - target.socket.write('\r\n'); + if (target.socket.broadcastProxy) { + target.socket.broadcastProxy(target, '\r\n', { wrapWidth, useColor, formatter }); + } else { + target.socket.write('\r\n'); + } target.socket._prompted = false; } - let targetMessage = formatter(target, message); - targetMessage = wrapWidth ? Broadcast.wrap(targetMessage, wrapWidth) : ansi.parse(targetMessage); - target.socket.write(targetMessage); + if (target.socket.broadcastProxy) { + target.socket.broadcastProxy(target, message, { wrapWidth, useColor, formatter } ); + } else { + let targetMessage = formatter(target, message); + targetMessage = wrapWidth ? Broadcast.wrap(targetMessage, wrapWidth) : ansi.parse(targetMessage); + target.socket.write(targetMessage); + } } }