@geek-fun/serverlessinsight
Version:
Full life cycle cross providers serverless application management for your fast-growing business.
179 lines (178 loc) • 7.18 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.cleanupAssets = exports.publishAssets = exports.constructAssets = exports.getAssets = void 0;
const node_fs_1 = __importDefault(require("node:fs"));
const ossDeployment = __importStar(require("@alicloud/ros-cdk-ossdeployment"));
const node_path_1 = __importDefault(require("node:path"));
const jszip_1 = __importDefault(require("jszip"));
const logger_1 = require("./logger");
const lodash_1 = require("lodash");
const ali_oss_1 = __importDefault(require("ali-oss"));
const context_1 = require("./context");
const buildAssets = (rootPath, relativePath) => {
const location = node_path_1.default.resolve(rootPath, relativePath);
if (!node_fs_1.default.existsSync(location)) {
throw new Error(`Location: ${location} is not exists!`);
}
if (node_fs_1.default.lstatSync(location).isFile()) {
return [
ossDeployment.Source.asset(location, {}, relativePath.substring(0, relativePath.lastIndexOf('/') + 1)),
];
}
return node_fs_1.default
.readdirSync(location)
.map((file) => buildAssets(rootPath, `${relativePath}/${file}`.replace(/^\//, '')))
.flat();
};
const getAssets = (location) => {
return buildAssets(location, '');
};
exports.getAssets = getAssets;
const assembleFiles = (folder, zip) => {
const files = node_fs_1.default.readdirSync(folder);
files.forEach((file) => {
const filePath = node_path_1.default.join(folder, file);
if (node_fs_1.default.lstatSync(filePath).isFile()) {
const content = node_fs_1.default.readFileSync(filePath);
zip.file(file, content);
}
else {
const subZip = zip.folder(file);
if (subZip) {
assembleFiles(filePath, subZip);
}
}
});
};
const zipAssets = async (assetsPath) => {
const zip = new jszip_1.default();
assembleFiles(assetsPath, zip);
const zipPath = `${assetsPath.replace(/\/$/, '').trim()}.zip`;
await zip
.generateAsync({ type: 'nodebuffer' })
.then((content) => {
node_fs_1.default.writeFileSync(zipPath, content);
logger_1.logger.info(`Folder compressed to: ${zipPath}`);
})
.catch((e) => {
logger_1.logger.error(`Failed to compress folder: ${e}`);
throw e;
});
return zipPath;
};
const constructAssets = async ({ files, rootPath, }) => {
const { region } = (0, context_1.getContext)();
const assets = await Promise.all(Object.entries(files)
.filter(([, fileItem]) => !fileItem.source.path.endsWith('.template.json'))
.map(async ([, fileItem]) => {
let sourcePath = `${rootPath}/${fileItem.source.path}`;
if (fileItem.source.packaging === 'zip') {
sourcePath = await zipAssets(`${rootPath}/${fileItem.source.path}`);
}
return {
bucketName: (0, lodash_1.get)(fileItem, 'destinations.current_account-current_region.bucketName', '').replace('${ALIYUN::Region}', region),
source: sourcePath,
objectKey: (0, lodash_1.get)(fileItem, 'destinations.current_account-current_region.objectKey'),
};
}));
return !(0, lodash_1.isEmpty)(assets) ? assets : undefined;
};
exports.constructAssets = constructAssets;
const ensureBucketExits = async (bucketName, ossClient) => await ossClient.getBucketInfo(bucketName).catch((err) => {
if (err.code === 'NoSuchBucket') {
logger_1.logger.info(`Bucket: ${bucketName} not exists, creating...`);
return ossClient.putBucket(bucketName, {
storageClass: 'Standard',
acl: 'private',
dataRedundancyType: 'LRS',
});
}
else {
throw err;
}
});
const publishAssets = async (assets) => {
if (!assets?.length) {
logger_1.logger.info('No assets to publish, skipped!');
return;
}
const context = (0, context_1.getContext)();
const bucketName = assets[0].bucketName;
const client = new ali_oss_1.default({
region: `oss-${context.region}`,
accessKeyId: context.accessKeyId,
accessKeySecret: context.accessKeySecret,
bucket: bucketName,
timeout: 600000, // 10 minutes
});
await ensureBucketExits(bucketName, client);
const headers = {
'x-oss-storage-class': 'Standard',
'x-oss-object-acl': 'default',
'x-oss-forbid-overwrite': 'false',
};
await Promise.all(assets.map(async ({ source, objectKey }) => {
await client.put(objectKey, node_path_1.default.normalize(source), { headers });
logger_1.logger.debug(`Upload file: ${source} to bucket: ${bucketName} successfully!`);
}));
return bucketName;
};
exports.publishAssets = publishAssets;
const cleanupAssets = async (assets) => {
if (!assets?.length) {
logger_1.logger.info('No assets to cleanup, skipped!');
return;
}
const context = (0, context_1.getContext)();
const bucketName = assets[0].bucketName;
const client = new ali_oss_1.default({
region: `oss-${context.region}`,
accessKeyId: context.accessKeyId,
accessKeySecret: context.accessKeySecret,
bucket: bucketName,
});
await Promise.all(assets.map(async ({ objectKey }) => {
await client.delete(objectKey);
logger_1.logger.debug(`Cleanup file: ${objectKey} from bucket: ${bucketName} successfully!`);
}));
// delete the bucket
await client.deleteBucket(bucketName);
logger_1.logger.debug(`Cleanup bucket: ${bucketName} successfully!`);
};
exports.cleanupAssets = cleanupAssets;