diff --git a/src/utils/ipfs.ts b/src/utils/ipfs.ts new file mode 100644 index 0000000..071f2cc --- /dev/null +++ b/src/utils/ipfs.ts @@ -0,0 +1,27 @@ +/** https://docs.ipfs.tech/how-to/address-ipfs-on-web/#path-gateway */ +const IPFS_PATH_REGEX = /^\/ipfs\/([^/]+)/; +/** https://docs.ipfs.tech/how-to/address-ipfs-on-web/#subdomain-gateway */ +const IPFS_HOST_REGEX = /^([^/]+)\.ipfs\./; + +/** Get IPFS CID out of a path. */ +function cidFromPath(path: string) { + return path.match(IPFS_PATH_REGEX)?.[1]; +} + +/** Get IPFS CID out of a host. */ +function cidFromHost(host: string) { + return host.match(IPFS_HOST_REGEX)?.[1]; +} + +/** Get IPFS CID out of a URL. */ +function cidFromUrl({ protocol, hostname, pathname }: URL) { + switch (protocol) { + case 'ipfs:': + return hostname; + case 'http:': + case 'https:': + return cidFromPath(pathname) || cidFromHost(hostname); + } +} + +export { cidFromUrl }; \ No newline at end of file