1 line
9.4 KiB
JavaScript
1 line
9.4 KiB
JavaScript
"use strict";(self.webpackChunkcanine_docs=self.webpackChunkcanine_docs||[]).push([[2127],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>f});var n=a(7294);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function r(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){l(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,n,l=function(e,t){if(null==e)return{};var a,n,l={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(l[a]=e[a]);return l}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(l[a]=e[a])}return l}var s=n.createContext({}),c=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},d=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,l=e.mdxType,o=e.originalType,s=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),p=c(a),m=l,f=p["".concat(s,".").concat(m)]||p[m]||u[m]||o;return a?n.createElement(f,r(r({ref:t},d),{},{components:a})):n.createElement(f,r({ref:t},d))}));function f(e,t){var a=arguments,l=t&&t.mdxType;if("string"==typeof e||l){var o=a.length,r=new Array(o);r[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i[p]="string"==typeof e?e:l,r[1]=i;for(var c=2;c<o;c++)r[c]=a[c];return n.createElement.apply(null,r)}return n.createElement.apply(null,a)}m.displayName="MDXCreateElement"},9526:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=a(7462),l=(a(7294),a(3905));const o={sidebar_position:4},r="Jackal.nodejs",i={unversionedId:"developers/dAppLibraries/jackal_nodejs",id:"developers/dAppLibraries/jackal_nodejs",title:"Jackal.nodejs",description:"Quickstart",source:"@site/docs/developers/dAppLibraries/4_jackal_nodejs.md",sourceDirName:"developers/dAppLibraries",slug:"/developers/dAppLibraries/jackal_nodejs",permalink:"/docs/developers/dAppLibraries/jackal_nodejs",draft:!1,editUrl:"https://github.com/JackalLabs/canine-docs/blob/master/docs/developers/dAppLibraries/4_jackal_nodejs.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Jackal.js",permalink:"/docs/developers/dAppLibraries/jackal_js"},next:{title:"Jackal.go",permalink:"/docs/developers/dAppLibraries/jackal_go"}},s={},c=[{value:"Quickstart",id:"quickstart",level:2},{value:"Demo",id:"demo",level:3},{value:"Pre-requesites",id:"pre-requesites",level:3},{value:"Setting Up",id:"setting-up",level:3},{value:"Wallet Instantiation",id:"wallet-instantiation",level:4},{value:"Buying Storage Space",id:"buying-storage-space",level:3},{value:"Creating a Root Folder",id:"creating-a-root-folder",level:3},{value:"Creating a Child Folder",id:"creating-a-child-folder",level:3},{value:"Uploading a File",id:"uploading-a-file",level:3},{value:"Downloading a File",id:"downloading-a-file",level:3}],d={toc:c},p="wrapper";function u(e){let{components:t,...a}=e;return(0,l.kt)(p,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"jackalnodejs"},"Jackal.nodejs"),(0,l.kt)("h2",{id:"quickstart"},"Quickstart"),(0,l.kt)("h3",{id:"demo"},"Demo"),(0,l.kt)("p",null,"A working demo repo can be found ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/JackalLabs/pup-demo"},"on GitHub"),"."),(0,l.kt)("h3",{id:"pre-requesites"},"Pre-requesites"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Nodejs v20+"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://www.npmjs.com/package/@jackallabs/jackal.nodejs"},"Jackal.nodejs")),(0,l.kt)("li",{parentName:"ul"},"Wallet Mnemonic")),(0,l.kt)("h3",{id:"setting-up"},"Setting Up"),(0,l.kt)("p",null,"Install dependencies:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-shell"},"npm install @jackallabs/jackal.nodejs\nnpm install -D @types/node typescript tscpaths\n")),(0,l.kt)("p",null,"Jackal.js requires Node v20+. The easiest way to manage this is\nwith ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/nvm-sh/nvm#installing-and-updating"},"NVM"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-shell"},"nvm use 20\n")),(0,l.kt)("h4",{id:"wallet-instantiation"},"Wallet Instantiation"),(0,l.kt)("p",null,"Jackal.nodejs does not use a traditional wallet like Jackal.js. Instead, ",(0,l.kt)("inlineCode",{parentName:"p"},"MnemonicWallet.create(mnemonic)")," is used for\nwallet instantiation."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-js"},"const appConfig = {\n signerChain: 'lupulella-2',\n queryAddr: 'https://testnet-grpc.jackalprotocol.com',\n txAddr: 'https://testnet-rpc.jackalprotocol.com'\n}\n\nconst m = await MnemonicWallet.create(mnemonic)\n\n// Hooking up the wallet to your app\nconst w = await WalletHandler.trackWallet(appConfig, m)\n")),(0,l.kt)("p",null,"Additionally, a query-only mode for the wallet can get accessed via the following:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-js"},"const wallet = await WalletHandler.trackQueryWallet('https://testnet-grpc.jackalprotocol.com') // Use the gRPC-web address of your choice\n")),(0,l.kt)("h3",{id:"buying-storage-space"},"Buying Storage Space"),(0,l.kt)("p",null,"Every account that wishes to use the Jackal Protocol to store data needs to have a paid storage account.\nThis means giving the protocol $8 USD per month per tb. We can do this with Jackal.js!"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-js"},"const storage = await StorageHandler.trackStorage(wallet)\n\n// (Wallet address)\n// duration in months (min 1)\n// space in terabytes (min .001)\n// 2 TB for 1 year:\nawait storage.buyStorage(WALLET_ADDRESS, 12, 2)\n")),(0,l.kt)("h3",{id:"creating-a-root-folder"},"Creating a Root Folder"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-js"},"const minimumProviderVersion = '1.0.9'\nconst fileIo = await FileIo.trackIo(wallet, minimumProviderVersion)\n\nconst listOfRootFolders = [\"Home\", ...]\n// you can create as many root folders as you would like this way. Home is the Jackal Dashboard default root directory.\n// The first time a user connects, they must init the system\nconst storage = await StorageHandler.trackStorage(wallet)\nconst msg = storage.makeStorageInitMsg()\nawait fileIo.generateInitialDirs(msg, listOfRootFolders)\n\n// after the first time, this code can be used instead. this will only create new root folders if they don't already exist\nconst newFolderCount = await fileIo.verifyFoldersExist(listOfRootFolders)\n")),(0,l.kt)("h3",{id:"creating-a-child-folder"},"Creating a Child Folder"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-js"},'const fileIo = await FileIo.trackIo(wallet)\nconst parentFolderPath = PARENT_FOLDER_NAME_AND_PATH // for example Dashboard\'s root folder path is s/Home\nconst parent = await fileIo.downloadFolder(parentFolderPath)\nconst listOfChildFolders = ["Movies", "Pictures", ...]\nawait fileIo.createFolders(parent, listOfChildFolders)\n')),(0,l.kt)("h3",{id:"uploading-a-file"},"Uploading a File"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-js"},"const fileIo = await FileIo.trackIo(wallet)\n\nconst parentFolderPath = PARENT_FOLDER_NAME_AND_PATH // for example Dashboard's root folder path is s/Home\nconst parent = await fileIo.downloadFolder(parentFolderPath)\n\nconst file = FILE_OBJECT // this MUST be an instance of File() that is in the browser memory\nconst fileName = file.name\nconst handler = await FileUploadHandler.trackFile(file, parentFolderPath)\n\nconst uploadList = {}\nuploadList[fileName] = {\n data: null,\n exists: false,\n handler: handler,\n key: fileName,\n uploadable: await handler.getForUpload()\n}\n\nawait fileIo.staggeredUploadFiles(uploadList, parent, {counter: 0, complete: 0})\n")),(0,l.kt)("h3",{id:"downloading-a-file"},"Downloading a File"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-js"},"const fileIo = await FileIo.trackIo(wallet)\n\n/* optional */\nconst parentFolderPath = PARENT_FOLDER_NAME_AND_PATH // for example Dashboard's root folder path is s/Home\nconst parent = await fileIo.downloadFolder(parentFolderPath)\nconst childrenFiles = parent.getChildFiles()\nconst pathOfFirstChild = parent.getMyChildPath(childrenFiles[0].name)\n/* end optional */\n\nconst downloadDetails = {\n rawPath: FILE_PATH, // manual complete file path OR pathOfFirstChild\n owner: OWNER_ADDRESS, // JKL address of file owner\n isFolder: false\n}\n\nconst fileHanlder = await fileIo.downloadFile(downloadDetails, { track: 0 })\n\nconst file = fileHanlder.receiveBacon()\n// do what you want with the File object returned by receiveBacon\n")))}u.isMDXComponent=!0}}]); |