mirror of
https://github.com/movie-web/movie-web.git
synced 2025-02-18 12:50:05 +00:00
improve typings
This commit is contained in:
parent
421186cb54
commit
52bc66e7dd
src/backend
|
@ -7,18 +7,17 @@ import { isAllowedExtensionVersion } from "@/backend/extension/compatibility";
|
||||||
|
|
||||||
let activeExtension = false;
|
let activeExtension = false;
|
||||||
|
|
||||||
export interface ExtensionHello {
|
function sendMessage<MessageKey extends keyof MessagesMetadata>(
|
||||||
version: string;
|
message: MessageKey,
|
||||||
}
|
payload: MessagesMetadata[MessageKey]["req"],
|
||||||
|
|
||||||
function sendMessage<T, Payload>(
|
|
||||||
message: keyof MessagesMetadata,
|
|
||||||
payload: any,
|
|
||||||
timeout: number = -1,
|
timeout: number = -1,
|
||||||
) {
|
) {
|
||||||
return new Promise<T | null>((resolve) => {
|
return new Promise<MessagesMetadata[MessageKey]["res"] | null>((resolve) => {
|
||||||
if (timeout >= 0) setTimeout(() => resolve(null), timeout);
|
if (timeout >= 0) setTimeout(() => resolve(null), timeout);
|
||||||
sendToBackgroundViaRelay<Payload, T>({
|
sendToBackgroundViaRelay<
|
||||||
|
MessagesMetadata[MessageKey]["req"],
|
||||||
|
MessagesMetadata[MessageKey]["res"]
|
||||||
|
>({
|
||||||
name: message,
|
name: message,
|
||||||
body: payload,
|
body: payload,
|
||||||
})
|
})
|
||||||
|
@ -34,21 +33,33 @@ function sendMessage<T, Payload>(
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function sendExtensionRequest(
|
export async function sendExtensionRequest(
|
||||||
url: string,
|
ops: Omit<MessagesMetadata["makeRequest"]["req"], "requestDomain">,
|
||||||
ops: any,
|
): Promise<MessagesMetadata["makeRequest"]["res"] | null> {
|
||||||
): Promise<ExtensionHello | null> {
|
return sendMessage("makeRequest", {
|
||||||
return sendMessage("make-request", { url, ...ops });
|
requestDomain: window.location.origin,
|
||||||
|
...ops,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function setDomainRule(
|
export async function setDomainRule(
|
||||||
domains: string[],
|
ops: Omit<MessagesMetadata["prepareStream"]["req"], "requestDomain">,
|
||||||
headers: Record<string, string>,
|
): Promise<MessagesMetadata["prepareStream"]["res"] | null> {
|
||||||
): Promise<ExtensionHello | null> {
|
return sendMessage("prepareStream", {
|
||||||
return sendMessage("prepare-stream", { domains, headers });
|
requestDomain: window.location.origin,
|
||||||
|
...ops,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function extensionInfo(): Promise<ExtensionHello | null> {
|
export async function extensionInfo(): Promise<
|
||||||
return sendMessage("hello", null, 300);
|
MessagesMetadata["hello"]["res"] | null
|
||||||
|
> {
|
||||||
|
return sendMessage(
|
||||||
|
"hello",
|
||||||
|
{
|
||||||
|
requestDomain: window.location.origin,
|
||||||
|
},
|
||||||
|
300,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isExtensionActiveCached(): boolean {
|
export function isExtensionActiveCached(): boolean {
|
||||||
|
@ -57,7 +68,7 @@ export function isExtensionActiveCached(): boolean {
|
||||||
|
|
||||||
export async function isExtensionActive(): Promise<boolean> {
|
export async function isExtensionActive(): Promise<boolean> {
|
||||||
const info = await extensionInfo();
|
const info = await extensionInfo();
|
||||||
if (!info) return false;
|
if (!info?.success) return false;
|
||||||
const allowedVersion = isAllowedExtensionVersion(info.version);
|
const allowedVersion = isAllowedExtensionVersion(info.version);
|
||||||
if (!allowedVersion) return false;
|
if (!allowedVersion) return false;
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -1,6 +1,37 @@
|
||||||
export interface PlasmoRequestBody {
|
export interface ExtensionBaseRequest {
|
||||||
|
requestDomain: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type ExtensionBaseResponse<T = object> =
|
||||||
|
| ({
|
||||||
|
success: true;
|
||||||
|
} & T)
|
||||||
|
| {
|
||||||
|
success: false;
|
||||||
|
error: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ExtensionHelloResponse = ExtensionBaseResponse<{
|
||||||
|
version: string;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export interface ExtensionMakeRequest extends ExtensionBaseRequest {
|
||||||
|
url: string;
|
||||||
|
method: string;
|
||||||
|
headers?: Record<string, string>;
|
||||||
|
body?: string | FormData | URLSearchParams | Record<string, any>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type ExtensionMakeRequestResponse = ExtensionBaseResponse<{
|
||||||
|
status: number;
|
||||||
|
requestHeaders: Record<string, string>;
|
||||||
|
responseHeaders: Record<string, string>;
|
||||||
|
data: string | Record<string, unknown>;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
export interface ExtensionPrepareStreamRequest extends ExtensionBaseRequest {
|
||||||
ruleId: number;
|
ruleId: number;
|
||||||
domain: string;
|
targetDomains: string[];
|
||||||
requestHeaders?: Record<string, string>;
|
requestHeaders?: Record<string, string>;
|
||||||
responseHeaders?: Record<string, string>;
|
responseHeaders?: Record<string, string>;
|
||||||
}
|
}
|
||||||
|
@ -9,28 +40,18 @@ export interface ExtensionHelloReply {
|
||||||
version: string;
|
version: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ExtensionRequestReply =
|
export interface MmMetadata {
|
||||||
| {
|
|
||||||
success: true;
|
|
||||||
ruleId: number;
|
|
||||||
}
|
|
||||||
| {
|
|
||||||
success: false;
|
|
||||||
error: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
interface MmMetadata {
|
|
||||||
"prepare-stream": {
|
|
||||||
req: PlasmoRequestBody;
|
|
||||||
res: ExtensionRequestReply;
|
|
||||||
};
|
|
||||||
"make-request": {
|
|
||||||
req: PlasmoRequestBody;
|
|
||||||
res: ExtensionRequestReply;
|
|
||||||
};
|
|
||||||
hello: {
|
hello: {
|
||||||
req: null;
|
req: ExtensionBaseRequest;
|
||||||
res: ExtensionHelloReply;
|
res: ExtensionHelloResponse;
|
||||||
|
};
|
||||||
|
makeRequest: {
|
||||||
|
req: ExtensionMakeRequest;
|
||||||
|
res: ExtensionMakeRequestResponse;
|
||||||
|
};
|
||||||
|
prepareStream: {
|
||||||
|
req: ExtensionPrepareStreamRequest;
|
||||||
|
res: ExtensionBaseResponse;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,8 +33,9 @@ function buildHeadersFromStream(stream: Stream): Record<string, string> {
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function prepareStream(stream: Stream) {
|
export async function prepareStream(stream: Stream) {
|
||||||
await setDomainRule(
|
await setDomainRule({
|
||||||
extractDomainsFromStream(stream),
|
ruleId: 1,
|
||||||
buildHeadersFromStream(stream),
|
targetDomains: extractDomainsFromStream(stream),
|
||||||
);
|
requestHeaders: buildHeadersFromStream(stream),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,8 +54,13 @@ export function makeLoadBalancedSimpleProxyFetcher() {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function makeExtensionFetcher() {
|
export function makeExtensionFetcher() {
|
||||||
const fetcher: Fetcher = async (a, b) => {
|
const fetcher: Fetcher = async (url, ops) => {
|
||||||
return sendExtensionRequest(a, b) as any;
|
return sendExtensionRequest({
|
||||||
|
url,
|
||||||
|
method: ops?.method ?? "GET",
|
||||||
|
headers: ops?.headers,
|
||||||
|
body: ops?.body,
|
||||||
|
}) as any;
|
||||||
};
|
};
|
||||||
return fetcher;
|
return fetcher;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue