Compare commits
4 Commits
d7cdaaf316
...
738c3f12cf
Author | SHA1 | Date |
---|---|---|
Derrick Hammer | 738c3f12cf | |
Derrick Hammer | 381a892fae | |
Derrick Hammer | 7c07211356 | |
Derrick Hammer | d340447aba |
|
@ -4,7 +4,8 @@
|
|||
"tsconfig": {
|
||||
"compilerOptions": {
|
||||
"lib": [
|
||||
"ES2021"
|
||||
"ES2021",
|
||||
"dom"
|
||||
]
|
||||
}
|
||||
},
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -21,7 +21,7 @@
|
|||
"semantic-release": "semantic-release"
|
||||
},
|
||||
"dependencies": {
|
||||
"@lumeweb/libportal": "^0.1.0",
|
||||
"@lumeweb/libportal": "^0.2.0-develop.2",
|
||||
"@noble/curves": "^1.1.0",
|
||||
"@noble/hashes": "^1.3.1"
|
||||
},
|
||||
|
|
|
@ -1 +1,41 @@
|
|||
export function downloadObject(cid: string) {}
|
||||
import { getActivePortals } from "#portal.js";
|
||||
import { ErrTuple } from "#types.js";
|
||||
import { decodeCid, getVerifiableStream } from "@lumeweb/libportal";
|
||||
|
||||
const NO_PORTALS_ERROR = [null, "no active portals"] as ErrTuple;
|
||||
|
||||
export async function downloadObject(cid: string): Promise<ErrTuple> {
|
||||
const activePortals = getActivePortals();
|
||||
|
||||
if (!activePortals.size) {
|
||||
return NO_PORTALS_ERROR;
|
||||
}
|
||||
|
||||
for (const portal of activePortals) {
|
||||
if (!(await portal.isLoggedIn())) {
|
||||
try {
|
||||
await portal.register();
|
||||
} catch {
|
||||
continue;
|
||||
}
|
||||
|
||||
await portal.login();
|
||||
}
|
||||
|
||||
let stream, proof;
|
||||
|
||||
try {
|
||||
stream = await portal.downloadFile(cid);
|
||||
proof = await portal.downloadProof(cid);
|
||||
} catch {
|
||||
continue;
|
||||
}
|
||||
|
||||
return [
|
||||
await getVerifiableStream(decodeCid(cid).hash, proof, stream),
|
||||
null,
|
||||
];
|
||||
}
|
||||
|
||||
return NO_PORTALS_ERROR;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,78 @@
|
|||
import { ErrTuple, KeyPair, Portal } from "#types.js";
|
||||
import { Client } from "@lumeweb/libportal";
|
||||
import { deriveChildKey } from "#keys.js";
|
||||
import { ed25519 } from "@noble/curves/ed25519";
|
||||
import { bytesToHex } from "@noble/hashes/utils.js";
|
||||
|
||||
let activePortalMasterKey;
|
||||
|
||||
export const DEFAULT_PORTAL_LIST: Portal[] = [
|
||||
{ id: "lumeweb", url: "https://web3portal.com", name: "web3portal.com" },
|
||||
];
|
||||
|
||||
const ACTIVE_PORTALS = new Set<Client>();
|
||||
|
||||
type PortalSessionsStore = { [id: string]: string };
|
||||
|
||||
export function maybeInitDefaultPortals(): ErrTuple {
|
||||
if (!activePortalMasterKey) {
|
||||
return [null, "activePortalMasterKey not set"];
|
||||
}
|
||||
|
||||
let portalSessionsData = window.localStorage.getItem("portals");
|
||||
let portalSessions: PortalSessionsStore = {};
|
||||
if (portalSessions) {
|
||||
portalSessions = JSON.parse(
|
||||
portalSessionsData as string,
|
||||
) as PortalSessionsStore;
|
||||
}
|
||||
|
||||
for (const portal of DEFAULT_PORTAL_LIST) {
|
||||
let jwt: string | null = null;
|
||||
|
||||
if (portalSessions) {
|
||||
if (portal.id in portalSessions) {
|
||||
jwt = portalSessions[portal.id];
|
||||
}
|
||||
}
|
||||
|
||||
const client = new Client({
|
||||
email: generatePortalEmail(portal),
|
||||
portalUrl: portal.url,
|
||||
privateKey: generatePortalKeyPair(portal).privateKey,
|
||||
jwt: jwt as string,
|
||||
});
|
||||
|
||||
ACTIVE_PORTALS.add(client);
|
||||
}
|
||||
|
||||
return [null, null];
|
||||
}
|
||||
|
||||
export function setActivePortalMasterKey(key: Uint8Array) {
|
||||
activePortalMasterKey = key;
|
||||
}
|
||||
|
||||
export function generatePortalEmail(portal: Portal) {
|
||||
const keyPair = generatePortalKeyPair(portal);
|
||||
|
||||
const userId = bytesToHex(keyPair.publicKey.slice(0, 12));
|
||||
|
||||
return `${userId}@example.com`;
|
||||
}
|
||||
|
||||
export function generatePortalKeyPair(portal: Portal): KeyPair {
|
||||
const privateKey = deriveChildKey(
|
||||
activePortalMasterKey,
|
||||
`portal-account:${portal.id}`,
|
||||
);
|
||||
|
||||
return {
|
||||
privateKey,
|
||||
publicKey: ed25519.getPublicKey(privateKey),
|
||||
};
|
||||
}
|
||||
|
||||
export function getActivePortals(): Set<Client> {
|
||||
return ACTIVE_PORTALS;
|
||||
}
|
|
@ -71,6 +71,11 @@ interface RequestOverrideResponse {
|
|||
body?: Uint8Array;
|
||||
}
|
||||
|
||||
export interface KeyPair {
|
||||
publicKey: Uint8Array;
|
||||
privateKey: Uint8Array;
|
||||
}
|
||||
|
||||
export {
|
||||
DataFn,
|
||||
ErrFn,
|
||||
|
|
Loading…
Reference in New Issue