permaweb-deploy 3.4.6 → 5.0.0
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/README.md +174 -511
- package/dist/chunks/chalk-BP_cCc9v.js +49 -0
- package/dist/chunks/chalk-BP_cCc9v.js.map +1 -0
- package/dist/chunks/{display-y6lAuqxZ.js → display-CZV6KUcG.js} +2 -2
- package/dist/chunks/{display-y6lAuqxZ.js.map → display-CZV6KUcG.js.map} +1 -1
- package/dist/chunks/upload-workflow-f3hExxtV.js +620 -0
- package/dist/chunks/upload-workflow-f3hExxtV.js.map +1 -0
- package/dist/chunks/{uploader-CC-qBdlV.js → uploader-Bz9jraY2.js} +15 -17
- package/dist/chunks/uploader-Bz9jraY2.js.map +1 -0
- package/dist/commands/deploy.js +72 -98
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/hyperbeam-uploaders.js +48 -0
- package/dist/commands/hyperbeam-uploaders.js.map +1 -0
- package/dist/commands/upload.js +11 -12
- package/dist/commands/upload.js.map +1 -1
- package/dist/constants/flags.js +66 -97
- package/dist/constants/flags.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/prompts/names.js +13 -0
- package/dist/prompts/names.js.map +1 -0
- package/dist/src/commands/deploy.d.ts +1 -1
- package/dist/src/commands/deploy.d.ts.map +1 -1
- package/dist/src/commands/hyperbeam-uploaders.d.ts +14 -0
- package/dist/src/commands/hyperbeam-uploaders.d.ts.map +1 -0
- package/dist/src/commands/upload.d.ts +1 -1
- package/dist/src/commands/upload.d.ts.map +1 -1
- package/dist/src/constants/flags.d.ts +271 -100
- package/dist/src/constants/flags.d.ts.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/prompts/names.d.ts +2 -0
- package/dist/src/prompts/names.d.ts.map +1 -0
- package/dist/src/types/index.d.ts +0 -29
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/utils/__tests__/hyperbeam-uploaders-cli.test.d.ts +2 -0
- package/dist/src/utils/__tests__/hyperbeam-uploaders-cli.test.d.ts.map +1 -0
- package/dist/src/utils/__tests__/names.test.d.ts +2 -0
- package/dist/src/utils/__tests__/names.test.d.ts.map +1 -0
- package/dist/src/utils/__tests__/permawebos-bundlers.test.d.ts +2 -0
- package/dist/src/utils/__tests__/permawebos-bundlers.test.d.ts.map +1 -0
- package/dist/src/utils/config-resolver.d.ts +29 -11
- package/dist/src/utils/config-resolver.d.ts.map +1 -1
- package/dist/src/utils/constants.d.ts +0 -2
- package/dist/src/utils/constants.d.ts.map +1 -1
- package/dist/src/utils/hyperbeam-uploader.d.ts +8 -1
- package/dist/src/utils/hyperbeam-uploader.d.ts.map +1 -1
- package/dist/src/utils/hyperbeam-uploaders-cli.d.ts +7 -0
- package/dist/src/utils/hyperbeam-uploaders-cli.d.ts.map +1 -0
- package/dist/src/utils/legacy-bundler-uploader.d.ts +29 -0
- package/dist/src/utils/legacy-bundler-uploader.d.ts.map +1 -0
- package/dist/src/utils/names.d.ts +46 -0
- package/dist/src/utils/names.d.ts.map +1 -0
- package/dist/src/utils/permawebos-bundlers.d.ts +28 -0
- package/dist/src/utils/permawebos-bundlers.d.ts.map +1 -0
- package/dist/src/utils/signer.d.ts +4 -6
- package/dist/src/utils/signer.d.ts.map +1 -1
- package/dist/src/utils/uploader.d.ts +5 -7
- package/dist/src/utils/uploader.d.ts.map +1 -1
- package/dist/src/utils/validators.d.ts +13 -20
- package/dist/src/utils/validators.d.ts.map +1 -1
- package/dist/src/workflows/upload-workflow.d.ts +3 -4
- package/dist/src/workflows/upload-workflow.d.ts.map +1 -1
- package/dist/tests/mocks/{turbo-handlers.d.ts → legacy-handlers.d.ts} +12 -27
- package/dist/tests/mocks/legacy-handlers.d.ts.map +1 -0
- package/dist/tests/setup.d.ts +2 -2
- package/dist/tests/setup.d.ts.map +1 -1
- package/dist/tests/types/payment-service.d.ts +2 -2
- package/dist/tests/types/payment-service.d.ts.map +1 -1
- package/dist/tests/types/upload-service.d.ts +1 -1
- package/dist/tests/types/upload-service.d.ts.map +1 -1
- package/dist/utils/config-resolver.js +4 -1
- package/dist/utils/config-resolver.js.map +1 -1
- package/dist/utils/constants.js +1 -3
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/hyperbeam-uploaders-cli.js +32 -0
- package/dist/utils/hyperbeam-uploaders-cli.js.map +1 -0
- package/dist/utils/names.js +157 -0
- package/dist/utils/names.js.map +1 -0
- package/dist/utils/permawebos-bundlers.js +120 -0
- package/dist/utils/permawebos-bundlers.js.map +1 -0
- package/dist/utils/signer.js +3 -2
- package/dist/utils/signer.js.map +1 -1
- package/dist/utils/uploader.js +1 -1
- package/dist/utils/validators.js +3 -39
- package/dist/utils/validators.js.map +1 -1
- package/dist/workflows/upload-workflow.js +5 -6
- package/dist/workflows/upload-workflow.js.map +1 -1
- package/package.json +6 -6
- package/dist/chunks/upload-workflow-CfCTs0EW.js +0 -1113
- package/dist/chunks/upload-workflow-CfCTs0EW.js.map +0 -1
- package/dist/chunks/uploader-CC-qBdlV.js.map +0 -1
- package/dist/prompts/arns.js +0 -89
- package/dist/prompts/arns.js.map +0 -1
- package/dist/src/prompts/arns.d.ts +0 -13
- package/dist/src/prompts/arns.d.ts.map +0 -1
- package/dist/tests/mocks/turbo-handlers.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-workflow-f3hExxtV.js","sources":["../../src/utils/hyperbeam-uploader.ts","../../src/utils/legacy-bundler-uploader.ts","../../src/workflows/upload-workflow.ts"],"sourcesContent":["import { createHash } from 'node:crypto'\nimport fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { Readable } from 'node:stream'\n\nimport { createDataItemSigner, message as aoMessage } from '@permaweb/aoconnect'\nimport {\n AoTokenTransferAdapter,\n DEFAULT_AO_TOKEN_ID,\n discoverHyperbeamAoBundlerProfile,\n type FundingResult,\n HyperbalanceClient,\n type HyperbalanceProfile,\n HYPERBEAM_DEFAULT_LEDGER_ID,\n HYPERBEAM_DEFAULT_LEDGER_ROUTE,\n waitForAoAssignmentSlot,\n} from '@permaweb/hyperbalance'\n\nconst require = createRequire(import.meta.url)\nconst { ArweaveSigner, DataItem, createData } = require('@dha-team/arbundles') as {\n ArweaveSigner: new (jwk: Record<string, unknown>) => unknown\n DataItem: new (raw: Buffer) => { id: string | Uint8Array }\n createData: (\n data: Buffer,\n signer: unknown,\n opts?: { tags?: Array<{ name: string; value: string }> },\n ) => {\n getRaw: () => Uint8Array\n id?: string\n sign: (signer: unknown) => Promise<void>\n }\n}\n\nexport interface UploadFileArgs {\n dataItemOpts?: { tags?: Array<{ name: string; value: string }> }\n file?: string | Buffer\n fileSizeFactory?: () => number\n fileStreamFactory?: () => unknown\n fundingMode?: unknown\n}\n\nexport interface UploadClient {\n uploadFile: (args: UploadFileArgs) => Promise<UploadClientResult>\n}\n\nexport interface UploadClientResult {\n cost?: UploadCost\n id?: string\n size?: UploadSize\n}\n\nexport interface UploadCost {\n amount: bigint\n token: 'AO'\n}\n\nexport interface UploadSize {\n payloadBytes: number\n signedBytes?: number\n}\n\nconst AO_BASE_UNITS = 1_000_000_000_000n\nconst ARWEAVE_GATEWAY = 'https://arweave.net'\n\nexport interface HyperbeamBundlerOptions {\n autoFund?: HyperbeamBundlerAutoFundOptions\n deployKey: string\n quote?: HyperbeamBundlerQuoteOptions\n uploadPath: string\n uploader: string\n}\n\nexport interface HyperbeamAutoFundOptions {\n aoPollMs?: number\n aoStateUrl?: string\n aoTimeoutMs?: number\n deployKey: string\n ledgerId?: string\n minimumBalance: bigint\n tokenId?: string\n uploader: string\n}\n\nexport interface HyperbeamBundlerAutoFundOptions {\n aoPollMs?: number\n aoStateUrl?: string\n aoTimeoutMs?: number\n deployKey: string\n ledgerId?: string\n minimumBalance?: bigint\n quoteAction?: string\n tokenId?: string\n uploader: string\n}\n\nexport interface HyperbeamBundlerQuoteOptions {\n ledgerId?: string\n quoteAction?: string\n tokenId?: string\n uploader: string\n}\n\nexport interface HyperbeamDataItemPostResult {\n body: string\n id?: string\n}\n\nasync function readableToBuffer(stream: Readable): Promise<Buffer> {\n const chunks: Buffer[] = []\n\n for await (const chunk of stream) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))\n }\n\n return Buffer.concat(chunks)\n}\n\nasync function streamToBuffer(stream: unknown): Promise<Buffer> {\n if (Buffer.isBuffer(stream)) {\n return stream\n }\n\n if (stream instanceof Uint8Array) {\n return Buffer.from(stream)\n }\n\n if (stream instanceof Readable) {\n return readableToBuffer(stream)\n }\n\n if (stream && typeof (stream as { getReader?: unknown }).getReader === 'function') {\n return readableToBuffer(Readable.fromWeb(stream as ReadableStream))\n }\n\n throw new Error('Unsupported upload stream type')\n}\n\nfunction toBase64Url(value: string | Uint8Array): string {\n if (typeof value === 'string') {\n return value\n }\n\n return Buffer.from(value).toString('base64url')\n}\n\nfunction normalizeUploadUrl(base: string, uploadPath: string): string {\n const normalizedBase = base.endsWith('/') ? base : `${base}/`\n const cleanPath = uploadPath.startsWith('/') ? uploadPath.slice(1) : uploadPath\n return new URL(cleanPath, normalizedBase).toString()\n}\n\nexport function hyperbeamUploadUrl(base: string, uploadPath: string): string {\n return normalizeUploadUrl(base, uploadPath)\n}\n\nfunction arweaveAddressFromJwk(jwk: Record<string, unknown>): string {\n if (typeof jwk.n !== 'string') {\n throw new TypeError('Arweave JWK is missing modulus field \"n\"')\n }\n\n return createHash('sha256').update(Buffer.from(jwk.n, 'base64url')).digest('base64url')\n}\n\nexport function parseHyperbeamFundAmount(value: string): bigint {\n if (!/^[1-9]\\d*$/.test(value)) {\n throw new Error('--hyperbeam-fund-amount must be a positive integer in token base units')\n }\n\n return BigInt(value)\n}\n\nfunction formatAoAmount(amount: bigint): string {\n const whole = amount / AO_BASE_UNITS\n const fraction = amount % AO_BASE_UNITS\n\n if (fraction === 0n) {\n return `${whole.toString()} AO`\n }\n\n return `${whole.toString()}.${fraction.toString().padStart(12, '0').replaceAll(/0+$/g, '')} AO`\n}\n\nfunction responsePreview(body: string): string | undefined {\n const preview = body.replaceAll(/\\s+/g, ' ').trim()\n if (!preview) {\n return undefined\n }\n\n if (/^(<!doctype html\\b|<html\\b)/i.test(preview)) {\n return 'HTML error response'\n }\n\n return preview.slice(0, 300)\n}\n\nexport async function autoFundHyperbeamLedger(\n options: HyperbeamAutoFundOptions,\n): Promise<FundingResult> {\n const profile = await discoverHyperbeamAoBundlerProfile({\n ledgerId: options.ledgerId,\n nodeUrl: options.uploader,\n tokenId: options.tokenId,\n })\n\n return ensureHyperbeamCredit(options, profile)\n}\n\nasync function ensureHyperbeamCredit(\n options: HyperbeamAutoFundOptions,\n profile: HyperbalanceProfile,\n): Promise<FundingResult> {\n const jwk = JSON.parse(Buffer.from(options.deployKey, 'base64').toString('utf8')) as Record<\n string,\n unknown\n >\n const recipient = arweaveAddressFromJwk(jwk)\n const signer = createDataItemSigner(jwk)\n const client = new HyperbalanceClient({ nodeUrl: options.uploader })\n const adapter = new AoTokenTransferAdapter({\n async inferSender() {\n return recipient\n },\n async message(input) {\n return aoMessage({\n data: input.data ?? '',\n process: input.process,\n signer,\n tags: input.tags,\n })\n },\n async waitForAssignmentSlot(messageId, context) {\n return waitForAoAssignmentSlot({\n messageId,\n pollMs: options.aoPollMs,\n processId: context.processId,\n stateUrl: options.aoStateUrl,\n timeoutMs: options.aoTimeoutMs,\n })\n },\n })\n\n return client.ensureCreditAuto({\n ledgerId: options.ledgerId,\n minimumBalance: options.minimumBalance,\n profile,\n recipient,\n tokenId: options.tokenId ?? DEFAULT_AO_TOKEN_ID,\n transferAdapter: adapter,\n })\n}\n\nexport async function autoFundQuotedHyperbeamLedger(\n options: { signedBytes: number } & HyperbeamBundlerAutoFundOptions,\n): Promise<FundingResult> {\n const profile = await discoverHyperbeamAoBundlerProfile({\n ledgerId: options.ledgerId,\n nodeUrl: options.uploader,\n tokenId: options.tokenId,\n })\n const client = new HyperbalanceClient({ nodeUrl: options.uploader })\n let { ledgerId } = options\n let { minimumBalance } = options\n let { tokenId } = options\n\n if (minimumBalance === undefined) {\n const quote = await client.quoteAuto({\n action: options.quoteAction ?? 'hyperbeam-upload',\n params: { bytes: options.signedBytes },\n profile,\n })\n minimumBalance = quote.amount\n ledgerId ??= quote.ledgerId\n tokenId ??= quote.tokenId\n }\n\n return ensureHyperbeamCredit(\n {\n aoPollMs: options.aoPollMs,\n aoStateUrl: options.aoStateUrl,\n aoTimeoutMs: options.aoTimeoutMs,\n deployKey: options.deployKey,\n ledgerId,\n minimumBalance,\n tokenId,\n uploader: options.uploader,\n },\n profile,\n )\n}\n\nexport async function quoteHyperbeamUpload(\n options: { signedBytes: number } & HyperbeamBundlerQuoteOptions,\n): Promise<{ amount: bigint; ledgerId?: string; tokenId?: string }> {\n const profile = await discoverHyperbeamAoBundlerProfile({\n ledgerId: options.ledgerId,\n nodeUrl: options.uploader,\n tokenId: options.tokenId,\n })\n const quote = await new HyperbalanceClient({ nodeUrl: options.uploader }).quoteAuto({\n action: options.quoteAction ?? 'hyperbeam-upload',\n params: { bytes: options.signedBytes },\n profile,\n })\n\n return { amount: quote.amount, ledgerId: quote.ledgerId, tokenId: quote.tokenId }\n}\n\nexport function hyperbeamBundlerLink(uploader: string, id: string, isManifest = false): string {\n const normalizedBase = uploader.endsWith('/') ? uploader : `${uploader}/`\n return new URL(`${encodeURIComponent(id)}${isManifest ? '/' : ''}`, normalizedBase).toString()\n}\n\nexport async function preflightHyperbeamBundlerArBalance(uploader: string): Promise<void> {\n const nodeUrl = uploader.replace(/\\/+$/, '')\n const addressRes = await fetch(`${nodeUrl}/~meta@1.0/info/address`)\n if (!addressRes.ok) {\n throw new Error(`HyperBEAM bundler address check failed with HTTP ${addressRes.status}`)\n }\n\n const address = (await addressRes.text()).trim()\n if (!address) {\n throw new Error('HyperBEAM bundler address check returned an empty address')\n }\n\n const balanceRes = await fetch(`${ARWEAVE_GATEWAY}/wallet/${encodeURIComponent(address)}/balance`)\n if (!balanceRes.ok) {\n throw new Error(`HyperBEAM bundler AR balance check failed with HTTP ${balanceRes.status}`)\n }\n\n const balance = (await balanceRes.text()).trim()\n if (!/^\\d+$/.test(balance)) {\n throw new Error('HyperBEAM bundler AR balance check returned an invalid balance')\n }\n\n if (BigInt(balance) === 0n) {\n throw new Error(\n `HyperBEAM bundler wallet ${address} has 0 AR; upload aborted because the node cannot seed data to Arweave.`,\n )\n }\n}\n\nfunction responseId(headers: Headers, body: string): string | undefined {\n const headerId = headers.get('id')\n if (headerId) {\n return headerId\n }\n\n try {\n const parsed = JSON.parse(body) as { body?: { id?: string }; id?: string }\n return parsed.id || parsed.body?.id\n } catch {\n return undefined\n }\n}\n\nexport async function postHyperbeamDataItem(\n uploadUrl: string,\n raw: Buffer | Uint8Array,\n localId?: string,\n): Promise<HyperbeamDataItemPostResult> {\n const res = await fetch(uploadUrl, {\n body: raw,\n headers: {\n accept: 'application/json, text/plain, */*',\n 'content-type': 'application/octet-stream',\n },\n method: 'POST',\n })\n const body = await res.text()\n\n if (!res.ok) {\n const preview = responsePreview(body)\n const itemContext = localId ? ` for local data item ${localId}` : ''\n throw new Error(\n `HyperBEAM bundler upload failed${itemContext} with HTTP ${res.status}${preview ? `: ${preview}` : ''}`,\n )\n }\n\n return { body, id: responseId(res.headers, body) }\n}\n\nfunction cleanAutoFundErrorMessage(message: string): string {\n const jsonStart = message.indexOf('{')\n if (jsonStart >= 0) {\n try {\n const parsed = JSON.parse(message.slice(jsonStart)) as { error?: string }\n if (parsed.error) {\n return parsed.error.replace(/^Error:\\s*/, '')\n }\n } catch {\n // Keep the original error below if the body is not JSON.\n }\n }\n\n return message\n}\n\nfunction autoFundFailureNote(message: string): string {\n if (/rate limit exceeded/i.test(message)) {\n return 'AO token transfer was rate limited. Check that the wallet has enough spendable AO before retrying auto-fund.'\n }\n\n return 'Check the wallet or node ledger before retrying auto-fund; the AO transfer may already have been submitted.'\n}\n\nfunction autoFundUnavailableMessage(message: string): string {\n return [\n 'HyperBEAM auto-fund was requested, but this node is not hyperbalance-compatible for this upload.',\n `Auto-fund compatibility check failed: ${message}`,\n 'Attempted direct upload instead.',\n ].join('\\n')\n}\n\nexport class HyperbeamBundlerClient implements UploadClient {\n private readonly autoFund?: HyperbeamBundlerAutoFundOptions\n private readonly quote: HyperbeamBundlerQuoteOptions\n private seedPreflight?: Promise<void>\n private readonly signer: unknown\n private readonly uploader: string\n private readonly uploadUrl: string\n\n constructor({ autoFund, deployKey, quote, uploadPath, uploader }: HyperbeamBundlerOptions) {\n const jwk = JSON.parse(Buffer.from(deployKey, 'base64').toString('utf8')) as Record<\n string,\n unknown\n >\n this.autoFund = autoFund\n this.quote = quote ?? { uploader }\n this.signer = new ArweaveSigner(jwk)\n this.uploader = uploader\n this.uploadUrl = normalizeUploadUrl(uploader, uploadPath)\n }\n\n async uploadFile(args: UploadFileArgs): Promise<{ id: string } & UploadClientResult> {\n const data = args.file\n ? typeof args.file === 'string'\n ? fs.readFileSync(args.file)\n : args.file\n : await streamToBuffer(args.fileStreamFactory?.() ?? Readable.from([]))\n const tags = args.dataItemOpts?.tags ?? []\n const item = createData(data, this.signer, { tags })\n\n await item.sign(this.signer)\n\n const raw = Buffer.from(item.getRaw())\n const localId = item.id || toBase64Url(new DataItem(raw).id)\n const size: UploadSize = { payloadBytes: data.length, signedBytes: raw.length }\n let autoFundUnavailable: string | undefined\n let autoFundQuote: { amount: bigint; ledgerId?: string; tokenId?: string } | undefined\n let cost: UploadCost | undefined\n\n if (this.autoFund) {\n try {\n autoFundQuote = await quoteHyperbeamUpload({ ...this.quote, signedBytes: raw.length })\n cost = { amount: autoFundQuote.amount, token: 'AO' }\n } catch (error) {\n autoFundUnavailable = cleanAutoFundErrorMessage(\n error instanceof Error ? error.message : String(error),\n )\n }\n } else {\n try {\n const quote = await quoteHyperbeamUpload({ ...this.quote, signedBytes: raw.length })\n cost = { amount: quote.amount, token: 'AO' }\n } catch {\n cost = undefined\n }\n }\n\n this.seedPreflight ??= preflightHyperbeamBundlerArBalance(this.uploader)\n await this.seedPreflight\n\n if (this.autoFund && autoFundQuote) {\n try {\n await autoFundQuotedHyperbeamLedger({\n ...this.autoFund,\n ledgerId: this.autoFund.ledgerId ?? autoFundQuote.ledgerId,\n minimumBalance: this.autoFund.minimumBalance ?? autoFundQuote.amount,\n signedBytes: raw.length,\n tokenId: this.autoFund.tokenId ?? autoFundQuote.tokenId,\n })\n } catch (error) {\n const message = cleanAutoFundErrorMessage(\n error instanceof Error ? error.message : String(error),\n )\n throw new Error(\n [\n `HyperBEAM auto-fund failed: ${message}`,\n `Required upload credit: ${formatAoAmount(cost?.amount ?? autoFundQuote.amount)}`,\n autoFundFailureNote(message),\n await this.paymentHint(false),\n ]\n .filter(Boolean)\n .join('\\n\\n'),\n )\n }\n }\n\n let posted: HyperbeamDataItemPostResult\n try {\n posted = await postHyperbeamDataItem(this.uploadUrl, raw, localId)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const needsPayment = message.includes('HTTP 402')\n const paymentHint = needsPayment\n ? await this.paymentHint(autoFundUnavailable ? false : undefined)\n : undefined\n throw new Error(\n [\n message,\n needsPayment && autoFundUnavailable\n ? autoFundUnavailableMessage(autoFundUnavailable)\n : undefined,\n paymentHint,\n ]\n .filter(Boolean)\n .join('\\n\\n'),\n )\n }\n\n return { cost, id: posted.id || localId, size }\n }\n\n private async paymentHint(includeAutoFundInstruction = true): Promise<string | undefined> {\n try {\n return hyperbeamAoFundingHint(\n await discoverHyperbeamAoBundlerProfile({ nodeUrl: this.uploader }),\n { includeAutoFundInstruction },\n )\n } catch {\n try {\n const operator = await fetch(\n `${this.uploader.replace(/\\/+$/, '')}/~meta@1.0/info/address`,\n ).then((res) => (res.ok ? res.text() : undefined))\n if (!operator?.trim()) return undefined\n\n return [\n 'The HyperBEAM node requires AO in its local ledger:',\n `- AO: send funds to ${operator.trim()}. Local ledger: ${HYPERBEAM_DEFAULT_LEDGER_ID} at ${HYPERBEAM_DEFAULT_LEDGER_ROUTE}.`,\n includeAutoFundInstruction\n ? 'Use --hyperbeam-auto-fund to transfer AO and import the credit automatically before upload.'\n : undefined,\n ]\n .filter(Boolean)\n .join('\\n')\n } catch {\n return undefined\n }\n }\n }\n}\n\nexport function hyperbeamAoFundingHint(\n profile: HyperbalanceProfile,\n options: { includeAutoFundInstruction?: boolean } = {},\n): string | undefined {\n const lines = profile.tokens\n .map((token) => {\n const depositAddress = token.depositAddress ?? profile.node?.operator\n if (!depositAddress) return\n\n const label =\n token.ticker === 'AO' ? 'AO' : token.ticker ? `${token.ticker} (${token.id})` : token.id\n const ledger = token.ledgerId\n ? profile.ledgers.find((candidate) => candidate.id === token.ledgerId)\n : undefined\n const ledgerInfo = ledger\n ? ` Local ledger: ${ledger.id}${ledger.route ? ` at ${ledger.route}` : ''}.`\n : ''\n\n return `- ${label}: send funds to ${depositAddress}.${ledgerInfo}`\n })\n .filter(Boolean)\n\n if (lines.length === 0) return undefined\n\n return [\n 'The HyperBEAM node requires AO in its local ledger:',\n ...lines,\n options.includeAutoFundInstruction === false\n ? undefined\n : 'Use --hyperbeam-auto-fund to transfer AO and import the credit automatically before upload.',\n ]\n .filter(Boolean)\n .join('\\n')\n}\n","import fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { Readable } from 'node:stream'\n\nimport type { SignerType } from '../types/index.js'\nimport type {\n UploadClient,\n UploadClientResult,\n UploadFileArgs,\n UploadSize,\n} from './hyperbeam-uploader.js'\nimport { createSigner } from './signer.js'\n\nconst require = createRequire(import.meta.url)\nconst { DataItem, createData } = require('@dha-team/arbundles') as {\n DataItem: new (raw: Buffer) => { id: string | Uint8Array }\n createData: (\n data: Buffer,\n signer: unknown,\n opts?: { tags?: Array<{ name: string; value: string }> },\n ) => {\n getRaw: () => Uint8Array\n id?: string\n sign: (signer: unknown) => Promise<void>\n }\n}\n\nexport interface LegacyBundlerClientOptions {\n deployKey: string\n sigType: SignerType\n uploader: string\n}\n\nasync function readableToBuffer(stream: Readable): Promise<Buffer> {\n const chunks: Buffer[] = []\n\n for await (const chunk of stream) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))\n }\n\n return Buffer.concat(chunks)\n}\n\nasync function streamToBuffer(stream: unknown): Promise<Buffer> {\n if (Buffer.isBuffer(stream)) {\n return stream\n }\n\n if (stream instanceof Uint8Array) {\n return Buffer.from(stream)\n }\n\n if (stream instanceof Readable) {\n return readableToBuffer(stream)\n }\n\n if (stream && typeof (stream as { getReader?: unknown }).getReader === 'function') {\n return readableToBuffer(Readable.fromWeb(stream as ReadableStream))\n }\n\n throw new Error('Unsupported upload stream type')\n}\n\nfunction toBase64Url(value: string | Uint8Array): string {\n if (typeof value === 'string') {\n return value\n }\n\n return Buffer.from(value).toString('base64url')\n}\n\nfunction legacyUploadUrl(base: string, token: string): string {\n const normalizedBase = base.endsWith('/') ? base : `${base}/`\n return new URL(`v1/tx/${token}`, normalizedBase).toString()\n}\n\nfunction responsePreview(body: string): string | undefined {\n const preview = body.replaceAll(/\\s+/g, ' ').trim()\n if (!preview) {\n return undefined\n }\n\n return preview.slice(0, 300)\n}\n\n/**\n * Legacy ANS-104 upload client.\n *\n * @remarks This signs the data item locally with arbundles and posts the raw\n * bytes to legacy upload endpoints such as up.arweave.net.\n */\nexport class LegacyBundlerClient implements UploadClient {\n private readonly signer: unknown\n private readonly token: string\n private readonly uploadUrl: string\n\n constructor({ deployKey, sigType, uploader }: LegacyBundlerClientOptions) {\n const { signer, token } = createSigner(sigType, deployKey)\n this.signer = signer\n this.token = token\n this.uploadUrl = legacyUploadUrl(uploader, token)\n }\n\n /**\n * Sign and post one ANS-104 data item.\n *\n * @param args - Upload payload and data item tags.\n * @returns The upload response with the data item ID.\n */\n async uploadFile(args: UploadFileArgs): Promise<{ id: string } & UploadClientResult> {\n const data = args.file\n ? typeof args.file === 'string'\n ? fs.readFileSync(args.file)\n : args.file\n : await streamToBuffer(args.fileStreamFactory?.() ?? Readable.from([]))\n const tags = args.dataItemOpts?.tags ?? []\n const item = createData(data, this.signer, { tags })\n\n await item.sign(this.signer)\n\n const raw = Buffer.from(item.getRaw())\n const localId = item.id || toBase64Url(new DataItem(raw).id)\n const size: UploadSize = { payloadBytes: data.length, signedBytes: raw.length }\n const response = await fetch(this.uploadUrl, {\n body: raw,\n headers: {\n 'content-length': String(raw.length),\n 'content-type': 'application/octet-stream',\n },\n method: 'POST',\n })\n const body = await response.text()\n\n if (!response.ok) {\n const preview = responsePreview(body)\n throw new Error(\n `Legacy bundler upload failed with HTTP ${response.status}${preview ? `: ${preview}` : ''}`,\n )\n }\n\n let id: string | undefined\n if (body) {\n try {\n const parsed = JSON.parse(body) as { id?: unknown }\n id = typeof parsed.id === 'string' ? parsed.id : undefined\n } catch {\n id = undefined\n }\n }\n\n return { id: id ?? localId, size }\n }\n}\n","import { randomInt } from 'node:crypto'\n\nimport ora from 'ora'\n\nimport type { SignerType } from '../types/index.js'\nimport { cleanupCache, loadCache, saveCache } from '../utils/cache.js'\nimport { chalk } from '../utils/chalk.js'\nimport {\n type HyperbeamBundlerAutoFundOptions,\n HyperbeamBundlerClient,\n parseHyperbeamFundAmount,\n preflightHyperbeamBundlerArBalance,\n type UploadClient,\n type UploadCost,\n type UploadSize,\n} from '../utils/hyperbeam-uploader.js'\nimport { LegacyBundlerClient } from '../utils/legacy-bundler-uploader.js'\nimport { expandPath } from '../utils/path.js'\nimport {\n type ActivePermawebOSBundler,\n fetchActivePermawebOSBundlers,\n} from '../utils/permawebos-bundlers.js'\nimport { type FolderUploadResult, uploadFile, uploadFolder } from '../utils/uploader.js'\n\nexport interface UploadWorkflowConfig {\n 'dedupe-cache-max-entries': number\n 'deploy-file'?: string\n 'deploy-folder': string\n 'hyperbeam-ao-state-url'?: string\n 'hyperbeam-auto-fund'?: boolean\n 'hyperbeam-fund-amount'?: string\n 'hyperbeam-ledger-id'?: string\n 'hyperbeam-token-id'?: string\n 'hyperbeam-upload-path'?: string\n 'sig-type': string\n uploader?: string\n 'uploader-type'?: string\n}\n\nexport interface UploadWorkflowIo {\n error: (msg: string) => never\n}\n\nexport interface UploadWorkflowResult {\n cost?: UploadCost\n size?: UploadSize\n transactionId: string\n uploader?: string\n}\n\nfunction randomizedUploaders(uploaders: ActivePermawebOSBundler[]): ActivePermawebOSBundler[] {\n const candidates = [...uploaders]\n\n for (let index = candidates.length - 1; index > 0; index -= 1) {\n const swapIndex = randomInt(index + 1)\n const current = candidates[index]\n const replacement = candidates[swapIndex]\n candidates[index] = replacement\n candidates[swapIndex] = current\n }\n\n return candidates\n}\n\nasync function discoverUsableHyperbeamUploader(spinner: ReturnType<typeof ora>): Promise<string> {\n spinner.start('Discovering active HyperBEAM uploaders')\n const uploaders = randomizedUploaders(await fetchActivePermawebOSBundlers())\n\n if (uploaders.length === 0) {\n spinner.fail('No active HyperBEAM uploaders found')\n throw new Error('No active HyperBEAM uploaders found')\n }\n\n const failures: string[] = []\n for (const uploader of uploaders) {\n try {\n await preflightHyperbeamBundlerArBalance(uploader.url)\n spinner.succeed(`Selected HyperBEAM bundler (${chalk.cyan(uploader.url)})`)\n return uploader.url\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n failures.push(`${uploader.url}: ${message}`)\n }\n }\n\n spinner.fail('No active HyperBEAM uploaders with spendable AR found')\n throw new Error(\n [\n 'No active HyperBEAM uploaders with spendable AR found.',\n failures.length > 0 ? failures.join('\\n') : undefined,\n ]\n .filter(Boolean)\n .join('\\n'),\n )\n}\n\n/**\n * Sign and upload a file or folder.\n *\n * @param deployKey - Wallet material (base64 JWK or hex private key per sig-type)\n * @param config - Upload paths, dedupe, and bundler service URL.\n * @param io - Error handler (must exit the process)\n * @returns Transaction ID or folder manifest ID\n */\nexport async function runUploadWorkflow(\n deployKey: string,\n config: UploadWorkflowConfig,\n io: UploadWorkflowIo,\n): Promise<UploadWorkflowResult> {\n const spinner = ora()\n\n const uploaderType = config['uploader-type'] ?? 'legacy'\n let uploadClient: UploadClient\n let effectiveUploader: string | undefined\n\n if (uploaderType === 'hyperbeam') {\n if (config['sig-type'] !== 'arweave') {\n io.error('HyperBEAM uploads require --sig-type arweave')\n }\n\n effectiveUploader = config.uploader ?? (await discoverUsableHyperbeamUploader(spinner))\n\n let autoFund: HyperbeamBundlerAutoFundOptions | undefined\n if (config['hyperbeam-auto-fund']) {\n autoFund = {\n deployKey,\n uploader: effectiveUploader,\n }\n if (config['hyperbeam-ao-state-url']) autoFund.aoStateUrl = config['hyperbeam-ao-state-url']\n if (config['hyperbeam-ledger-id']) autoFund.ledgerId = config['hyperbeam-ledger-id']\n if (config['hyperbeam-token-id']) autoFund.tokenId = config['hyperbeam-token-id']\n if (config['hyperbeam-fund-amount']) {\n autoFund.minimumBalance = parseHyperbeamFundAmount(config['hyperbeam-fund-amount'])\n }\n }\n\n spinner.start('Initializing HyperBEAM bundler')\n uploadClient = new HyperbeamBundlerClient({\n autoFund,\n deployKey,\n quote: {\n ledgerId: config['hyperbeam-ledger-id'],\n tokenId: config['hyperbeam-token-id'],\n uploader: effectiveUploader,\n },\n uploadPath: config['hyperbeam-upload-path'] ?? '/~bundler@1.0/item?codec-device=ans104@1.0',\n uploader: effectiveUploader,\n })\n spinner.succeed(`HyperBEAM bundler initialized (${chalk.cyan(effectiveUploader)})`)\n } else {\n effectiveUploader = config.uploader ?? 'https://up.arweave.net'\n spinner.start('Initializing legacy bundler')\n uploadClient = new LegacyBundlerClient({\n deployKey,\n sigType: config['sig-type'] as SignerType,\n uploader: effectiveUploader,\n })\n\n spinner.succeed('Legacy bundler initialized')\n }\n\n let txOrManifestId: string\n let cost: UploadCost | undefined\n let size: UploadSize | undefined\n try {\n if (config['deploy-file']) {\n const filePath = expandPath(config['deploy-file'])\n spinner.start(`Uploading file ${chalk.yellow(config['deploy-file'])}`)\n\n let cache = config['dedupe-cache-max-entries'] > 0 ? loadCache() : {}\n const uploadResult = await uploadFile(uploadClient, filePath, { cache })\n\n if (!uploadResult.transactionId) {\n spinner.fail('File upload failed: no transaction ID returned')\n io.error('File upload failed: no transaction ID returned')\n }\n\n txOrManifestId = uploadResult.transactionId\n cost = uploadResult.cost\n size = uploadResult.size\n\n if (uploadResult.updatedCache && config['dedupe-cache-max-entries'] > 0) {\n cache = cleanupCache(uploadResult.updatedCache, config['dedupe-cache-max-entries'])\n saveCache(cache)\n }\n\n if (uploadResult.cacheHit) {\n spinner.succeed(`File cache hit - reusing transaction ${chalk.green(txOrManifestId)}`)\n } else {\n const cacheMsg =\n config['dedupe-cache-max-entries'] > 0 ? chalk.gray('(cached for future uploads)') : ''\n spinner.succeed(`File uploaded: ${chalk.green(txOrManifestId)} ${cacheMsg}`.trim())\n }\n } else {\n const folderPath = expandPath(config['deploy-folder'])\n spinner.start(`Uploading folder ${chalk.yellow(config['deploy-folder'])}`)\n\n let cache = config['dedupe-cache-max-entries'] > 0 ? loadCache() : {}\n const uploadResult: FolderUploadResult = await uploadFolder(uploadClient, folderPath, {\n cache,\n concurrency: config['hyperbeam-auto-fund'] ? 1 : undefined,\n omitManifestDeviceTag: uploaderType === 'hyperbeam',\n throwOnFailure: true,\n })\n\n if (!uploadResult.transactionId) {\n spinner.fail('Folder upload failed: no transaction ID returned')\n io.error('Folder upload failed: no transaction ID returned')\n }\n\n txOrManifestId = uploadResult.transactionId\n cost = uploadResult.cost\n size = uploadResult.size\n\n if (uploadResult.updatedCache && config['dedupe-cache-max-entries'] > 0) {\n cache = cleanupCache(uploadResult.updatedCache, config['dedupe-cache-max-entries'])\n saveCache(cache)\n }\n\n const { cacheHits, totalFiles, uploaded } = uploadResult\n const statsMsg =\n cacheHits > 0\n ? chalk.gray(` (${cacheHits}/${totalFiles} files cached, ${uploaded} uploaded)`)\n : ''\n\n if (uploadResult.cacheHit) {\n spinner.succeed(`All ${totalFiles} files cached - manifest: ${chalk.green(txOrManifestId)}`)\n } else {\n const cacheMsg =\n config['dedupe-cache-max-entries'] > 0\n ? chalk.gray(' (files cached for future uploads)')\n : ''\n spinner.succeed(`Folder uploaded: ${chalk.green(txOrManifestId)}${statsMsg}${cacheMsg}`)\n }\n }\n } catch (uploadError) {\n spinner.fail('Upload failed')\n const errorMessage = uploadError instanceof Error ? uploadError.message : String(uploadError)\n io.error(`Upload failed: ${errorMessage}`)\n }\n\n return {\n cost,\n size,\n transactionId: txOrManifestId,\n uploader: effectiveUploader,\n }\n}\n"],"names":["require","DataItem","createData","readableToBuffer","streamToBuffer","toBase64Url","responsePreview","aoMessage"],"mappings":"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"}
|
|
@@ -299,7 +299,7 @@ function validateConcurrency(concurrency) {
|
|
|
299
299
|
}
|
|
300
300
|
}
|
|
301
301
|
|
|
302
|
-
async function uploadFile(
|
|
302
|
+
async function uploadFile(uploadClient, filePath, options) {
|
|
303
303
|
const mimeType = mime.lookup(filePath) || "application/octet-stream";
|
|
304
304
|
const fileHash = options?.cache ? await hashFile(filePath) : void 0;
|
|
305
305
|
if (fileHash && options?.cache) {
|
|
@@ -313,7 +313,7 @@ async function uploadFile(turbo, filePath, options) {
|
|
|
313
313
|
};
|
|
314
314
|
}
|
|
315
315
|
}
|
|
316
|
-
const uploadResult = await
|
|
316
|
+
const uploadResult = await uploadClient.uploadFile({
|
|
317
317
|
dataItemOpts: {
|
|
318
318
|
tags: [
|
|
319
319
|
{
|
|
@@ -330,8 +330,7 @@ async function uploadFile(turbo, filePath, options) {
|
|
|
330
330
|
}
|
|
331
331
|
]
|
|
332
332
|
},
|
|
333
|
-
file: filePath
|
|
334
|
-
...options?.fundingMode && { fundingMode: options.fundingMode }
|
|
333
|
+
file: filePath
|
|
335
334
|
});
|
|
336
335
|
if (!uploadResult?.id) {
|
|
337
336
|
throw new Error("Failed to upload file: upload result missing transaction ID");
|
|
@@ -354,7 +353,7 @@ async function uploadFile(turbo, filePath, options) {
|
|
|
354
353
|
};
|
|
355
354
|
}
|
|
356
355
|
const DEFAULT_UPLOAD_CONCURRENCY = 10;
|
|
357
|
-
async function uploadFolder(
|
|
356
|
+
async function uploadFolder(uploadClient, folderPath, options) {
|
|
358
357
|
const concurrency = options?.concurrency ?? DEFAULT_UPLOAD_CONCURRENCY;
|
|
359
358
|
const useCache = options?.cache !== void 0;
|
|
360
359
|
const relativePaths = getAllFiles(folderPath);
|
|
@@ -386,15 +385,14 @@ async function uploadFolder(turbo, folderPath, options) {
|
|
|
386
385
|
uncachedTasks.map(
|
|
387
386
|
(task) => limit(async () => {
|
|
388
387
|
const mimeType = mime.lookup(task.fullPath) || "application/octet-stream";
|
|
389
|
-
const uploadResult = await
|
|
388
|
+
const uploadResult = await uploadClient.uploadFile({
|
|
390
389
|
dataItemOpts: {
|
|
391
390
|
tags: [
|
|
392
391
|
{ name: "App-Name", value: "Permaweb-Deploy" },
|
|
393
392
|
{ name: "Content-Type", value: mimeType }
|
|
394
393
|
]
|
|
395
394
|
},
|
|
396
|
-
file: task.fullPath
|
|
397
|
-
...options?.fundingMode && { fundingMode: options.fundingMode }
|
|
395
|
+
file: task.fullPath
|
|
398
396
|
});
|
|
399
397
|
if (!uploadResult?.id) {
|
|
400
398
|
if (options?.throwOnFailure) {
|
|
@@ -442,17 +440,17 @@ async function uploadFolder(turbo, folderPath, options) {
|
|
|
442
440
|
paths: manifestPaths
|
|
443
441
|
};
|
|
444
442
|
const manifestBuffer = Buffer.from(JSON.stringify(manifest));
|
|
445
|
-
const
|
|
443
|
+
const manifestTags = [
|
|
444
|
+
{ name: "App-Name", value: "Permaweb-Deploy" },
|
|
445
|
+
{ name: "Content-Type", value: "application/x.arweave-manifest+json" },
|
|
446
|
+
...options?.omitManifestDeviceTag ? [] : [{ name: "Device", value: "manifest@1.0" }]
|
|
447
|
+
];
|
|
448
|
+
const manifestUploadResult = await uploadClient.uploadFile({
|
|
446
449
|
dataItemOpts: {
|
|
447
|
-
tags:
|
|
448
|
-
{ name: "App-Name", value: "Permaweb-Deploy" },
|
|
449
|
-
{ name: "Content-Type", value: "application/x.arweave-manifest+json" },
|
|
450
|
-
{ name: "Device", value: "manifest@1.0" }
|
|
451
|
-
]
|
|
450
|
+
tags: manifestTags
|
|
452
451
|
},
|
|
453
452
|
fileSizeFactory: () => manifestBuffer.length,
|
|
454
|
-
fileStreamFactory: () => Readable.from(manifestBuffer)
|
|
455
|
-
...options?.fundingMode && { fundingMode: options.fundingMode }
|
|
453
|
+
fileStreamFactory: () => Readable.from(manifestBuffer)
|
|
456
454
|
});
|
|
457
455
|
if (!manifestUploadResult?.id) {
|
|
458
456
|
throw new Error("Failed to upload manifest: upload result missing transaction ID");
|
|
@@ -468,4 +466,4 @@ async function uploadFolder(turbo, folderPath, options) {
|
|
|
468
466
|
}
|
|
469
467
|
|
|
470
468
|
export { uploadFolder as a, cleanupCache as c, loadCache as l, saveCache as s, uploadFile as u };
|
|
471
|
-
//# sourceMappingURL=uploader-
|
|
469
|
+
//# sourceMappingURL=uploader-Bz9jraY2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploader-Bz9jraY2.js","sources":["../../src/utils/cache.ts","../../node_modules/.pnpm/yocto-queue@1.2.2/node_modules/yocto-queue/index.js","../../node_modules/.pnpm/p-limit@7.3.0/node_modules/p-limit/index.js","../../src/utils/uploader.ts"],"sourcesContent":["import crypto from 'node:crypto'\nimport fs from 'node:fs'\nimport path from 'node:path'\n\nimport { CACHE_DIR, CACHE_FILE } from '../constants/cache.js'\n\nexport interface TransactionCacheEntry {\n createdAtTimestamp: number\n lastUsedTimestamp: number\n transactionId: string\n}\n\nexport type TransactionCache = Record<string, TransactionCacheEntry>\n\n/**\n * Get the path to the cache file in the current working directory\n */\nexport function getCachePath(): string {\n return path.join(process.cwd(), CACHE_DIR, CACHE_FILE)\n}\n\n/**\n * Load the transaction cache from disk\n * Returns an empty object if the cache file doesn't exist or is invalid\n */\nexport function loadCache(): TransactionCache {\n const cachePath = getCachePath()\n\n try {\n if (!fs.existsSync(cachePath)) {\n return {}\n }\n\n const content = fs.readFileSync(cachePath, 'utf8')\n return JSON.parse(content) as TransactionCache\n } catch {\n // If the cache is corrupted or unreadable, start fresh\n return {}\n }\n}\n\n/**\n * Save the transaction cache to disk\n * Creates the cache directory if it doesn't exist\n */\nexport function saveCache(cache: TransactionCache): void {\n const cachePath = getCachePath()\n const cacheDir = path.dirname(cachePath)\n\n if (!fs.existsSync(cacheDir)) {\n fs.mkdirSync(cacheDir, { recursive: true })\n }\n\n fs.writeFileSync(cachePath, JSON.stringify(cache, null, 2), 'utf8')\n}\n\n/**\n * Compute the SHA-256 hash of a file using streaming\n */\nexport async function hashFile(filePath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const hash = crypto.createHash('sha256')\n const stream = fs.createReadStream(filePath)\n\n stream.on('data', (chunk) => hash.update(chunk))\n stream.on('end', () => resolve(hash.digest('hex')))\n stream.on('error', reject)\n })\n}\n\n/**\n * Recursively get all files in a directory\n * Returns relative paths from the base directory\n */\nexport function getAllFiles(dirPath: string, basePath: string = dirPath): string[] {\n const files: string[] = []\n\n for (const item of fs.readdirSync(dirPath)) {\n const fullPath = path.join(dirPath, item)\n const stats = fs.statSync(fullPath)\n\n if (stats.isDirectory()) {\n files.push(...getAllFiles(fullPath, basePath))\n } else {\n // Store relative path for consistent hashing\n files.push(path.relative(basePath, fullPath))\n }\n }\n\n return files\n}\n\n/**\n * Get a cached transaction entry by its file hash\n */\nexport function getCachedTransaction(\n cache: TransactionCache,\n hash: string,\n): TransactionCacheEntry | undefined {\n return cache[hash]\n}\n\n/**\n * Add or update a cache entry for a file hash\n * Updates lastUsedTimestamp if the entry already exists\n */\nexport function setCachedTransaction(\n cache: TransactionCache,\n hash: string,\n transactionId: string,\n): TransactionCache {\n const now = Date.now()\n const existing = cache[hash]\n\n return {\n ...cache,\n [hash]: {\n createdAtTimestamp: existing?.createdAtTimestamp ?? now,\n lastUsedTimestamp: now,\n transactionId,\n },\n }\n}\n\n/**\n * Update the lastUsedTimestamp for an existing cache entry\n */\nexport function touchCacheEntry(cache: TransactionCache, hash: string): TransactionCache {\n const existing = cache[hash]\n if (!existing) {\n return cache\n }\n\n return {\n ...cache,\n [hash]: {\n ...existing,\n lastUsedTimestamp: Date.now(),\n },\n }\n}\n\n/**\n * Clean up the cache by keeping only the most recently used entries\n * Entries are sorted by lastUsedTimestamp descending, keeping the newest maxEntries\n */\nexport function cleanupCache(cache: TransactionCache, maxEntries: number): TransactionCache {\n const entries = Object.entries(cache)\n\n if (entries.length <= maxEntries) {\n return cache\n }\n\n // Sort by lastUsedTimestamp descending (newest first)\n const sorted = entries.sort(([, a], [, b]) => b.lastUsedTimestamp - a.lastUsedTimestamp)\n\n // Keep only the newest maxEntries\n const kept = sorted.slice(0, maxEntries)\n\n return Object.fromEntries(kept)\n}\n","/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\n\t\t// Clean up tail reference when queue becomes empty\n\t\tif (!this.#head) {\n\t\t\tthis.#tail = undefined;\n\t\t}\n\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n\n\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tlet rejectOnClear = false;\n\n\tif (typeof concurrency === 'object') {\n\t\t({concurrency, rejectOnClear = false} = concurrency);\n\t}\n\n\tvalidateConcurrency(concurrency);\n\n\tif (typeof rejectOnClear !== 'boolean') {\n\t\tthrow new TypeError('Expected `rejectOnClear` to be a boolean');\n\t}\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\t// Process the next queued function if we're under the concurrency limit\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tactiveCount++;\n\t\t\tqueue.dequeue().run();\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\t// Execute the function and capture the result promise\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\t// Resolve immediately with the promise (don't wait for completion)\n\t\tresolve(result);\n\n\t\t// Wait for the function to complete (success or failure)\n\t\t// We catch errors here to prevent unhandled rejections,\n\t\t// but the original promise rejection is preserved for the caller\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\t// Decrement active count and process next queued function\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, reject, arguments_) => {\n\t\tconst queueItem = {reject};\n\n\t\t// Queue the internal resolve function instead of the run function\n\t\t// to preserve the asynchronous execution context.\n\t\tnew Promise(internalResolve => { // eslint-disable-line promise/param-names\n\t\t\tqueueItem.run = internalResolve;\n\t\t\tqueue.enqueue(queueItem);\n\t\t}).then(run.bind(undefined, function_, resolve, arguments_)); // eslint-disable-line promise/prefer-await-to-then\n\n\t\t// Start processing immediately if we haven't reached the concurrency limit\n\t\tif (activeCount < concurrency) {\n\t\t\tresumeNext();\n\t\t}\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise((resolve, reject) => {\n\t\tenqueue(function_, resolve, reject, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tif (!rejectOnClear) {\n\t\t\t\t\tqueue.clear();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst abortError = AbortSignal.abort().reason;\n\n\t\t\t\twhile (queue.size > 0) {\n\t\t\t\t\tqueue.dequeue().reject(abortError);\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t\tmap: {\n\t\t\tasync value(iterable, function_) {\n\t\t\t\tconst promises = Array.from(iterable, (value, index) => this(function_, value, index));\n\t\t\t\treturn Promise.all(promises);\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nexport function limitFunction(function_, options) {\n\tconst limit = pLimit(options);\n\n\treturn (...arguments_) => limit(() => function_(...arguments_));\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n","import path from 'node:path'\nimport { Readable } from 'node:stream'\n\nimport * as mime from 'mime-types'\nimport pLimit from 'p-limit'\n\nimport {\n getAllFiles,\n getCachedTransaction,\n hashFile,\n setCachedTransaction,\n touchCacheEntry,\n type TransactionCache,\n} from './cache.js'\nimport type { UploadClient, UploadCost, UploadSize } from './hyperbeam-uploader.js'\n\nexport interface UploadResult {\n cacheHit: boolean\n cost?: UploadCost\n size?: UploadSize\n transactionId: string\n updatedCache?: TransactionCache\n}\n\nexport interface FolderUploadResult extends UploadResult {\n /** Number of files that were cache hits (not re-uploaded) */\n cacheHits: number\n /** Total number of files in the folder */\n totalFiles: number\n /** Number of files that were uploaded */\n uploaded: number\n}\n\nexport async function uploadFile(\n uploadClient: UploadClient,\n filePath: string,\n options?: {\n cache?: TransactionCache\n },\n): Promise<UploadResult> {\n const mimeType = mime.lookup(filePath) || 'application/octet-stream'\n\n // Compute hash if cache is provided\n const fileHash = options?.cache ? await hashFile(filePath) : undefined\n\n // Check cache for hit\n if (fileHash && options?.cache) {\n const cached = getCachedTransaction(options.cache, fileHash)\n if (cached) {\n const updatedCache = touchCacheEntry(options.cache, fileHash)\n return {\n cacheHit: true,\n transactionId: cached.transactionId,\n updatedCache,\n }\n }\n }\n\n // Upload file\n const uploadResult = await uploadClient.uploadFile({\n dataItemOpts: {\n tags: [\n {\n name: 'App-Name',\n value: 'Permaweb-Deploy',\n },\n {\n name: 'anchor',\n value: new Date().toISOString(),\n },\n {\n name: 'Content-Type',\n value: mimeType,\n },\n ],\n },\n file: filePath,\n })\n\n if (!uploadResult?.id) {\n throw new Error('Failed to upload file: upload result missing transaction ID')\n }\n\n // Store in cache if provided\n if (fileHash && options?.cache) {\n const updatedCache = setCachedTransaction(options.cache, fileHash, uploadResult.id)\n return {\n cacheHit: false,\n cost: uploadResult.cost,\n size: uploadResult.size,\n transactionId: uploadResult.id,\n updatedCache,\n }\n }\n\n return {\n cacheHit: false,\n cost: uploadResult.cost,\n size: uploadResult.size,\n transactionId: uploadResult.id,\n }\n}\n\n/** Default concurrency for parallel file uploads */\nconst DEFAULT_UPLOAD_CONCURRENCY = 10\n\ninterface FileUploadTask {\n cached?: { transactionId: string }\n fullPath: string\n hash: string\n relativePath: string\n}\n\n/**\n * Upload a folder with per-file deduplication.\n * Each file is checked against the cache individually, and only uncached files are uploaded.\n * A manifest is then constructed and uploaded to create the folder structure.\n *\n * @param uploadClient - Upload client used for file and manifest uploads.\n * @param folderPath - Folder to upload.\n * @param options - Upload options for caching, concurrency, and failure handling.\n * @returns Folder upload result including manifest transaction ID and cache stats.\n */\nexport async function uploadFolder(\n uploadClient: UploadClient,\n folderPath: string,\n options?: {\n cache?: TransactionCache\n concurrency?: number\n omitManifestDeviceTag?: boolean\n throwOnFailure?: boolean\n },\n): Promise<FolderUploadResult> {\n const concurrency = options?.concurrency ?? DEFAULT_UPLOAD_CONCURRENCY\n const useCache = options?.cache !== undefined\n\n // Get all files in the folder\n const relativePaths = getAllFiles(folderPath)\n\n if (relativePaths.length === 0) {\n throw new Error('Folder is empty, nothing to upload')\n }\n\n // Prepare file tasks with hashes (if caching is enabled)\n const tasks: FileUploadTask[] = await Promise.all(\n relativePaths.map(async (relativePath) => {\n const fullPath = path.join(folderPath, relativePath)\n const hash = useCache ? await hashFile(fullPath) : ''\n return { fullPath, hash, relativePath }\n }),\n )\n\n // Check cache for each file\n let cache = options?.cache ?? {}\n let cacheHits = 0\n\n for (const task of tasks) {\n if (useCache && task.hash) {\n const cached = getCachedTransaction(cache, task.hash)\n if (cached) {\n task.cached = { transactionId: cached.transactionId }\n cache = touchCacheEntry(cache, task.hash)\n cacheHits++\n }\n }\n }\n\n // If all files are cached, we still need to build and upload a new manifest\n // (because the manifest itself has a unique transaction ID each time)\n const uncachedTasks = tasks.filter((t) => !t.cached)\n\n // Upload uncached files with concurrency control using p-limit\n const limit = pLimit(concurrency)\n\n const uploadResults = await Promise.all(\n uncachedTasks.map((task) =>\n limit(async () => {\n const mimeType = mime.lookup(task.fullPath) || 'application/octet-stream'\n\n const uploadResult = await uploadClient.uploadFile({\n dataItemOpts: {\n tags: [\n { name: 'App-Name', value: 'Permaweb-Deploy' },\n { name: 'Content-Type', value: mimeType },\n ],\n },\n file: task.fullPath,\n })\n\n if (!uploadResult?.id) {\n if (options?.throwOnFailure) {\n throw new Error(`Failed to upload file: ${task.relativePath}`)\n }\n\n return { hash: task.hash, task, transactionId: null }\n }\n\n return { hash: task.hash, task, transactionId: uploadResult.id }\n }),\n ),\n )\n\n // Update cache with all successful uploads (done sequentially to avoid race conditions)\n for (const result of uploadResults) {\n if (useCache && result.hash && result.transactionId) {\n cache = setCachedTransaction(cache, result.hash, result.transactionId)\n }\n }\n\n // Check for any failed uploads\n const failedUploads = uploadResults.filter((r) => r.transactionId === null)\n if (failedUploads.length > 0 && options?.throwOnFailure) {\n throw new Error(\n `Failed to upload ${failedUploads.length} file(s): ${failedUploads.map((f) => f.task.relativePath).join(', ')}`,\n )\n }\n\n // Build manifest paths from cached and newly uploaded files\n const manifestPaths: Record<string, { id: string }> = {}\n\n for (const task of tasks) {\n let transactionId: string | null = null\n\n if (task.cached) {\n transactionId = task.cached.transactionId\n } else {\n const uploadResult = uploadResults.find((r) => r.task === task)\n transactionId = uploadResult?.transactionId ?? null\n }\n\n if (transactionId) {\n manifestPaths[task.relativePath] = { id: transactionId }\n\n // Add directory index support: if file is dir/index.html, also add dir → same ID\n if (task.relativePath.endsWith('/index.html')) {\n const dirPath = task.relativePath.replace(/\\/index\\.html$/, '')\n manifestPaths[dirPath] = { id: transactionId }\n }\n }\n }\n\n // Determine the index path (root index.html)\n const indexPath = relativePaths.includes('index.html') ? 'index.html' : undefined\n\n // Build the manifest\n const manifest = {\n manifest: 'arweave/paths',\n version: '0.2.0',\n ...(indexPath && { index: { path: indexPath } }),\n paths: manifestPaths,\n }\n\n // Upload the manifest\n const manifestBuffer = Buffer.from(JSON.stringify(manifest))\n const manifestTags = [\n { name: 'App-Name', value: 'Permaweb-Deploy' },\n { name: 'Content-Type', value: 'application/x.arweave-manifest+json' },\n ...(options?.omitManifestDeviceTag ? [] : [{ name: 'Device', value: 'manifest@1.0' }]),\n ]\n const manifestUploadResult = await uploadClient.uploadFile({\n dataItemOpts: {\n tags: manifestTags,\n },\n fileSizeFactory: () => manifestBuffer.length,\n fileStreamFactory: () => Readable.from(manifestBuffer),\n })\n\n if (!manifestUploadResult?.id) {\n throw new Error('Failed to upload manifest: upload result missing transaction ID')\n }\n\n return {\n cacheHit: cacheHits === tasks.length,\n cacheHits,\n totalFiles: tasks.length,\n transactionId: manifestUploadResult.id,\n updatedCache: useCache ? cache : undefined,\n uploaded: uncachedTasks.length - failedUploads.length,\n }\n}\n"],"names":[],"mappings":"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","x_google_ignoreList":[1,2]}
|
package/dist/commands/deploy.js
CHANGED
|
@@ -1,36 +1,34 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
|
-
import { ARIO, AOProcess, ANT } from '@ar.io/sdk';
|
|
3
2
|
import { Command } from '@oclif/core';
|
|
4
|
-
import { connect } from '@permaweb/aoconnect';
|
|
5
3
|
import ora from 'ora';
|
|
6
|
-
import { deployFlagConfigs } from '../constants/flags.js';
|
|
7
|
-
import { promptAdvancedOptions } from '../prompts/arns.js';
|
|
4
|
+
import { deployFlagConfigs, DEFAULT_LEGACY_UPLOADER } from '../constants/flags.js';
|
|
8
5
|
import { getWalletConfig } from '../prompts/wallet.js';
|
|
9
|
-
import { c as chalk
|
|
6
|
+
import { c as chalk } from '../chunks/chalk-BP_cCc9v.js';
|
|
10
7
|
import { extractFlags, resolveConfig } from '../utils/config-resolver.js';
|
|
11
|
-
import { f as formatDisplayRows, a as formatUploadError } from '../chunks/display-
|
|
8
|
+
import { f as formatDisplayRows, a as formatUploadError } from '../chunks/display-CZV6KUcG.js';
|
|
9
|
+
import { r as runUploadWorkflow, h as hyperbeamBundlerLink } from '../chunks/upload-workflow-f3hExxtV.js';
|
|
10
|
+
import { preflightNamesUpdate, publishNamesUpdate } from '../utils/names.js';
|
|
12
11
|
import { expandPath } from '../utils/path.js';
|
|
13
|
-
import { createSigner } from '../utils/signer.js';
|
|
14
12
|
|
|
15
13
|
class Deploy extends Command {
|
|
16
14
|
static args = {};
|
|
17
|
-
static description = "Deploy an application to the permaweb with optional
|
|
15
|
+
static description = "Deploy an application to the permaweb with optional names update";
|
|
18
16
|
static examples = [
|
|
19
17
|
"<%= config.bin %> deploy --wallet ./wallet.json",
|
|
20
18
|
"<%= config.bin %> deploy --wallet ./wallet.json --deploy-folder ./dist",
|
|
21
19
|
"<%= config.bin %> deploy --wallet ./wallet.json --deploy-file ./dist/index.html",
|
|
22
20
|
"<%= config.bin %> deploy --wallet ./wallet.json --uploader-type hyperbeam --uploader https://hyperbeam.example.com",
|
|
23
|
-
"<%= config.bin %> deploy --wallet ./wallet.json --use-
|
|
24
|
-
"<%= config.bin %> deploy --wallet ./wallet.json --use-
|
|
21
|
+
"<%= config.bin %> deploy --wallet ./wallet.json --use-names --name my-app",
|
|
22
|
+
"<%= config.bin %> deploy --wallet ./wallet.json --use-names --reference-id REFERENCE_ID"
|
|
25
23
|
];
|
|
26
24
|
static flags = extractFlags(deployFlagConfigs);
|
|
27
25
|
async run() {
|
|
28
26
|
try {
|
|
29
27
|
const { flags } = await this.parse(Deploy);
|
|
30
|
-
const
|
|
31
|
-
const interactive =
|
|
28
|
+
const useNames = Boolean(flags["use-names"] || flags.name || flags["reference-id"]);
|
|
29
|
+
const interactive = useNames && !flags.name && !flags["reference-id"];
|
|
32
30
|
if (interactive) {
|
|
33
|
-
this.log(chalk.bold(chalk.cyan("\nInteractive
|
|
31
|
+
this.log(chalk.bold(chalk.cyan("\nInteractive Names Deployment Mode\n")));
|
|
34
32
|
}
|
|
35
33
|
const baseConfig = await resolveConfig(deployFlagConfigs, flags, {
|
|
36
34
|
interactive
|
|
@@ -47,15 +45,9 @@ class Deploy extends Command {
|
|
|
47
45
|
wallet: config.wallet
|
|
48
46
|
};
|
|
49
47
|
}
|
|
50
|
-
let advancedOptions;
|
|
51
|
-
if (interactive) {
|
|
52
|
-
const options = await promptAdvancedOptions();
|
|
53
|
-
advancedOptions = options || void 0;
|
|
54
|
-
}
|
|
55
48
|
const effectiveCacheMaxEntries = baseConfig["no-dedupe"] ? 0 : baseConfig["dedupe-cache-max-entries"];
|
|
49
|
+
const uploader = baseConfig.uploader ?? (baseConfig["uploader-type"] === "legacy" ? DEFAULT_LEGACY_UPLOADER : void 0);
|
|
56
50
|
const deployConfig = {
|
|
57
|
-
"ario-process": advancedOptions?.arioProcess || baseConfig["ario-process"],
|
|
58
|
-
"arns-name": baseConfig["arns-name"],
|
|
59
51
|
"dedupe-cache-max-entries": effectiveCacheMaxEntries,
|
|
60
52
|
"deploy-file": baseConfig["deploy-file"],
|
|
61
53
|
"deploy-folder": baseConfig["deploy-folder"],
|
|
@@ -65,16 +57,17 @@ class Deploy extends Command {
|
|
|
65
57
|
"hyperbeam-ledger-id": baseConfig["hyperbeam-ledger-id"],
|
|
66
58
|
"hyperbeam-token-id": baseConfig["hyperbeam-token-id"],
|
|
67
59
|
"hyperbeam-upload-path": baseConfig["hyperbeam-upload-path"],
|
|
68
|
-
|
|
60
|
+
name: baseConfig.name,
|
|
61
|
+
"names-gateway": baseConfig["names-gateway"],
|
|
62
|
+
"names-graphql": baseConfig["names-graphql"],
|
|
63
|
+
"names-namespace": baseConfig["names-namespace"],
|
|
69
64
|
"no-dedupe": baseConfig["no-dedupe"],
|
|
70
|
-
"on-demand": advancedOptions?.onDemand || baseConfig["on-demand"],
|
|
71
65
|
"private-key": walletConfig.privateKey,
|
|
66
|
+
"reference-id": baseConfig["reference-id"],
|
|
72
67
|
"sig-type": baseConfig["sig-type"],
|
|
73
|
-
|
|
74
|
-
undername: advancedOptions?.undername || baseConfig.undername,
|
|
75
|
-
uploader: baseConfig.uploader,
|
|
68
|
+
uploader,
|
|
76
69
|
"uploader-type": baseConfig["uploader-type"],
|
|
77
|
-
"use-
|
|
70
|
+
"use-names": useNames,
|
|
78
71
|
wallet: walletConfig.wallet
|
|
79
72
|
};
|
|
80
73
|
if (interactive) {
|
|
@@ -100,24 +93,22 @@ class Deploy extends Command {
|
|
|
100
93
|
}
|
|
101
94
|
this.log(chalk.bold(chalk.cyan("\nStarting deployment...\n")));
|
|
102
95
|
try {
|
|
103
|
-
if (!deployConfig["use-
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
);
|
|
96
|
+
if (!deployConfig["use-names"]) {
|
|
97
|
+
const uploadResult2 = await runUploadWorkflow(deployKey, deployConfig, {
|
|
98
|
+
error: (msg) => this.error(msg)
|
|
99
|
+
});
|
|
100
|
+
const txOrManifestId2 = uploadResult2.transactionId;
|
|
101
|
+
const effectiveUploader2 = uploadResult2.uploader ?? deployConfig.uploader;
|
|
111
102
|
this.log("");
|
|
112
|
-
const bundlerLink2 = deployConfig["uploader-type"] === "hyperbeam" &&
|
|
113
|
-
|
|
103
|
+
const bundlerLink2 = deployConfig["uploader-type"] === "hyperbeam" && effectiveUploader2 ? hyperbeamBundlerLink(
|
|
104
|
+
effectiveUploader2,
|
|
114
105
|
txOrManifestId2,
|
|
115
106
|
!deployConfig["deploy-file"]
|
|
116
107
|
) : void 0;
|
|
117
108
|
const rows2 = [["Tx ID", chalk.green(txOrManifestId2)]];
|
|
118
|
-
if (
|
|
109
|
+
if (effectiveUploader2) {
|
|
119
110
|
rows2.push(
|
|
120
|
-
["Bundler service", chalk.cyan(
|
|
111
|
+
["Bundler service", chalk.cyan(effectiveUploader2)],
|
|
121
112
|
["Uploader type", chalk.cyan(deployConfig["uploader-type"])]
|
|
122
113
|
);
|
|
123
114
|
}
|
|
@@ -129,69 +120,53 @@ class Deploy extends Command {
|
|
|
129
120
|
this.log(formatDisplayRows(rows2));
|
|
130
121
|
return;
|
|
131
122
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
123
|
+
if (deployConfig["sig-type"] !== "arweave") {
|
|
124
|
+
this.error("Names updates currently require --sig-type arweave");
|
|
125
|
+
}
|
|
126
|
+
if (!deployConfig.name && !deployConfig["reference-id"]) {
|
|
127
|
+
this.error("--use-names requires --name or --reference-id");
|
|
136
128
|
}
|
|
137
129
|
const spinner = ora();
|
|
138
|
-
spinner.start("
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
130
|
+
spinner.start("Validating names reference");
|
|
131
|
+
const namesTarget = await preflightNamesUpdate({
|
|
132
|
+
deployKey,
|
|
133
|
+
gateway: deployConfig["names-gateway"],
|
|
134
|
+
graphql: deployConfig["names-graphql"],
|
|
135
|
+
name: deployConfig.name,
|
|
136
|
+
namespace: deployConfig["names-namespace"],
|
|
137
|
+
referenceId: deployConfig["reference-id"],
|
|
138
|
+
sigType: deployConfig["sig-type"]
|
|
139
|
+
}).catch((error) => {
|
|
140
|
+
spinner.fail("Names reference validation failed");
|
|
141
|
+
throw error;
|
|
149
142
|
});
|
|
150
|
-
spinner.succeed("
|
|
151
|
-
|
|
152
|
-
const arnsNameRecord = await ario.getArNSRecord({ name: arnsName }).catch(() => {
|
|
153
|
-
spinner.fail(`ArNS name ${chalk.red(arnsName)} does not exist`);
|
|
154
|
-
this.error(`ArNS name [${arnsName}] does not exist`);
|
|
155
|
-
});
|
|
156
|
-
spinner.succeed(`ArNS record fetched for ${chalk.green(arnsName)}`);
|
|
157
|
-
const { transactionId: txOrManifestId } = await runUploadWorkflow(deployKey, deployConfig, {
|
|
143
|
+
spinner.succeed("Names reference validated");
|
|
144
|
+
const uploadResult = await runUploadWorkflow(deployKey, deployConfig, {
|
|
158
145
|
error: (msg) => this.error(msg)
|
|
159
146
|
});
|
|
147
|
+
const txOrManifestId = uploadResult.transactionId;
|
|
148
|
+
const effectiveUploader = uploadResult.uploader ?? deployConfig.uploader;
|
|
160
149
|
this.log("");
|
|
161
|
-
spinner.start("Updating
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
{
|
|
178
|
-
name: "GIT-HASH",
|
|
179
|
-
value: process.env.GITHUB_SHA
|
|
180
|
-
}
|
|
181
|
-
] : []
|
|
182
|
-
]
|
|
183
|
-
}
|
|
184
|
-
);
|
|
185
|
-
spinner.succeed("ANT record updated");
|
|
186
|
-
const bundlerLink = deployConfig["uploader-type"] === "hyperbeam" && deployConfig.uploader ? hyperbeamBundlerLink(
|
|
187
|
-
deployConfig.uploader,
|
|
188
|
-
txOrManifestId,
|
|
189
|
-
!deployConfig["deploy-file"]
|
|
190
|
-
) : void 0;
|
|
150
|
+
spinner.start("Updating names reference");
|
|
151
|
+
const namesUpdate = await publishNamesUpdate({
|
|
152
|
+
deployKey,
|
|
153
|
+
gateway: deployConfig["names-gateway"],
|
|
154
|
+
graphql: deployConfig["names-graphql"],
|
|
155
|
+
name: namesTarget.name,
|
|
156
|
+
namespace: deployConfig["names-namespace"],
|
|
157
|
+
referenceId: namesTarget.referenceId,
|
|
158
|
+
sigType: deployConfig["sig-type"],
|
|
159
|
+
value: txOrManifestId
|
|
160
|
+
}).catch((error) => {
|
|
161
|
+
spinner.fail("Names reference update failed");
|
|
162
|
+
throw error;
|
|
163
|
+
});
|
|
164
|
+
spinner.succeed("Names reference updated");
|
|
165
|
+
const bundlerLink = deployConfig["uploader-type"] === "hyperbeam" && effectiveUploader ? hyperbeamBundlerLink(effectiveUploader, txOrManifestId, !deployConfig["deploy-file"]) : void 0;
|
|
191
166
|
const rows = [["Tx ID", chalk.green(txOrManifestId)]];
|
|
192
|
-
if (
|
|
167
|
+
if (effectiveUploader) {
|
|
193
168
|
rows.push(
|
|
194
|
-
["Bundler service", chalk.cyan(
|
|
169
|
+
["Bundler service", chalk.cyan(effectiveUploader)],
|
|
195
170
|
["Uploader type", chalk.cyan(deployConfig["uploader-type"])]
|
|
196
171
|
);
|
|
197
172
|
}
|
|
@@ -199,11 +174,10 @@ class Deploy extends Command {
|
|
|
199
174
|
rows.push(["Bundler link", chalk.yellow(bundlerLink)]);
|
|
200
175
|
}
|
|
201
176
|
rows.push(
|
|
202
|
-
["
|
|
203
|
-
["
|
|
204
|
-
["
|
|
205
|
-
["
|
|
206
|
-
["TTL Seconds", chalk.blue(deployConfig["ttl-seconds"])],
|
|
177
|
+
...namesUpdate.name ? [["Name", chalk.yellow(namesUpdate.name)]] : [],
|
|
178
|
+
["Reference ID", chalk.cyan(namesUpdate.referenceId)],
|
|
179
|
+
["Names Update ID", chalk.green(namesUpdate.updateId)],
|
|
180
|
+
["Names Namespace", chalk.gray(namesUpdate.namespace)],
|
|
207
181
|
["Arweave URL", chalk.yellow(`https://arweave.net/${txOrManifestId}`)]
|
|
208
182
|
);
|
|
209
183
|
this.log(chalk.bold(chalk.green("Deployment Successful!")));
|