feat: cos-backend添加presignFile

This commit is contained in:
Pan Qiancheng 2025-12-29 16:41:41 +08:00
parent ab9789eb4c
commit 3fa730cfb1
46 changed files with 463 additions and 9 deletions

View File

@ -1,2 +1,2 @@
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "system", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "passport", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthApplication", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthProvider", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUser", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUserAuthorization", import("../context/BackendRuntimeContext").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "mobile", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "system", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "passport", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthApplication", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthProvider", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUser", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUserAuthorization", import("../context/BackendRuntimeContext").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "mobile", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
export default _default;

13
es/types/Cos.d.ts vendored
View File

@ -111,4 +111,17 @@ export interface CosBackend<ED extends EntityDict> {
lastModified: Date;
}>;
}>;
/**
*
* @param methods HTTP方法
* @param application
* @param extraFile
* @param context
* @returns url及相关信息
*/
presignFile: (methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: ED['application']['Schema'], extraFile: ED['extraFile']['OpSchema'], context: BRC<ED>) => Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -37,4 +37,9 @@ export default class ALiYunBackend extends ALiYun implements CosBackend<EntityDi
lastModified: Date;
}>;
}>;
presignFile(methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -152,4 +152,13 @@ export default class ALiYunBackend extends ALiYun {
assert(b, `extraFile中的bucket名称在阿里云配置中找不到「${extraFile.bucket}`);
return await instance.listParts(extraFile.bucket, b.zone, key, extraFile.chunkInfo.uploadId);
}
async presignFile(methods, application, extraFile, context) {
const key = this.formKey(extraFile);
const { instance, config: aliyunCosConfig } = this.getConfigAndInstance(application);
const b = aliyunCosConfig.buckets.find((ele) => ele.name === extraFile.bucket);
assert(b, `extraFile中的bucket名称在阿里云配置中找不到「${extraFile.bucket}`);
return await instance.presignObjectUrl(methods, extraFile.bucket, b.zone, key, {
expires: 24 * 60 * 60, // 1 day
});
}
}

View File

@ -29,4 +29,9 @@ export default class CTYunBackend extends CTYun implements CosBackend<EntityDict
listMultipartUploads(application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
parts: never[];
}>;
presignFile(methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -100,4 +100,13 @@ export default class CTYunBackend extends CTYun {
parts: [],
};
}
async presignFile(methods, application, extraFile, context) {
const key = this.formKey(extraFile);
const { instance, config: ctyunCosConfig } = this.getConfigAndInstance(application);
const b = ctyunCosConfig.buckets.find((ele) => ele.name === extraFile.bucket);
assert(b, `extraFile中的bucket名称在天翼云配置中找不到「${extraFile.bucket}`);
return await instance.presignObjectUrl(methods, extraFile.bucket, b.zone, key, {
expires: 24 * 60 * 60, // 1 day
});
}
}

View File

@ -29,4 +29,9 @@ export default class LocalBackend extends Local implements CosBackend<EntityDict
listMultipartUploads(application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
parts: never[];
}>;
presignFile(methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -78,5 +78,15 @@ export default class LocalBackend extends Local {
parts: [],
};
}
async presignFile(methods, application, extraFile, context) {
const key = this.formKey(extraFile);
const { instance, config: localCosConfig } = this.getConfigAndInstance(application);
const b = localCosConfig.buckets.find((ele) => ele.name === extraFile.bucket);
assert(b, `extraFile中的bucket名称在本地存储配置中找不到「${extraFile.bucket}`);
assert(false, '本地存储暂不支持预签名操作');
return {
url: '',
};
}
}
;

View File

@ -29,4 +29,9 @@ export default class QiniuBackend extends Qiniu implements CosBackend<EntityDict
listMultipartUploads(application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
parts: never[];
}>;
presignFile(methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -119,5 +119,14 @@ export default class QiniuBackend extends Qiniu {
parts: [],
};
}
async presignFile(methods, application, extraFile, context) {
const key = this.formKey(extraFile);
const { instance, config: qiniuCosConfig } = this.getConfigAndInstance(application);
const b = qiniuCosConfig.buckets.find((ele) => ele.name === extraFile.bucket);
assert(b, `extraFile中的bucket名称在七牛配置中找不到「${extraFile.bucket}`);
return await instance.presignObjectUrl(methods, extraFile.bucket, b.zone, key, {
expires: 24 * 60 * 60, // 1 day
});
}
}
;

View File

