135 lines
4.2 KiB
JavaScript
135 lines
4.2 KiB
JavaScript
'use strict';
|
|
|
|
const FormData = require('form-data');
|
|
const { requestStream } = require('./http-client');
|
|
|
|
function collaboraBase(config) {
|
|
return (config.collaboraUrl || '').replace(/\/$/, '');
|
|
}
|
|
|
|
function tlsOptions(config) {
|
|
return config.verifyTls !== false && config.verifyTls !== 'false';
|
|
}
|
|
|
|
function buildMultipart(fields) {
|
|
const form = new FormData();
|
|
for (const field of fields) {
|
|
if (field.buffer) {
|
|
form.append(field.name, field.buffer, {
|
|
filename: field.filename || 'document.bin',
|
|
contentType: field.contentType || 'application/octet-stream'
|
|
});
|
|
} else if (field.value !== undefined) {
|
|
form.append(field.name, String(field.value));
|
|
}
|
|
}
|
|
return form;
|
|
}
|
|
|
|
async function postMultipart(config, endpoint, fields) {
|
|
const form = buildMultipart(fields);
|
|
const url = `${collaboraBase(config)}${endpoint}`;
|
|
|
|
const res = await requestStream(
|
|
{
|
|
url,
|
|
method: 'POST',
|
|
headers: form.getHeaders(),
|
|
rejectUnauthorized: tlsOptions(config)
|
|
},
|
|
(req) => form.pipe(req)
|
|
);
|
|
|
|
if (res.statusCode < 200 || res.statusCode >= 300) {
|
|
const snippet = res.body.toString('utf8').slice(0, 300);
|
|
throw new Error(`Collabora ${endpoint} misslyckades (${res.statusCode}): ${snippet}`);
|
|
}
|
|
|
|
if (!res.body || res.body.length === 0) {
|
|
throw new Error(`Collabora ${endpoint} returnerade tomt svar — kontrollera intern URL och post_allow`);
|
|
}
|
|
|
|
return {
|
|
buffer: res.body,
|
|
contentType: res.headers['content-type'],
|
|
statusCode: res.statusCode
|
|
};
|
|
}
|
|
|
|
async function convertTo(config, { buffer, filename, format, extraFields = [] }) {
|
|
const fmt = String(format || 'pdf').toLowerCase();
|
|
const fields = [
|
|
{ name: 'data', buffer, filename: filename || 'document.bin' },
|
|
...extraFields
|
|
];
|
|
|
|
try {
|
|
return await postMultipart(config, `/cool/convert-to/${fmt}`, fields);
|
|
} catch (err) {
|
|
fields.push({ name: 'format', value: fmt });
|
|
return postMultipart(config, '/cool/convert-to', fields);
|
|
}
|
|
}
|
|
|
|
async function extractStructure(config, { buffer, filename, filter }) {
|
|
const fields = [{ name: 'data', buffer, filename: filename || 'document.bin' }];
|
|
if (filter) {
|
|
fields.push({ name: 'filter', value: typeof filter === 'string' ? filter : JSON.stringify(filter) });
|
|
}
|
|
const res = await postMultipart(config, '/cool/extract-document-structure', fields);
|
|
try {
|
|
return JSON.parse(res.buffer.toString('utf8'));
|
|
} catch {
|
|
return { raw: res.buffer.toString('utf8') };
|
|
}
|
|
}
|
|
|
|
async function transformStructure(config, { buffer, filename, transform }) {
|
|
const fields = [
|
|
{ name: 'data', buffer, filename: filename || 'document.bin' },
|
|
{ name: 'transform', value: typeof transform === 'string' ? transform : JSON.stringify(transform) }
|
|
];
|
|
const res = await postMultipart(config, '/cool/transform-document-structure', fields);
|
|
return {
|
|
buffer: res.buffer,
|
|
contentType: res.contentType
|
|
};
|
|
}
|
|
|
|
async function getCapabilities(config) {
|
|
const url = `${collaboraBase(config)}/hosting/capabilities`;
|
|
const { requestBuffer } = require('./http-client');
|
|
const res = await requestBuffer({
|
|
url,
|
|
method: 'GET',
|
|
rejectUnauthorized: tlsOptions(config)
|
|
});
|
|
if (res.statusCode < 200 || res.statusCode >= 300) {
|
|
throw new Error(`Capabilities misslyckades (${res.statusCode})`);
|
|
}
|
|
return JSON.parse(res.body.toString('utf8'));
|
|
}
|
|
|
|
async function getDiscovery(config) {
|
|
const url = `${collaboraBase(config)}/hosting/discovery`;
|
|
const { requestBuffer } = require('./http-client');
|
|
const res = await requestBuffer({
|
|
url,
|
|
method: 'GET',
|
|
rejectUnauthorized: tlsOptions(config)
|
|
});
|
|
if (res.statusCode < 200 || res.statusCode >= 300) {
|
|
throw new Error(`Discovery misslyckades (${res.statusCode})`);
|
|
}
|
|
return res.body.toString('utf8');
|
|
}
|
|
|
|
module.exports = {
|
|
convertTo,
|
|
extractStructure,
|
|
transformStructure,
|
|
getCapabilities,
|
|
getDiscovery,
|
|
postMultipart
|
|
};
|