2022-11-16 01:37:52 +00:00
|
|
|
import axios, { AxiosInstance, ResponseType } from 'axios';
|
2022-11-03 15:04:57 +00:00
|
|
|
import { App, Plugin } from 'vue';
|
|
|
|
|
|
|
|
export class Advent22 {
|
2022-11-16 01:37:52 +00:00
|
|
|
private axios: AxiosInstance;
|
|
|
|
private api_auth = { username: "", password: "" };
|
|
|
|
|
|
|
|
public constructor() {
|
|
|
|
this.axios = axios.create();
|
|
|
|
}
|
|
|
|
|
2022-11-03 15:04:57 +00:00
|
|
|
private get api_baseurl(): string {
|
|
|
|
// in production mode, return "//host/api"
|
|
|
|
if (process.env.NODE_ENV === "production") {
|
|
|
|
return `//${window.location.host}/api`;
|
|
|
|
|
|
|
|
} else if (process.env.NODE_ENV !== "development") {
|
|
|
|
// not in prouction or development mode
|
|
|
|
console.warn("Unexpected NODE_ENV value");
|
|
|
|
}
|
|
|
|
|
|
|
|
// in development mode, return "//hostname:8000/api"
|
|
|
|
return `//${window.location.hostname}:8000/api`;
|
|
|
|
}
|
|
|
|
|
|
|
|
public api_url(endpoint?: string): string {
|
|
|
|
if (endpoint === undefined)
|
2022-11-22 22:27:57 +00:00
|
|
|
return this.api_baseurl;
|
2022-11-03 15:04:57 +00:00
|
|
|
|
2022-12-22 00:15:59 +00:00
|
|
|
while (endpoint.startsWith('/'))
|
|
|
|
endpoint = endpoint.substring(1);
|
|
|
|
|
2022-11-03 15:04:57 +00:00
|
|
|
return `${this.api_baseurl}/${endpoint}`;
|
|
|
|
}
|
2022-11-16 01:37:52 +00:00
|
|
|
|
2022-12-14 02:39:32 +00:00
|
|
|
public set_api_auth(username: string, password: string) {
|
2022-11-16 01:37:52 +00:00
|
|
|
this.api_auth = { username: username, password: password };
|
|
|
|
}
|
|
|
|
|
2023-09-06 18:44:19 +00:00
|
|
|
private fail(name: string, reason: unknown): void {
|
|
|
|
console.warn("Failed to query", name, "-", reason);
|
2022-11-16 01:37:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private api_get<T>(
|
|
|
|
endpoint: string,
|
|
|
|
on_success: (data: T) => void,
|
2023-09-06 18:44:19 +00:00
|
|
|
on_failure: (name: string, reason: unknown) => void,
|
2022-11-16 01:37:52 +00:00
|
|
|
responseType: ResponseType = "json",
|
2023-01-17 14:28:11 +00:00
|
|
|
) {
|
2022-11-16 01:37:52 +00:00
|
|
|
const req_data = {
|
|
|
|
auth: this.api_auth,
|
|
|
|
responseType: responseType,
|
|
|
|
};
|
|
|
|
|
|
|
|
this.axios.get<T>(this.api_url(endpoint), req_data)
|
|
|
|
.then((response) => on_success(response.data))
|
2023-09-06 18:44:19 +00:00
|
|
|
.catch((reason) => on_failure(endpoint, reason));
|
2022-11-16 01:37:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public api_get_blob(
|
|
|
|
endpoint: string,
|
|
|
|
on_success: (data: string) => void,
|
2023-09-06 18:44:19 +00:00
|
|
|
on_failure: (name: string, reason: unknown) => void = this.fail,
|
2023-01-17 14:28:11 +00:00
|
|
|
) {
|
2022-11-16 01:37:52 +00:00
|
|
|
this.api_get<Blob>(
|
|
|
|
endpoint,
|
|
|
|
(data: Blob) => {
|
|
|
|
const reader = new FileReader();
|
|
|
|
reader.readAsDataURL(data);
|
|
|
|
reader.onloadend = () => {
|
|
|
|
if (typeof reader.result === "string")
|
|
|
|
on_success(reader.result);
|
2022-11-22 22:27:57 +00:00
|
|
|
|
|
|
|
else
|
2023-09-06 18:44:19 +00:00
|
|
|
on_failure(endpoint, "failed data url");
|
2022-11-16 01:37:52 +00:00
|
|
|
}
|
|
|
|
},
|
2023-09-06 18:44:19 +00:00
|
|
|
on_failure,
|
2022-11-16 01:37:52 +00:00
|
|
|
"blob",
|
|
|
|
);
|
|
|
|
}
|
2022-12-08 23:21:52 +00:00
|
|
|
|
|
|
|
public api_get_string(
|
|
|
|
endpoint: string,
|
|
|
|
on_success: (data: string) => void,
|
2023-09-06 18:44:19 +00:00
|
|
|
on_failure: (name: string, reason: unknown) => void = this.fail,
|
2023-01-17 14:28:11 +00:00
|
|
|
) {
|
2022-12-08 23:21:52 +00:00
|
|
|
this.api_get<string>(
|
|
|
|
endpoint,
|
|
|
|
(data: string) => {
|
|
|
|
on_success(data);
|
2023-09-06 18:44:19 +00:00
|
|
|
},
|
|
|
|
on_failure,
|
2022-12-08 23:21:52 +00:00
|
|
|
);
|
|
|
|
}
|
2022-12-21 23:48:54 +00:00
|
|
|
|
|
|
|
public api_get_number(
|
|
|
|
endpoint: string,
|
|
|
|
on_success: (data: number) => void,
|
2023-09-06 18:44:19 +00:00
|
|
|
on_failure: (name: string, reason: unknown) => void = this.fail,
|
2023-01-17 14:28:11 +00:00
|
|
|
) {
|
2022-12-21 23:48:54 +00:00
|
|
|
this.api_get<number>(
|
|
|
|
endpoint,
|
|
|
|
(data: number) => {
|
|
|
|
on_success(data);
|
2023-09-06 18:44:19 +00:00
|
|
|
},
|
|
|
|
on_failure,
|
2022-12-21 23:48:54 +00:00
|
|
|
);
|
|
|
|
}
|
2022-11-03 15:04:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export const Advent22Plugin: Plugin = {
|
|
|
|
install(app: App) {
|
|
|
|
app.config.globalProperties.$advent22 = new Advent22();
|
|
|
|
}
|
|
|
|
}
|