@ -37,4 +37,9 @@ export default class S3Backend extends S3 implements CosBackend<EntityDict> {
lastModified: Date;
}>;
}>;
presignFile(methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -143,4 +143,13 @@ export default class S3Backend extends S3 {
}))
};
}
async presignFile(methods, application, extraFile, context) {
const key = this.formKey(extraFile);
const { instance, config: s3CosConfig } = this.getConfigAndInstance(application, extraFile.bucket);
const b = s3CosConfig.buckets.find((ele) => ele.name === extraFile.bucket);
assert(b, `extraFile中的bucket名称在S3配置中找不到「${extraFile.bucket}`);
return await instance.presignObjectUrl(methods, extraFile.bucket, b.zone || '', key, {
expires: 24 * 60 * 60, // 1 day
});
}
}

View File

@ -29,4 +29,9 @@ export default class TencentYunBackend extends TencentYun implements CosBackend<
listMultipartUploads(application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
parts: never[];
}>;
presignFile(methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -98,4 +98,13 @@ export default class TencentYunBackend extends TencentYun {
parts: [],
};
}
async presignFile(methods, application, extraFile, context) {
const key = this.formKey(extraFile);
const { instance, config: tencentYunCosConfig } = this.getConfigAndInstance(application);
const b = tencentYunCosConfig.buckets.find((ele) => ele.name === extraFile.bucket);
assert(b, `extraFile中的bucket名称在腾讯云配置中找不到「${extraFile.bucket}`);
return await instance.presignObjectUrl(methods, extraFile.bucket, b.zone, key, {
expires: 24 * 60 * 60, // 1 day
});
}
}

View File

@ -29,4 +29,9 @@ export default class UnknownBackend extends Unknown implements CosBackend<Entity
listMultipartUploads(application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
parts: never[];
}>;
presignFile(methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -38,5 +38,8 @@ export default class UnknownBackend extends Unknown {
parts: [],
};
}
async presignFile(methods, application, extraFile, context) {
throw new OakPreConditionUnsetException('未知存储暂不支持预签名操作');
}
}
;

View File

@ -29,4 +29,9 @@ export default class WechatBackend extends Wechat implements CosBackend<EntityDi
listMultipartUploads(application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
parts: never[];
}>;
presignFile(methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -59,5 +59,8 @@ export default class WechatBackend extends Wechat {
parts: [],
};
}
async presignFile(methods, application, extraFile, context) {
return { url: '' };
}
}
;

View File

@ -1,2 +1,2 @@
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "system", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "passport", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthApplication", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthProvider", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUser", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUserAuthorization", import("../context/BackendRuntimeContext").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "mobile", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
declare const _default: (import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "address", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "application", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "article", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "articleMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "extraFile", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "user", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "userEntityGrant", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatQrCode", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "message", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "notification", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatLogin", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "parasite", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "sessionMessage", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMenu", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatPublicTag", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "wechatMpJump", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "system", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "passport", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthApplication", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthProvider", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUser", import("..").BRC<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "oauthUserAuthorization", import("../context/BackendRuntimeContext").BackendRuntimeContext<import("../oak-app-domain").EntityDict>> | import("oak-domain/lib/types").Trigger<import("../oak-app-domain").EntityDict, "mobile", import("..").BRC<import("../oak-app-domain").EntityDict>>)[];
export default _default;

13
lib/types/Cos.d.ts vendored
View File

@ -111,4 +111,17 @@ export interface CosBackend<ED extends EntityDict> {
lastModified: Date;
}>;
}>;
/**
*
* @param methods HTTP方法
* @param application
* @param extraFile
* @param context
* @returns url及相关信息
*/
presignFile: (methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: ED['application']['Schema'], extraFile: ED['extraFile']['OpSchema'], context: BRC<ED>) => Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -37,4 +37,9 @@ export default class ALiYunBackend extends ALiYun implements CosBackend<EntityDi
lastModified: Date;
}>;
}>;
presignFile(methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -155,5 +155,14 @@ class ALiYunBackend extends aliyun_1.default {
(0, assert_1.assert)(b, `extraFile中的bucket名称在阿里云配置中找不到「${extraFile.bucket}`);
return await instance.listParts(extraFile.bucket, b.zone, key, extraFile.chunkInfo.uploadId);
}
async presignFile(methods, application, extraFile, context) {
const key = this.formKey(extraFile);
const { instance, config: aliyunCosConfig } = this.getConfigAndInstance(application);
const b = aliyunCosConfig.buckets.find((ele) => ele.name === extraFile.bucket);
(0, assert_1.assert)(b, `extraFile中的bucket名称在阿里云配置中找不到「${extraFile.bucket}`);
return await instance.presignObjectUrl(methods, extraFile.bucket, b.zone, key, {
expires: 24 * 60 * 60, // 1 day
});
}
}
exports.default = ALiYunBackend;

