@cfxjs/sirius-next-common 0.2.23 → 0.2.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-FTRICVXA.js → chunk-2KOLEWOS.js} +2 -2
- package/dist/{chunk-3KWBKDLY.js → chunk-2PGGAIEP.js} +6 -6
- package/dist/{chunk-DV3GFG5Q.js → chunk-2PQY4AOY.js} +2 -2
- package/dist/{chunk-53Z3XVZD.js → chunk-2UN57Q5P.js} +3 -3
- package/dist/{chunk-VVEA44KS.js → chunk-442632G5.js} +3 -3
- package/dist/{chunk-CRTD2R3I.js → chunk-6PDWJNOG.js} +4 -4
- package/dist/{chunk-N5X4DZS3.js → chunk-73PNXQWF.js} +2 -2
- package/dist/{chunk-P7M7B7ER.js → chunk-75SROBSE.js} +2 -2
- package/dist/{chunk-ZSOMTVP5.js → chunk-7R6SGHOG.js} +21 -10
- package/dist/chunk-7R6SGHOG.js.map +1 -0
- package/dist/{chunk-7JMW3D4O.js → chunk-AKS6URWT.js} +5 -5
- package/dist/{chunk-XF2CMO2A.js → chunk-BHL6OY3L.js} +2 -2
- package/dist/{chunk-RJOY6FMD.js → chunk-C2BON7HP.js} +2 -2
- package/dist/{chunk-TJZKPAAH.js → chunk-COMABNT2.js} +5 -5
- package/dist/{chunk-2PGTU5DN.js → chunk-D6FWT557.js} +4 -4
- package/dist/{chunk-DEZ6AV62.js → chunk-DWU7DZBU.js} +3 -3
- package/dist/{chunk-MCQS3VCO.js → chunk-FUZVMDLY.js} +4 -4
- package/dist/{chunk-6TKFGXSA.js → chunk-IUL5FJSO.js} +2 -2
- package/dist/{chunk-VXHLESK7.js → chunk-MBRAYFD4.js} +2 -2
- package/dist/{chunk-A53N6IFN.js → chunk-NG6K2B3F.js} +2 -2
- package/dist/{chunk-MOMFJZ7B.js → chunk-NQFK4HOS.js} +4 -4
- package/dist/{chunk-CCMPEOQY.js → chunk-NRHFGPN6.js} +4 -4
- package/dist/{chunk-E7ZFE6KT.js → chunk-QUEYGZEY.js} +3 -3
- package/dist/{chunk-OOL2AH54.js → chunk-RDIVTGYB.js} +2 -2
- package/dist/{chunk-MF6LAIGP.js → chunk-RIWM6DB5.js} +3 -3
- package/dist/{chunk-6KG65RIO.js → chunk-S4M4LBVQ.js} +2 -2
- package/dist/{chunk-7P6KYI3Z.js → chunk-SWH3CIYY.js} +2 -2
- package/dist/{chunk-UY54GCWF.js → chunk-TNVFEZBN.js} +6 -6
- package/dist/{chunk-7PQ6YKBC.js → chunk-UAUOFPHA.js} +2 -2
- package/dist/{chunk-LQCS5PT5.js → chunk-UDR62T6C.js} +2 -2
- package/dist/{chunk-TTNJMHOJ.js → chunk-UQQJ37UO.js} +4 -4
- package/dist/{chunk-FUKVDD7K.js → chunk-WBV3BSDG.js} +2 -2
- package/dist/{chunk-G246NFI4.js → chunk-XASQUPYS.js} +2 -2
- package/dist/{chunk-OUI67IFL.js → chunk-ZTGRS6WM.js} +5 -5
- package/dist/components/AAFailedReason/index.js +3 -3
- package/dist/components/AceEditor/index.js +4 -4
- package/dist/components/AddressContainer/CoreAddressContainer.js +10 -10
- package/dist/components/AddressContainer/EVMAddressContainer.js +9 -9
- package/dist/components/AddressContainer/addressSwitcher.js +7 -7
- package/dist/components/AddressContainer/addressView.js +6 -6
- package/dist/components/AddressContainer/label.js +3 -3
- package/dist/components/AddressContainer/utils.js +3 -3
- package/dist/components/Age/index.js +4 -4
- package/dist/components/AutoComplete/index.js +3 -3
- package/dist/components/Charts/PreviewChartTemplate.js +1 -1
- package/dist/components/Charts/StockChartTemplate.js +1 -1
- package/dist/components/CopyButton/index.js +3 -3
- package/dist/components/DecimalsSelect/index.js +3 -3
- package/dist/components/DownloadCSV/index.js +4 -4
- package/dist/components/GasPriceDropdown/index.js +2 -2
- package/dist/components/IncreasePercent/index.js +2 -2
- package/dist/components/InfoIconWithTooltip/index.js +4 -4
- package/dist/components/InputData/AddressLabel.js +8 -8
- package/dist/components/InputData/ContractDetail.js +5 -5
- package/dist/components/InputData/JsonDecode.js +5 -5
- package/dist/components/InputData/OptimizationDecode.js +12 -12
- package/dist/components/InputData/UTF8.js +3 -3
- package/dist/components/InputData/index.js +16 -16
- package/dist/components/List/index.js +1 -1
- package/dist/components/List/index.js.map +1 -1
- package/dist/components/Modal/index.js +3 -3
- package/dist/components/NetworkIcon/index.js +2 -2
- package/dist/components/OutputData/ErrorDecode.js +15 -15
- package/dist/components/OutputData/index.js +17 -17
- package/dist/components/PhishingAddressContainer/index.js +4 -4
- package/dist/components/Popover/index.js +3 -3
- package/dist/components/Price/index.js +3 -3
- package/dist/components/ProxyContractAddress/index.js +6 -6
- package/dist/components/Radio/index.js +2 -2
- package/dist/components/SearchInput/index.js +4 -4
- package/dist/components/Select/index.js +4 -4
- package/dist/components/Select/select.js +3 -3
- package/dist/components/SmartAccountAddress/index.js +6 -6
- package/dist/components/Text/index.js +4 -4
- package/dist/components/Tooltip/index.js +3 -3
- package/dist/components/TransactionAction/coreTransactionAction.js +10 -10
- package/dist/components/TransactionAction/evmTransactionAction.js +9 -9
- package/dist/components/TransactionTrace/TraceDetail.js +25 -25
- package/dist/components/TransactionTrace/TreeTraceTable.js +26 -26
- package/dist/components/TransactionTrace/index.js +26 -26
- package/dist/utils/address.js +2 -2
- package/dist/utils/contractManagerTool.js +2 -2
- package/dist/utils/hooks/useAddressLabel.js +3 -3
- package/dist/utils/hooks/useAddressNameMap.js +2 -2
- package/dist/utils/hooks/useAutoSetHolderFilterParams.js +2 -2
- package/dist/utils/hooks/useContractDetail.js +2 -2
- package/dist/utils/hooks/useDecodeFunctionData.js +5 -5
- package/dist/utils/hooks/useDecodeFunctionError.js +3 -3
- package/dist/utils/hooks/useENS.js +3 -3
- package/dist/utils/hooks/useEnhanceDataWithNameMap.js +2 -2
- package/dist/utils/hooks/useMethodAbi.js +2 -2
- package/dist/utils/hooks/useTableData.js +1 -1
- package/dist/utils/hooks/useTxTrace.js +3 -3
- package/dist/utils/index.js +2 -2
- package/dist/utils/ipfsGateway.d.ts +52 -0
- package/dist/utils/ipfsGateway.js +350 -0
- package/dist/utils/ipfsGateway.js.map +1 -0
- package/dist/utils/request.d.ts +1 -0
- package/dist/utils/request.js +1 -1
- package/package.json +3 -3
- package/dist/chunk-ZSOMTVP5.js.map +0 -1
- /package/dist/{chunk-FTRICVXA.js.map → chunk-2KOLEWOS.js.map} +0 -0
- /package/dist/{chunk-3KWBKDLY.js.map → chunk-2PGGAIEP.js.map} +0 -0
- /package/dist/{chunk-DV3GFG5Q.js.map → chunk-2PQY4AOY.js.map} +0 -0
- /package/dist/{chunk-53Z3XVZD.js.map → chunk-2UN57Q5P.js.map} +0 -0
- /package/dist/{chunk-VVEA44KS.js.map → chunk-442632G5.js.map} +0 -0
- /package/dist/{chunk-CRTD2R3I.js.map → chunk-6PDWJNOG.js.map} +0 -0
- /package/dist/{chunk-N5X4DZS3.js.map → chunk-73PNXQWF.js.map} +0 -0
- /package/dist/{chunk-P7M7B7ER.js.map → chunk-75SROBSE.js.map} +0 -0
- /package/dist/{chunk-7JMW3D4O.js.map → chunk-AKS6URWT.js.map} +0 -0
- /package/dist/{chunk-XF2CMO2A.js.map → chunk-BHL6OY3L.js.map} +0 -0
- /package/dist/{chunk-RJOY6FMD.js.map → chunk-C2BON7HP.js.map} +0 -0
- /package/dist/{chunk-TJZKPAAH.js.map → chunk-COMABNT2.js.map} +0 -0
- /package/dist/{chunk-2PGTU5DN.js.map → chunk-D6FWT557.js.map} +0 -0
- /package/dist/{chunk-DEZ6AV62.js.map → chunk-DWU7DZBU.js.map} +0 -0
- /package/dist/{chunk-MCQS3VCO.js.map → chunk-FUZVMDLY.js.map} +0 -0
- /package/dist/{chunk-6TKFGXSA.js.map → chunk-IUL5FJSO.js.map} +0 -0
- /package/dist/{chunk-VXHLESK7.js.map → chunk-MBRAYFD4.js.map} +0 -0
- /package/dist/{chunk-A53N6IFN.js.map → chunk-NG6K2B3F.js.map} +0 -0
- /package/dist/{chunk-MOMFJZ7B.js.map → chunk-NQFK4HOS.js.map} +0 -0
- /package/dist/{chunk-CCMPEOQY.js.map → chunk-NRHFGPN6.js.map} +0 -0
- /package/dist/{chunk-E7ZFE6KT.js.map → chunk-QUEYGZEY.js.map} +0 -0
- /package/dist/{chunk-OOL2AH54.js.map → chunk-RDIVTGYB.js.map} +0 -0
- /package/dist/{chunk-MF6LAIGP.js.map → chunk-RIWM6DB5.js.map} +0 -0
- /package/dist/{chunk-6KG65RIO.js.map → chunk-S4M4LBVQ.js.map} +0 -0
- /package/dist/{chunk-7P6KYI3Z.js.map → chunk-SWH3CIYY.js.map} +0 -0
- /package/dist/{chunk-UY54GCWF.js.map → chunk-TNVFEZBN.js.map} +0 -0
- /package/dist/{chunk-7PQ6YKBC.js.map → chunk-UAUOFPHA.js.map} +0 -0
- /package/dist/{chunk-LQCS5PT5.js.map → chunk-UDR62T6C.js.map} +0 -0
- /package/dist/{chunk-TTNJMHOJ.js.map → chunk-UQQJ37UO.js.map} +0 -0
- /package/dist/{chunk-FUKVDD7K.js.map → chunk-WBV3BSDG.js.map} +0 -0
- /package/dist/{chunk-G246NFI4.js.map → chunk-XASQUPYS.js.map} +0 -0
- /package/dist/{chunk-OUI67IFL.js.map → chunk-ZTGRS6WM.js.map} +0 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import "../chunk-WQG2LZMB.js";
|
|
2
|
+
|
|
3
|
+
// src/utils/ipfsGateway.ts
|
|
4
|
+
var IPFS_GATEWAY_LIST_URL = "https://raw.githubusercontent.com/ipfs/public-gateway-checker/refs/heads/main/gateways.json";
|
|
5
|
+
var IPFS_GATEWAY_SAMPLE_CID = "bafybeifx7yeb55armcsxwwitkymga5xf53dxiarykms3ygqic223w5sk3m";
|
|
6
|
+
var DEFAULT_TIMEOUT = 3e3;
|
|
7
|
+
var DEFAULT_PAGE_SIZE = 5;
|
|
8
|
+
var IPFS_GATEWAY_GLOBAL_CACHE_KEY = "__SIRIUS_NEXT_IPFS_GATEWAY_CACHE__";
|
|
9
|
+
var IPFS_GATEWAY_LIST_STORAGE_PREFIX = "sirius-next:ipfs-gateway:list:";
|
|
10
|
+
var IPFS_GATEWAY_DETECT_STORAGE_PREFIX = "sirius-next:ipfs-gateway:detect:";
|
|
11
|
+
var IPFS_GATEWAY_RELOAD_CLEANED_KEY = "sirius-next:ipfs-gateway:reload-cleaned";
|
|
12
|
+
var getIPFSGatewayCache = () => {
|
|
13
|
+
clearSessionCacheOnReload();
|
|
14
|
+
const globalObject = globalThis;
|
|
15
|
+
globalObject[IPFS_GATEWAY_GLOBAL_CACHE_KEY] ?? (globalObject[IPFS_GATEWAY_GLOBAL_CACHE_KEY] = {
|
|
16
|
+
gatewayListPromiseMap: /* @__PURE__ */ new Map(),
|
|
17
|
+
gatewayDetectPromiseMap: /* @__PURE__ */ new Map()
|
|
18
|
+
});
|
|
19
|
+
return globalObject[IPFS_GATEWAY_GLOBAL_CACHE_KEY];
|
|
20
|
+
};
|
|
21
|
+
var clearIPFSGatewayListCache = () => {
|
|
22
|
+
getIPFSGatewayCache().gatewayListPromiseMap.clear();
|
|
23
|
+
clearSessionListCache();
|
|
24
|
+
};
|
|
25
|
+
var clearIPFSGatewayDetectCache = () => {
|
|
26
|
+
getIPFSGatewayCache().gatewayDetectPromiseMap.clear();
|
|
27
|
+
clearSessionDetectCache();
|
|
28
|
+
};
|
|
29
|
+
var normalizeIPFSGateway = (gateway) => {
|
|
30
|
+
if (!gateway || typeof gateway !== "string") {
|
|
31
|
+
return void 0;
|
|
32
|
+
}
|
|
33
|
+
const target = gateway.trim();
|
|
34
|
+
if (!target) {
|
|
35
|
+
return void 0;
|
|
36
|
+
}
|
|
37
|
+
return target.endsWith("/") ? target.slice(0, -1) : target;
|
|
38
|
+
};
|
|
39
|
+
var hostFromIPFSGateway = (gateway) => {
|
|
40
|
+
try {
|
|
41
|
+
return new URL(gateway).host;
|
|
42
|
+
} catch (_) {
|
|
43
|
+
const parts = gateway.split("://");
|
|
44
|
+
const urlExcludeProtocol = (parts.length > 1 ? parts[1] : parts[0]) ?? "";
|
|
45
|
+
return urlExcludeProtocol.split("/")[0] ?? "";
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
var tmplFromIPFSGateway = (userGateway, gatewayList) => {
|
|
49
|
+
const target = normalizeIPFSGateway(userGateway);
|
|
50
|
+
if (!target) {
|
|
51
|
+
return void 0;
|
|
52
|
+
}
|
|
53
|
+
return new Set(gatewayList.map((gateway) => normalizeIPFSGateway(gateway))).has(
|
|
54
|
+
target
|
|
55
|
+
) ? target : void 0;
|
|
56
|
+
};
|
|
57
|
+
var requestWithTimeout = async (url, fetcher, timeout) => {
|
|
58
|
+
const controller = new AbortController();
|
|
59
|
+
const timer = setTimeout(() => controller.abort(), timeout);
|
|
60
|
+
try {
|
|
61
|
+
return await fetcher(url, { signal: controller.signal });
|
|
62
|
+
} finally {
|
|
63
|
+
clearTimeout(timer);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
var getSessionStorage = () => {
|
|
67
|
+
try {
|
|
68
|
+
return globalThis.sessionStorage;
|
|
69
|
+
} catch (_) {
|
|
70
|
+
return void 0;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
var getNavigationType = () => {
|
|
74
|
+
const navigationEntry = globalThis.performance?.getEntriesByType?.(
|
|
75
|
+
"navigation"
|
|
76
|
+
)?.[0];
|
|
77
|
+
if (navigationEntry?.type) {
|
|
78
|
+
return navigationEntry.type;
|
|
79
|
+
}
|
|
80
|
+
return globalThis.performance?.navigation?.type === 1 ? "reload" : void 0;
|
|
81
|
+
};
|
|
82
|
+
var clearSessionCacheOnReload = () => {
|
|
83
|
+
const globalObject = globalThis;
|
|
84
|
+
if (globalObject[IPFS_GATEWAY_RELOAD_CLEANED_KEY]) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
globalObject[IPFS_GATEWAY_RELOAD_CLEANED_KEY] = true;
|
|
88
|
+
if (getNavigationType() === "reload") {
|
|
89
|
+
clearSessionListCache();
|
|
90
|
+
clearSessionDetectCache();
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
var clearSessionCacheByPrefix = (prefix) => {
|
|
94
|
+
const storage = getSessionStorage();
|
|
95
|
+
if (!storage) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
const keys = Array.from({ length: storage.length }).map((_, index) => storage.key(index)).filter((key) => Boolean(key?.startsWith(prefix)));
|
|
100
|
+
keys.forEach((key) => storage.removeItem(key));
|
|
101
|
+
} catch (_) {
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
var clearSessionListCache = () => {
|
|
105
|
+
clearSessionCacheByPrefix(IPFS_GATEWAY_LIST_STORAGE_PREFIX);
|
|
106
|
+
};
|
|
107
|
+
var clearSessionDetectCache = () => {
|
|
108
|
+
clearSessionCacheByPrefix(IPFS_GATEWAY_DETECT_STORAGE_PREFIX);
|
|
109
|
+
};
|
|
110
|
+
var getSessionListCache = (listUrl) => {
|
|
111
|
+
const storage = getSessionStorage();
|
|
112
|
+
if (!storage) {
|
|
113
|
+
return void 0;
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
const item = storage.getItem(
|
|
117
|
+
`${IPFS_GATEWAY_LIST_STORAGE_PREFIX}${listUrl}`
|
|
118
|
+
);
|
|
119
|
+
if (!item) {
|
|
120
|
+
return void 0;
|
|
121
|
+
}
|
|
122
|
+
const data = JSON.parse(item);
|
|
123
|
+
return Array.isArray(data) && data.every((gateway) => typeof gateway === "string") ? data : void 0;
|
|
124
|
+
} catch (_) {
|
|
125
|
+
return void 0;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
var setSessionListCache = (listUrl, gatewayList) => {
|
|
129
|
+
const storage = getSessionStorage();
|
|
130
|
+
if (!storage) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
storage.setItem(
|
|
135
|
+
`${IPFS_GATEWAY_LIST_STORAGE_PREFIX}${listUrl}`,
|
|
136
|
+
JSON.stringify(gatewayList)
|
|
137
|
+
);
|
|
138
|
+
} catch (_) {
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
var getSessionDetectCache = (cacheKey) => {
|
|
142
|
+
const storage = getSessionStorage();
|
|
143
|
+
if (!storage) {
|
|
144
|
+
return void 0;
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
const item = storage.getItem(
|
|
148
|
+
`${IPFS_GATEWAY_DETECT_STORAGE_PREFIX}${cacheKey}`
|
|
149
|
+
);
|
|
150
|
+
if (!item) {
|
|
151
|
+
return void 0;
|
|
152
|
+
}
|
|
153
|
+
const result = JSON.parse(item);
|
|
154
|
+
return result?.data?.url === cacheKey ? result : void 0;
|
|
155
|
+
} catch (_) {
|
|
156
|
+
return void 0;
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
var setSessionDetectCache = (cacheKey, result) => {
|
|
160
|
+
const storage = getSessionStorage();
|
|
161
|
+
if (!storage) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
storage.setItem(
|
|
166
|
+
`${IPFS_GATEWAY_DETECT_STORAGE_PREFIX}${cacheKey}`,
|
|
167
|
+
JSON.stringify(result)
|
|
168
|
+
);
|
|
169
|
+
} catch (_) {
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
var fetchIPFSGatewayListWithoutCache = async ({
|
|
173
|
+
fetcher = globalThis.fetch,
|
|
174
|
+
listUrl = IPFS_GATEWAY_LIST_URL,
|
|
175
|
+
timeout = DEFAULT_TIMEOUT
|
|
176
|
+
} = {}) => {
|
|
177
|
+
const response = await requestWithTimeout(listUrl, fetcher, timeout);
|
|
178
|
+
if (!response.ok) {
|
|
179
|
+
return [];
|
|
180
|
+
}
|
|
181
|
+
const data = await response.json();
|
|
182
|
+
if (!Array.isArray(data)) {
|
|
183
|
+
return [];
|
|
184
|
+
}
|
|
185
|
+
return data.map((gateway) => normalizeIPFSGateway(gateway)).filter((gateway) => Boolean(gateway));
|
|
186
|
+
};
|
|
187
|
+
var fetchIPFSGatewayList = (options = {}) => {
|
|
188
|
+
const listUrl = options.listUrl ?? IPFS_GATEWAY_LIST_URL;
|
|
189
|
+
if (options.useCache === false) {
|
|
190
|
+
return fetchIPFSGatewayListWithoutCache({ ...options, listUrl });
|
|
191
|
+
}
|
|
192
|
+
const { gatewayListPromiseMap } = getIPFSGatewayCache();
|
|
193
|
+
let gatewayListPromise = gatewayListPromiseMap.get(listUrl);
|
|
194
|
+
if (!gatewayListPromise) {
|
|
195
|
+
const storedGatewayList = getSessionListCache(listUrl);
|
|
196
|
+
if (storedGatewayList) {
|
|
197
|
+
gatewayListPromise = Promise.resolve(storedGatewayList);
|
|
198
|
+
gatewayListPromiseMap.set(listUrl, gatewayListPromise);
|
|
199
|
+
return gatewayListPromise;
|
|
200
|
+
}
|
|
201
|
+
gatewayListPromise = fetchIPFSGatewayListWithoutCache({
|
|
202
|
+
...options,
|
|
203
|
+
listUrl
|
|
204
|
+
}).then((gatewayList) => {
|
|
205
|
+
setSessionListCache(listUrl, gatewayList);
|
|
206
|
+
return gatewayList;
|
|
207
|
+
}).catch((error) => {
|
|
208
|
+
gatewayListPromiseMap.delete(listUrl);
|
|
209
|
+
throw error;
|
|
210
|
+
});
|
|
211
|
+
gatewayListPromiseMap.set(listUrl, gatewayListPromise);
|
|
212
|
+
}
|
|
213
|
+
return gatewayListPromise;
|
|
214
|
+
};
|
|
215
|
+
var detectIPFSGateway = async (gateway, {
|
|
216
|
+
fetcher = globalThis.fetch,
|
|
217
|
+
cid = IPFS_GATEWAY_SAMPLE_CID,
|
|
218
|
+
timeout = DEFAULT_TIMEOUT,
|
|
219
|
+
useDetectCache = true
|
|
220
|
+
} = {}) => {
|
|
221
|
+
const normalizedGateway = normalizeIPFSGateway(gateway) ?? gateway;
|
|
222
|
+
const host = hostFromIPFSGateway(normalizedGateway);
|
|
223
|
+
const url = `${normalizedGateway}/ipfs/${cid}`;
|
|
224
|
+
const cacheKey = url;
|
|
225
|
+
if (useDetectCache) {
|
|
226
|
+
const { gatewayDetectPromiseMap } = getIPFSGatewayCache();
|
|
227
|
+
const cachedResult = gatewayDetectPromiseMap.get(cacheKey);
|
|
228
|
+
if (cachedResult) {
|
|
229
|
+
return cachedResult;
|
|
230
|
+
}
|
|
231
|
+
const storedResult = getSessionDetectCache(cacheKey);
|
|
232
|
+
if (storedResult) {
|
|
233
|
+
const storedPromise = Promise.resolve(storedResult);
|
|
234
|
+
gatewayDetectPromiseMap.set(cacheKey, storedPromise);
|
|
235
|
+
return storedPromise;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
const detectPromise = detectIPFSGatewayWithoutCache({
|
|
239
|
+
fetcher,
|
|
240
|
+
timeout,
|
|
241
|
+
normalizedGateway,
|
|
242
|
+
host,
|
|
243
|
+
url
|
|
244
|
+
}).then((result) => {
|
|
245
|
+
if (useDetectCache) {
|
|
246
|
+
setSessionDetectCache(cacheKey, result);
|
|
247
|
+
}
|
|
248
|
+
return result;
|
|
249
|
+
});
|
|
250
|
+
if (useDetectCache) {
|
|
251
|
+
const { gatewayDetectPromiseMap } = getIPFSGatewayCache();
|
|
252
|
+
gatewayDetectPromiseMap.set(cacheKey, detectPromise);
|
|
253
|
+
}
|
|
254
|
+
return detectPromise;
|
|
255
|
+
};
|
|
256
|
+
var detectIPFSGatewayWithoutCache = async ({
|
|
257
|
+
fetcher,
|
|
258
|
+
timeout,
|
|
259
|
+
normalizedGateway,
|
|
260
|
+
host,
|
|
261
|
+
url
|
|
262
|
+
}) => {
|
|
263
|
+
const startedAt = Date.now();
|
|
264
|
+
const baseResult = {
|
|
265
|
+
data: {
|
|
266
|
+
gateway: normalizedGateway,
|
|
267
|
+
host,
|
|
268
|
+
url
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
try {
|
|
272
|
+
const response = await requestWithTimeout(url, fetcher, timeout);
|
|
273
|
+
const time = Date.now() - startedAt;
|
|
274
|
+
const contentType = response.headers.get("content-type");
|
|
275
|
+
const result = {
|
|
276
|
+
data: {
|
|
277
|
+
...baseResult.data,
|
|
278
|
+
time,
|
|
279
|
+
status: response.status,
|
|
280
|
+
contentType
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
if (response.ok && contentType?.startsWith("text/plain")) {
|
|
284
|
+
return {
|
|
285
|
+
...result,
|
|
286
|
+
code: "OK",
|
|
287
|
+
message: "success"
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
return {
|
|
291
|
+
...result,
|
|
292
|
+
code: "NOT_OK",
|
|
293
|
+
message: "fetch fail"
|
|
294
|
+
};
|
|
295
|
+
} catch (_) {
|
|
296
|
+
return {
|
|
297
|
+
...baseResult,
|
|
298
|
+
code: "NOT_OK",
|
|
299
|
+
message: "fetch fail"
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
var detectIPFSGateways = async ({
|
|
304
|
+
gateways,
|
|
305
|
+
pageSize = DEFAULT_PAGE_SIZE,
|
|
306
|
+
fetcher = globalThis.fetch,
|
|
307
|
+
cid = IPFS_GATEWAY_SAMPLE_CID,
|
|
308
|
+
timeout = DEFAULT_TIMEOUT,
|
|
309
|
+
listUrl = IPFS_GATEWAY_LIST_URL,
|
|
310
|
+
useCache = true
|
|
311
|
+
} = {}) => {
|
|
312
|
+
const gatewayList = gateways ?? await fetchIPFSGatewayList({ fetcher, listUrl, timeout, useCache });
|
|
313
|
+
const results = [];
|
|
314
|
+
const normalizedGatewayList = gatewayList.map((gateway) => normalizeIPFSGateway(gateway)).filter((gateway) => Boolean(gateway));
|
|
315
|
+
const safePageSize = Number.isFinite(pageSize) && pageSize > 0 ? Math.max(1, Math.floor(pageSize)) : DEFAULT_PAGE_SIZE;
|
|
316
|
+
for (let skip = 0; skip < normalizedGatewayList.length; skip += safePageSize) {
|
|
317
|
+
const taskArray = normalizedGatewayList.slice(skip, skip + safePageSize).map(
|
|
318
|
+
(gateway) => detectIPFSGateway(gateway, {
|
|
319
|
+
fetcher,
|
|
320
|
+
cid,
|
|
321
|
+
timeout,
|
|
322
|
+
useDetectCache: useCache
|
|
323
|
+
})
|
|
324
|
+
);
|
|
325
|
+
results.push(...await Promise.all(taskArray));
|
|
326
|
+
}
|
|
327
|
+
const availableGateways = results.filter((result) => result.code === "OK" && result.data.time !== void 0).sort((a, b) => Number(a.data.time) - Number(b.data.time));
|
|
328
|
+
return {
|
|
329
|
+
fastest: availableGateways[0]?.data.gateway,
|
|
330
|
+
results,
|
|
331
|
+
availableGateways
|
|
332
|
+
};
|
|
333
|
+
};
|
|
334
|
+
export {
|
|
335
|
+
IPFS_GATEWAY_DETECT_STORAGE_PREFIX,
|
|
336
|
+
IPFS_GATEWAY_GLOBAL_CACHE_KEY,
|
|
337
|
+
IPFS_GATEWAY_LIST_STORAGE_PREFIX,
|
|
338
|
+
IPFS_GATEWAY_LIST_URL,
|
|
339
|
+
IPFS_GATEWAY_RELOAD_CLEANED_KEY,
|
|
340
|
+
IPFS_GATEWAY_SAMPLE_CID,
|
|
341
|
+
clearIPFSGatewayDetectCache,
|
|
342
|
+
clearIPFSGatewayListCache,
|
|
343
|
+
detectIPFSGateway,
|
|
344
|
+
detectIPFSGateways,
|
|
345
|
+
fetchIPFSGatewayList,
|
|
346
|
+
hostFromIPFSGateway,
|
|
347
|
+
normalizeIPFSGateway,
|
|
348
|
+
tmplFromIPFSGateway
|
|
349
|
+
};
|
|
350
|
+
//# sourceMappingURL=ipfsGateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/ipfsGateway.ts"],"sourcesContent":["export const IPFS_GATEWAY_LIST_URL =\n 'https://raw.githubusercontent.com/ipfs/public-gateway-checker/refs/heads/main/gateways.json';\nexport const IPFS_GATEWAY_SAMPLE_CID =\n 'bafybeifx7yeb55armcsxwwitkymga5xf53dxiarykms3ygqic223w5sk3m';\n\nexport type IPFSGatewayDetectCode = 'OK' | 'NOT_OK';\n\nexport interface IPFSGatewayDetectResult {\n code: IPFSGatewayDetectCode;\n message: string;\n data: {\n gateway: string;\n host: string;\n url: string;\n time?: number;\n status?: number;\n contentType?: string | null;\n };\n}\n\nexport interface FetchIPFSGatewayListOptions {\n fetcher?: typeof globalThis.fetch;\n listUrl?: string;\n timeout?: number;\n useCache?: boolean;\n}\n\nexport interface DetectIPFSGatewayOptions {\n fetcher?: typeof globalThis.fetch;\n cid?: string;\n timeout?: number;\n useDetectCache?: boolean;\n}\n\nexport interface DetectIPFSGatewaysOptions extends DetectIPFSGatewayOptions {\n gateways?: string[];\n listUrl?: string;\n pageSize?: number;\n useCache?: boolean;\n}\n\nexport interface DetectIPFSGatewaysResult {\n fastest?: string;\n results: IPFSGatewayDetectResult[];\n availableGateways: IPFSGatewayDetectResult[];\n}\n\nconst DEFAULT_TIMEOUT = 3000;\nconst DEFAULT_PAGE_SIZE = 5;\nexport const IPFS_GATEWAY_GLOBAL_CACHE_KEY =\n '__SIRIUS_NEXT_IPFS_GATEWAY_CACHE__';\nexport const IPFS_GATEWAY_LIST_STORAGE_PREFIX =\n 'sirius-next:ipfs-gateway:list:';\nexport const IPFS_GATEWAY_DETECT_STORAGE_PREFIX =\n 'sirius-next:ipfs-gateway:detect:';\nexport const IPFS_GATEWAY_RELOAD_CLEANED_KEY =\n 'sirius-next:ipfs-gateway:reload-cleaned';\n\ninterface IPFSGatewayCache {\n gatewayListPromiseMap: Map<string, Promise<string[]>>;\n gatewayDetectPromiseMap: Map<string, Promise<IPFSGatewayDetectResult>>;\n}\n\nconst getIPFSGatewayCache = (): IPFSGatewayCache => {\n clearSessionCacheOnReload();\n const globalObject = globalThis as typeof globalThis & {\n [IPFS_GATEWAY_GLOBAL_CACHE_KEY]?: IPFSGatewayCache;\n };\n globalObject[IPFS_GATEWAY_GLOBAL_CACHE_KEY] ??= {\n gatewayListPromiseMap: new Map<string, Promise<string[]>>(),\n gatewayDetectPromiseMap: new Map<\n string,\n Promise<IPFSGatewayDetectResult>\n >(),\n };\n return globalObject[IPFS_GATEWAY_GLOBAL_CACHE_KEY];\n};\n\nexport const clearIPFSGatewayListCache = () => {\n getIPFSGatewayCache().gatewayListPromiseMap.clear();\n clearSessionListCache();\n};\n\nexport const clearIPFSGatewayDetectCache = () => {\n getIPFSGatewayCache().gatewayDetectPromiseMap.clear();\n clearSessionDetectCache();\n};\n\nexport const normalizeIPFSGateway = (gateway: string) => {\n if (!gateway || typeof gateway !== 'string') {\n return undefined;\n }\n const target = gateway.trim();\n if (!target) {\n return undefined;\n }\n return target.endsWith('/') ? target.slice(0, -1) : target;\n};\n\nexport const hostFromIPFSGateway = (gateway: string) => {\n try {\n return new URL(gateway).host;\n } catch (_) {\n const parts = gateway.split('://');\n const urlExcludeProtocol = (parts.length > 1 ? parts[1] : parts[0]) ?? '';\n return urlExcludeProtocol.split('/')[0] ?? '';\n }\n};\n\nexport const tmplFromIPFSGateway = (\n userGateway: string,\n gatewayList: string[],\n) => {\n const target = normalizeIPFSGateway(userGateway);\n if (!target) {\n return undefined;\n }\n return new Set(gatewayList.map(gateway => normalizeIPFSGateway(gateway))).has(\n target,\n )\n ? target\n : undefined;\n};\n\nconst requestWithTimeout = async (\n url: string,\n fetcher: typeof globalThis.fetch,\n timeout: number,\n) => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n try {\n return await fetcher(url, { signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n};\n\nconst getSessionStorage = () => {\n try {\n return globalThis.sessionStorage;\n } catch (_) {\n return undefined;\n }\n};\n\nconst getNavigationType = () => {\n const navigationEntry = globalThis.performance?.getEntriesByType?.(\n 'navigation',\n )?.[0] as PerformanceNavigationTiming | undefined;\n if (navigationEntry?.type) {\n return navigationEntry.type;\n }\n\n return globalThis.performance?.navigation?.type === 1 ? 'reload' : undefined;\n};\n\nconst clearSessionCacheOnReload = () => {\n const globalObject = globalThis as typeof globalThis & {\n [IPFS_GATEWAY_RELOAD_CLEANED_KEY]?: boolean;\n };\n if (globalObject[IPFS_GATEWAY_RELOAD_CLEANED_KEY]) {\n return;\n }\n globalObject[IPFS_GATEWAY_RELOAD_CLEANED_KEY] = true;\n\n if (getNavigationType() === 'reload') {\n clearSessionListCache();\n clearSessionDetectCache();\n }\n};\n\nconst clearSessionCacheByPrefix = (prefix: string) => {\n const storage = getSessionStorage();\n if (!storage) {\n return;\n }\n\n try {\n const keys = Array.from({ length: storage.length })\n .map((_, index) => storage.key(index))\n .filter((key): key is string => Boolean(key?.startsWith(prefix)));\n keys.forEach(key => storage.removeItem(key));\n } catch (_) {\n /* empty */\n }\n};\n\nconst clearSessionListCache = () => {\n clearSessionCacheByPrefix(IPFS_GATEWAY_LIST_STORAGE_PREFIX);\n};\n\nconst clearSessionDetectCache = () => {\n clearSessionCacheByPrefix(IPFS_GATEWAY_DETECT_STORAGE_PREFIX);\n};\n\nconst getSessionListCache = (listUrl: string) => {\n const storage = getSessionStorage();\n if (!storage) {\n return undefined;\n }\n\n try {\n const item = storage.getItem(\n `${IPFS_GATEWAY_LIST_STORAGE_PREFIX}${listUrl}`,\n );\n if (!item) {\n return undefined;\n }\n const data = JSON.parse(item);\n return Array.isArray(data) &&\n data.every(gateway => typeof gateway === 'string')\n ? data\n : undefined;\n } catch (_) {\n return undefined;\n }\n};\n\nconst setSessionListCache = (listUrl: string, gatewayList: string[]) => {\n const storage = getSessionStorage();\n if (!storage) {\n return;\n }\n\n try {\n storage.setItem(\n `${IPFS_GATEWAY_LIST_STORAGE_PREFIX}${listUrl}`,\n JSON.stringify(gatewayList),\n );\n } catch (_) {\n /* empty */\n }\n};\n\nconst getSessionDetectCache = (cacheKey: string) => {\n const storage = getSessionStorage();\n if (!storage) {\n return undefined;\n }\n\n try {\n const item = storage.getItem(\n `${IPFS_GATEWAY_DETECT_STORAGE_PREFIX}${cacheKey}`,\n );\n if (!item) {\n return undefined;\n }\n const result = JSON.parse(item) as IPFSGatewayDetectResult;\n return result?.data?.url === cacheKey ? result : undefined;\n } catch (_) {\n return undefined;\n }\n};\n\nconst setSessionDetectCache = (\n cacheKey: string,\n result: IPFSGatewayDetectResult,\n) => {\n const storage = getSessionStorage();\n if (!storage) {\n return;\n }\n\n try {\n storage.setItem(\n `${IPFS_GATEWAY_DETECT_STORAGE_PREFIX}${cacheKey}`,\n JSON.stringify(result),\n );\n } catch (_) {\n /* empty */\n }\n};\n\nconst fetchIPFSGatewayListWithoutCache = async ({\n fetcher = globalThis.fetch,\n listUrl = IPFS_GATEWAY_LIST_URL,\n timeout = DEFAULT_TIMEOUT,\n}: FetchIPFSGatewayListOptions = {}) => {\n const response = await requestWithTimeout(listUrl, fetcher, timeout);\n if (!response.ok) {\n return [];\n }\n\n const data = await response.json();\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data\n .map(gateway => normalizeIPFSGateway(gateway))\n .filter((gateway): gateway is string => Boolean(gateway));\n};\n\nexport const fetchIPFSGatewayList = (\n options: FetchIPFSGatewayListOptions = {},\n) => {\n const listUrl = options.listUrl ?? IPFS_GATEWAY_LIST_URL;\n if (options.useCache === false) {\n return fetchIPFSGatewayListWithoutCache({ ...options, listUrl });\n }\n\n const { gatewayListPromiseMap } = getIPFSGatewayCache();\n let gatewayListPromise = gatewayListPromiseMap.get(listUrl);\n if (!gatewayListPromise) {\n const storedGatewayList = getSessionListCache(listUrl);\n if (storedGatewayList) {\n gatewayListPromise = Promise.resolve(storedGatewayList);\n gatewayListPromiseMap.set(listUrl, gatewayListPromise);\n return gatewayListPromise;\n }\n\n gatewayListPromise = fetchIPFSGatewayListWithoutCache({\n ...options,\n listUrl,\n })\n .then(gatewayList => {\n setSessionListCache(listUrl, gatewayList);\n return gatewayList;\n })\n .catch(error => {\n gatewayListPromiseMap.delete(listUrl);\n throw error;\n });\n gatewayListPromiseMap.set(listUrl, gatewayListPromise);\n }\n return gatewayListPromise;\n};\n\nexport const detectIPFSGateway = async (\n gateway: string,\n {\n fetcher = globalThis.fetch,\n cid = IPFS_GATEWAY_SAMPLE_CID,\n timeout = DEFAULT_TIMEOUT,\n useDetectCache = true,\n }: DetectIPFSGatewayOptions = {},\n): Promise<IPFSGatewayDetectResult> => {\n const normalizedGateway = normalizeIPFSGateway(gateway) ?? gateway;\n const host = hostFromIPFSGateway(normalizedGateway);\n const url = `${normalizedGateway}/ipfs/${cid}`;\n const cacheKey = url;\n\n if (useDetectCache) {\n const { gatewayDetectPromiseMap } = getIPFSGatewayCache();\n const cachedResult = gatewayDetectPromiseMap.get(cacheKey);\n if (cachedResult) {\n return cachedResult;\n }\n\n const storedResult = getSessionDetectCache(cacheKey);\n if (storedResult) {\n const storedPromise = Promise.resolve(storedResult);\n gatewayDetectPromiseMap.set(cacheKey, storedPromise);\n return storedPromise;\n }\n }\n\n const detectPromise = detectIPFSGatewayWithoutCache({\n fetcher,\n timeout,\n normalizedGateway,\n host,\n url,\n }).then(result => {\n if (useDetectCache) {\n setSessionDetectCache(cacheKey, result);\n }\n return result;\n });\n\n if (useDetectCache) {\n const { gatewayDetectPromiseMap } = getIPFSGatewayCache();\n gatewayDetectPromiseMap.set(cacheKey, detectPromise);\n }\n\n return detectPromise;\n};\n\nconst detectIPFSGatewayWithoutCache = async ({\n fetcher,\n timeout,\n normalizedGateway,\n host,\n url,\n}: {\n fetcher: typeof globalThis.fetch;\n timeout: number;\n normalizedGateway: string;\n host: string;\n url: string;\n}): Promise<IPFSGatewayDetectResult> => {\n const startedAt = Date.now();\n const baseResult = {\n data: {\n gateway: normalizedGateway,\n host,\n url,\n },\n };\n\n try {\n const response = await requestWithTimeout(url, fetcher, timeout);\n const time = Date.now() - startedAt;\n const contentType = response.headers.get('content-type');\n const result = {\n data: {\n ...baseResult.data,\n time,\n status: response.status,\n contentType,\n },\n };\n\n if (response.ok && contentType?.startsWith('text/plain')) {\n return {\n ...result,\n code: 'OK',\n message: 'success',\n };\n }\n\n return {\n ...result,\n code: 'NOT_OK',\n message: 'fetch fail',\n };\n } catch (_) {\n return {\n ...baseResult,\n code: 'NOT_OK',\n message: 'fetch fail',\n };\n }\n};\n\nexport const detectIPFSGateways = async ({\n gateways,\n pageSize = DEFAULT_PAGE_SIZE,\n fetcher = globalThis.fetch,\n cid = IPFS_GATEWAY_SAMPLE_CID,\n timeout = DEFAULT_TIMEOUT,\n listUrl = IPFS_GATEWAY_LIST_URL,\n useCache = true,\n}: DetectIPFSGatewaysOptions = {}): Promise<DetectIPFSGatewaysResult> => {\n const gatewayList =\n gateways ??\n (await fetchIPFSGatewayList({ fetcher, listUrl, timeout, useCache }));\n const results: IPFSGatewayDetectResult[] = [];\n const normalizedGatewayList = gatewayList\n .map(gateway => normalizeIPFSGateway(gateway))\n .filter((gateway): gateway is string => Boolean(gateway));\n const safePageSize =\n Number.isFinite(pageSize) && pageSize > 0\n ? Math.max(1, Math.floor(pageSize))\n : DEFAULT_PAGE_SIZE;\n\n for (\n let skip = 0;\n skip < normalizedGatewayList.length;\n skip += safePageSize\n ) {\n const taskArray = normalizedGatewayList\n .slice(skip, skip + safePageSize)\n .map(gateway =>\n detectIPFSGateway(gateway, {\n fetcher,\n cid,\n timeout,\n useDetectCache: useCache,\n }),\n );\n results.push(...(await Promise.all(taskArray)));\n }\n\n const availableGateways = results\n .filter(result => result.code === 'OK' && result.data.time !== undefined)\n .sort((a, b) => Number(a.data.time) - Number(b.data.time));\n\n return {\n fastest: availableGateways[0]?.data.gateway,\n results,\n availableGateways,\n };\n};\n"],"mappings":"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","names":[]}
|
package/dist/utils/request.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { BaseContractInfo, DetectAccountTypeResponse, MethodAbiItemResponse, Add
|
|
|
2
2
|
|
|
3
3
|
interface FetchOptions extends RequestInit {
|
|
4
4
|
timeout?: number;
|
|
5
|
+
showErrorMessage?: boolean;
|
|
5
6
|
}
|
|
6
7
|
declare const fetch: <T>(url: string, options?: FetchOptions) => Promise<T>;
|
|
7
8
|
declare const appendApiPrefix: (url: string) => string;
|
package/dist/utils/request.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cfxjs/sirius-next-common",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.25",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/**"
|
|
@@ -79,8 +79,8 @@
|
|
|
79
79
|
"unocss": "0.58.6",
|
|
80
80
|
"vitest": "3.2.3",
|
|
81
81
|
"@cfxjs/sirius-next-eslint-config": "0.0.0",
|
|
82
|
-
"@cfxjs/sirius-next-
|
|
83
|
-
"@cfxjs/sirius-next-
|
|
82
|
+
"@cfxjs/sirius-next-typescript-config": "0.0.0",
|
|
83
|
+
"@cfxjs/sirius-next-i18n": "0.2.14"
|
|
84
84
|
},
|
|
85
85
|
"publishConfig": {
|
|
86
86
|
"access": "public"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/request.ts"],"sourcesContent":["import qs from 'query-string';\nimport { publishRequestError } from './pubsub';\nimport {\n AddressNameMap,\n BaseContractInfo,\n DetectAccountTypeResponse,\n MethodAbiItemResponse,\n} from './request.types';\nimport { getEnvConfig } from '../store';\nimport { fetchWithCache } from './cache';\ninterface FetchWithAbortType<T> {\n promise: Promise<T>;\n abort: () => void;\n}\n\ninterface FetchOptions extends RequestInit {\n timeout?: number;\n}\n\nconst TIMEOUT_TIMESTAMP = 60000;\n\nconst checkStatus = (response: Response) => {\n if (\n (response.status >= 200 && response.status < 300) ||\n response.status === 600\n ) {\n return response;\n } else {\n const error = new Error(response.statusText);\n error.name = 'HttpError';\n (error as any).status = response.status;\n (error as any).response = response;\n throw error;\n }\n};\n\n// 格式化 response data\nconst parseJSON = async (response: Response) => {\n const contentType = response.headers.get('content-type');\n try {\n if (contentType?.includes('application/json')) {\n return { data: await response.json(), response };\n } else if (contentType?.includes('text/html')) {\n return { data: await response.text(), response };\n } else {\n // contentType 还有其他类型,目前项目中用不到\n // 不能简单的报错,比如 image/x-icon 是 favicon 请求\n // 此处直接返回 response,由业务代码处理其他类型的数据\n return { data: response, response };\n }\n } catch (error) {\n if ((error as any).name === 'AbortError') {\n return { data: response, response };\n }\n publishRequestError({ url: response.url, code: 20001 }, 'http');\n (error as any).response = response;\n throw error;\n }\n};\n\n// 检查返回值中是否包含错误\nconst checkResponse = function (\n url: string,\n {\n data,\n response,\n }: {\n data: any;\n response: Response;\n },\n opts: any,\n) {\n // 兼容 data.code 和 data.data, 是关于 core space 的数据结构\n if (response.status === 200 && (data.status === '1' || data.code === 0)) {\n return data.result || data.data;\n } else if (/HEAD/i.test(opts?.method || '')) {\n // handle of HEAD method\n return response;\n } else {\n const code = Number(data.status ?? data.code);\n publishRequestError({ url, code, message: data.message }, 'http');\n const error: Partial<ErrorEvent> & {\n response?: ResponseType;\n } = new Error(data.message);\n error.response = data;\n throw error;\n }\n};\n\nconst fetchWithAbort = <T>(\n url: string,\n options: FetchOptions = {},\n): FetchWithAbortType<T> => {\n const controller = new AbortController();\n const opts: FetchOptions = { ...options, signal: controller.signal };\n const timeout = options.timeout || TIMEOUT_TIMESTAMP;\n\n let timeoutId: ReturnType<typeof setTimeout>;\n const promise: Promise<T> = new Promise((resolve, reject) => {\n timeoutId = setTimeout(() => {\n controller.abort();\n publishRequestError(\n { url, code: 20002, message: 'Request timeout' },\n 'http',\n );\n reject(new Error('Request timeout'));\n }, timeout);\n\n window\n .fetch(url, opts)\n .then(checkStatus)\n .then(parseJSON)\n .then((...args) => checkResponse(url, ...args, opts))\n .then(data => resolve(data as T))\n .catch(error => {\n if (/HEAD/i.test(opts?.method || '')) {\n return resolve({} as T);\n }\n\n // A fetch() promise will reject with a TypeError when a network error is encountered or CORS is misconfigured on the server-side,\n // although this usually means permission issues or similar — a 404 does not constitute a network error, for example.\n // For detail: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch\n if (error.name === 'TypeError') {\n publishRequestError({ url, code: 20004 }, 'http');\n reject(new Error('Network error'));\n } else if (error.name === 'AbortError') {\n publishRequestError(\n { url, code: 20003, message: 'Fetch aborted' },\n 'http',\n );\n reject(new Error('Fetch aborted'));\n } else {\n publishRequestError(\n { url, code: (error as any).status, message: error.message },\n 'http',\n );\n reject(error);\n }\n })\n .finally(() => clearTimeout(timeoutId));\n });\n\n return {\n promise,\n abort: () => {\n clearTimeout(timeoutId);\n controller.abort();\n },\n };\n};\n\nexport const fetch = <T>(\n url: string,\n options: FetchOptions = {},\n): Promise<T> => {\n const { promise } = fetchWithAbort<T>(url, options);\n return promise;\n};\n\nexport const appendApiPrefix = (url: string) => {\n // for cfx top N\n if (url.startsWith('/stat/')) {\n return url;\n }\n if (url.startsWith('http')) {\n return url;\n }\n return `/v1${url.startsWith('/') ? url : '/' + url}`;\n};\n\nexport const fetchWithPrefix = <T>(url: string, opts?: FetchOptions) => {\n return fetch<T>(appendApiPrefix(url), opts);\n};\n\nexport const fetchWithOpenApi = <T>(url: string, opts?: FetchOptions) => {\n const ENV_CONFIG = getEnvConfig();\n if (!ENV_CONFIG.ENV_OPEN_API_HOST) {\n throw new Error('ENV_OPEN_API_HOST is not set');\n }\n return fetch<T>(\n `${ENV_CONFIG.ENV_OPEN_API_HOST}${url.startsWith('/') ? url : '/' + url}`,\n opts,\n );\n};\n\nexport const simpleGetFetcher = async <T>(args: any[]) => {\n let [url, query] = args;\n if (query) {\n url = qs.stringifyUrl({ url, query });\n }\n return await fetchWithPrefix<T>(url, {\n method: 'get',\n });\n};\n\ntype RequestMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD';\ninterface QueryParams {\n [key: string]: string | undefined;\n}\ninterface Config {\n url: string;\n query: QueryParams;\n type?: RequestMethod;\n body?: any;\n headers?: Headers;\n signal?: AbortSignal;\n}\n\nconst queryAddress = (address: string[]) => {\n return address.reduce((prev, curr, index) => {\n return !index ? `address=${curr}` : `${prev}&address=${curr}`;\n }, '');\n};\n\nexport const sendRequestChart = async (config: Config) => {\n try {\n const res: any = await fetch(\n qs.stringifyUrl({ url: config.url, query: config.query }),\n {\n method: config.type || 'GET',\n body: config.body,\n headers: config.headers,\n signal: config.signal,\n },\n );\n const data = res;\n data.list = [...(data.list || [])].reverse();\n return data;\n } catch (error) {\n console.error('Request failed', error);\n throw error;\n }\n};\n\nexport const sendRequestENSInfo = async (url?: string | null) => {\n if (!url) return {};\n try {\n const res: any = await fetch(url, {\n method: 'GET',\n });\n\n return res?.map;\n } catch (error) {\n console.error('Request failed', error);\n throw error;\n }\n};\n\nexport const sendRequestGasPrice = async () => {\n try {\n const res: any = await fetch(`/stat/gasprice/tracker`, {\n method: 'GET',\n });\n return res;\n } catch (error) {\n console.error('Request failed', error);\n throw error;\n }\n};\n\nexport const reqNametag = async (address: string[]) => {\n const query = queryAddress(address);\n\n const res: any = await fetch(`/v1/nametag?${query}`, {\n method: 'GET',\n });\n return res?.map;\n};\n\nexport const reqContractAndToken = fetchWithCache(\n async (address: string[]) => {\n const query = queryAddress(address);\n\n const res: any = await fetch(`/v1/contract-and-token?${query}`, {\n method: 'GET',\n });\n return res;\n },\n {\n key: 'contract-and-token',\n maxAge: 1000 * 60 * 60,\n },\n);\n\nexport const getContractDetail = fetchWithCache(\n <T extends string>(contractAddress?: string, fields: T[] = []) => {\n const url = qs.stringifyUrl({\n url: `/v1/contract/${contractAddress}`,\n query: { fields },\n });\n\n return fetch<BaseContractInfo & Record<T, unknown>>(url, {\n method: 'GET',\n });\n },\n {\n key: 'contract-detail',\n maxAge: 1000 * 60 * 60,\n },\n);\n\nexport const detectAccountType = fetchWithCache(\n (address: string) => {\n return fetchWithOpenApi<DetectAccountTypeResponse>(\n `/util/detectAccountType?hex=${address}`,\n {\n method: 'GET',\n },\n );\n },\n {\n // 10 seconds\n maxAge: 1000 * 10,\n },\n);\n\nexport const reqAbiByMethodId = (methodId: string) => {\n return fetchWithPrefix<{\n list: MethodAbiItemResponse[];\n }>(\n qs.stringifyUrl({\n url: '/stat/list-abi-method',\n query: {\n id: methodId,\n },\n }),\n );\n};\n\nexport const fetchAddressNameMap = (\n addresses: string[],\n params: {\n withContractInfo?: 'true' | 'false';\n withNameTagInfo?: 'true' | 'false';\n withENSInfo?: 'true' | 'false';\n } = {},\n) => {\n const url = qs.stringifyUrl({\n url: '/account/infos',\n query: {\n accounts: addresses.join(','),\n ...params,\n },\n });\n return fetchWithOpenApi<Record<string, AddressNameMap>>(url, {\n method: 'GET',\n });\n};\n"],"mappings":"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","names":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|