Compare commits
20 Commits
0ab9f438b6
...
d567eb58ce
Author | SHA1 | Date |
---|---|---|
Derrick Hammer | d567eb58ce | |
Derrick Hammer | 345d441984 | |
Derrick Hammer | c7f3ffa2c1 | |
Derrick Hammer | eb6c2d94cc | |
Derrick Hammer | 867f36c346 | |
Derrick Hammer | f7720f775c | |
Derrick Hammer | a50a78ea47 | |
Derrick Hammer | 47f61909f5 | |
Derrick Hammer | 165ead6a80 | |
Derrick Hammer | ad68d92c57 | |
Derrick Hammer | 9767e82751 | |
Derrick Hammer | c0892c10c3 | |
Derrick Hammer | 34e6e99287 | |
Derrick Hammer | bb4909948e | |
Derrick Hammer | a76076b730 | |
Derrick Hammer | 2c972144f9 | |
Derrick Hammer | 0039e5b1b5 | |
Derrick Hammer | b75bf77f1e | |
Derrick Hammer | fd54384b4e | |
Derrick Hammer | 0cf849a9d5 |
|
@ -17,6 +17,7 @@
|
|||
"@lumeweb/kernel-ipfs-client": "^0.1.0-develop.25",
|
||||
"@lumeweb/kernel-network-registry-client": "^0.1.0-develop.10",
|
||||
"@lumeweb/kernel-peer-discovery-client": "^0.0.2-develop.18",
|
||||
"@lumeweb/kernel-s5-client": "^0.1.0-develop.5",
|
||||
"@lumeweb/kernel-swarm-client": "^0.1.0-develop.12",
|
||||
"@lumeweb/libresolver": "^0.1.0-develop.1",
|
||||
"@lumeweb/sdk": "^0.1.0-develop.44",
|
||||
|
@ -2504,6 +2505,14 @@
|
|||
"hyperswarm": "^4.3.7"
|
||||
}
|
||||
},
|
||||
"node_modules/@lumeweb/kernel-s5-client": {
|
||||
"version": "0.1.0-develop.5",
|
||||
"resolved": "https://registry.npmjs.org/@lumeweb/kernel-s5-client/-/kernel-s5-client-0.1.0-develop.5.tgz",
|
||||
"integrity": "sha512-3yjq8F6JiLaY8ymtaVm/9uR0AtO9IHl/fOUmJyT2XCT+kbz0LJYZgMv0UMddnz/RHXiRMKRbIXxHhz2aEOw8kg==",
|
||||
"dependencies": {
|
||||
"@lumeweb/libkernel": "0.1.0-develop.68"
|
||||
}
|
||||
},
|
||||
"node_modules/@lumeweb/kernel-swarm-client": {
|
||||
"version": "0.1.0-develop.12",
|
||||
"resolved": "https://registry.npmjs.org/@lumeweb/kernel-swarm-client/-/kernel-swarm-client-0.1.0-develop.12.tgz",
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
"@lumeweb/kernel-ipfs-client": "^0.1.0-develop.25",
|
||||
"@lumeweb/kernel-network-registry-client": "^0.1.0-develop.10",
|
||||
"@lumeweb/kernel-peer-discovery-client": "^0.0.2-develop.18",
|
||||
"@lumeweb/kernel-s5-client": "^0.1.0-develop.5",
|
||||
"@lumeweb/kernel-swarm-client": "^0.1.0-develop.12",
|
||||
"@lumeweb/libresolver": "^0.1.0-develop.1",
|
||||
"@lumeweb/sdk": "^0.1.0-develop.44",
|
||||
|
|
|
@ -33,7 +33,7 @@ export default class URLRewriteFilter implements ContentFilter {
|
|||
urlValue.startsWith("http") ||
|
||||
(urlValue.startsWith("//") && isICANN(urlValue));
|
||||
if (!isExternal || !isICANN(urlValue)) {
|
||||
if (!isExternal) {
|
||||
if (!isExternal && !urlValue.startsWith("/")) {
|
||||
//@ts-ignore
|
||||
urlValue = path.join(rUrl.pathname, urlValue);
|
||||
}
|
||||
|
@ -49,9 +49,16 @@ export default class URLRewriteFilter implements ContentFilter {
|
|||
let srcsetValues = srcsetValue?.split(",");
|
||||
let rewrittenSrcsetValues = srcsetValues?.map((srcsetEntry) => {
|
||||
let [url, descriptor] = srcsetEntry.trim().split(" ");
|
||||
if (!url.startsWith("http") && !url.startsWith("//")) {
|
||||
url = path.join(rUrl.pathname, url);
|
||||
url = `${rUrl.protocol}//${rUrl.hostname}/browse/${rUrl.hostname}${url}`;
|
||||
const isExternal =
|
||||
url.startsWith("http") ||
|
||||
(url.startsWith("//") && isICANN(url));
|
||||
if (!isExternal || !isICANN(url)) {
|
||||
if (!isExternal && !url.startsWith("/")) {
|
||||
//@ts-ignore
|
||||
url = path.join(rUrl.pathname, url);
|
||||
}
|
||||
url = `${swUrl.protocol}//${swUrl.hostname}/browse/${rUrl.hostname}${url}`;
|
||||
console.log(url);
|
||||
}
|
||||
return `${url} ${descriptor}`;
|
||||
});
|
||||
|
|
|
@ -0,0 +1,86 @@
|
|||
import type { ContentProvider } from "../types.js";
|
||||
import * as nodePath from "path";
|
||||
import { createClient } from "@lumeweb/kernel-s5-client";
|
||||
import { CID, CID_TYPES } from "@lumeweb/libs5";
|
||||
|
||||
export default class S5Provider implements ContentProvider {
|
||||
private _client = createClient();
|
||||
|
||||
async fetchContent(
|
||||
uri: string,
|
||||
path: string,
|
||||
query?: string,
|
||||
): Promise<Response> {
|
||||
let cid = translatePath(uri);
|
||||
let err;
|
||||
let urlPath = path;
|
||||
const parsedPath = nodePath.parse(urlPath);
|
||||
|
||||
if (!cid.startsWith("/s5/") && !cid.startsWith("/sia/")) {
|
||||
err = "404";
|
||||
}
|
||||
|
||||
if (err) {
|
||||
throw new Error(err);
|
||||
}
|
||||
|
||||
cid = cid.replace("/s5/", "").replace("/sia/", "");
|
||||
|
||||
let file;
|
||||
|
||||
switch (CID.decode(cid).type) {
|
||||
case CID_TYPES.METADATA_WEBAPP:
|
||||
const meta = await this._client.stat(cid);
|
||||
if (!parsedPath.base.length || !parsedPath.ext.length) {
|
||||
let found = false;
|
||||
for (const indexFile of meta.tryFiles) {
|
||||
urlPath = nodePath.join(urlPath, indexFile);
|
||||
if (urlPath.startsWith("/")) {
|
||||
urlPath = urlPath.substring(1);
|
||||
}
|
||||
if (urlPath in meta.paths) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
throw new Error("404");
|
||||
}
|
||||
file = meta.paths[urlPath];
|
||||
} else {
|
||||
if (urlPath.startsWith("/")) {
|
||||
urlPath = urlPath.substring(1);
|
||||
}
|
||||
if (!(urlPath in meta.paths)) {
|
||||
throw new Error("404");
|
||||
}
|
||||
file = meta.paths[urlPath];
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
throw new Error("404");
|
||||
}
|
||||
|
||||
const headers: HeadersInit = {};
|
||||
|
||||
headers["Content-Type"] = file.contentType as string;
|
||||
|
||||
return new Response(
|
||||
new Blob([(await this._client.cat(file.cid)) as Uint8Array]),
|
||||
{
|
||||
headers,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
supports(uri: string): boolean {
|
||||
uri = translatePath(uri);
|
||||
return uri.startsWith("/s5/") || uri.startsWith("/sia/");
|
||||
}
|
||||
}
|
||||
|
||||
function translatePath(uri: string) {
|
||||
return uri.replace(/:\/\//, "/").replace(/^/, "/");
|
||||
}
|
|
@ -2,11 +2,13 @@ import { createClient as createDnsClient } from "@lumeweb/kernel-dns-client";
|
|||
import { ProviderManager } from "./providerManager.js";
|
||||
import IPFSProvider from "./providers/ipfs.js";
|
||||
import URLRewriteFilter from "./filters/urlRewrite.js";
|
||||
import S5Provider from "./providers/s5.js";
|
||||
|
||||
const dnsClient = createDnsClient();
|
||||
|
||||
const providerManager = new ProviderManager();
|
||||
providerManager.register(new IPFSProvider());
|
||||
providerManager.register(new S5Provider());
|
||||
providerManager.processor.registerFilter(new URLRewriteFilter());
|
||||
|
||||
globalThis.postMessage = async (...args) => {
|
||||
|
|
|
@ -5,6 +5,7 @@ import { createClient as createPeerDiscoveryClient } from "@lumeweb/kernel-peer-
|
|||
import { createClient as createNetworkRegistryClient } from "@lumeweb/kernel-network-registry-client";
|
||||
import { createClient as createHandshakeClient } from "@lumeweb/kernel-handshake-client";
|
||||
import { createClient as createEthClient } from "@lumeweb/kernel-eth-client";
|
||||
import { createClient as createS5Client } from "@lumeweb/kernel-s5-client";
|
||||
|
||||
const dnsClient = createDnsClient();
|
||||
const ipfsClient = createIpfsClient();
|
||||
|
@ -13,6 +14,7 @@ const peerDiscoveryClient = createPeerDiscoveryClient();
|
|||
const networkRegistryClient = createNetworkRegistryClient();
|
||||
const handshakeClient = createHandshakeClient();
|
||||
const ethClient = createEthClient();
|
||||
const s5Client = createS5Client();
|
||||
|
||||
export {
|
||||
dnsClient,
|
||||
|
@ -22,4 +24,5 @@ export {
|
|||
networkRegistryClient,
|
||||
handshakeClient,
|
||||
ethClient,
|
||||
s5Client,
|
||||
};
|
||||
|
|
|
@ -6,6 +6,7 @@ type Props = {
|
|||
};
|
||||
|
||||
const AVAILABLE_PAGES = [
|
||||
"lumeweb",
|
||||
"blockranger.eth",
|
||||
"esteroids.eth",
|
||||
// "ens.eth",
|
||||
|
|
Loading…
Reference in New Issue