@taqueria/plugin-ipfs-pinata 0.24.2 → 0.25.3-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -248,17 +248,17 @@ const $e26bf59b4820ce36$var$publishToIpfs = async (fileOrDirPath, auth)=>{
248
248
  render: "table",
249
249
  data: [
250
250
  ...result.failures.map((x)=>({
251
- "?": "\u274C",
251
+ "?": "",
252
252
  filePath: x.filePath,
253
253
  ipfsHash: undefined,
254
254
  error: x.error?.message ?? JSON.stringify(x.error)
255
255
  })),
256
256
  ...result.successes.map((x)=>({
257
- "?": "\u2714",
257
+ "?": "",
258
258
  filePath: x.filePath,
259
259
  ipfsHash: x.result.ipfsHash,
260
260
  error: undefined
261
- })),
261
+ }))
262
262
  ]
263
263
  };
264
264
  };
@@ -278,7 +278,7 @@ const $e26bf59b4820ce36$var$pinToIpfs = async (hash, auth)=>{
278
278
  };
279
279
  };
280
280
  const $e26bf59b4820ce36$var$execute = async (opts)=>{
281
- const { task: task , path: path , hash: hash , config: config , } = opts;
281
+ const { task: task , path: path , hash: hash } = opts;
282
282
  const auth = {
283
283
  // TODO: Where should this be stored?
284
284
  // pinataJwtToken: (config as Record<string, any>).credentials.pinataJwtToken,
@@ -325,7 +325,7 @@ var $e26bf59b4820ce36$export$2e2bcd8739ae039 = async (args)=>{
325
325
  placeholder: "path",
326
326
  description: "Directory or file path to publish",
327
327
  type: "string"
328
- }),
328
+ })
329
329
  ],
330
330
  encoding: "json"
331
331
  }),
@@ -340,9 +340,9 @@ var $e26bf59b4820ce36$export$2e2bcd8739ae039 = async (args)=>{
340
340
  placeholder: "hash",
341
341
  description: "Ipfs hash of the file or directory that is already on the ipfs network.",
342
342
  type: "string"
343
- }),
343
+ })
344
344
  ]
345
- }),
345
+ })
346
346
  ],
347
347
  proxy: $e26bf59b4820ce36$export$2e2bcd8739ae039
