57 lines
1.4 KiB
JavaScript
57 lines
1.4 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
const fs = require("node:fs");
|
|
const path = require("node:path");
|
|
|
|
const DEFAULT_ASSETS = [
|
|
{
|
|
path: "licensed/GeoLite2-City.mmdb",
|
|
url: "https://raw.githubusercontent.com/P3TERX/GeoLite.mmdb/download/GeoLite2-City.mmdb",
|
|
},
|
|
];
|
|
|
|
async function downloadAsset(asset, destination) {
|
|
const response = await fetch(asset.url);
|
|
if (!response.ok) {
|
|
throw new Error(
|
|
`Failed to download ${asset.url}: ${response.status} ${response.statusText}`,
|
|
);
|
|
}
|
|
|
|
const arrayBuffer = await response.arrayBuffer();
|
|
fs.mkdirSync(path.dirname(destination), { recursive: true });
|
|
fs.writeFileSync(destination, Buffer.from(arrayBuffer));
|
|
}
|
|
|
|
async function ensureLicensedAssets({
|
|
rootDir = __dirname ? path.resolve(__dirname, "..") : process.cwd(),
|
|
assets = DEFAULT_ASSETS,
|
|
downloadAsset: downloadImpl = downloadAsset,
|
|
} = {}) {
|
|
for (const asset of assets) {
|
|
const destination = path.resolve(rootDir, asset.path);
|
|
if (fs.existsSync(destination)) {
|
|
continue;
|
|
}
|
|
|
|
await downloadImpl(asset, destination);
|
|
}
|
|
}
|
|
|
|
if (require.main === module) {
|
|
ensureLicensedAssets()
|
|
.then(() => {
|
|
process.stdout.write("Licensed assets are ready.\n");
|
|
})
|
|
.catch((error) => {
|
|
process.stderr.write(`${error.stack || error}\n`);
|
|
process.exit(1);
|
|
});
|
|
}
|
|
|
|
module.exports = {
|
|
DEFAULT_ASSETS,
|
|
downloadAsset,
|
|
ensureLicensedAssets,
|
|
};
|