'use strict'; const { getConfig, setError, setSuccess, clearStatus } = require('../lib/utils'); const { getCapabilities, getDiscovery } = require('../lib/collabora'); const { requestBuffer } = require('../lib/http-client'); module.exports = function (RED) { function CollaboraWopiNode(config) { RED.nodes.createNode(this, config); const node = this; node.configNode = RED.nodes.getNode(config.config); node.operation = config.operation || 'capabilities'; node.on('input', async (msg, send, done) => { send = send || function () { node.send.apply(node, arguments); }; done = done || function (err) { if (err) { node.error(err, msg); } }; clearStatus(node); try { const cfg = getConfig(node); const op = msg.operation || node.operation; if (op === 'capabilities') { msg.payload = await getCapabilities(cfg); } else if (op === 'discovery') { msg.payload = await getDiscovery(cfg); } else if (op === 'buildEditor') { const publicBase = cfg.collaboraPublicUrl || cfg.collaboraUrl; const wopiSrc = encodeURIComponent(msg.wopiSrc || msg.WOPISrc || ''); const token = encodeURIComponent(msg.token || msg.access_token || ''); if (!wopiSrc || !token) { throw new Error('buildEditor kräver msg.wopiSrc och msg.token'); } msg.editorUrl = `${publicBase}/browser/dist/cool.html?WOPISrc=${wopiSrc}&access_token=${token}`; msg.payload = { editorUrl: msg.editorUrl }; } else if (op === 'checkFileInfo' || op === 'getFile') { const wopiUrl = msg.wopiUrl; if (!wopiUrl) { throw new Error(`${op} kräver msg.wopiUrl (felsökning)`); } const token = msg.token || msg.access_token || ''; const res = await requestBuffer({ url: wopiUrl, method: 'GET', headers: { Authorization: `Bearer ${token}`, 'X-WOPI-Override': op === 'getFile' ? 'GET' : undefined }, rejectUnauthorized: cfg.verifyTls !== false }); msg.statusCode = res.statusCode; msg.payload = op === 'getFile' ? res.body : JSON.parse(res.body.toString('utf8')); } else { throw new Error(`Okänd wopi-operation: ${op}`); } setSuccess(node, msg, op); send(msg); done(); } catch (err) { setError(node, msg, err); send(msg); done(err); } }); } RED.nodes.registerType('collabora-wopi', CollaboraWopiNode); };