View File

@ -29,4 +29,9 @@ export default class CTYunBackend extends CTYun implements CosBackend<EntityDict
listMultipartUploads(application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
parts: never[];
}>;
presignFile(methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -103,5 +103,14 @@ class CTYunBackend extends ctyun_1.default {
parts: [],
};
}
async presignFile(methods, application, extraFile, context) {
const key = this.formKey(extraFile);
const { instance, config: ctyunCosConfig } = this.getConfigAndInstance(application);
const b = ctyunCosConfig.buckets.find((ele) => ele.name === extraFile.bucket);
(0, assert_1.assert)(b, `extraFile中的bucket名称在天翼云配置中找不到「${extraFile.bucket}`);
return await instance.presignObjectUrl(methods, extraFile.bucket, b.zone, key, {
expires: 24 * 60 * 60, // 1 day
});
}
}
exports.default = CTYunBackend;

View File

@ -29,4 +29,9 @@ export default class LocalBackend extends Local implements CosBackend<EntityDict
listMultipartUploads(application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
parts: never[];
}>;
presignFile(methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -81,6 +81,16 @@ class LocalBackend extends local_1.default {
parts: [],
};
}
async presignFile(methods, application, extraFile, context) {
const key = this.formKey(extraFile);
const { instance, config: localCosConfig } = this.getConfigAndInstance(application);
const b = localCosConfig.buckets.find((ele) => ele.name === extraFile.bucket);
(0, assert_1.assert)(b, `extraFile中的bucket名称在本地存储配置中找不到「${extraFile.bucket}`);
(0, assert_1.assert)(false, '本地存储暂不支持预签名操作');
return {
url: '',
};
}
}
exports.default = LocalBackend;
;

View File

@ -29,4 +29,9 @@ export default class QiniuBackend extends Qiniu implements CosBackend<EntityDict
listMultipartUploads(application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
parts: never[];
}>;
presignFile(methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -122,6 +122,15 @@ class QiniuBackend extends qiniu_1.default {
parts: [],
};
}
async presignFile(methods, application, extraFile, context) {
const key = this.formKey(extraFile);
const { instance, config: qiniuCosConfig } = this.getConfigAndInstance(application);
const b = qiniuCosConfig.buckets.find((ele) => ele.name === extraFile.bucket);
(0, assert_1.assert)(b, `extraFile中的bucket名称在七牛配置中找不到「${extraFile.bucket}`);
return await instance.presignObjectUrl(methods, extraFile.bucket, b.zone, key, {
expires: 24 * 60 * 60, // 1 day
});
}
}
exports.default = QiniuBackend;
;

View File

@ -37,4 +37,9 @@ export default class S3Backend extends S3 implements CosBackend<EntityDict> {
lastModified: Date;
}>;
}>;
presignFile(methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -146,5 +146,14 @@ class S3Backend extends s3_1.default {
}))
};
}
async presignFile(methods, application, extraFile, context) {
const key = this.formKey(extraFile);
const { instance, config: s3CosConfig } = this.getConfigAndInstance(application, extraFile.bucket);
const b = s3CosConfig.buckets.find((ele) => ele.name === extraFile.bucket);
(0, assert_1.assert)(b, `extraFile中的bucket名称在S3配置中找不到「${extraFile.bucket}`);
return await instance.presignObjectUrl(methods, extraFile.bucket, b.zone || '', key, {
expires: 24 * 60 * 60, // 1 day
});
}
}
exports.default = S3Backend;

View File

@ -29,4 +29,9 @@ export default class TencentYunBackend extends TencentYun implements CosBackend<
listMultipartUploads(application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
parts: never[];
}>;
presignFile(methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -101,5 +101,14 @@ class TencentYunBackend extends tencent_1.default {
parts: [],
};
}
async presignFile(methods, application, extraFile, context) {
const key = this.formKey(extraFile);
const { instance, config: tencentYunCosConfig } = this.getConfigAndInstance(application);
const b = tencentYunCosConfig.buckets.find((ele) => ele.name === extraFile.bucket);
(0, assert_1.assert)(b, `extraFile中的bucket名称在腾讯云配置中找不到「${extraFile.bucket}`);
return await instance.presignObjectUrl(methods, extraFile.bucket, b.zone, key, {
expires: 24 * 60 * 60, // 1 day
});
}
}
exports.default = TencentYunBackend;