348
348
  }), process.argv);
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"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","sources":["taqueria-plugin-ipfs-pinata/index.ts","taqueria-plugin-ipfs-pinata/src/proxy.ts","taqueria-plugin-ipfs-pinata/src/file-processing.ts","taqueria-plugin-ipfs-pinata/src/pinata-api.ts","taqueria-plugin-ipfs-pinata/src/utils.ts"],"sourcesContent":["import { Option, Plugin, PositionalArg, Task } from '@taqueria/node-sdk';\nimport proxy from './src/proxy';\n\nPlugin.create(() => ({\n\tschema: '0.1',\n\tversion: '0.4.0',\n\talias: 'pinata',\n\ttasks: [\n\t\tTask.create({\n\t\t\ttask: 'publish',\n\t\t\tcommand: 'publish [path]',\n\t\t\tdescription: 'Upload and pin files using your pinata account.',\n\t\t\taliases: [],\n\t\t\thandler: 'proxy',\n\t\t\tpositionals: [\n\t\t\t\tPositionalArg.create({\n\t\t\t\t\tplaceholder: 'path',\n\t\t\t\t\tdescription: 'Directory or file path to publish',\n\t\t\t\t\ttype: 'string',\n\t\t\t\t}),\n\t\t\t],\n\t\t\tencoding: 'json',\n\t\t}),\n\t\tTask.create({\n\t\t\ttask: 'pin',\n\t\t\tcommand: 'pin [hash]',\n\t\t\tdescription: 'Pin a file already on ipfs with your pinata account.',\n\t\t\taliases: [],\n\t\t\thandler: 'proxy',\n\t\t\tpositionals: [\n\t\t\t\tPositionalArg.create({\n\t\t\t\t\tplaceholder: 'hash',\n\t\t\t\t\tdescription: 'Ipfs hash of the file or directory that is already on the ipfs network.',\n\t\t\t\t\ttype: 'string',\n\t\t\t\t}),\n\t\t\t],\n\t\t}),\n\t],\n\tproxy,\n}), process.argv);\n","import { sendAsyncErr, sendAsyncRes, sendErr, sendJsonRes } from '@taqueria/node-sdk';\nimport { LoadedConfig, RequestArgs, SanitizedAbsPath } from '@taqueria/node-sdk/types';\nimport path from 'path';\nimport { processFiles } from './file-processing';\nimport { PinataAuth, pinHash, publishFileToIpfs } from './pinata-api';\nimport { createProcessBackoffController } from './utils';\n\n// Load .env for jwt token\n// TODO: How should this be stored in a secure way?\nimport 'dotenv/config';\n\n// TODO: What should this be, it was removed from the sdk\ntype PluginResponse =\n\t| void\n\t| {\n\t\trender: 'table';\n\t\tdata: unknown[];\n\t};\n\ninterface Opts extends RequestArgs.ProxyRequestArgs {\n\treadonly path?: string;\n\treadonly hash?: string;\n}\n\nconst publishToIpfs = async (fileOrDirPath: undefined | string, auth: PinataAuth): Promise<PluginResponse> => {\n\tif (!fileOrDirPath) {\n\t\tthrow new Error(`path was not provided`);\n\t}\n\n\t// Pinata is limited to 180 requests per minute\n\t// So for the first 180 requests they can go fast\n\n\tconst { processWithBackoff } = createProcessBackoffController({\n\t\tretryCount: 5,\n\t\ttargetRequestsPerMinute: 180,\n\t});\n\n\tconst result = await processFiles({\n\t\tfileOrDirPath,\n\t\tparallelCount: 10,\n\t\tprocessFile: async filePath => {\n\t\t\t// // TEMP: Debug\n\t\t\t// console.log(`publishing: ${filePath}`);\n\n\t\t\treturn processWithBackoff(() =>\n\t\t\t\tpublishFileToIpfs({\n\t\t\t\t\tauth,\n\t\t\t\t\titem: { filePath, name: path.basename(filePath) },\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tonProgress: ({ processedFilesCount, estimateFileCount }) => {\n\t\t\tif (estimateFileCount && processedFilesCount % 10) {\n\t\t\t\tlet ratio = processedFilesCount / estimateFileCount;\n\t\t\t\tif (ratio > 1) ratio = 1;\n\n\t\t\t\t// // TODO: Call task sdk progress\n\t\t\t\t// console.log(`Progress: ${(ratio * 100).toFixed(0)}%`);\n\t\t\t}\n\t\t},\n\t});\n\n\t// // TEMP: DEBUG: Show error\n\t// if (result.failures.length) {\n\t// \tconsole.log('❗ Failures:\\n' + result.failures.map(f => `${f.filePath}: ${f.error}`).join('\\n'));\n\t// }\n\n\treturn {\n\t\trender: 'table',\n\t\tdata: [\n\t\t\t...result.failures.map(x => ({\n\t\t\t\t'?': '❌',\n\t\t\t\tfilePath: x.filePath,\n\t\t\t\tipfsHash: undefined,\n\t\t\t\terror: (x.error as { message?: string })?.message ?? JSON.stringify(x.error),\n\t\t\t})),\n\t\t\t...result.successes.map(x => ({\n\t\t\t\t'?': '✔',\n\t\t\t\tfilePath: x.filePath,\n\t\t\t\tipfsHash: x.result.ipfsHash,\n\t\t\t\terror: undefined,\n\t\t\t})),\n\t\t],\n\t};\n};\n\nconst pinToIpfs = async (hash: undefined | string, auth: PinataAuth): Promise<PluginResponse> => {\n\tif (!hash) {\n\t\tthrow new Error(`ipfs hash was not provided`);\n\t}\n\n\tawait pinHash({ ipfsHash: hash, auth });\n\n\treturn {\n\t\trender: 'table',\n\t\tdata: [{ ipfsHash: hash }],\n\t};\n};\n\nconst execute = async (opts: Opts): Promise<PluginResponse> => {\n\tconst {\n\t\ttask,\n\t\tpath,\n\t\thash,\n\t\tconfig,\n\t} = opts;\n\n\tconst auth: PinataAuth = {\n\t\t// TODO: Where should this be stored?\n\t\t// pinataJwtToken: (config as Record<string, any>).credentials.pinataJwtToken,\n\t\tpinataJwtToken: process.env['pinataJwtToken'] as string,\n\t};\n\n\tif (!auth.pinataJwtToken) {\n\t\tthrow new Error(`The 'credentials.pinataJwtToken' was not found in config`);\n\t}\n\n\tswitch (task) {\n\t\tcase 'publish':\n\t\t\treturn publishToIpfs(path, auth);\n\t\tcase 'pin':\n\t\t\treturn pinToIpfs(hash, auth);\n\t\tdefault:\n\t\t\tthrow new Error(`${task} is not an understood task by the ipfs-pinata plugin`);\n\t}\n};\n\nexport default async (args: RequestArgs.ProxyRequestArgs): Promise<PluginResponse> => {\n\tconst opts = args as Opts;\n\n\ttry {\n\t\tconst resultRaw = await execute(opts) as Record<string, unknown>;\n\t\t// TODO: Fix deno parsing\n\t\t// Without this, `data.reduce is not a function`\n\t\tconst result = ('data' in resultRaw) ? resultRaw.data : resultRaw;\n\t\treturn sendJsonRes(result);\n\t} catch (err) {\n\t\tconst error = err as Error;\n\t\tif (error.message) {\n\t\t\treturn sendAsyncErr(error.message);\n\t\t}\n\t}\n};\n","import fs from 'fs/promises';\nimport path from 'path';\n\n// Async generator\n// https://stackoverflow.com/questions/5827612/node-js-fs-readdir-recursive-directory-search\nasync function* getFiles(fileOrDirPath: string): AsyncGenerator<string, void, unknown> {\n\tconst dirInfo = await fs.stat(fileOrDirPath);\n\tif (dirInfo.isFile()) {\n\t\tyield fileOrDirPath;\n\t\treturn;\n\t}\n\n\tconst dirents = await fs.readdir(fileOrDirPath, { withFileTypes: true });\n\tfor (const dirent of dirents) {\n\t\tconst res = path.resolve(fileOrDirPath, dirent.name);\n\t\tif (dirent.isDirectory()) {\n\t\t\tyield* getFiles(res);\n\t\t} else {\n\t\t\tyield res;\n\t\t}\n\t}\n}\n\nconst createFileProvider = async ({\n\tfileOrDirPath,\n\tfilter,\n\tshouldEstimateFileCount,\n}: {\n\tfileOrDirPath: string;\n\tfilter?: (filePath: string) => boolean;\n\tshouldEstimateFileCount?: boolean;\n}) => {\n\tfileOrDirPath = path.resolve(fileOrDirPath);\n\tconst pathInfo = await fs.stat(fileOrDirPath);\n\tif (\n\t\t!pathInfo.isFile()\n\t\t&& !pathInfo.isDirectory()\n\t) {\n\t\tthrow new Error(`The path '${fileOrDirPath}' is not a file or directory`);\n\t}\n\n\tlet estimateFileCount = undefined as undefined | number;\n\tif (shouldEstimateFileCount) {\n\t\testimateFileCount = 0;\n\t\tfor await (const filePath of getFiles(fileOrDirPath)) {\n\t\t\tif (filter && !filter(filePath)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\testimateFileCount++;\n\t\t}\n\t}\n\n\tconst fileGenerator = getFiles(fileOrDirPath);\n\tconst getNextFile = async () => {\n\t\tlet nextFile = (await fileGenerator.next()).value;\n\t\tif (!filter) {\n\t\t\treturn nextFile;\n\t\t}\n\n\t\twhile (nextFile && !filter(nextFile)) {\n\t\t\tnextFile = await getNextFile();\n\t\t}\n\n\t\treturn nextFile;\n\t};\n\treturn {\n\t\tgetNextFile,\n\t\testimateFileCount,\n\t};\n};\n\ntype ProgressInfo = { processedFilesCount: number; estimateFileCount: undefined | number };\nexport const processFiles = async <TResult>({\n\tfileOrDirPath,\n\tprocessFile,\n\tfilter,\n\tparallelCount = 10,\n\tonProgress,\n}: {\n\tfileOrDirPath: string;\n\tprocessFile: (filePath: string, progress: ProgressInfo) => Promise<TResult>;\n\tfilter?: (filePath: string) => boolean;\n\tparallelCount?: number;\n\tonProgress?: (progress: ProgressInfo) => void;\n}) => {\n\tconst { getNextFile, estimateFileCount } = await createFileProvider({\n\t\tfileOrDirPath,\n\t\tfilter,\n\t\tshouldEstimateFileCount: true,\n\t});\n\n\tconst successes = [] as { filePath: string; result: TResult }[];\n\tconst failures = [] as { filePath: string; error: unknown }[];\n\n\tonProgress?.({\n\t\tprocessedFilesCount: 0,\n\t\testimateFileCount,\n\t});\n\n\tawait Promise.all([...new Array(parallelCount)].map(async x => {\n\t\tlet fileToProcess = await getNextFile();\n\t\twhile (fileToProcess) {\n\t\t\tconst progressInfo = {\n\t\t\t\tprocessedFilesCount: successes.length + failures.length,\n\t\t\t\testimateFileCount,\n\t\t\t};\n\t\t\tonProgress?.(progressInfo);\n\n\t\t\ttry {\n\t\t\t\tconst result = await processFile(fileToProcess, progressInfo);\n\t\t\t\tsuccesses.push({ filePath: fileToProcess, result });\n\t\t\t} catch (err) {\n\t\t\t\tfailures.push({ filePath: fileToProcess, error: err });\n\t\t\t}\n\n\t\t\tfileToProcess = await getNextFile();\n\t\t}\n\t}));\n\n\tonProgress?.({\n\t\tprocessedFilesCount: successes.length + failures.length,\n\t\testimateFileCount,\n\t});\n\n\treturn {\n\t\tsuccesses,\n\t\tfailures,\n\t};\n};\n","import FormData from 'form-data';\nimport fs from 'fs';\nimport Hash from 'ipfs-only-hash';\nimport fetch from 'node-fetch';\n\nexport type PinataAuth = {\n\tpinataJwtToken: string;\n};\n\nexport type PublishFileResult = {\n\tipfsHash: string;\n};\n\nexport const publishFileToIpfs = async ({\n\tauth,\n\titem,\n}: {\n\tauth: PinataAuth;\n\titem: {\n\t\tname: string;\n\t\tfilePath: string;\n\t};\n}): Promise<PublishFileResult> => {\n\t// The data api to check for existing file is limited to 30 requests per minute\n\t// While uploading allows 180 requests per minute\n\t// i.e. it's faster to just upload again\n\n\t// // Skip if already pinned\n\t// const { isPinned, ipfsHash } = await checkIfFileIsPinned({ auth, item });\n\t// if (isPinned) {\n\t// \treturn {\n\t// \t\tipfsHash,\n\t// \t};\n\t// }\n\n\tconst data = new FormData();\n\tdata.append('file', fs.createReadStream(item.filePath));\n\tdata.append(\n\t\t'pinataMetadata',\n\t\tJSON.stringify({\n\t\t\tname: item.name,\n\t\t}),\n\t);\n\n\tconst response = await fetch(`https://api.pinata.cloud/pinning/pinFileToIPFS`, {\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${auth.pinataJwtToken}`,\n\t\t\t'Content-Type': `multipart/form-data; boundary=${(data as unknown as { _boundary: string })._boundary}`,\n\t\t},\n\t\tbody: data,\n\t\tmethod: 'post',\n\t});\n\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to upload '${item.name}' to ipfs ${response.statusText}`);\n\t}\n\n\tconst uploadResult = await response.json() as {\n\t\tIpfsHash: string; // This is the IPFS multi-hash provided back for your content,\n\t\tPinSize: string; // This is how large (in bytes) the content you just pinned is,\n\t\tTimestamp: string; // This is the timestamp for your content pinning (represented in ISO 8601 format)\n\t};\n\n\treturn {\n\t\tipfsHash: uploadResult.IpfsHash,\n\t};\n};\n\nconst checkIfFileIsPinned = async ({\n\tauth,\n\titem,\n}: {\n\tauth: PinataAuth;\n\titem: {\n\t\tname: string;\n\t\tfilePath: string;\n\t};\n}) => {\n\tconst ipfsHash = await Hash.of(fs.createReadStream(item.filePath));\n\n\tconst response = await fetch(`https://api.pinata.cloud/data/pinList?status=pinned&hashContains=${ipfsHash}`, {\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${auth.pinataJwtToken}`,\n\t\t},\n\t\tmethod: 'get',\n\t});\n\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to query '${item.name}' status from pinata ${response.statusText}`);\n\t}\n\n\tconst pinResult = await response.json() as {\n\t\tcount: number;\n\t\trows: {\n\t\t\tid: string;\n\t\t\tipfs_pin_hash: string;\n\t\t\tsize: number;\n\t\t\tuser_id: string;\n\t\t\tdate_pinned: null | string;\n\t\t\tdate_unpinned: null | string;\n\t\t\tmetadata: {\n\t\t\t\tname: string;\n\t\t\t\tkeyvalues: null | string;\n\t\t\t};\n\t\t\tregions: {\n\t\t\t\tregionId: string;\n\t\t\t\tcurrentReplicationCount: number;\n\t\t\t\tdesiredReplicationCount: number;\n\t\t\t}[];\n\t\t}[];\n\t};\n\n\tconst isPinned = pinResult.rows.some(x =>\n\t\tx.ipfs_pin_hash === ipfsHash\n\t\t&& x.date_pinned\n\t\t&& !x.date_unpinned\n\t);\n\n\treturn {\n\t\tisPinned,\n\t\tipfsHash,\n\t};\n};\n\nexport const pinHash = async ({\n\tauth,\n\tipfsHash,\n}: {\n\tauth: PinataAuth;\n\tipfsHash: string;\n}) => {\n\tconst response = await fetch(`https://api.pinata.cloud/pinning/pinByHash`, {\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${auth.pinataJwtToken}`,\n\t\t\t'Content-Type': 'application/json',\n\t\t},\n\t\tmethod: 'post',\n\t\tbody: JSON.stringify({\n\t\t\thashToPin: ipfsHash,\n\t\t}),\n\t});\n\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to pin '${ipfsHash}' with pinata: ${response.statusText}`);\n\t}\n\n\t// Ok is the only response if successful\n\treturn;\n};\n","export async function delay(timeout: number): Promise<void> {\n\treturn await new Promise(resolve => {\n\t\tsetTimeout(resolve, timeout);\n\t});\n}\n\nexport const createProcessBackoffController = ({\n\tretryCount = 5,\n\ttargetRequestsPerMinute = 180,\n}: {\n\tretryCount?: number;\n\ttargetRequestsPerMinute?: number;\n}) => {\n\tlet averageTimePerRequest = 5000;\n\tlet targetTimePerRequest = 60000 / targetRequestsPerMinute;\n\tlet lastTime = Date.now();\n\n\tconst processWithBackoff = async <TResult>(process: () => Promise<TResult>) => {\n\t\tlet attempt = 0;\n\t\tlet lastError = undefined as unknown;\n\t\twhile (attempt < retryCount) {\n\t\t\ttry {\n\t\t\t\tlet delayTimeMs = Math.max(10, targetTimePerRequest - averageTimePerRequest);\n\n\t\t\t\t// Partially randomized delay to ensure parallel requests don't line up\n\t\t\t\tawait delay(Math.floor(delayTimeMs * (1 + 0.5 * Math.random())));\n\n\t\t\t\tconst result = await process();\n\n\t\t\t\tconst timeNow = Date.now();\n\t\t\t\tconst timeElapsed = timeNow - lastTime;\n\t\t\t\tlastTime = timeNow;\n\n\t\t\t\t// Running average\n\t\t\t\taverageTimePerRequest = averageTimePerRequest * 0.97 + timeElapsed * 0.03;\n\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tlastError = err;\n\t\t\t}\n\n\t\t\t// Quickly increase time to wait if failure (allow negatives to wait longer than target)\n\t\t\taverageTimePerRequest -= (attempt + 1) * 1000;\n\t\t\tattempt++;\n\t\t}\n\n\t\t// All attempts failed\n\t\tthrow lastError;\n\t};\n\n\treturn {\n\t\tprocessWithBackoff,\n\t};\n};\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"}
1
+ {"mappings":"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","sources":["taqueria-plugin-ipfs-pinata/index.ts","taqueria-plugin-ipfs-pinata/src/proxy.ts","taqueria-plugin-ipfs-pinata/src/file-processing.ts","taqueria-plugin-ipfs-pinata/src/pinata-api.ts","taqueria-plugin-ipfs-pinata/src/utils.ts"],"sourcesContent":["import { Option, Plugin, PositionalArg, Task } from '@taqueria/node-sdk';\nimport proxy from './src/proxy';\n\nPlugin.create(() => ({\n\tschema: '0.1',\n\tversion: '0.4.0',\n\talias: 'pinata',\n\ttasks: [\n\t\tTask.create({\n\t\t\ttask: 'publish',\n\t\t\tcommand: 'publish [path]',\n\t\t\tdescription: 'Upload and pin files using your pinata account.',\n\t\t\taliases: [],\n\t\t\thandler: 'proxy',\n\t\t\tpositionals: [\n\t\t\t\tPositionalArg.create({\n\t\t\t\t\tplaceholder: 'path',\n\t\t\t\t\tdescription: 'Directory or file path to publish',\n\t\t\t\t\ttype: 'string',\n\t\t\t\t}),\n\t\t\t],\n\t\t\tencoding: 'json',\n\t\t}),\n\t\tTask.create({\n\t\t\ttask: 'pin',\n\t\t\tcommand: 'pin [hash]',\n\t\t\tdescription: 'Pin a file already on ipfs with your pinata account.',\n\t\t\taliases: [],\n\t\t\thandler: 'proxy',\n\t\t\tpositionals: [\n\t\t\t\tPositionalArg.create({\n\t\t\t\t\tplaceholder: 'hash',\n\t\t\t\t\tdescription: 'Ipfs hash of the file or directory that is already on the ipfs network.',\n\t\t\t\t\ttype: 'string',\n\t\t\t\t}),\n\t\t\t],\n\t\t}),\n\t],\n\tproxy,\n}), process.argv);\n","import { sendAsyncErr, sendAsyncRes, sendErr, sendJsonRes } from '@taqueria/node-sdk';\nimport { RequestArgs } from '@taqueria/node-sdk';\nimport { LoadedConfig, SanitizedAbsPath } from '@taqueria/node-sdk/types';\nimport path from 'path';\nimport { processFiles } from './file-processing';\nimport { PinataAuth, pinHash, publishFileToIpfs } from './pinata-api';\nimport { createProcessBackoffController } from './utils';\n\n// Load .env for jwt token\n// TODO: How should this be stored in a secure way?\nimport 'dotenv/config';\n\n// TODO: What should this be, it was removed from the sdk\ntype PluginResponse =\n\t| void\n\t| {\n\t\trender: 'table';\n\t\tdata: unknown[];\n\t};\n\ninterface Opts extends RequestArgs.t {\n\treadonly path?: string;\n\treadonly hash?: string;\n\treadonly task?: string;\n}\n\nconst publishToIpfs = async (fileOrDirPath: undefined | string, auth: PinataAuth): Promise<PluginResponse> => {\n\tif (!fileOrDirPath) {\n\t\tthrow new Error(`path was not provided`);\n\t}\n\n\t// Pinata is limited to 180 requests per minute\n\t// So for the first 180 requests they can go fast\n\n\tconst { processWithBackoff } = createProcessBackoffController({\n\t\tretryCount: 5,\n\t\ttargetRequestsPerMinute: 180,\n\t});\n\n\tconst result = await processFiles({\n\t\tfileOrDirPath,\n\t\tparallelCount: 10,\n\t\tprocessFile: async filePath => {\n\t\t\t// // TEMP: Debug\n\t\t\t// console.log(`publishing: ${filePath}`);\n\n\t\t\treturn processWithBackoff(() =>\n\t\t\t\tpublishFileToIpfs({\n\t\t\t\t\tauth,\n\t\t\t\t\titem: { filePath, name: path.basename(filePath) },\n\t\t\t\t})\n\t\t\t);\n\t\t},\n\t\tonProgress: ({ processedFilesCount, estimateFileCount }) => {\n\t\t\tif (estimateFileCount && processedFilesCount % 10) {\n\t\t\t\tlet ratio = processedFilesCount / estimateFileCount;\n\t\t\t\tif (ratio > 1) ratio = 1;\n\n\t\t\t\t// // TODO: Call task sdk progress\n\t\t\t\t// console.log(`Progress: ${(ratio * 100).toFixed(0)}%`);\n\t\t\t}\n\t\t},\n\t});\n\n\t// // TEMP: DEBUG: Show error\n\t// if (result.failures.length) {\n\t// \tconsole.log('❗ Failures:\\n' + result.failures.map(f => `${f.filePath}: ${f.error}`).join('\\n'));\n\t// }\n\n\treturn {\n\t\trender: 'table',\n\t\tdata: [\n\t\t\t...result.failures.map(x => ({\n\t\t\t\t'?': '❌',\n\t\t\t\tfilePath: x.filePath,\n\t\t\t\tipfsHash: undefined,\n\t\t\t\terror: (x.error as { message?: string })?.message ?? JSON.stringify(x.error),\n\t\t\t})),\n\t\t\t...result.successes.map(x => ({\n\t\t\t\t'?': '✔',\n\t\t\t\tfilePath: x.filePath,\n\t\t\t\tipfsHash: x.result.ipfsHash,\n\t\t\t\terror: undefined,\n\t\t\t})),\n\t\t],\n\t};\n};\n\nconst pinToIpfs = async (hash: undefined | string, auth: PinataAuth): Promise<PluginResponse> => {\n\tif (!hash) {\n\t\tthrow new Error(`ipfs hash was not provided`);\n\t}\n\n\tawait pinHash({ ipfsHash: hash, auth });\n\n\treturn {\n\t\trender: 'table',\n\t\tdata: [{ ipfsHash: hash }],\n\t};\n};\n\nconst execute = async (opts: Opts): Promise<PluginResponse> => {\n\tconst {\n\t\ttask,\n\t\tpath,\n\t\thash,\n\t} = opts;\n\n\tconst auth: PinataAuth = {\n\t\t// TODO: Where should this be stored?\n\t\t// pinataJwtToken: (config as Record<string, any>).credentials.pinataJwtToken,\n\t\tpinataJwtToken: process.env['pinataJwtToken'] as string,\n\t};\n\n\tif (!auth.pinataJwtToken) {\n\t\tthrow new Error(`The 'credentials.pinataJwtToken' was not found in config`);\n\t}\n\n\tswitch (task) {\n\t\tcase 'publish':\n\t\t\treturn publishToIpfs(path, auth);\n\t\tcase 'pin':\n\t\t\treturn pinToIpfs(hash, auth);\n\t\tdefault:\n\t\t\tthrow new Error(`${task} is not an understood task by the ipfs-pinata plugin`);\n\t}\n};\n\nexport default async (args: RequestArgs.t): Promise<PluginResponse> => {\n\tconst opts = args as Opts;\n\n\ttry {\n\t\tconst resultRaw = await execute(opts) as Record<string, unknown>;\n\t\t// TODO: Fix deno parsing\n\t\t// Without this, `data.reduce is not a function`\n\t\tconst result = ('data' in resultRaw) ? resultRaw.data : resultRaw;\n\t\treturn sendJsonRes(result);\n\t} catch (err) {\n\t\tconst error = err as Error;\n\t\tif (error.message) {\n\t\t\treturn sendAsyncErr(error.message);\n\t\t}\n\t}\n};\n","import fs from 'fs/promises';\nimport path from 'path';\n\n// Async generator\n// https://stackoverflow.com/questions/5827612/node-js-fs-readdir-recursive-directory-search\nasync function* getFiles(fileOrDirPath: string): AsyncGenerator<string, void, unknown> {\n\tconst dirInfo = await fs.stat(fileOrDirPath);\n\tif (dirInfo.isFile()) {\n\t\tyield fileOrDirPath;\n\t\treturn;\n\t}\n\n\tconst dirents = await fs.readdir(fileOrDirPath, { withFileTypes: true });\n\tfor (const dirent of dirents) {\n\t\tconst res = path.resolve(fileOrDirPath, dirent.name);\n\t\tif (dirent.isDirectory()) {\n\t\t\tyield* getFiles(res);\n\t\t} else {\n\t\t\tyield res;\n\t\t}\n\t}\n}\n\nconst createFileProvider = async ({\n\tfileOrDirPath,\n\tfilter,\n\tshouldEstimateFileCount,\n}: {\n\tfileOrDirPath: string;\n\tfilter?: (filePath: string) => boolean;\n\tshouldEstimateFileCount?: boolean;\n}) => {\n\tfileOrDirPath = path.resolve(fileOrDirPath);\n\tconst pathInfo = await fs.stat(fileOrDirPath);\n\tif (\n\t\t!pathInfo.isFile()\n\t\t&& !pathInfo.isDirectory()\n\t) {\n\t\tthrow new Error(`The path '${fileOrDirPath}' is not a file or directory`);\n\t}\n\n\tlet estimateFileCount = undefined as undefined | number;\n\tif (shouldEstimateFileCount) {\n\t\testimateFileCount = 0;\n\t\tfor await (const filePath of getFiles(fileOrDirPath)) {\n\t\t\tif (filter && !filter(filePath)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\testimateFileCount++;\n\t\t}\n\t}\n\n\tconst fileGenerator = getFiles(fileOrDirPath);\n\tconst getNextFile = async () => {\n\t\tlet nextFile = (await fileGenerator.next()).value;\n\t\tif (!filter) {\n\t\t\treturn nextFile;\n\t\t}\n\n\t\twhile (nextFile && !filter(nextFile)) {\n\t\t\tnextFile = await getNextFile();\n\t\t}\n\n\t\treturn nextFile;\n\t};\n\treturn {\n\t\tgetNextFile,\n\t\testimateFileCount,\n\t};\n};\n\ntype ProgressInfo = { processedFilesCount: number; estimateFileCount: undefined | number };\nexport const processFiles = async <TResult>({\n\tfileOrDirPath,\n\tprocessFile,\n\tfilter,\n\tparallelCount = 10,\n\tonProgress,\n}: {\n\tfileOrDirPath: string;\n\tprocessFile: (filePath: string, progress: ProgressInfo) => Promise<TResult>;\n\tfilter?: (filePath: string) => boolean;\n\tparallelCount?: number;\n\tonProgress?: (progress: ProgressInfo) => void;\n}) => {\n\tconst { getNextFile, estimateFileCount } = await createFileProvider({\n\t\tfileOrDirPath,\n\t\tfilter,\n\t\tshouldEstimateFileCount: true,\n\t});\n\n\tconst successes = [] as { filePath: string; result: TResult }[];\n\tconst failures = [] as { filePath: string; error: unknown }[];\n\n\tonProgress?.({\n\t\tprocessedFilesCount: 0,\n\t\testimateFileCount,\n\t});\n\n\tawait Promise.all([...new Array(parallelCount)].map(async x => {\n\t\tlet fileToProcess = await getNextFile();\n\t\twhile (fileToProcess) {\n\t\t\tconst progressInfo = {\n\t\t\t\tprocessedFilesCount: successes.length + failures.length,\n\t\t\t\testimateFileCount,\n\t\t\t};\n\t\t\tonProgress?.(progressInfo);\n\n\t\t\ttry {\n\t\t\t\tconst result = await processFile(fileToProcess, progressInfo);\n\t\t\t\tsuccesses.push({ filePath: fileToProcess, result });\n\t\t\t} catch (err) {\n\t\t\t\tfailures.push({ filePath: fileToProcess, error: err });\n\t\t\t}\n\n\t\t\tfileToProcess = await getNextFile();\n\t\t}\n\t}));\n\n\tonProgress?.({\n\t\tprocessedFilesCount: successes.length + failures.length,\n\t\testimateFileCount,\n\t});\n\n\treturn {\n\t\tsuccesses,\n\t\tfailures,\n\t};\n};\n","import FormData from 'form-data';\nimport fs from 'fs';\nimport Hash from 'ipfs-only-hash';\nimport fetch from 'node-fetch';\n\nexport type PinataAuth = {\n\tpinataJwtToken: string;\n};\n\nexport type PublishFileResult = {\n\tipfsHash: string;\n};\n\nexport const publishFileToIpfs = async ({\n\tauth,\n\titem,\n}: {\n\tauth: PinataAuth;\n\titem: {\n\t\tname: string;\n\t\tfilePath: string;\n\t};\n}): Promise<PublishFileResult> => {\n\t// The data api to check for existing file is limited to 30 requests per minute\n\t// While uploading allows 180 requests per minute\n\t// i.e. it's faster to just upload again\n\n\t// // Skip if already pinned\n\t// const { isPinned, ipfsHash } = await checkIfFileIsPinned({ auth, item });\n\t// if (isPinned) {\n\t// \treturn {\n\t// \t\tipfsHash,\n\t// \t};\n\t// }\n\n\tconst data = new FormData();\n\tdata.append('file', fs.createReadStream(item.filePath));\n\tdata.append(\n\t\t'pinataMetadata',\n\t\tJSON.stringify({\n\t\t\tname: item.name,\n\t\t}),\n\t);\n\n\tconst response = await fetch(`https://api.pinata.cloud/pinning/pinFileToIPFS`, {\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${auth.pinataJwtToken}`,\n\t\t\t'Content-Type': `multipart/form-data; boundary=${(data as unknown as { _boundary: string })._boundary}`,\n\t\t},\n\t\tbody: data,\n\t\tmethod: 'post',\n\t});\n\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to upload '${item.name}' to ipfs ${response.statusText}`);\n\t}\n\n\tconst uploadResult = await response.json() as {\n\t\tIpfsHash: string; // This is the IPFS multi-hash provided back for your content,\n\t\tPinSize: string; // This is how large (in bytes) the content you just pinned is,\n\t\tTimestamp: string; // This is the timestamp for your content pinning (represented in ISO 8601 format)\n\t};\n\n\treturn {\n\t\tipfsHash: uploadResult.IpfsHash,\n\t};\n};\n\nconst checkIfFileIsPinned = async ({\n\tauth,\n\titem,\n}: {\n\tauth: PinataAuth;\n\titem: {\n\t\tname: string;\n\t\tfilePath: string;\n\t};\n}) => {\n\tconst ipfsHash = await Hash.of(fs.createReadStream(item.filePath));\n\n\tconst response = await fetch(`https://api.pinata.cloud/data/pinList?status=pinned&hashContains=${ipfsHash}`, {\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${auth.pinataJwtToken}`,\n\t\t},\n\t\tmethod: 'get',\n\t});\n\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to query '${item.name}' status from pinata ${response.statusText}`);\n\t}\n\n\tconst pinResult = await response.json() as {\n\t\tcount: number;\n\t\trows: {\n\t\t\tid: string;\n\t\t\tipfs_pin_hash: string;\n\t\t\tsize: number;\n\t\t\tuser_id: string;\n\t\t\tdate_pinned: null | string;\n\t\t\tdate_unpinned: null | string;\n\t\t\tmetadata: {\n\t\t\t\tname: string;\n\t\t\t\tkeyvalues: null | string;\n\t\t\t};\n\t\t\tregions: {\n\t\t\t\tregionId: string;\n\t\t\t\tcurrentReplicationCount: number;\n\t\t\t\tdesiredReplicationCount: number;\n\t\t\t}[];\n\t\t}[];\n\t};\n\n\tconst isPinned = pinResult.rows.some(x =>\n\t\tx.ipfs_pin_hash === ipfsHash\n\t\t&& x.date_pinned\n\t\t&& !x.date_unpinned\n\t);\n\n\treturn {\n\t\tisPinned,\n\t\tipfsHash,\n\t};\n};\n\nexport const pinHash = async ({\n\tauth,\n\tipfsHash,\n}: {\n\tauth: PinataAuth;\n\tipfsHash: string;\n}) => {\n\tconst response = await fetch(`https://api.pinata.cloud/pinning/pinByHash`, {\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${auth.pinataJwtToken}`,\n\t\t\t'Content-Type': 'application/json',\n\t\t},\n\t\tmethod: 'post',\n\t\tbody: JSON.stringify({\n\t\t\thashToPin: ipfsHash,\n\t\t}),\n\t});\n\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to pin '${ipfsHash}' with pinata: ${response.statusText}`);\n\t}\n\n\t// Ok is the only response if successful\n\treturn;\n};\n","export async function delay(timeout: number): Promise<void> {\n\treturn await new Promise(resolve => {\n\t\tsetTimeout(resolve, timeout);\n\t});\n}\n\nexport const createProcessBackoffController = ({\n\tretryCount = 5,\n\ttargetRequestsPerMinute = 180,\n}: {\n\tretryCount?: number;\n\ttargetRequestsPerMinute?: number;\n}) => {\n\tlet averageTimePerRequest = 5000;\n\tlet targetTimePerRequest = 60000 / targetRequestsPerMinute;\n\tlet lastTime = Date.now();\n\n\tconst processWithBackoff = async <TResult>(process: () => Promise<TResult>) => {\n\t\tlet attempt = 0;\n\t\tlet lastError = undefined as unknown;\n\t\twhile (attempt < retryCount) {\n\t\t\ttry {\n\t\t\t\tlet delayTimeMs = Math.max(10, targetTimePerRequest - averageTimePerRequest);\n\n\t\t\t\t// Partially randomized delay to ensure parallel requests don't line up\n\t\t\t\tawait delay(Math.floor(delayTimeMs * (1 + 0.5 * Math.random())));\n\n\t\t\t\tconst result = await process();\n\n\t\t\t\tconst timeNow = Date.now();\n\t\t\t\tconst timeElapsed = timeNow - lastTime;\n\t\t\t\tlastTime = timeNow;\n\n\t\t\t\t// Running average\n\t\t\t\taverageTimePerRequest = averageTimePerRequest * 0.97 + timeElapsed * 0.03;\n\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tlastError = err;\n\t\t\t}\n\n\t\t\t// Quickly increase time to wait if failure (allow negatives to wait longer than target)\n\t\t\taverageTimePerRequest -= (attempt + 1) * 1000;\n\t\t\tattempt++;\n\t\t}\n\n\t\t// All attempts failed\n\t\tthrow lastError;\n\t};\n\n\treturn {\n\t\tprocessWithBackoff,\n\t};\n};\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taqueria/plugin-ipfs-pinata",
3
- "version": "0.24.2",
3
+ "version": "0.25.3-alpha",
4
4
  "description": "A plugin for Taqueria providing ipfs publishing and pinning using the Pinata service",
5
5
  "keywords": [
6
6
  "taqueria",
@@ -33,7 +33,7 @@
33
33
  "directory": "taqueria-plugin-ipfs-pinata"
34
34
  },
35
35
  "dependencies": {
36
- "@taqueria/node-sdk": "^0.24.2",
36
+ "@taqueria/node-sdk": "^0.25.3-alpha",
37
37
  "dotenv": "^16.0.0",
38
38
  "form-data": "^4.0.0",
39
39
  "ipfs-only-hash": "^4.0.0",
@@ -41,7 +41,7 @@
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/node-fetch": "^2.6.1",
44
- "parcel": "2.6.1",
44
+ "parcel": "^2.8.0",
45
45
  "typescript": "4.7.2"
46
46
  }
47
47
  }
package/src/proxy.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { sendAsyncErr, sendAsyncRes, sendErr, sendJsonRes } from '@taqueria/node-sdk';
2
- import { LoadedConfig, RequestArgs, SanitizedAbsPath } from '@taqueria/node-sdk/types';
2
+ import { RequestArgs } from '@taqueria/node-sdk';
3
+ import { LoadedConfig, SanitizedAbsPath } from '@taqueria/node-sdk/types';
3
4
  import path from 'path';
4
5
  import { processFiles } from './file-processing';
5
6
  import { PinataAuth, pinHash, publishFileToIpfs } from './pinata-api';
@@ -17,9 +18,10 @@ type PluginResponse =
17
18
  data: unknown[];
18
19
  };
