UNPKG

@longviewlabs/strapi-provider-upload-arweave

Version:

Arweave upload provider for Strapi v5

1 lines 12.4 kB
{"version":3,"file":"index.mjs","sources":["../src/types.ts","../src/utils.ts","../src/index.ts"],"sourcesContent":["import type { ReadStream } from 'node:fs';\nimport type { JWKInterface } from 'arweave/node/lib/wallet';\nimport { z } from 'zod';\n\nconst fileSchema = z.object({\n name: z.string(),\n alternativeText: z.string().optional(),\n caption: z.string().optional(),\n width: z.number().optional(),\n height: z.number().optional(),\n formats: z.record(z.string(), z.unknown()).optional(),\n hash: z.string(),\n ext: z.string().optional(),\n mime: z.string(),\n size: z.number(),\n sizeInBytes: z.number(),\n url: z.string(),\n previewUrl: z.string().optional(),\n path: z.string().optional(),\n provider: z.string().optional(),\n provider_metadata: z.record(z.string(), z.unknown()).optional(),\n stream: z.unknown().optional(), // `ReadStream` can't be validated easily, so `any` or skip\n buffer: z.unknown().optional(), // same for `Buffer`\n});\n\nexport type File = z.infer<typeof fileSchema> & {\n stream?: ReadStream;\n buffer?: Buffer;\n};\n\nconst jwkSchema = z.object({\n\t\"kty\": z.string({ error: \"Invalid JWK format. Please check the content of your Arweave Wallet JWK\" }),\n\t\"e\": z.string({ error: \"Invalid JWK format. Please check the content of your Arweave Wallet JWK\" }),\n\t\"n\": z.string({ error: \"Invalid JWK format. Please check the content of your Arweave Wallet JWK\" }),\n \"d\": z.string().optional(),\n\t\"dp\": z.string().optional(),\n\t\"dq\": z.string().optional(),\n\t\"ext\": z.boolean().optional(),\n\t\"p\": z.string().optional(),\n\t\"q\": z.string().optional(),\n\t\"qi\": z.string().optional(),\n});\n\ntype GetContentTypeFn = (file: File) => string;\n\nconst defaultGetContentType = (file: File) => file.mime;\n\nexport const defaultGateway = 'https://arweave.net';\n\nexport const optionsSchema = z.object({\n arweaveWallet: z\n .preprocess((input) => {\n if (typeof input === 'string') {\n try {\n return JSON.parse(input);\n } catch {\n throw new Error(\n 'Arweave Wallet provided is not a valid JSON. Please ensure it is a valid JWK format.'\n );\n }\n }\n \n return input;\n }, jwkSchema),\n gateway: z.url().default(defaultGateway),\n getContentType: z\n .custom<GetContentTypeFn>((val) => typeof val === 'function')\n .optional()\n .default(() => defaultGetContentType),\n});\n\nexport type Options = z.infer<typeof optionsSchema>;\n\nexport type DefaultOptions = Partial<Omit<Options, 'arweaveWallet'>> & {\n arweaveWallet: JWKInterface | string;\n};\n","import z from 'zod';\nimport {\n optionsSchema,\n type DefaultOptions,\n type File,\n type Options,\n} from './types';\n\nexport const getConfigDefaultValues = (config: DefaultOptions) => {\n try {\n return optionsSchema.parse(config);\n } catch (err) {\n if (err instanceof z.ZodError) {\n throw new Error(err.issues[0]?.message);\n } else {\n throw err;\n }\n }\n};\n\nexport const prepareUploadFile = async (\n file: File,\n config: Options,\n) => {\n let fileBuffer : Buffer;\n if (file.stream) { // convert stream to buffer\n const buffers = []\n for await (const chunk of file.stream) {\n buffers.push(chunk);\n }\n\n fileBuffer = Buffer.concat(buffers);\n } else if (file.buffer) {\n fileBuffer = file.buffer;\n } else {\n throw new Error('File must have either a stream or a buffer.');\n }\n\n const fileSize = fileBuffer.length\n\n const fileContentType = config.getContentType(file);\n\n return { fileBuffer, fileSize, fileContentType };\n};\n","import type { DefaultOptions, File } from './types';\nimport { TurboFactory } from '@ardrive/turbo-sdk';\nimport { getConfigDefaultValues, prepareUploadFile } from './utils';\n\nexport default {\n init(providedConfig: DefaultOptions) {\n const config = getConfigDefaultValues(providedConfig);\n const { arweaveWallet } = config;\n const turbo = TurboFactory.authenticated({ privateKey: arweaveWallet });\n\n // const arweave = Arweave.init({});\n // let jwk = arweaveWallet;\n // if (!jwk) {\n // console.log(__dirname);\n // try {\n // const arweaveJson = fs.readFileSync('arweave.json', 'utf-8');\n // jwk = JSON.parse(arweaveJson);\n // } catch (error) {\n // // If reading the file failed, log the error\n // console.error('Error reading arweave.json:', error);\n // }\n // }\n\n // if (!jwk) {\n // throw new Error('Arweave wallet JSON is required. Please set the arweaveWallet option, or have wallet as \"arweave.json\" file in the project root.');\n // }\n\n const upload = async (file: File) => {\n try {\n const { fileBuffer, fileSize, fileContentType } = await prepareUploadFile(file, config);\n\n const res = await turbo.uploadFile({\n fileStreamFactory: () => fileBuffer,\n fileSizeFactory: () => fileSize,\n dataItemOpts: {\n tags: [\n {\n name: \"Content-Type\",\n value: fileContentType,\n },\n ],\n },\n });\n\n file.url = `${res.id}`;\n } catch (error: any) {\n if (error.status === 402) {\n const message = `Insufficient balance. Please follow the documentation on how to top up your ArDrive Turbo account (https://github.com/longview-labs/strapi-provider-upload-arweave?tab=readme-ov-file#how-to-pay-for-uploads)`;\n console.error(message)\n throw new Error(message);\n } else if (error instanceof Error && 'message' in error) {\n const message = `Error uploading file to Arweave: ${error.message}`;\n console.error(message);\n throw new Error(message);\n } else {\n throw error;\n }\n }\n };\n\n return {\n async upload(file: File) {\n return upload(file);\n },\n async uploadStream(file: File) {\n return upload(file);\n },\n async delete(file: File) {\n return \"Files save on Arweave cannot be deleted as they are immutable.\";\n },\n isPrivate() {\n return true;\n },\n async getSignedUrl(file: File) {\n // transform url to specific gateway\n return {\n url: `${config.gateway}/${file.url}`\n };\n },\n };\n },\n};\n"],"names":["z","object","name","string","alternativeText","optional","caption","width","number","height","formats","record","unknown","hash","ext","mime","size","sizeInBytes","url","previewUrl","path","provider","provider_metadata","stream","buffer","jwkSchema","error","boolean","defaultGetContentType","file","defaultGateway","optionsSchema","arweaveWallet","preprocess","input","JSON","parse","Error","gateway","default","getContentType","custom","val","getConfigDefaultValues","config","err","ZodError","issues","message","prepareUploadFile","fileBuffer","buffers","chunk","push","Buffer","concat","fileSize","length","fileContentType","init","providedConfig","turbo","TurboFactory","authenticated","privateKey","upload","res","uploadFile","fileStreamFactory","fileSizeFactory","dataItemOpts","tags","value","id","status","console","uploadStream","delete","isPrivate","getSignedUrl"],"mappings":"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"}