View File

@ -29,4 +29,9 @@ export default class UnknownBackend extends Unknown implements CosBackend<Entity
listMultipartUploads(application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
parts: never[];
}>;
presignFile(methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -41,6 +41,9 @@ class UnknownBackend extends unknown_1.default {
parts: [],
};
}
async presignFile(methods, application, extraFile, context) {
throw new types_1.OakPreConditionUnsetException('未知存储暂不支持预签名操作');
}
}
exports.default = UnknownBackend;
;

View File

@ -29,4 +29,9 @@ export default class WechatBackend extends Wechat implements CosBackend<EntityDi
listMultipartUploads(application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
parts: never[];
}>;
presignFile(methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: EntityDict['application']['Schema'], extraFile: OpSchema, context: BRC<EntityDict>): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}>;
}

View File

@ -62,6 +62,9 @@ class WechatBackend extends wechat_1.default {
parts: [],
};
}
async presignFile(methods, application, extraFile, context) {
return { url: '' };
}
}
exports.default = WechatBackend;
;

View File

@ -157,7 +157,7 @@ export async function mergeChunkedUpload<ED extends EntityDict>(
id: extraFileId,
},
},
{ }
{}
);
closeRootMode();
} catch (err) {

View File

@ -166,4 +166,23 @@ export interface CosBackend<ED extends EntityDict> {
lastModified: Date,
}>
}>;
/**
*
* @param methods HTTP方法
* @param application
* @param extraFile
* @param context
* @returns url及相关信息
*/
presignFile: (
methods: 'GET' | 'PUT' | 'POST' | 'DELETE',
application: ED['application']['Schema'],
extraFile: ED['extraFile']['OpSchema'],
context: BRC<ED>,
) => Promise<{
url: string;
headers?: Record<string, string | string[]>; // 如果是PUT/DELETE/GET请求可能需要添加请求头
formdata?: Record<string, any>; // 对于POST上传可能需要添加表单数据
}>;
}

View File

@ -291,4 +291,35 @@ export default class ALiYunBackend
extraFile.chunkInfo!.uploadId!
);
}
async presignFile(
methods: 'GET' | 'PUT' | 'POST' | 'DELETE',
application: EntityDict['application']['Schema'],
extraFile: OpSchema,
context: BRC<EntityDict>,
): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}> {
const key = this.formKey(extraFile);
const { instance, config: aliyunCosConfig } =
this.getConfigAndInstance(application);
const b = (aliyunCosConfig as ALiYunCosConfig).buckets.find(
(ele) => ele.name === extraFile.bucket
);
assert(
b,
`extraFile中的bucket名称在阿里云配置中找不到「${extraFile.bucket}`
);
return await instance.presignObjectUrl(
methods,
extraFile.bucket!,
b.zone,
key,
{
expires: 24 * 60 * 60, // 1 day
}
);
}
}

View File

@ -183,9 +183,40 @@ export default class CTYunBackend
application: EntityDict['application']['Schema'],
extraFile: OpSchema,
context: BRC<EntityDict>,
){
) {
return {
parts: [],
}
}
async presignFile(
methods: 'GET' | 'PUT' | 'POST' | 'DELETE',
application: EntityDict['application']['Schema'],
extraFile: OpSchema,
context: BRC<EntityDict>,
): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}> {
const key = this.formKey(extraFile);
const { instance, config: ctyunCosConfig } =
this.getConfigAndInstance(application);
const b = (ctyunCosConfig as CTYunCosConfig).buckets.find(
(ele) => ele.name === extraFile.bucket
);
assert(
b,
`extraFile中的bucket名称在天翼云配置中找不到「${extraFile.bucket}`
);
return await instance.presignObjectUrl(
methods,
extraFile.bucket!,
b.zone,
key,
{
expires: 24 * 60 * 60, // 1 day
}
);
}
}

View File

@ -138,9 +138,35 @@ export default class LocalBackend extends Local implements CosBackend<EntityDict
application: EntityDict['application']['Schema'],
extraFile: OpSchema,
context: BRC<EntityDict>,
){
) {
return {
parts: [],
}
}
async presignFile(
methods: 'GET' | 'PUT' | 'POST' | 'DELETE',
application: EntityDict['application']['Schema'],
extraFile: OpSchema,
context: BRC<EntityDict>,
): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}> {
const key = this.formKey(extraFile);
const { instance, config: localCosConfig } =
this.getConfigAndInstance(application);
const b = (localCosConfig as LocalCosConfig).buckets.find(
(ele) => ele.name === extraFile.bucket
);
assert(
b,
`extraFile中的bucket名称在本地存储配置中找不到「${extraFile.bucket}`
);
assert(false, '本地存储暂不支持预签名操作');
return {
url: '',
}
}
};