19
20
 
20
- interface Opts extends RequestArgs.ProxyRequestArgs {
21
+ interface Opts extends RequestArgs.t {
21
22
  readonly path?: string;
22
23
  readonly hash?: string;
24
+ readonly task?: string;
23
25
  }
24
26
 
25
27
  const publishToIpfs = async (fileOrDirPath: undefined | string, auth: PinataAuth): Promise<PluginResponse> => {
@@ -102,7 +104,6 @@ const execute = async (opts: Opts): Promise<PluginResponse> => {
102
104
  task,
103
105
  path,
104
106
  hash,
105
- config,
106
107
  } = opts;
107
108
 
108
109
  const auth: PinataAuth = {
@@ -125,7 +126,7 @@ const execute = async (opts: Opts): Promise<PluginResponse> => {
125
126
  }
126
127
  };
127
128
 
128
- export default async (args: RequestArgs.ProxyRequestArgs): Promise<PluginResponse> => {
129
+ export default async (args: RequestArgs.t): Promise<PluginResponse> => {
129
130
  const opts = args as Opts;
130
131
 
131
132
  try {
package/tsconfig.json CHANGED
@@ -12,7 +12,9 @@
12
12
 
13
13
  /* Language and Environment */
14
14
  "target": "ES2021", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
15
- // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
15
+ "lib": [
16
+ "ES2021.String"
17
+ ], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
16
18
  // "jsx": "preserve", /* Specify what JSX code is generated. */
17
19
  // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
18
20
  // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */