UNPKG

@cloudbase/lowcode-deployer

Version:

deploy weda app

239 lines (238 loc) 9.5 kB
"use strict"; 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;