feat: initial very basic file listing

This commit is contained in:
Derrick Hammer 2024-03-21 13:24:13 -04:00
parent 39ac3467fc
commit d724359622
Signed by: pcfreak30
GPG Key ID: C997C339BE476FF2
1 changed files with 124 additions and 37 deletions

View File

@ -1,39 +1,126 @@
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: () => { }
console.log("Not implemented"); },
return Promise.resolve({ }) as CancelablePromise<ArrayBuffer>;
data: {
id: 1 const data = await resp;
}, const unpacker = Unpacker.fromPacked(Buffer.from(data));
}); try {
}, const magic = unpacker.unpackInt();
update: () => {
console.log("Not implemented"); if (magic !== metadataMagicByte) {
return Promise.resolve({ return false;
data: {}, }
});
}, type = unpacker.unpackInt();
create: () => {
console.log("Not implemented"); if (!type || !Object.values(METADATA_TYPES).includes(type)) {
return Promise.resolve({ return false;
data: {}, }
}); } catch (e) {
}, return false;
deleteOne: () => { }
console.log("Not implemented");
return Promise.resolve({ } catch (e) {
data: {}, return false;
}); }
},
getApiUrl: () => "", 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");
return Promise.resolve({
data: {
id: 1
},
});
},
update() {
console.log("Not implemented");
return Promise.resolve({
data: {},
});
},
create() {
console.log("Not implemented");
return Promise.resolve({
data: {},
});
},
deleteOne() {
console.log("Not implemented");
return Promise.resolve({
data: {},
});
},
getApiUrl() {
return "";
},
} satisfies SdkProvider; } satisfies SdkProvider;