Skip to content

Commit

Permalink
fix: XML type align to go struct (#272)
Browse files Browse the repository at this point in the history
  • Loading branch information
rrr523 authored Aug 28, 2023
1 parent 7924c50 commit b3683b8
Show file tree
Hide file tree
Showing 22 changed files with 236 additions and 279 deletions.
5 changes: 5 additions & 0 deletions .changeset/silver-avocados-march.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@bnb-chain/greenfield-js-sdk': patch
---

fix: XML response from sp align to go struct
21 changes: 11 additions & 10 deletions examples/nextjs/src/components/deposit/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,22 @@ export const Deposit = () => {
const amount_with_relay_fee = relayFee + ackRelayFee + amount;
console.log('amount_with_relay_fee', amount_with_relay_fee);

const estimateGas = await publicClient.estimateContractGas({
address: TOKEN_HUB_CONTRACT_ADDRESS,
abi: TOKENHUB_ABI,
functionName: 'transferOut',
args: [address, amount],
account: address,
value: amount_with_relay_fee,
});
console.log('estimateGas', estimateGas);
// const estimateGas = await publicClient.estimateContractGas({
// address: TOKEN_HUB_CONTRACT_ADDRESS,
// abi: TOKENHUB_ABI,
// functionName: 'transferOut',
// args: [address, amount],
// account: address,
// value: amount_with_relay_fee,
// });
// console.log('estimateGas', estimateGas);

const gasPrice = await publicClient.getGasPrice();

console.log('gasPrice', gasPrice);

const gasFee = estimateGas * gasPrice;
// const gasFee = BigInt(5) * gasPrice;
const gasFee = 21000n;
console.log('estimate gas fee: gas price * gas = ', formatEther(gasFee), 'ETH');

const txHash = await walletClient.writeContract({
Expand Down
1 change: 1 addition & 0 deletions examples/nextjs/src/utils/offchainAuth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export const getOffchainAuthKeys = async (address: string, provider: any) => {
const storageRes = JSON.parse(storageResStr) as IReturnOffChainAuthKeyPairAndUpload;
if (storageRes.expirationTime < Date.now()) {
alert('Your auth key has expired, please generate a new one');
localStorage.removeItem(address);
return;
}

Expand Down
5 changes: 3 additions & 2 deletions packages/chain-sdk/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,13 @@
"dayjs": "^1.11.7",
"dotenv": "^16.0.3",
"ethereum-cryptography": "^2.0.0",
"fast-xml-parser": "^4.2.7",
"lodash.clonedeep": "^4.5.0",
"lodash.mapvalues": "^4.6.0",
"lodash.sortby": "^4.7.0",
"long": "^5.2.1",
"reflect-metadata": "^0.1.13",
"tsyringe": "^4.7.0"
"tsyringe": "^4.7.0",
"xml2js": "^0.6.2"
},
"devDependencies": {
"@jest/globals": "^29.5.0",
Expand All @@ -82,6 +82,7 @@
"@types/lodash.mapvalues": "^4.6.7",
"@types/lodash.sortby": "^4.7.7",
"@types/mime": "^3.0.1",
"@types/xml2js": "^0.4.11",
"jest": "^29.5.0",
"mime": "^3.0.0",
"rollup": "^2.79.1",
Expand Down
10 changes: 5 additions & 5 deletions packages/chain-sdk/src/api/bucket.ts
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,7 @@ export class Bucket implements IBucket {

if (!result.ok) {
const xmlError = await result.text();
const { code, message } = parseError(xmlError);
const { code, message } = await parseError(xmlError);
throw {
code: code || -1,
message: message || 'Get bucket error.',
Expand All @@ -351,7 +351,7 @@ export class Bucket implements IBucket {
}

const xmlData = await result.text();
const res = parseGetUserBucketsResponse(xmlData);
const res = await parseGetUserBucketsResponse(xmlData);

return {
code: 0,
Expand Down Expand Up @@ -399,7 +399,7 @@ export class Bucket implements IBucket {
);

const xmlData = await result.text();
const res = parseReadQuotaResponse(xmlData);
const res = await parseReadQuotaResponse(xmlData);

return {
code: 0,
Expand Down Expand Up @@ -532,7 +532,7 @@ export class Bucket implements IBucket {
const { status } = result;
if (!result.ok) {
const xmlError = await result.text();
const { code, message } = parseError(xmlError);
const { code, message } = await parseError(xmlError);
throw {
code: code || -1,
message: message || 'Get migrate bucket approval error.',
Expand Down Expand Up @@ -615,7 +615,7 @@ export class Bucket implements IBucket {
});

const xml = await result.text();
const res = parseGetBucketMetaResponse(xml);
const res = await parseGetBucketMetaResponse(xml);

return {
code: 0,
Expand Down
8 changes: 4 additions & 4 deletions packages/chain-sdk/src/api/objectt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -407,7 +407,7 @@ export class Objectt implements IObject {
const { status } = result;
if (!result.ok) {
const xmlError = await result.text();
const { code, message } = parseError(xmlError);
const { code, message } = await parseError(xmlError);

return {
code: code || -1,
Expand Down Expand Up @@ -524,7 +524,7 @@ export class Objectt implements IObject {
const { status } = result;
if (!result.ok) {
const xmlError = await result.text();
const { code, message } = parseError(xmlError);
const { code, message } = await parseError(xmlError);
return {
code: code || -1,
message: message || 'List object error.',
Expand All @@ -533,7 +533,7 @@ export class Objectt implements IObject {
}

const xmlData = await result.text();
const res = parseListObjectsByBucketNameResponse(xmlData);
const res = await parseListObjectsByBucketNameResponse(xmlData);

return {
code: 0,
Expand Down Expand Up @@ -667,7 +667,7 @@ export class Objectt implements IObject {
});

const xml = await result.text();
const res = parseGetObjectMetaResponse(xml);
const res = await parseGetObjectMetaResponse(xml);

return {
code: 0,
Expand Down
2 changes: 1 addition & 1 deletion packages/chain-sdk/src/api/sp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ export class Sp implements ISp {
const { status } = result;
if (!result.ok) {
const xmlError = await result.text();
const { code, message } = parseError(xmlError);
const { code, message } = await parseError(xmlError);
throw {
code: code || -1,
message: message || 'Get group list error.',
Expand Down
24 changes: 8 additions & 16 deletions packages/chain-sdk/src/clients/spclient/spApis/getBucketMeta.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,14 @@
import { GetBucketMetaResponse } from '@/types';
import { XMLParser } from 'fast-xml-parser';
import xml from 'xml2js';

// https://docs.bnbchain.org/greenfield-docs/docs/api/storgae-provider-rest/get_bucket_meta
export const parseGetBucketMetaResponse = (data: string) => {
const xmlParser = new XMLParser({
isArray: (tagName: string) => {
if (tagName === 'Buckets') return true;
return false;
},
numberParseOptions: {
hex: false,
leadingZeros: true,
skipLike: undefined,
eNotation: false,
},
});

const res = xmlParser.parse(data) as GetBucketMetaResponse;
export const parseGetBucketMetaResponse = async (data: string) => {
// Buckets
const res = (await xml.parseStringPromise(data, {
strict: true,
explicitRoot: true,
explicitArray: false,
})) as GetBucketMetaResponse;

return res;
};
12 changes: 8 additions & 4 deletions packages/chain-sdk/src/clients/spclient/spApis/getNonce.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { IFetchNonce, RequestNonceResponse } from '@/types';
import { fetchWithTimeout } from '@/utils/http';
import { XMLParser } from 'fast-xml-parser';
import xml from 'xml2js';
import { Headers } from 'cross-fetch';

// https://docs.bnbchain.org/greenfield-docs/docs/api/storgae-provider-rest/get_nonce
Expand All @@ -20,9 +20,13 @@ export const getNonce = async ({ spEndpoint, spName, spAddress, address, domain
return { code: -1, nonce: null };
}

const xmlParser = new XMLParser();
const xmlData = await result.text();
res = xmlParser.parse(xmlData) as RequestNonceResponse;
const data = await result.text();

res = (await xml.parseStringPromise(data, {
strict: true,
explicitRoot: true,
explicitArray: false,
})) as RequestNonceResponse;
} catch (error) {
return { code: -1, nonce: null };
}
Expand Down
38 changes: 23 additions & 15 deletions packages/chain-sdk/src/clients/spclient/spApis/getObjectMeta.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,28 @@
import { formatObjectInfo } from '@/types';
import { GetObjectMetaResponse } from '@/types/sp-xml/GetObjectMetaResponse';
import { XMLParser } from 'fast-xml-parser';
import xml from 'xml2js';

// https://docs.bnbchain.org/greenfield-docs/docs/api/storgae-provider-rest/get_object_meta
export const parseGetObjectMetaResponse = (data: string) => {
const xmlParser = new XMLParser({
isArray: (tagName: string) => {
if (tagName === 'Objects') return true;
return false;
},
numberParseOptions: {
hex: false,
leadingZeros: true,
skipLike: undefined,
eNotation: false,
},
});
export const parseGetObjectMetaResponse = async (data: string) => {
const res = (await xml.parseStringPromise(data, {
strict: true,
explicitRoot: true,
explicitArray: false,
})) as GetObjectMetaResponse;

return xmlParser.parse(data) as GetObjectMetaResponse;
const Object = res.GfSpGetObjectMetaResponse.Object || {};
if (Object) {
Object.Removed = Boolean(Object.Removed);
Object.UpdateAt = Number(Object.UpdateAt);
Object.DeleteAt = Number(Object.DeleteAt);

Object.ObjectInfo = formatObjectInfo(Object.ObjectInfo);
}

res.GfSpGetObjectMetaResponse = {
...res.GfSpGetObjectMetaResponse,
Object,
};

return res;
};
48 changes: 24 additions & 24 deletions packages/chain-sdk/src/clients/spclient/spApis/getUserBuckets.ts
Original file line number Diff line number Diff line change
@@ -1,34 +1,34 @@
import { GetUserBucketsResponse } from '@/types';
import { XMLParser } from 'fast-xml-parser';
import xml from 'xml2js';

// https://docs.bnbchain.org/greenfield-docs/docs/api/storgae-provider-rest/get_user_buckets
export const parseGetUserBucketsResponse = (data: string) => {
const xmlParser = new XMLParser({
isArray: (tagName: string) => {
if (tagName === 'Buckets') return true;
return false;
},
numberParseOptions: {
hex: false,
leadingZeros: true,
skipLike: undefined,
eNotation: false,
},
});
export const parseGetUserBucketsResponse = async (data: string) => {
const res = (await xml.parseStringPromise(data, {
strict: true,
explicitRoot: true,
explicitArray: false,
})) as GetUserBucketsResponse;

const res = xmlParser.parse(data) as GetUserBucketsResponse;
let Buckets = res.GfSpGetUserBucketsResponse.Buckets || [];
if (Buckets) {
if (!Array.isArray(Buckets)) {
Buckets = [Buckets];
}

if (typeof res.GfSpGetUserBucketsResponse === 'string') {
return {
GfSpGetUserBucketsResponse: {
Buckets: [],
},
};
Buckets = Buckets.map((item) => {
return {
...item,
Removed: Boolean(item.Removed),
DeleteAt: Number(item.DeleteAt),
UpdateAt: Number(item.UpdateAt),
UpdateTime: Number(item.UpdateTime),
};
});
}

if (!res.GfSpGetUserBucketsResponse?.Buckets) {
res.GfSpGetUserBucketsResponse.Buckets = [];
}
res.GfSpGetUserBucketsResponse = {
Buckets,
};

return res;
};
Original file line number Diff line number Diff line change
@@ -1,31 +1,42 @@
import { ListObjectsByBucketNameResponse } from '@/types/sp-xml/ListObjectsByBucketNameResponse';
import { XMLParser } from 'fast-xml-parser';
import {
formatObjectInfo,
ListObjectsByBucketNameResponse,
} from '@/types/sp-xml/ListObjectsByBucketNameResponse';
import xml from 'xml2js';

// https://docs.bnbchain.org/greenfield-docs/docs/api/storgae-provider-rest/list_objects_by_bucket
export const parseListObjectsByBucketNameResponse = (data: string) => {
const arrayFields = ['Objects', 'CommonPrefixes'];
const xmlParser = new XMLParser({
isArray: (tagName: string) => {
if (arrayFields.includes(tagName)) return true;
return false;
},
numberParseOptions: {
hex: false,
leadingZeros: true,
skipLike: undefined,
eNotation: false,
},
});
export const parseListObjectsByBucketNameResponse = async (data: string) => {
const res = (await xml.parseStringPromise(data, {
strict: true,
explicitRoot: true,
explicitArray: false,
})) as ListObjectsByBucketNameResponse;

const res = xmlParser.parse(data) as ListObjectsByBucketNameResponse;
let Objects = res.GfSpListObjectsByBucketNameResponse.Objects || [];
if (Objects) {
if (!Array.isArray(Objects)) {
Objects = [Objects];
}

if (!res.GfSpListObjectsByBucketNameResponse?.CommonPrefixes) {
res.GfSpListObjectsByBucketNameResponse.CommonPrefixes = [];
Objects = Objects.map((item) => {
return {
...item,
Removed: Boolean(item.Removed),
UpdateAt: Number(item.UpdateAt),
DeleteAt: Number(item.DeleteAt),
ObjectInfo: formatObjectInfo(item.ObjectInfo),
};
});
}

if (!res.GfSpListObjectsByBucketNameResponse?.Objects) {
res.GfSpListObjectsByBucketNameResponse.Objects = [];
}
const CommonPrefixes = res.GfSpListObjectsByBucketNameResponse.CommonPrefixes || [];

res.GfSpListObjectsByBucketNameResponse = {
...res.GfSpListObjectsByBucketNameResponse,
Objects,
CommonPrefixes,
IsTruncated: Boolean(res.GfSpListObjectsByBucketNameResponse.IsTruncated),
};

return res;
};
Loading

0 comments on commit b3683b8

Please sign in to comment.