-
Notifications
You must be signed in to change notification settings - Fork 11
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rework to handle complex website (#61)
* Update dependency and set type to module * Deploying website according to new API where deployments are managed through a JSON index instead of multiple chains * Print different message for file or folder deployment * Display explorer transaction link
- Loading branch information
Showing
9 changed files
with
288 additions
and
1,695 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,21 +1,15 @@ | ||
#!/usr/bin/env node | ||
|
||
const yargs = require('yargs') | ||
import yargs from 'yargs' | ||
import { hideBin } from 'yargs/helpers' | ||
import about from './commands/about.js' | ||
import generate_address from './commands/generate_address.js' | ||
import deploy from './commands/deploy.js' | ||
|
||
yargs.command(require('./commands/about')) | ||
.help() | ||
const y = yargs(hideBin(process.argv)) | ||
|
||
yargs.command((require('./commands/generate_address'))) | ||
.help() | ||
y.command(about).help() | ||
y.command(generate_address).help() | ||
y.command(deploy).help() | ||
|
||
yargs.command((require('./commands/deploy_file'))) | ||
.help() | ||
|
||
yargs.command((require('./commands/deploy_folder'))) | ||
.help() | ||
|
||
yargs.command((require('./commands/deploy_website'))) | ||
.help() | ||
|
||
|
||
yargs.parse() | ||
y.parse() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,21 @@ | ||
const chalk = require('chalk') | ||
const figlet = require('figlet') | ||
import chalk from 'chalk' | ||
import figlet from 'figlet' | ||
|
||
exports.command = 'about' | ||
const command = 'about' | ||
|
||
exports.describe = 'Welcome to AeWeb' | ||
const describe = 'Welcome to AeWeb' | ||
|
||
exports.handler = function () { | ||
const handler = function () { | ||
console.log(chalk.green('\n', 'Hello and Welcome to AeWeb !', '\n')) | ||
console.log(chalk.blue(figlet.textSync('AEWEB', { | ||
font: "Alligator2" | ||
}))) | ||
console.log(chalk.green('\n', 'Create your Website on top of Archethic Public Blockchain')) | ||
console.log(chalk.green('\n')) | ||
} | ||
|
||
export default { | ||
command, | ||
describe, | ||
handler | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,147 @@ | ||
import fs from "fs"; | ||
import archethic from "archethic"; | ||
import chalk from "chalk"; | ||
import path from "path"; | ||
import yesno from "yesno"; | ||
import zlib from 'zlib' | ||
|
||
const command = "deploy"; | ||
|
||
const describe = | ||
"Deploy a single file or all file inside a folder"; | ||
|
||
const builder = { | ||
seed: { | ||
describe: | ||
"Seed is a string representing the transaction chain entropy to be able to derive and generate the keys for the transactions", | ||
demandOption: true, // Required | ||
type: "string", | ||
}, | ||
|
||
endpoint: { | ||
describe: | ||
"Endpoint is the URL of a welcome node to receive the transaction", | ||
demandOption: true, // Required | ||
type: "string", | ||
}, | ||
|
||
path: { | ||
describe: "Path to the folder or the file to deploy", | ||
demandOption: true, // Required | ||
type: "string", | ||
}, | ||
}; | ||
|
||
const handler = async function (argv) { | ||
try { | ||
// Derive address and get last transaction index | ||
const seed = argv.seed | ||
const endpoint = argv.endpoint | ||
const firstAddress = archethic.deriveAddress(seed, 0) | ||
const index = await archethic.getTransactionIndex(firstAddress, endpoint) | ||
|
||
// Convert directory structure to json | ||
console.log(chalk.blue('Creating file structure and compress content...')) | ||
|
||
let json = {} | ||
let argStats | ||
try { | ||
argStats = fs.statSync(argv.path) | ||
if (argStats.isDirectory()) { | ||
json = handleDirectory(argv.path) | ||
} else { | ||
json[path.basename(argv.path)] = handleFile(argv.path) | ||
} | ||
|
||
if (Object.keys(json).length === 0) { | ||
throw { message: 'Folder ' + argv.path + ' is empty' } | ||
} | ||
} catch (e) { | ||
throw e.message | ||
} | ||
|
||
// Create transaction | ||
console.log(chalk.blue('Creating transaction, it may take a while...')) | ||
|
||
const tx = archethic.newTransactionBuilder('hosting') | ||
.setContent(JSON.stringify(json)) | ||
.build(seed, index) | ||
.originSign(await archethic.getOriginKey(endpoint)) | ||
|
||
// Get transaction fees and ask user | ||
const { fee: fees, rates: rates } = await archethic.getTransactionFee(tx, endpoint) | ||
|
||
const ok = await yesno({ | ||
question: chalk.yellowBright( | ||
"Total Fee Requirement would be : " + | ||
fees.toFixed(2) + | ||
" UCO ( $ " + | ||
(rates.usd * fees).toFixed(2) + | ||
" | € " + | ||
(rates.eur * fees).toFixed(2) + | ||
" ). Do you want to continue. (yes/no)" | ||
), | ||
}); | ||
|
||
if (ok) { | ||
console.log(chalk.blue('Sending transaction...')) | ||
|
||
await archethic.waitConfirmations( | ||
tx.address, | ||
endpoint, | ||
nbConfirmations => { | ||
console.log(chalk.blue("Got " + nbConfirmations + " confirmations")) | ||
console.log( | ||
chalk.cyanBright( | ||
"See transaction in explorer:", | ||
endpoint + '/explorer/transaction/' + Buffer.from(tx.address).toString('hex') | ||
) | ||
) | ||
console.log( | ||
chalk.green( | ||
(argStats.isDirectory() ? "Website": "File") + " is deployed at:", | ||
endpoint + "/api/web_hosting/" + firstAddress + '/' | ||
) | ||
) | ||
} | ||
) | ||
|
||
await archethic.sendTransaction(tx, endpoint) | ||
console.log(chalk.blue('Waiting transaction validation...')) | ||
} else { | ||
throw "User aborted website deployment." | ||
} | ||
} catch (e) { | ||
console.log(chalk.red(e)) | ||
} | ||
} | ||
|
||
function handleFile(file) { | ||
const data = fs.readFileSync(file) | ||
return { | ||
encodage: 'gzip', | ||
content: zlib.gzipSync(data).toString('base64url') | ||
} | ||
} | ||
|
||
function handleDirectory(entry) { | ||
const stats = fs.statSync(entry) | ||
let json = {} | ||
|
||
if (stats.isDirectory()) { | ||
fs.readdirSync(entry).forEach(child => { | ||
json[path.basename(child)] = handleDirectory(entry + '/' + child) | ||
}); | ||
} else { | ||
json = handleFile(entry) | ||
} | ||
|
||
return json; | ||
} | ||
|
||
export default { | ||
command, | ||
describe, | ||
builder, | ||
handler | ||
} |
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.