Compare commits

..

2 Commits

Author SHA1 Message Date
Derrick Hammer d724359622
feat: initial very basic file listing 2024-03-21 13:24:13 -04:00
Derrick Hammer 39ac3467fc
dep: update portal-sdk 2024-03-21 13:22:19 -04:00
2 changed files with 125 additions and 38 deletions

View File

@ -1,15 +1,100 @@
import type { DataProvider } from "@refinedev/core";
import {SdkProvider} from "~/data/sdk-provider.js"; import {SdkProvider} from "~/data/sdk-provider.js";
import {S5Client} from "@lumeweb/s5-js";
import {PROTOCOL_S5} from "@lumeweb/portal-sdk";
import {Multihash} from "@lumeweb/libs5/lib/multihash.js";
import {AxiosProgressEvent} from "axios";
import {CancelablePromise} from "@lumeweb/s5-js/lib/axios.js";
import {MetadataResult} from "@lumeweb/s5-js/lib/options/download.js";
import {metadataMagicByte, Unpacker, CID, METADATA_TYPES, CID_TYPES} from "@lumeweb/libs5";
export const fileProvider = { async function getIsManifest(s5: S5Client, hash: string): Promise<boolean | number> {
getList: () => {
console.log("Not implemented"); let type: number | null;
return Promise.resolve({ try {
data: [], const resp = s5.downloadData(hash, {
total: 0, onDownloadProgress: (progressEvent: AxiosProgressEvent) => {
}); if (progressEvent.loaded >= 10) {
resp.cancel();
}
}, },
getOne: () => { }) as CancelablePromise<ArrayBuffer>;
const data = await resp;
const unpacker = Unpacker.fromPacked(Buffer.from(data));
try {
const magic = unpacker.unpackInt();
if (magic !== metadataMagicByte) {
return false;
}
type = unpacker.unpackInt();
if (!type || !Object.values(METADATA_TYPES).includes(type)) {
return false;
}
} catch (e) {
return false;
}
} catch (e) {
return false;
}
switch (type) {
case METADATA_TYPES.DIRECTORY:
return CID_TYPES.DIRECTORY;
case METADATA_TYPES.WEBAPP:
return CID_TYPES.METADATA_WEBAPP;
case METADATA_TYPES.MEDIA:
return CID_TYPES.METADATA_MEDIA;
case METADATA_TYPES.USER_IDENTITY:
return CID_TYPES.USER_IDENTITY;
}
return 0;
}
export interface FileItem {
cid: string;
type: string;
mimeType: string;
}
export const fileProvider: SdkProvider = {
sdk: undefined,
async getList() {
const items: FileItem[] = [];
try {
const s5 = fileProvider.sdk?.protocols().get<S5Client>(PROTOCOL_S5)!.getSdk()!;
const pinList = await s5.accountPins();
for (const pin of pinList!.pins) {
const manifest = await getIsManifest(s5, pin.hash) as number;
if (manifest) {
items.push({
cid: CID.fromHash(pin.hash, pin.size, manifest).toString(),
type: "manifest",
mimeType: "application/octet-stream",
});
} else {
items.push({
cid: CID.fromHash(pin.hash, pin.size, CID_TYPES.RAW).toString(),
type: "raw",
mimeType: pin.mime_type,
});
}
}
} catch (e) {
return Promise.reject(e);
}
return {
data: items,
total: items.length,
};
},
getOne() {
console.log("Not implemented"); console.log("Not implemented");
return Promise.resolve({ return Promise.resolve({
data: { data: {
@ -17,23 +102,25 @@ export const fileProvider = {
}, },
}); });
}, },
update: () => { update() {
console.log("Not implemented"); console.log("Not implemented");
return Promise.resolve({ return Promise.resolve({
data: {}, data: {},
}); });
}, },
create: () => { create() {
console.log("Not implemented"); console.log("Not implemented");
return Promise.resolve({ return Promise.resolve({
data: {}, data: {},
}); });
}, },
deleteOne: () => { deleteOne() {
console.log("Not implemented"); console.log("Not implemented");
return Promise.resolve({ return Promise.resolve({
data: {}, data: {},
}); });
}, },
getApiUrl: () => "", getApiUrl() {
return "";
},
} satisfies SdkProvider; } satisfies SdkProvider;

View File

@ -16,7 +16,7 @@
"@conform-to/react": "^1.0.2", "@conform-to/react": "^1.0.2",
"@conform-to/zod": "^1.0.2", "@conform-to/zod": "^1.0.2",
"@fontsource-variable/manrope": "^5.0.19", "@fontsource-variable/manrope": "^5.0.19",
"@lumeweb/portal-sdk": "0.0.0-20240321171622", "@lumeweb/portal-sdk": "0.0.0-20240321172104",
"@radix-ui/react-avatar": "^1.0.4", "@radix-ui/react-avatar": "^1.0.4",
"@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-checkbox": "^1.0.4",
"@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-dialog": "^1.0.5",