mirror of
https://github.com/Drop-OSS/drop.git
synced 2026-01-31 15:37:09 +01:00
* feat: nginx + torrential basics & services system * fix: lint + i18n * fix: update torrential to remove openssl * feat: add torrential to Docker build * feat: move to self hosted runner * fix: move off self-hosted runner * fix: update nginx.conf * feat: torrential cache invalidation * fix: update torrential for cache invalidation * feat: integrity check task * fix: lint * feat: move to version ids * fix: client fixes and client-side checks * feat: new depot apis and version id fixes * feat: update torrential * feat: droplet bump and remove unsafe update functions * fix: lint * feat: v4 featureset: emulators, multi-launch commands * fix: lint * fix: mobile ui for game editor * feat: launch options * fix: lint * fix: remove axios, use $fetch * feat: metadata and task api improvements * feat: task actions * fix: slight styling issue * feat: fix style and lints * feat: totp backend routes * feat: oidc groups * fix: update drop-base * feat: creation of passkeys & totp * feat: totp signin * feat: webauthn mfa/signin * feat: launch selecting ui * fix: manually running tasks * feat: update add company game modal to use new SelectorGame * feat: executor selector * fix(docker): update rust to rust nightly for torrential build (#305) * feat: new version ui * feat: move package lookup to build time to allow for deno dev * fix: lint * feat: localisation cleanup * feat: apply localisation cleanup * feat: potential i18n refactor logic * feat: remove args from commands * fix: lint * fix: lockfile --------- Co-authored-by: Aden Lindsay <140392385+AdenMGB@users.noreply.github.com>
104 lines
2.8 KiB
TypeScript
104 lines
2.8 KiB
TypeScript
import type {
|
|
ExtractedRouteMethod,
|
|
NitroFetchOptions,
|
|
NitroFetchRequest,
|
|
TypedInternalResponse,
|
|
} from "nitropack/types";
|
|
import type { FetchError } from "ofetch";
|
|
|
|
interface DropFetch<
|
|
DefaultT = unknown,
|
|
DefaultR extends NitroFetchRequest = NitroFetchRequest,
|
|
> {
|
|
<
|
|
T = DefaultT,
|
|
R extends NitroFetchRequest = DefaultR,
|
|
O extends NitroFetchOptions<R> = NitroFetchOptions<R>,
|
|
>(
|
|
request: R,
|
|
opts?: O & { failTitle?: string; params?: { [key: string]: string } },
|
|
): Promise<
|
|
// sometimes there is an error, other times there isn't
|
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
// @ts-ignore
|
|
TypedInternalResponse<
|
|
R,
|
|
T,
|
|
NitroFetchOptions<R> extends O ? "get" : ExtractedRouteMethod<R, O>
|
|
>
|
|
>;
|
|
}
|
|
|
|
export const $dropFetch: DropFetch = async (rawRequest, opts) => {
|
|
const requestParts = rawRequest.toString().split("/");
|
|
requestParts.forEach((part, index) => {
|
|
if (!part.startsWith(":")) {
|
|
return;
|
|
}
|
|
const partName = part.slice(1);
|
|
const replacement = opts?.params?.[partName] as string | undefined;
|
|
if (!replacement) {
|
|
return;
|
|
}
|
|
requestParts[index] = replacement;
|
|
|
|
delete opts?.params?.[partName];
|
|
});
|
|
const request = requestParts.join("/");
|
|
|
|
// If not in setup
|
|
if (!getCurrentInstance()?.proxy) {
|
|
try {
|
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
// @ts-ignore Excessive stack depth comparing types
|
|
return await $fetch(request, opts);
|
|
} catch (e) {
|
|
if (import.meta.client && opts?.failTitle) {
|
|
console.warn(e);
|
|
createModal(
|
|
ModalType.Notification,
|
|
{
|
|
title: opts.failTitle,
|
|
description:
|
|
(e as FetchError)?.data?.message ?? (e as string).toString(),
|
|
//buttonText: $t("common.close"),
|
|
},
|
|
(_, c) => c(),
|
|
);
|
|
}
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
const id = request.toString();
|
|
|
|
const state = useState(id);
|
|
if (state.value) {
|
|
// Deep copy
|
|
const object = JSON.parse(JSON.stringify(state.value));
|
|
// Never use again on client
|
|
if (import.meta.client) state.value = undefined;
|
|
return object;
|
|
}
|
|
|
|
const headers = useRequestHeaders(["cookie", "authorization"]);
|
|
const data = await $fetch(request, {
|
|
...opts,
|
|
headers: { ...headers, ...opts?.headers },
|
|
});
|
|
if (import.meta.server) state.value = data;
|
|
return data;
|
|
};
|
|
|
|
export function isClientRequest() {
|
|
const existingState = useState("clientMode", () => false);
|
|
if (import.meta.server) {
|
|
const headers = useRequestHeaders(["User-Agent"]);
|
|
const calculatedClientRequest =
|
|
headers["user-agent"] == "Drop Desktop Client";
|
|
existingState.value = calculatedClientRequest;
|
|
}
|
|
|
|
return existingState.value;
|
|
}
|