107 lines
3.2 KiB
JavaScript
107 lines
3.2 KiB
JavaScript
import Post from './post/post.js';
|
|
|
|
let instance;
|
|
|
|
const ERR_UNSUPPORTED = "Unsupported server";
|
|
const ERR_SERVER_RESPONSE = "Unsupported response from the server";
|
|
|
|
export default class Instance {
|
|
#host;
|
|
#token;
|
|
#type;
|
|
#secure;
|
|
|
|
static types = {
|
|
ICESHRIMP: "iceshrimp",
|
|
MASTODON: "mastodon",
|
|
MISSKEY: "misskey",
|
|
AKKOMA: "akkoma",
|
|
};
|
|
|
|
static get_instance() {
|
|
if (!instance) instance = new Instance();
|
|
return instance;
|
|
}
|
|
|
|
static async setup(host, token, secure) {
|
|
instance = Instance.get_instance();
|
|
instance.host = host;
|
|
instance.token = token;
|
|
instance.secure = secure;
|
|
await instance.#guess_type();
|
|
}
|
|
|
|
async #guess_type() {
|
|
const url = instance.#proto + instance.host + "/api/v1/instance";
|
|
console.log("Snooping for instance information at " + url + "...");
|
|
const res = await fetch(url);
|
|
const data = await res.json();
|
|
const version = data.version.toLowerCase();
|
|
|
|
instance.type = Instance.types.MASTODON;
|
|
if (version.search("iceshrimp") !== -1) instance.type = Instance.types.ICESHRIMP;
|
|
if (version.search("misskey") !== -1) instance.type = Instance.types.MISSKEY;
|
|
if (version.search("akkoma") !== -1) instance.type = Instance.types.AKKOMA;
|
|
|
|
console.log("Assumed server type to be \"" + instance.type + "\".");
|
|
}
|
|
|
|
static async get_timeline(last_post_id) {
|
|
let data = null;
|
|
switch (instance.type) {
|
|
case Instance.types.ICESHRIMP:
|
|
data = await instance.#get_timeline_iceshrimp(last_post_id);
|
|
break;
|
|
case Instance.types.MASTODON:
|
|
data = await instance.#get_timeline_mastodon(last_post_id);
|
|
break;
|
|
default:
|
|
console.error(ERR_UNSUPPORTED);
|
|
return null;
|
|
}
|
|
if (data.constructor != Array) {
|
|
console.error(ERR_SERVER_RESPONSE);
|
|
return null;
|
|
}
|
|
let posts = [];
|
|
data.forEach(post_data => {
|
|
const post = Post.parse(post_data);
|
|
if (!post) return;
|
|
posts = [...posts, post];
|
|
});
|
|
return posts;
|
|
}
|
|
|
|
async #get_timeline_iceshrimp(last_post_id) {
|
|
let body = Object;
|
|
if (last_post_id) body.untilId = last_post_id;
|
|
const res = await fetch(this.#proto + this.host + "/api/notes/timeline", {
|
|
method: 'POST',
|
|
headers: { "Authorization": "Bearer " + this.token },
|
|
body: JSON.stringify(body)
|
|
});
|
|
return await res.json();
|
|
}
|
|
|
|
async #get_timeline_mastodon(last_post_id) {
|
|
let url = this.#proto + this.host + "/api/v1/timelines/home";
|
|
if (last_post_id) url += "?max_id=" + last_post_id;
|
|
const res = await fetch(url, {
|
|
method: 'GET',
|
|
headers: { "Authorization": "Bearer " + this.token }
|
|
});
|
|
return await res.json();
|
|
}
|
|
|
|
get #proto() {
|
|
if (this.secure) return "https://";
|
|
return "http://";
|
|
}
|
|
|
|
static get ok() {
|
|
if (!instance) return false;
|
|
if (!instance.host) return false;
|
|
if (!instance.token) return false;
|
|
return true;
|
|
}
|
|
}
|