@cloudbase/lowcode-deployer
Version:
deploy weda app
239 lines (238 loc) • 9.5 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getUploadDirFileList = exports.Storage = void 0;
const cos_nodejs_sdk_v5_1 = __importDefault(require("cos-nodejs-sdk-v5"));
const client_s3_1 = require("@aws-sdk/client-s3");
const request_1 = __importDefault(require("request"));
const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
const node_http_handler_1 = require("@aws-sdk/node-http-handler");
const fs_extra_1 = __importDefault(require("fs-extra"));
const path_1 = __importDefault(require("path"));
const mime_types_1 = require("mime-types");
class Storage {
constructor({ endpoint, region, credential, cos = true, instance, }) {
this.endpoint = '';
this._cos = cos;
this._region = region || '';
if (instance) {
this._instance = instance;
}
else {
if (this._cos) {
this._instance = (credential === null || credential === void 0 ? void 0 : credential.token)
? new cos_nodejs_sdk_v5_1.default({
Timeout: 15000,
getAuthorization(options, callback) {
callback({
TmpSecretId: (credential === null || credential === void 0 ? void 0 : credential.secretId) || '',
TmpSecretKey: (credential === null || credential === void 0 ? void 0 : credential.secretKey) || '',
XCosSecurityToken: (credential === null || credential === void 0 ? void 0 : credential.token) || '',
ExpiredTime: Math.floor(Date.now() / 1000) + 600,
StartTime: Math.floor(Date.now() / 1000),
});
},
})
: new cos_nodejs_sdk_v5_1.default({
SecretId: credential === null || credential === void 0 ? void 0 : credential.secretId,
SecretKey: credential === null || credential === void 0 ? void 0 : credential.secretKey,
Timeout: 15000,
});
}
else {
this.endpoint = endpoint || 'http://oss-csp1.rgw.infra.tce.io';
this._instance = new client_s3_1.S3Client({
endpoint: this.endpoint,
region: region || 'us-east-1',
forcePathStyle: process.env.S3_FORCE_PATH_STYLE !== 'false',
// sslEnabled: false,
credentials: {
accessKeyId: (credential === null || credential === void 0 ? void 0 : credential.secretId) || '',
secretAccessKey: (credential === null || credential === void 0 ? void 0 : credential.secretKey) || '',
sessionToken: (credential === null || credential === void 0 ? void 0 : credential.token) || '',
},
requestHandler: new node_http_handler_1.NodeHttpHandler({
connectionTimeout: 1000,
socketTimeout: 1000, // 套接字超时,单位为毫秒
}),
});
}
}
}
async getObjectSignedUrl({ Bucket, Key, Expires }) {
const baseParam = { Bucket, Key };
if (!this._cos) {
const url = await (0, s3_request_presigner_1.getSignedUrl)(this._instance, new client_s3_1.GetObjectCommand(baseParam), {
expiresIn: Expires,
});
return { Url: url };
}
else {
return new Promise((resolve, reject) => {
this._instance.getObjectUrl({
...baseParam,
Sign: true,
Region: this._region || 'ap-shanghai',
Expires,
}, (err, data) => {
if (err) {
reject(err);
}
else {
resolve(data);
}
});
});
}
}
async putObject({ Bucket, Key, Body, ACL, Headers = {}, }) {
const baseParam = {
Bucket,
Body,
Key,
};
if (this._cos) {
return new Promise((resolve, reject) => {
this._instance.putObject({
Region: this._region || 'ap-shanghai',
...baseParam,
}, (err) => {
if (err) {
reject(err);
}
else {
resolve(null);
}
});
});
}
const contentType = (0, mime_types_1.lookup)(baseParam.Key);
if (process.env.STORAGE_CDN_ENDPOINT) {
const { Url } = await this.putObjectSignedUrl({ Bucket, Key, ACL, Expires: 3600, ContentType: contentType });
const url = Url.replace(this.endpoint, process.env.STORAGE_CDN_ENDPOINT);
await new Promise((resolve, reject) => {
(0, request_1.default)({
url,
headers: { 'content-type': contentType || 'application/octet-stream', ...Headers },
timeout: 5000,
method: 'put',
body: Body,
}, function (error, response, body) {
if (error) {
reject(error);
}
else if (response.statusCode >= 300) {
const error = new Error(`[${response.statusCode}]${response.statusMessage} ${body}`);
reject(error);
}
else {
resolve(null);
}
});
});
}
else {
const command = new client_s3_1.PutObjectCommand({
ACL,
ContentType: contentType || 'application/octet-stream',
...baseParam,
});
command.middlewareStack.add((next) => (args) => {
const { request } = args;
if (request) {
if (!request.headers) {
request.headers = {};
}
// eslint-disable-next-line no-restricted-syntax
for (const key in Headers) {
request.headers[key] = Headers[key];
}
}
return next(args);
}, {
step: 'build',
});
await this._instance.send(command);
}
return null;
}
async putObjectSignedUrl({ Bucket, Key, ACL, Expires, ContentType }) {
const baseParam = { Bucket, Key, ACL };
if (!this._cos) {
const url = await (0, s3_request_presigner_1.getSignedUrl)(this._instance, new client_s3_1.PutObjectCommand({ ...baseParam, ContentType: ContentType || 'application/octet-stream' }), {
expiresIn: Expires,
});
return { Url: url };
}
else {
throw new Error('need to impl cos putObjectSignedUrl');
}
}
async putBucketAcl({ ACL, Bucket }) {
const baseParam = {
Bucket,
};
if (this._cos) {
throw new Error('');
}
await this._instance.send(new client_s3_1.PutBucketAclCommand({
ACL,
...baseParam,
}));
return null;
}
async putObjectAcl({ ACL, Bucket, Key }) {
const baseParam = {
Bucket,
Key,
};
if (this._cos) {
throw new Error('');
}
await this._instance.send(new client_s3_1.PutObjectAclCommand({
ACL,
...baseParam,
}));
return null;
}
async deleteMultipleObject({ Bucket, Objects }) {
const baseParam = { Bucket, Objects };
if (this._cos) {
return new Promise((resolve, reject) => {
this._instance.deleteMultipleObject({
Region: this._region || 'ap-shanghai',
...baseParam,
}, (err) => {
if (err) {
reject(err);
}
else {
resolve(null);
}
});
});
}
throw new Error('need to impl s3 deleteMultipleObject');
}
}
exports.Storage = Storage;
function getUploadDirFileList(src, cloudPath) {
const stat = fs_extra_1.default.statSync(src);
let uploadFilePathList = [];
if (stat.isFile()) {
uploadFilePathList.push({
src,
cloudPath,
});
}
else if (stat.isDirectory()) {
const files = fs_extra_1.default.readdirSync(src);
for (const file of files) {
uploadFilePathList = uploadFilePathList.concat(getUploadDirFileList(path_1.default.join(src, file), path_1.default.posix.join(cloudPath, file)));
}
}
return uploadFilePathList;
}
exports.getUploadDirFileList = getUploadDirFileList;