View File

@ -194,9 +194,40 @@ export default class QiniuBackend extends Qiniu implements CosBackend<EntityDict
application: EntityDict['application']['Schema'],
extraFile: OpSchema,
context: BRC<EntityDict>,
){
) {
return {
parts: [],
}
}
async presignFile(
methods: 'GET' | 'PUT' | 'POST' | 'DELETE',
application: EntityDict['application']['Schema'],
extraFile: OpSchema,
context: BRC<EntityDict>,
): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}> {
const key = this.formKey(extraFile);
const { instance, config: qiniuCosConfig } =
this.getConfigAndInstance(application);
const b = (qiniuCosConfig as QiniuCosConfig).buckets.find(
(ele) => ele.name === extraFile.bucket
);
assert(
b,
`extraFile中的bucket名称在七牛配置中找不到「${extraFile.bucket}`
);
return await instance.presignObjectUrl(
methods,
extraFile.bucket!,
b.zone,
key,
{
expires: 24 * 60 * 60, // 1 day
}
);
}
};

View File

@ -285,4 +285,35 @@ export default class S3Backend extends S3 implements CosBackend<EntityDict> {
}))
}
}
async presignFile(
methods: 'GET' | 'PUT' | 'POST' | 'DELETE',
application: EntityDict['application']['Schema'],
extraFile: OpSchema,
context: BRC<EntityDict>,
): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}> {
const key = this.formKey(extraFile);
const { instance, config: s3CosConfig } =
this.getConfigAndInstance(application, extraFile.bucket!);
const b = (s3CosConfig as S3CosConfig).buckets.find(
(ele) => ele.name === extraFile.bucket
);
assert(
b,
`extraFile中的bucket名称在S3配置中找不到「${extraFile.bucket}`
);
return await instance.presignObjectUrl(
methods,
extraFile.bucket!,
b.zone || '',
key,
{
expires: 24 * 60 * 60, // 1 day
}
);
}
}

View File

@ -180,9 +180,40 @@ export default class TencentYunBackend extends TencentYun implements CosBackend<
application: EntityDict['application']['Schema'],
extraFile: OpSchema,
context: BRC<EntityDict>,
){
) {
return {
parts: [],
}
}
async presignFile(
methods: 'GET' | 'PUT' | 'POST' | 'DELETE',
application: EntityDict['application']['Schema'],
extraFile: OpSchema,
context: BRC<EntityDict>,
): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}> {
const key = this.formKey(extraFile);
const { instance, config: tencentYunCosConfig } =
this.getConfigAndInstance(application);
const b = (tencentYunCosConfig as TencentYunCosConfig).buckets.find(
(ele) => ele.name === extraFile.bucket
);
assert(
b,
`extraFile中的bucket名称在腾讯云配置中找不到「${extraFile.bucket}`
);
return await instance.presignObjectUrl(
methods,
extraFile.bucket!,
b.zone,
key,
{
expires: 24 * 60 * 60, // 1 day
}
);
}
}

View File

@ -87,9 +87,22 @@ export default class UnknownBackend extends Unknown implements CosBackend<Entity
application: EntityDict['application']['Schema'],
extraFile: OpSchema,
context: BRC<EntityDict>,
){
) {
return {
parts: [],
}
}
async presignFile(
methods: 'GET' | 'PUT' | 'POST' | 'DELETE',
application: EntityDict['application']['Schema'],
extraFile: OpSchema,
context: BRC<EntityDict>,
): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}> {
throw new OakPreConditionUnsetException('未知存储暂不支持预签名操作');
}
};

View File

@ -117,9 +117,22 @@ export default class WechatBackend extends Wechat implements CosBackend<EntityDi
application: EntityDict['application']['Schema'],
extraFile: OpSchema,
context: BRC<EntityDict>,
){
) {
return {
parts: [],
}
}
async presignFile(
methods: 'GET' | 'PUT' | 'POST' | 'DELETE',
application: EntityDict['application']['Schema'],
extraFile: OpSchema,
context: BRC<EntityDict>,
): Promise<{
url: string;
headers?: Record<string, string | string[]>;
formdata?: Record<string, any>;
}> {
return { url: '' }
}
};