@fnlb-project/stanza
Version:
Modern XMPP in the browser, with a JSON API
68 lines (67 loc) • 2.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = default_1;
const tslib_1 = require("tslib");
const JID = tslib_1.__importStar(require("../JID"));
const Namespaces_1 = require("../Namespaces");
function default_1(client) {
client.disco.addFeature(Namespaces_1.NS_BOB);
client.getBits = async (jid, cid) => {
const result = await client.sendIQ({
bits: {
cid
},
to: jid,
type: 'get'
});
return result.bits;
};
async function getUploadParameters(jid) {
const disco = await client.getDiscoInfo(jid);
if (!disco.features || !disco.features.includes(Namespaces_1.NS_HTTP_UPLOAD_0)) {
return;
}
let maxSize;
for (const form of disco.extensions || []) {
const fields = form.fields || [];
if (fields.some(field => field.name === 'FORM_TYPE' && field.value === Namespaces_1.NS_HTTP_UPLOAD_0)) {
const sizeField = fields.find(field => field.name === 'max-file-size');
if (sizeField) {
maxSize = parseInt(sizeField.value, 10);
}
return {
jid,
maxSize
};
}
}
}
client.getUploadService = async (domain = JID.getDomain(client.jid)) => {
const domainParameters = await getUploadParameters(domain);
if (domainParameters) {
return domainParameters;
}
const disco = await client.getDiscoItems(domain);
for (const item of disco.items || []) {
if (!item.jid) {
continue;
}
const itemParameters = await getUploadParameters(item.jid);
if (itemParameters) {
return itemParameters;
}
}
throw new Error('No upload service discovered on: ' + domain);
};
client.getUploadSlot = async (uploadService, uploadRequest) => {
const resp = await client.sendIQ({
httpUpload: {
type: 'request',
...uploadRequest
},
to: uploadService,
type: 'get'
});
return resp.httpUpload;
};
}