forked from blisstown/campfire
federating my verse (iceshrimp & mastodon API compat, read-only)
This commit is contained in:
parent
8dc8190cdf
commit
da93978820
67 changed files with 2743 additions and 649 deletions
107
src/instance.js
Normal file
107
src/instance.js
Normal file
|
@ -0,0 +1,107 @@
|
|||
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;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue