From cb9658e65e630f5ff071d415efa8d6f14cb10dea Mon Sep 17 00:00:00 2001 From: rrr523 Date: Tue, 9 Apr 2024 12:03:46 +0800 Subject: [PATCH] fix: Delegated create folder response return parse error --- .changeset/nasty-tomatoes-occur.md | 5 +++ .../src/components/object/create/index.tsx | 2 ++ packages/js-sdk/src/api/objects.ts | 29 ++++++++++------- .../spclient/spApis/delegatedCreateFolder.ts | 11 +++++++ .../spclient/spApis/resumablePutObject.ts | 3 +- .../js-sdk/src/clients/spclient/spClient.ts | 3 +- packages/js-sdk/src/types/sp/Common.ts | 12 +++++++ .../src/types/sp/DelegateCreateFolder.ts | 15 +++++++++ .../js-sdk/src/types/sp/DelegatedPubObject.ts | 12 +++++++ packages/js-sdk/src/types/sp/PutObject.ts | 31 +------------------ packages/js-sdk/src/types/sp/index.ts | 2 ++ 11 files changed, 82 insertions(+), 43 deletions(-) create mode 100644 .changeset/nasty-tomatoes-occur.md create mode 100644 packages/js-sdk/src/types/sp/DelegateCreateFolder.ts create mode 100644 packages/js-sdk/src/types/sp/DelegatedPubObject.ts diff --git a/.changeset/nasty-tomatoes-occur.md b/.changeset/nasty-tomatoes-occur.md new file mode 100644 index 00000000..12924248 --- /dev/null +++ b/.changeset/nasty-tomatoes-occur.md @@ -0,0 +1,5 @@ +--- +'@bnb-chain/greenfield-js-sdk': patch +--- + +fix: Delegated Create Folder APi return parse error message diff --git a/examples/nextjs/src/components/object/create/index.tsx b/examples/nextjs/src/components/object/create/index.tsx index 084454ba..fe7f8730 100644 --- a/examples/nextjs/src/components/object/create/index.tsx +++ b/examples/nextjs/src/components/object/create/index.tsx @@ -351,6 +351,8 @@ export const CreateObject = () => { }, ); + console.log('res', res); + if (res.code === 0) { alert('success'); } diff --git a/packages/js-sdk/src/api/objects.ts b/packages/js-sdk/src/api/objects.ts index 4ae19709..30d03c95 100644 --- a/packages/js-sdk/src/api/objects.ts +++ b/packages/js-sdk/src/api/objects.ts @@ -1,4 +1,7 @@ -import { getDelegatedCreateFolderMetaInfo } from '@/clients/spclient/spApis/delegatedCreateFolder'; +import { + getDelegatedCreateFolderMetaInfo, + parseDelegatedCreateFolderResponse, +} from '@/clients/spclient/spApis/delegatedCreateFolder'; import { getObjectOffsetInfo, parseObjectOffsetResponse, @@ -8,6 +11,12 @@ import { parseObjectStatusResponse, } from '@/clients/spclient/spApis/getObjectStatus'; import { getResumablePutObjectMetaInfo } from '@/clients/spclient/spApis/resumablePutObject'; +import { DelegatedOpts } from '@/types/sp/Common'; +import { + DelegateCreateFolderRepsonse, + DelegatedCreateFolderRequest, +} from '@/types/sp/DelegateCreateFolder'; +import { DelegatedPubObjectRequest } from '@/types/sp/DelegatedPubObject'; import { UploadProgressResponse } from '@/types/sp/UploadProgress'; import { assertAuthType, assertStringRequire } from '@/utils/asserts/params'; import { @@ -92,12 +101,7 @@ import { import { GetObjectRequest } from '../types/sp/GetObject'; import { GetObjectMetaRequest, GetObjectMetaResponse } from '../types/sp/GetObjectMeta'; import { ListObjectsByBucketNameResponse } from '../types/sp/ListObjectsByBucketName'; -import { - DelegatedCreateFolderRequest, - DelegatedOpts, - DelegatedPubObjectRequest, - PutObjectRequest, -} from '../types/sp/PutObject'; +import { PutObjectRequest } from '../types/sp/PutObject'; import { checkObjectName, generateUrlByBucketName, @@ -153,7 +157,7 @@ export interface IObject { delegateCreateFolder( params: DelegatedCreateFolderRequest, authType: AuthType, - ): Promise>; + ): Promise>; putObjectPolicy( bucketName: string, @@ -396,7 +400,7 @@ export class Objects implements IObject { return { code: 0, message: 'Put object success.', statusCode: status }; } catch (error: any) { return { - code: -1, + code: error.code || -1, message: error.message, statusCode: error?.statusCode || NORMAL_ERROR_CODE, }; @@ -924,10 +928,13 @@ export class Objects implements IObject { ); const { status } = result; - return { code: 0, message: 'Put object success.', statusCode: status }; + const xmlData = await result.text(); + const res = parseDelegatedCreateFolderResponse(xmlData); + + return { code: 0, message: 'Create folder success.', statusCode: status, body: res }; } catch (error: any) { return { - code: -1, + code: error.code || -1, message: error.message, statusCode: error?.statusCode || NORMAL_ERROR_CODE, }; diff --git a/packages/js-sdk/src/clients/spclient/spApis/delegatedCreateFolder.ts b/packages/js-sdk/src/clients/spclient/spApis/delegatedCreateFolder.ts index 48ffda92..36bb9235 100644 --- a/packages/js-sdk/src/clients/spclient/spApis/delegatedCreateFolder.ts +++ b/packages/js-sdk/src/clients/spclient/spApis/delegatedCreateFolder.ts @@ -1,7 +1,9 @@ import { EMPTY_STRING_SHA256, METHOD_POST } from '@/constants'; import { ReqMeta } from '@/types'; +import { DelegateCreateFolderRepsonse } from '@/types/sp/DelegateCreateFolder'; import { generateUrlByBucketName } from '@/utils'; import { VisibilityType } from '@bnb-chain/greenfield-cosmos-types/greenfield/storage/common'; +import { XMLParser } from 'fast-xml-parser'; import { encodePath, getSortQueryParams } from '../auth'; export const getDelegatedCreateFolderMetaInfo = async ( @@ -50,3 +52,12 @@ export const getDelegatedCreateFolderMetaInfo = async ( reqMeta, }; }; + +export const parseDelegatedCreateFolderResponse = (data: string) => { + const xmlParser = new XMLParser({ + parseTagValue: false, + }); + + const res = xmlParser.parse(data) as DelegateCreateFolderRepsonse; + return res; +}; diff --git a/packages/js-sdk/src/clients/spclient/spApis/resumablePutObject.ts b/packages/js-sdk/src/clients/spclient/spApis/resumablePutObject.ts index 9172aec4..2ad7d3e8 100644 --- a/packages/js-sdk/src/clients/spclient/spApis/resumablePutObject.ts +++ b/packages/js-sdk/src/clients/spclient/spApis/resumablePutObject.ts @@ -1,5 +1,6 @@ import { EMPTY_STRING_SHA256, METHOD_POST } from '@/constants'; -import { DelegatedOpts, ReqMeta } from '@/types'; +import { ReqMeta } from '@/types'; +import { DelegatedOpts } from '@/types/sp/Common'; import { generateUrlByBucketName } from '@/utils/asserts/s3'; import { encodePath, getSortQueryParams } from '../auth'; diff --git a/packages/js-sdk/src/clients/spclient/spClient.ts b/packages/js-sdk/src/clients/spclient/spClient.ts index 195ae8e8..c8c9bcca 100644 --- a/packages/js-sdk/src/clients/spclient/spClient.ts +++ b/packages/js-sdk/src/clients/spclient/spClient.ts @@ -79,6 +79,7 @@ export class SpClient implements ISpClient { if (!response.ok) { const xmlError = await response.text(); const { code, message } = await parseError(xmlError); + throw { code: code || customError?.code, message: message || customError?.message, @@ -88,7 +89,7 @@ export class SpClient implements ISpClient { return response; } catch (error) { - return Promise.reject(error + ': timeout, try to increase the request time'); + return Promise.reject(error); } } diff --git a/packages/js-sdk/src/types/sp/Common.ts b/packages/js-sdk/src/types/sp/Common.ts index b5fc2101..921f2901 100644 --- a/packages/js-sdk/src/types/sp/Common.ts +++ b/packages/js-sdk/src/types/sp/Common.ts @@ -1,3 +1,5 @@ +import { VisibilityType } from '../common'; + export type BucketMeta = { /** * defines the information of the bucket. @@ -322,3 +324,13 @@ export interface PolicyMeta { */ ExpirationTime: number; } + +export type DelegatedOpts = { + visibility: VisibilityType; + isUpdate?: boolean; +}; + +export type ResumableOpts = { + disableResumable: boolean; + partSize?: number; +}; diff --git a/packages/js-sdk/src/types/sp/DelegateCreateFolder.ts b/packages/js-sdk/src/types/sp/DelegateCreateFolder.ts new file mode 100644 index 00000000..cafb776a --- /dev/null +++ b/packages/js-sdk/src/types/sp/DelegateCreateFolder.ts @@ -0,0 +1,15 @@ +import { DelegatedOpts } from './Common'; + +export type DelegatedCreateFolderRequest = { + bucketName: string; + objectName: string; + delegatedOpts: DelegatedOpts; + endpoint?: string; + timeout?: number; +}; + +export interface DelegateCreateFolderRepsonse { + CreateHash: { + TxHash: string; + }; +} diff --git a/packages/js-sdk/src/types/sp/DelegatedPubObject.ts b/packages/js-sdk/src/types/sp/DelegatedPubObject.ts new file mode 100644 index 00000000..0b62a474 --- /dev/null +++ b/packages/js-sdk/src/types/sp/DelegatedPubObject.ts @@ -0,0 +1,12 @@ +import { DelegatedOpts, ResumableOpts } from './Common'; + +export type DelegatedPubObjectRequest = { + bucketName: string; + objectName: string; + body: File; + delegatedOpts: DelegatedOpts; + endpoint?: string; + timeout?: number; + contentType?: string; + resumableOpts?: ResumableOpts; +}; diff --git a/packages/js-sdk/src/types/sp/PutObject.ts b/packages/js-sdk/src/types/sp/PutObject.ts index f57d6e9e..413bf874 100644 --- a/packages/js-sdk/src/types/sp/PutObject.ts +++ b/packages/js-sdk/src/types/sp/PutObject.ts @@ -1,4 +1,4 @@ -import { VisibilityType } from '../common'; +import { ResumableOpts } from './Common'; export type PutObjectRequest = { bucketName: string; @@ -9,32 +9,3 @@ export type PutObjectRequest = { endpoint?: string; resumableOpts?: ResumableOpts; }; - -export type DelegatedPubObjectRequest = { - bucketName: string; - objectName: string; - body: File; - delegatedOpts: DelegatedOpts; - endpoint?: string; - timeout?: number; - contentType?: string; - resumableOpts?: ResumableOpts; -}; - -export type DelegatedCreateFolderRequest = { - bucketName: string; - objectName: string; - delegatedOpts: DelegatedOpts; - endpoint?: string; - timeout?: number; -}; - -export type DelegatedOpts = { - visibility: VisibilityType; - isUpdate?: boolean; -}; - -export type ResumableOpts = { - disableResumable: boolean; - partSize?: number; -}; diff --git a/packages/js-sdk/src/types/sp/index.ts b/packages/js-sdk/src/types/sp/index.ts index 266ef945..7f2dd9ef 100644 --- a/packages/js-sdk/src/types/sp/index.ts +++ b/packages/js-sdk/src/types/sp/index.ts @@ -1,3 +1,5 @@ +export * from './DelegateCreateFolder'; +export * from './DelegatedPubObject'; export * from './ErrorResponse'; export * from './GetBucketMeta'; export * from './GetObject';