*Add initial skynet provider
This commit is contained in:
parent
67285ccc08
commit
236f64bc43
|
@ -0,0 +1,91 @@
|
||||||
|
import BaseProvider from "./baseProvider.js";
|
||||||
|
import {
|
||||||
|
BlockingResponse,
|
||||||
|
HttpHeaders,
|
||||||
|
OnBeforeRequestDetailsType,
|
||||||
|
OnHeadersReceivedDetailsType,
|
||||||
|
OnRequestDetailsType,
|
||||||
|
} from "../types.js";
|
||||||
|
import { validSkylink } from "libskynet";
|
||||||
|
import { downloadSkylink, requestProxies } from "../util.js";
|
||||||
|
import browser from "@lumeweb/webextension-polyfill";
|
||||||
|
|
||||||
|
export default class SkynetProvider extends BaseProvider {
|
||||||
|
async shouldHandleRequest(
|
||||||
|
details: OnBeforeRequestDetailsType
|
||||||
|
): Promise<boolean> {
|
||||||
|
const dns = await this.resolveDns(details);
|
||||||
|
|
||||||
|
if (dns && validSkylink(dns)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async handleProxy(details: OnRequestDetailsType): Promise<any> {
|
||||||
|
return requestProxies;
|
||||||
|
}
|
||||||
|
|
||||||
|
async handleRequest(
|
||||||
|
details: OnBeforeRequestDetailsType
|
||||||
|
): Promise<BlockingResponse | boolean> {
|
||||||
|
const dns = await this.resolveDns(details);
|
||||||
|
let path = new URL(details.url).pathname;
|
||||||
|
let fileData: any, err;
|
||||||
|
try {
|
||||||
|
[fileData, err] = await downloadSkylink(dns, path);
|
||||||
|
} catch (e: any) {
|
||||||
|
debugger;
|
||||||
|
this.setData(details, "error", (e as Error).message);
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
this.setData(details, "error", err);
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setData(details, "headers", fileData.response?.headers);
|
||||||
|
|
||||||
|
const filter = browser.webRequest.filterResponseData(details.requestId);
|
||||||
|
|
||||||
|
filter.ondata = () => {};
|
||||||
|
filter.onstop = () => {
|
||||||
|
fileData.response.arrayBuffer().then((data: any) => {
|
||||||
|
filter.write(data);
|
||||||
|
filter.close();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
async handleHeaders(
|
||||||
|
details: OnHeadersReceivedDetailsType
|
||||||
|
): Promise<BlockingResponse | boolean> {
|
||||||
|
const err = this.getData(details, "error");
|
||||||
|
let headers: Headers = this.getData(details, "headers") as Headers;
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
return {
|
||||||
|
responseHeaders: [
|
||||||
|
{
|
||||||
|
name: "Status-Code",
|
||||||
|
value: err == "404" ? "404" : "400",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Content-Type",
|
||||||
|
value: "text/html; charset=utf8",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
responseHeaders: Array.from(headers).map((item: string[]) => {
|
||||||
|
return { name: item[0], value: item[1] };
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue