1"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[2163],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>d});var r=t(7294);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function s(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function a(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?s(Object(t),!0).forEach((function(n){i(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):s(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function o(e,n){if(null==e)return{};var t,r,i=function(e,n){if(null==e)return{};var t,r,i={},s=Object.keys(e);for(r=0;r<s.length;r++)t=s[r],n.indexOf(t)>=0||(i[t]=e[t]);return i}(e,n);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r<s.length;r++)t=s[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var l=r.createContext({}),c=function(e){var n=r.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):a(a({},n),e)),t},p=function(e){var n=c(e.components);return r.createElement(l.Provider,{value:n},e.children)},f="mdxType",u={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},m=r.forwardRef((function(e,n){var t=e.components,i=e.mdxType,s=e.originalType,l=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),f=c(t),m=i,d=f["".concat(l,".").concat(m)]||f[m]||u[m]||s;return t?r.createElement(d,a(a({ref:n},p),{},{components:t})):r.createElement(d,a({ref:n},p))}));function d(e,n){var t=arguments,i=n&&n.mdxType;if("string"==typeof e||i){var s=t.length,a=new Array(s);a[0]=m;var o={};for(var l in n)hasOwnProperty.call(n,l)&&(o[l]=n[l]);o.originalType=e,o[f]="string"==typeof e?e:i,a[1]=o;for(var c=2;c<s;c++)a[c]=t[c];return r.createElement.apply(null,a)}return r.createElement.apply(null,t)}m.displayName="MDXCreateElement"},2624:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>l,default:()=>d,frontMatter:()=>o,metadata:()=>c,toc:()=>f});var r=t(7462),i=t(3366),s=(t(7294),t(3905)),a=["components"],o={title:"Write"},l=void 0,c={unversionedId:"develop/hive/write",id:"develop/hive/write",title:"Write",description:"The following code is an example of how a dApp could store some files to a users Hive vault courtesy of ela.city.",source:"@site/../docs/3.develop/hive/write.md",sourceDirName:"3.develop/hive",slug:"/develop/hive/write",permalink:"/develop/hive/write",draft:!1,editUrl:"https://github.com/elastos/Elastos.Wiki/edit/master/website/../docs/3.develop/hive/write.md",tags:[],version:"current",lastUpdatedBy:"racollette",lastUpdatedAt:1678819255,formattedLastUpdatedAt:"Mar 14, 2023",frontMatter:{title:"Write"},sidebar:"developSidebar",previous:{title:"Connect",permalink:"/develop/hive/connect"},next:{title:"Mainchain-Sidechain Transfer",permalink:"/develop/crosschain"}},p={},f=[],u={toc:f},m="wrapper";function d(e){var n=e.components,t=(0,i.Z)(e,a);return(0,s.kt)(m,(0,r.Z)({},u,t,{components:n,mdxType:"MDXLayout"}),(0,s.kt)("p",null,"The following code is an example of how a dApp could store some files to a users Hive vault courtesy of ",(0,s.kt)("a",{parentName:"p",href:"https://ela.city/"},"ela.city"),"."),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-ts"},'import {\n promiseAllStepN,\n Waitable,\n Waiter,\n CollectionOf,\n uid,\n} from "@elacity-js/lib";\nimport { FileInfo } from "@elastosfoundation/hive-js-sdk";\nimport { IUploadResult } from "../../nfts/types";\nimport { BrowserConnectivitySDKHiveAuthHelper } from "./hive.auth.helper";\nimport { resolverURLs } from "../connector";\nimport { APP_DID } from "../constants";\n\ninterface FileQuery {\n offset?: number;\n limit?: number;\n reverse?: boolean;\n path?: string;\n}\n\ninterface HiveFileResponse {\n url?: string;\n path?: string;\n content?: Uint8Array;\n}\n\nexport class HiveFileHelper extends BrowserConnectivitySDKHiveAuthHelper {\n /**\n * Upload a file as NFT\n *\n * @param userDid\n * @param formData\n * @returns\n */\n static async uploadNFTByUser(\n userDid: string,\n formData: FormData\n ): Promise<IUploadResult> {\n const helper = new HiveFileHelper(resolverURLs[20], APP_DID);\n const fileService = (\n await helper.getVaultServices(userDid)\n ).getFilesService();\n\n const subFolder = uid();\n\n const metadataJson: Record<string, any> = Array.from(formData).reduce(\n (r: Record<string, any>, [key, value]: [string, any]) => ({\n ...r,\n ...(key !== "image" && {\n [key]: value,\n }),\n }),\n {}\n );\n\n const imageHash = `nfts/elacity/${subFolder}/media.raw`;\n await fileService.upload(\n imageHash,\n Buffer.from(formData.get("image").toString().split(",").pop(), "base64")\n );\n\n const jsonHash = `nfts/elacity/${subFolder}/metadata.json`;\n await fileService.upload(\n jsonHash,\n Buffer.from(\n JSON.stringify({ ...metadataJson, image: imageHash, uid: subFolder })\n )\n );\n\n return { data: { jsonHash, imageHash }, status: "success" };\n }\n\n static async uploadFileToUserVault(\n userDid: string,\n file: Blob,\n path?: string\n ): Promise<HiveFileResponse> {\n console.log("uploadFileToUserVault", { userDid, file });\n const helper = new HiveFileHelper(resolverURLs[20], APP_DID);\n const fileService = (\n await helper.getVaultServices(userDid)\n ).getFilesService();\n\n const fileName = uid();\n const imagePath = `${path || "elacity/ai"}/${fileName}`;\n const buffer = await file.arrayBuffer();\n await fileService.upload(imagePath, Buffer.from(buffer));\n\n return {\n path: imagePath,\n content: new Uint8Array(buffer),\n };\n }\n\n static async uploadByURLToUserVault(\n userDid: string,\n url: string,\n path?: string\n ): Promise<HiveFileResponse> {\n const response = await fetch(url, { method: "GET" });\n\n return HiveFileHelper.uploadFileToUserVault(\n userDid,\n await response.blob(),\n path\n );\n }\n\n static async listAssets(\n userDid: string,\n path?: string\n ): Promise<HiveFileResponse[]> {\n const helper = new HiveFileHelper(resolverURLs[20], APP_DID);\n const fileService = (\n await helper.getVaultServices(userDid)\n ).getFilesService();\n\n const files: FileInfo[] = await fileService.list(path || "elacity/ai");\n\n return promiseAllStepN(\n 20,\n files.map((file) => async () => {\n const content: Uint8Array = await fileService.download(file.getName());\n return {\n url: URL.createObjectURL(\n new Blob([content.buffer], { type: "image/png" })\n ),\n path: file.getName(),\n content,\n };\n })\n );\n }\n\n static fetchAssets(\n userDid: string,\n { offset = 0, limit = Infinity, path, reverse }: FileQuery\n ): Waitable<CollectionOf<HiveFileResponse>> {\n return new Waitable(async (w: Waiter<CollectionOf<HiveFileResponse>>) => {\n const helper = new HiveFileHelper(resolverURLs[20], APP_DID);\n const fileService = (\n await helper.getVaultServices(userDid)\n ).getFilesService();\n\n let files: FileInfo[] = await fileService.list(path || "elacity/ai");\n w.emit("count", files.length);
1\n\n const result = {\n total: files.length,\n offset: offset || 0,\n limit: limit || Infinity,\n };\n\n if (files.length === 0) {\n w.emit("result", {\n ...result,\n items: [],\n isLast: true,\n });\n\n return {\n ...result,\n isLast: true,\n items: [],\n };\n }\n\n if (reverse) {\n files = files.reverse();\n }\n\n const items = (await promiseAllStepN)<HiveFileResponse>(\n 10,\n files.slice(offset, offset + limit).map((file, index) => async () => {\n const content: Uint8Array = await fileService.download(\n file.getName()\n );\n const response = {\n url: URL.createObjectURL(\n new Blob([content.buffer], { type: "image/png" })\n ),\n path: file.getName(),\n content,\n };\n\n w.emit("file", { ...response, index });\n\n return response;\n })\n );\n\n w.emit("result", {\n ...result,\n items,\n isLast: files.length === offset + items.length,\n });\n\n return {\n ...result,\n items,\n isLast: files.length === offset + items.length,\n };\n });\n }\n\n static async removeFile(userDid: string, fullpath?: string): Promise<void> {\n console.log("removeFile", { userDid, fullpath });\n const helper = new HiveFileHelper(resolverURLs[20], APP_DID);\n const fileService = (\n await helper.getVaultServices(userDid)\n ).getFilesService();\n\n return fileService.delete(fullpath);\n }\n}\n')),(0,s.kt)("admonition",{type:"info"},(0,s.kt)("p",{parentName:"admonition"},"A full Hive sample application built using Angular & Ionic is available at ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/elastos/Elastos.Hive.JS.SDK/tree/master/samples/ionic"},"https://github.com/elastos/Elastos.Hive.JS.SDK/tree/master/samples/ionic"),".")))}d.isMDXComponent=!0}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.