Compare commits

..

6 Commits

Author SHA1 Message Date
semantic-release-bot 7dcb741e46 chore(release): 0.2.0-develop.1 [skip ci]
# [0.2.0-develop.1](https://git.lumeweb.com/LumeWeb/libweb/compare/v0.1.3...v0.2.0-develop.1) (2023-06-23)

### Bug Fixes

* need to add dom support to TS ([738c3f1](738c3f12cf))

### Features

* add deriveChildKey function ([d7cdaaf](d7cdaaf316))
* add portal management apis ([d340447](d340447aba))
* implement initial download method ([7c07211](7c07211356))
2023-06-23 07:33:44 +00:00
Derrick Hammer 738c3f12cf
fix: need to add dom support to TS 2023-06-23 03:32:00 -04:00
Derrick Hammer 381a892fae
chore: update libportal 2023-06-23 03:30:44 -04:00
Derrick Hammer 7c07211356
feat: implement initial download method 2023-06-23 03:29:14 -04:00
Derrick Hammer d340447aba
feat: add portal management apis 2023-06-23 03:28:39 -04:00
Derrick Hammer d7cdaaf316
feat: add deriveChildKey function 2023-06-21 04:32:31 -04:00
9 changed files with 649 additions and 648 deletions

View File

@ -4,7 +4,8 @@
"tsconfig": { "tsconfig": {
"compilerOptions": { "compilerOptions": {
"lib": [ "lib": [
"ES2021" "ES2021",
"dom"
] ]
} }
}, },

View File

@ -1,3 +1,17 @@
# [0.2.0-develop.1](https://git.lumeweb.com/LumeWeb/libweb/compare/v0.1.3...v0.2.0-develop.1) (2023-06-23)
### Bug Fixes
* need to add dom support to TS ([738c3f1](https://git.lumeweb.com/LumeWeb/libweb/commit/738c3f12cfb49456fbcdd433b3f4bd30daa031b7))
### Features
* add deriveChildKey function ([d7cdaaf](https://git.lumeweb.com/LumeWeb/libweb/commit/d7cdaaf316d4d26ed44860701376d18030030708))
* add portal management apis ([d340447](https://git.lumeweb.com/LumeWeb/libweb/commit/d340447aba098dbac6163bfbacca0429323e6e45))
* implement initial download method ([7c07211](https://git.lumeweb.com/LumeWeb/libweb/commit/7c07211356497ed36119d32943c46cb2e268b30f))
## [0.1.3](https://git.lumeweb.com/LumeWeb/libweb/compare/v0.1.2...v0.1.3) (2023-06-21) ## [0.1.3](https://git.lumeweb.com/LumeWeb/libweb/compare/v0.1.2...v0.1.3) (2023-06-21)

1137
npm-shrinkwrap.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "@lumeweb/libweb", "name": "@lumeweb/libweb",
"version": "0.1.3", "version": "0.2.0-develop.1",
"main": "lib/index.js", "main": "lib/index.js",
"type": "module", "type": "module",
"repository": { "repository": {
@ -21,7 +21,7 @@
"semantic-release": "semantic-release" "semantic-release": "semantic-release"
}, },
"dependencies": { "dependencies": {
"@lumeweb/libportal": "^0.1.0", "@lumeweb/libportal": "^0.2.0-develop.2",
"@noble/curves": "^1.1.0", "@noble/curves": "^1.1.0",
"@noble/hashes": "^1.3.1" "@noble/hashes": "^1.3.1"
}, },

View File

@ -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;
}

View File

@ -9,4 +9,5 @@ export * from "./stringifyJSON.js";
export * from "./types.js"; export * from "./types.js";
export * from "./cid.js"; export * from "./cid.js";
export * from "./encoding.js"; export * from "./encoding.js";
export * from "./keys.js";
export { ed25519, sha512 }; export { ed25519, sha512 };

11
src/keys.ts Normal file
View File

@ -0,0 +1,11 @@
import { blake3 } from "@noble/hashes/blake3";
import { concatBytes } from "@noble/hashes/utils";
export function deriveChildKey(
parentKey: Uint8Array,
tweak: string,
): Uint8Array {
const tweakHash = blake3(tweak);
return blake3(concatBytes(parentKey, tweakHash));
}

78
src/portal.ts Normal file
View File

@ -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;
}

View File

@ -71,6 +71,11 @@ interface RequestOverrideResponse {
body?: Uint8Array; body?: Uint8Array;
} }
export interface KeyPair {
publicKey: Uint8Array;
privateKey: Uint8Array;
}
export { export {
DataFn, DataFn,
ErrFn, ErrFn,