1
0
Fork 0
mirror of https://github.com/binwiederhier/ntfy.git synced 2024-11-26 05:09:16 +01:00
ntfy/web/src/app/Api.js

103 lines
3.5 KiB
JavaScript
Raw Normal View History

import {
2022-04-01 14:41:45 +02:00
basicAuth,
encodeBase64,
fetchLinesIterator,
maybeWithBasicAuth,
topicShortUrl,
topicUrl,
topicUrlAuth,
topicUrlJsonPoll,
topicUrlJsonPollWithSince
} from "./utils";
import userManager from "./UserManager";
2022-02-23 05:22:30 +01:00
class Api {
async poll(baseUrl, topic, since) {
const user = await userManager.get(baseUrl);
const shortUrl = topicShortUrl(baseUrl, topic);
2022-02-28 01:29:17 +01:00
const url = (since)
? topicUrlJsonPollWithSince(baseUrl, topic, since)
: topicUrlJsonPoll(baseUrl, topic);
2022-02-23 05:22:30 +01:00
const messages = [];
const headers = maybeWithBasicAuth({}, user);
2022-02-23 05:22:30 +01:00
console.log(`[Api] Polling ${url}`);
for await (let line of fetchLinesIterator(url, headers)) {
console.log(`[Api, ${shortUrl}] Received message ${line}`);
2022-02-23 05:22:30 +01:00
messages.push(JSON.parse(line));
}
2022-02-24 20:53:45 +01:00
return messages;
2022-02-23 05:22:30 +01:00
}
async publish(baseUrl, topic, message, options) {
const user = await userManager.get(baseUrl);
console.log(`[Api] Publishing message to ${topicUrl(baseUrl, topic)}`);
2022-03-11 04:58:24 +01:00
const headers = {};
const body = {
topic: topic,
message: message,
...options
};
await fetch(baseUrl, {
2022-02-23 05:22:30 +01:00
method: 'PUT',
body: JSON.stringify(body),
2022-03-11 04:58:24 +01:00
headers: maybeWithBasicAuth(headers, user)
2022-02-23 05:22:30 +01:00
});
}
2022-02-25 19:40:03 +01:00
2022-04-01 14:41:45 +02:00
publishXHR(baseUrl, topic, body, headers, onProgress) {
const url = topicUrl(baseUrl, topic);
const xhr = new XMLHttpRequest();
console.log(`[Api] Publishing message to ${url}`);
const send = new Promise(function (resolve, reject) {
xhr.open("PUT", url);
xhr.addEventListener('readystatechange', (ev) => {
if (xhr.readyState === 4 && xhr.status >= 200 && xhr.status <= 299) {
console.log(`[Api] Publish successful`, ev);
resolve(xhr.response);
} else if (xhr.readyState === 4) {
console.log(`[Api] Publish failed (1)`, ev);
xhr.abort();
reject(ev);
}
})
xhr.onerror = (ev) => {
console.log(`[Api] Publish failed (2)`, ev);
reject(ev);
};
xhr.upload.addEventListener("progress", onProgress);
if (body.type) {
xhr.overrideMimeType(body.type);
}
for (const [key, value] of Object.entries(headers)) {
xhr.setRequestHeader(key, value);
}
xhr.send(body);
});
send.abort = () => {
console.log(`[Api] Publish aborted by user`);
xhr.abort();
}
return send;
}
2022-02-25 19:40:03 +01:00
async auth(baseUrl, topic, user) {
const url = topicUrlAuth(baseUrl, topic);
console.log(`[Api] Checking auth for ${url}`);
const response = await fetch(url, {
headers: maybeWithBasicAuth({}, user)
});
2022-02-25 19:40:03 +01:00
if (response.status >= 200 && response.status <= 299) {
return true;
} else if (!user && response.status === 404) {
return true; // Special case: Anonymous login to old servers return 404 since /<topic>/auth doesn't exist
} else if (response.status === 401 || response.status === 403) { // See server/server.go
return false;
}
throw new Error(`Unexpected server response ${response.status}`);
}
2022-02-23 05:22:30 +01:00
}
const api = new Api();
export default api;