@yuants/vendor-hyperliquid 0.11.5 → 0.11.7
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/api/client.js +4 -4
- package/dist/api/client.js.map +1 -1
- package/lib/api/client.js +3 -3
- package/lib/api/client.js.map +1 -1
- package/package.json +17 -17
- package/temp/build/typescript/ts_HOjXkPSo.json +1 -1
- package/temp/package-deps.json +21 -21
- package/temp/test/jest/haste-map-1a3370ad4952cc1cbecf8fc42c6e9732-7b2990dcc44090c4eba2c52e971c544c-6a2a6e27ca3579da37751287ea19ab4c +0 -0
- package/temp/test/jest/perf-cache-1a3370ad4952cc1cbecf8fc42c6e9732-da39a3ee5e6b4b0d3255bfef95601890 +1 -1
package/dist/api/client.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
var _a;
|
|
2
|
-
import { fetch,
|
|
2
|
+
import { fetch, selectHTTPProxyIpRoundRobinAsync } from '@yuants/http-services';
|
|
3
3
|
import { Terminal } from '@yuants/protocol';
|
|
4
4
|
import { UUID, formatTime, newError } from '@yuants/utils';
|
|
5
5
|
import { Subject, filter, firstValueFrom, mergeMap, of, shareReplay, throwError, timeout, timer } from 'rxjs';
|
|
@@ -18,9 +18,9 @@ const resolveLocalPublicIp = () => {
|
|
|
18
18
|
}
|
|
19
19
|
return 'public-ip-unknown';
|
|
20
20
|
};
|
|
21
|
-
const createRequestContext = () => {
|
|
21
|
+
const createRequestContext = async () => {
|
|
22
22
|
if (shouldUseHttpProxy) {
|
|
23
|
-
const ip =
|
|
23
|
+
const ip = await selectHTTPProxyIpRoundRobinAsync(terminal);
|
|
24
24
|
return { ip };
|
|
25
25
|
}
|
|
26
26
|
return { ip: resolveLocalPublicIp() };
|
|
@@ -62,7 +62,7 @@ const callApi = async (method, path, params) => {
|
|
|
62
62
|
console.info(formatTime(Date.now()), 'HyperliquidRequest', method, url.host, url.pathname);
|
|
63
63
|
const requestContext = getRestRequestContext(method, path, params);
|
|
64
64
|
const requestKey = getRequestKey(requestContext);
|
|
65
|
-
const proxyContext = createRequestContext();
|
|
65
|
+
const proxyContext = await createRequestContext();
|
|
66
66
|
beforeRestRequest({ method, url: url.href, path, kind: requestContext.kind, infoType: requestContext.infoType, requestKey }, requestContext, proxyContext.ip);
|
|
67
67
|
const res = await fetchImpl(url.href, shouldUseHttpProxy
|
|
68
68
|
? {
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { fetch, selectHTTPProxyIpRoundRobin } from '@yuants/http-services';\nimport { Terminal } from '@yuants/protocol';\nimport { UUID, formatTime, newError } from '@yuants/utils';\nimport { Subject, filter, firstValueFrom, mergeMap, of, shareReplay, throwError, timeout, timer } from 'rxjs';\nimport { afterRestResponse, beforeRestRequest, getRestRequestContext } from './rate-limit';\n\nvoid afterRestResponse;\n\ntype HttpMethod = 'GET' | 'POST';\n\ntype RequestContext = { ip: string };\n\nconst resolveLocalPublicIp = (): string => {\n const ip = terminal.terminalInfo.tags?.public_ip?.trim();\n if (ip) return ip;\n const now = Date.now();\n const lastLoggedAt = missingPublicIpLogAtByTerminalId.get(terminal.terminal_id) ?? 0;\n if (now - lastLoggedAt > MISSING_PUBLIC_IP_LOG_INTERVAL) {\n missingPublicIpLogAtByTerminalId.set(terminal.terminal_id, now);\n console.info(formatTime(Date.now()), 'missing terminal public_ip tag, fallback to public-ip-unknown');\n }\n return 'public-ip-unknown';\n};\n\nconst createRequestContext = (): RequestContext => {\n if (shouldUseHttpProxy) {\n const ip = selectHTTPProxyIpRoundRobin(terminal);\n return { ip };\n }\n return { ip: resolveLocalPublicIp() };\n};\n\nconst BASE_URL = 'https://api.hyperliquid.xyz';\nconst shouldUseHttpProxy = process.env.USE_HTTP_PROXY === 'true';\nconst fetchImpl = shouldUseHttpProxy ? fetch : globalThis.fetch ?? fetch;\nconst terminal = Terminal.fromNodeEnv();\nconst MISSING_PUBLIC_IP_LOG_INTERVAL = 3_600_000;\nconst missingPublicIpLogAtByTerminalId = new Map<string, number>();\n\nif (shouldUseHttpProxy) {\n globalThis.fetch = fetch;\n}\n\nconst getRequestKey = (ctx: ReturnType<typeof getRestRequestContext>) => {\n if (ctx.kind === 'info') return `info:${ctx.infoType ?? 'unknown'}`;\n if (ctx.kind === 'exchange') return `exchange:${ctx.exchangeActionType ?? 'unknown'}`;\n if (ctx.kind === 'explorer') return `explorer:${ctx.path}`;\n return `other:${ctx.path}`;\n};\n\nconst buildUrl = (path: string, method: HttpMethod, params?: any) => {\n const url = new URL(BASE_URL);\n url.pathname = path;\n if (method === 'GET' && params) {\n const entries = Object.entries(params).sort(([a], [b]) => a.localeCompare(b));\n for (const [key, value] of entries) {\n url.searchParams.set(key, '' + value);\n }\n }\n return url;\n};\n\nconst callApi = async (method: HttpMethod, path: string, params?: any) => {\n const url = buildUrl(path, method, params);\n const body = method === 'GET' ? '' : JSON.stringify(params ?? {});\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n console.info(formatTime(Date.now()), 'HyperliquidRequest', method, url.host, url.pathname);\n\n const requestContext = getRestRequestContext(method, path, params);\n const requestKey = getRequestKey(requestContext);\n const proxyContext = createRequestContext();\n\n beforeRestRequest(\n { method, url: url.href, path, kind: requestContext.kind, infoType: requestContext.infoType, requestKey },\n requestContext,\n proxyContext.ip,\n );\n\n const res = await fetchImpl(\n url.href,\n shouldUseHttpProxy\n ? {\n method,\n headers,\n body: method === 'GET' ? undefined : body || undefined,\n labels: proxyContext.ip ? { ip: proxyContext.ip } : undefined,\n terminal,\n }\n : {\n method,\n headers,\n body: method === 'GET' ? undefined : body || undefined,\n },\n );\n const retStr = await res.text();\n if (res.status === 429) {\n console.info(\n formatTime(Date.now()),\n 'HyperliquidResponse',\n method,\n url.host,\n url.pathname,\n `status=${res.status}`,\n );\n throw newError('HYPERLIQUID_HTTP_429', {\n status: res.status,\n requestKey,\n method,\n path,\n url: `${url.host}${url.pathname}`,\n });\n }\n try {\n if (process.env.LOG_LEVEL === 'DEBUG') {\n console.debug(formatTime(Date.now()), 'HyperliquidResponse', path, retStr);\n }\n const response = JSON.parse(retStr);\n // await afterRestResponse(\n // {\n // method,\n // url: url.href,\n // path,\n // kind: requestContext.kind,\n // infoType: requestContext.infoType,\n // requestKey,\n // },\n // requestContext,\n // response,\n // estimatedExtraWeight,\n // );\n return response;\n } catch (err) {\n console.error(formatTime(Date.now()), 'HyperliquidRequestFailed', path, retStr, err);\n throw err;\n }\n};\n\ntype FlowController = {\n requestQueue: Array<{ trace_id: string; method: HttpMethod; path: string; params?: any }>;\n responseChannel: Subject<{ trace_id: string; response?: any; error?: Error }>;\n};\n\nconst controllers = new Map<string, FlowController>();\n\nconst ensureController = (path: string, period: number, limit: number) => {\n if (controllers.has(path)) {\n return controllers.get(path)!;\n }\n const controller: FlowController = {\n requestQueue: [],\n responseChannel: new Subject(),\n };\n timer(0, period)\n .pipe(\n filter(() => controller.requestQueue.length > 0),\n mergeMap(() => controller.requestQueue.splice(0, limit)),\n mergeMap(async (request) => {\n try {\n const response = await callApi(request.method, request.path, request.params);\n return { trace_id: request.trace_id, response };\n } catch (error) {\n return { trace_id: request.trace_id, error: error as Error };\n }\n }),\n )\n .subscribe(controller.responseChannel);\n controllers.set(path, controller);\n return controller;\n};\n\nexport const request = <T = any>(method: HttpMethod, path: string, params?: any) =>\n callApi(method, path, params) as Promise<T>;\n\nexport const requestWithFlowControl = async <T = any>(\n method: HttpMethod,\n path: string,\n flowControl: { period: number; limit: number },\n params?: any,\n) => {\n const controller = ensureController(path, flowControl.period, flowControl.limit);\n const trace_id = UUID();\n const res$ = controller.responseChannel.pipe(\n filter((resp) => resp.trace_id === trace_id),\n mergeMap((resp) => (resp.error ? throwError(() => resp.error) : of(resp))),\n timeout(30_000),\n shareReplay(1),\n );\n controller.requestQueue.push({ trace_id, method, path, params });\n return ((await firstValueFrom(res$)).response ?? null) as T;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { fetch, selectHTTPProxyIpRoundRobinAsync } from '@yuants/http-services';\nimport { Terminal } from '@yuants/protocol';\nimport { UUID, formatTime, newError } from '@yuants/utils';\nimport { Subject, filter, firstValueFrom, mergeMap, of, shareReplay, throwError, timeout, timer } from 'rxjs';\nimport { afterRestResponse, beforeRestRequest, getRestRequestContext } from './rate-limit';\n\nvoid afterRestResponse;\n\ntype HttpMethod = 'GET' | 'POST';\n\ntype RequestContext = { ip: string };\n\nconst resolveLocalPublicIp = (): string => {\n const ip = terminal.terminalInfo.tags?.public_ip?.trim();\n if (ip) return ip;\n const now = Date.now();\n const lastLoggedAt = missingPublicIpLogAtByTerminalId.get(terminal.terminal_id) ?? 0;\n if (now - lastLoggedAt > MISSING_PUBLIC_IP_LOG_INTERVAL) {\n missingPublicIpLogAtByTerminalId.set(terminal.terminal_id, now);\n console.info(formatTime(Date.now()), 'missing terminal public_ip tag, fallback to public-ip-unknown');\n }\n return 'public-ip-unknown';\n};\n\nconst createRequestContext = async (): Promise<RequestContext> => {\n if (shouldUseHttpProxy) {\n const ip = await selectHTTPProxyIpRoundRobinAsync(terminal);\n return { ip };\n }\n return { ip: resolveLocalPublicIp() };\n};\n\nconst BASE_URL = 'https://api.hyperliquid.xyz';\nconst shouldUseHttpProxy = process.env.USE_HTTP_PROXY === 'true';\nconst fetchImpl = shouldUseHttpProxy ? fetch : globalThis.fetch ?? fetch;\nconst terminal = Terminal.fromNodeEnv();\nconst MISSING_PUBLIC_IP_LOG_INTERVAL = 3_600_000;\nconst missingPublicIpLogAtByTerminalId = new Map<string, number>();\n\nif (shouldUseHttpProxy) {\n globalThis.fetch = fetch;\n}\n\nconst getRequestKey = (ctx: ReturnType<typeof getRestRequestContext>) => {\n if (ctx.kind === 'info') return `info:${ctx.infoType ?? 'unknown'}`;\n if (ctx.kind === 'exchange') return `exchange:${ctx.exchangeActionType ?? 'unknown'}`;\n if (ctx.kind === 'explorer') return `explorer:${ctx.path}`;\n return `other:${ctx.path}`;\n};\n\nconst buildUrl = (path: string, method: HttpMethod, params?: any) => {\n const url = new URL(BASE_URL);\n url.pathname = path;\n if (method === 'GET' && params) {\n const entries = Object.entries(params).sort(([a], [b]) => a.localeCompare(b));\n for (const [key, value] of entries) {\n url.searchParams.set(key, '' + value);\n }\n }\n return url;\n};\n\nconst callApi = async (method: HttpMethod, path: string, params?: any) => {\n const url = buildUrl(path, method, params);\n const body = method === 'GET' ? '' : JSON.stringify(params ?? {});\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n console.info(formatTime(Date.now()), 'HyperliquidRequest', method, url.host, url.pathname);\n\n const requestContext = getRestRequestContext(method, path, params);\n const requestKey = getRequestKey(requestContext);\n const proxyContext = await createRequestContext();\n\n beforeRestRequest(\n { method, url: url.href, path, kind: requestContext.kind, infoType: requestContext.infoType, requestKey },\n requestContext,\n proxyContext.ip,\n );\n\n const res = await fetchImpl(\n url.href,\n shouldUseHttpProxy\n ? {\n method,\n headers,\n body: method === 'GET' ? undefined : body || undefined,\n labels: proxyContext.ip ? { ip: proxyContext.ip } : undefined,\n terminal,\n }\n : {\n method,\n headers,\n body: method === 'GET' ? undefined : body || undefined,\n },\n );\n const retStr = await res.text();\n if (res.status === 429) {\n console.info(\n formatTime(Date.now()),\n 'HyperliquidResponse',\n method,\n url.host,\n url.pathname,\n `status=${res.status}`,\n );\n throw newError('HYPERLIQUID_HTTP_429', {\n status: res.status,\n requestKey,\n method,\n path,\n url: `${url.host}${url.pathname}`,\n });\n }\n try {\n if (process.env.LOG_LEVEL === 'DEBUG') {\n console.debug(formatTime(Date.now()), 'HyperliquidResponse', path, retStr);\n }\n const response = JSON.parse(retStr);\n // await afterRestResponse(\n // {\n // method,\n // url: url.href,\n // path,\n // kind: requestContext.kind,\n // infoType: requestContext.infoType,\n // requestKey,\n // },\n // requestContext,\n // response,\n // estimatedExtraWeight,\n // );\n return response;\n } catch (err) {\n console.error(formatTime(Date.now()), 'HyperliquidRequestFailed', path, retStr, err);\n throw err;\n }\n};\n\ntype FlowController = {\n requestQueue: Array<{ trace_id: string; method: HttpMethod; path: string; params?: any }>;\n responseChannel: Subject<{ trace_id: string; response?: any; error?: Error }>;\n};\n\nconst controllers = new Map<string, FlowController>();\n\nconst ensureController = (path: string, period: number, limit: number) => {\n if (controllers.has(path)) {\n return controllers.get(path)!;\n }\n const controller: FlowController = {\n requestQueue: [],\n responseChannel: new Subject(),\n };\n timer(0, period)\n .pipe(\n filter(() => controller.requestQueue.length > 0),\n mergeMap(() => controller.requestQueue.splice(0, limit)),\n mergeMap(async (request) => {\n try {\n const response = await callApi(request.method, request.path, request.params);\n return { trace_id: request.trace_id, response };\n } catch (error) {\n return { trace_id: request.trace_id, error: error as Error };\n }\n }),\n )\n .subscribe(controller.responseChannel);\n controllers.set(path, controller);\n return controller;\n};\n\nexport const request = <T = any>(method: HttpMethod, path: string, params?: any) =>\n callApi(method, path, params) as Promise<T>;\n\nexport const requestWithFlowControl = async <T = any>(\n method: HttpMethod,\n path: string,\n flowControl: { period: number; limit: number },\n params?: any,\n) => {\n const controller = ensureController(path, flowControl.period, flowControl.limit);\n const trace_id = UUID();\n const res$ = controller.responseChannel.pipe(\n filter((resp) => resp.trace_id === trace_id),\n mergeMap((resp) => (resp.error ? throwError(() => resp.error) : of(resp))),\n timeout(30_000),\n shareReplay(1),\n );\n controller.requestQueue.push({ trace_id, method, path, params });\n return ((await firstValueFrom(res$)).response ?? null) as T;\n};\n"]}
|
package/lib/api/client.js
CHANGED
|
@@ -21,9 +21,9 @@ const resolveLocalPublicIp = () => {
|
|
|
21
21
|
}
|
|
22
22
|
return 'public-ip-unknown';
|
|
23
23
|
};
|
|
24
|
-
const createRequestContext = () => {
|
|
24
|
+
const createRequestContext = async () => {
|
|
25
25
|
if (shouldUseHttpProxy) {
|
|
26
|
-
const ip = (0, http_services_1.
|
|
26
|
+
const ip = await (0, http_services_1.selectHTTPProxyIpRoundRobinAsync)(terminal);
|
|
27
27
|
return { ip };
|
|
28
28
|
}
|
|
29
29
|
return { ip: resolveLocalPublicIp() };
|
|
@@ -65,7 +65,7 @@ const callApi = async (method, path, params) => {
|
|
|
65
65
|
console.info((0, utils_1.formatTime)(Date.now()), 'HyperliquidRequest', method, url.host, url.pathname);
|
|
66
66
|
const requestContext = (0, rate_limit_1.getRestRequestContext)(method, path, params);
|
|
67
67
|
const requestKey = getRequestKey(requestContext);
|
|
68
|
-
const proxyContext = createRequestContext();
|
|
68
|
+
const proxyContext = await createRequestContext();
|
|
69
69
|
(0, rate_limit_1.beforeRestRequest)({ method, url: url.href, path, kind: requestContext.kind, infoType: requestContext.infoType, requestKey }, requestContext, proxyContext.ip);
|
|
70
70
|
const res = await fetchImpl(url.href, shouldUseHttpProxy
|
|
71
71
|
? {
|
package/lib/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { fetch, selectHTTPProxyIpRoundRobin } from '@yuants/http-services';\nimport { Terminal } from '@yuants/protocol';\nimport { UUID, formatTime, newError } from '@yuants/utils';\nimport { Subject, filter, firstValueFrom, mergeMap, of, shareReplay, throwError, timeout, timer } from 'rxjs';\nimport { afterRestResponse, beforeRestRequest, getRestRequestContext } from './rate-limit';\n\nvoid afterRestResponse;\n\ntype HttpMethod = 'GET' | 'POST';\n\ntype RequestContext = { ip: string };\n\nconst resolveLocalPublicIp = (): string => {\n const ip = terminal.terminalInfo.tags?.public_ip?.trim();\n if (ip) return ip;\n const now = Date.now();\n const lastLoggedAt = missingPublicIpLogAtByTerminalId.get(terminal.terminal_id) ?? 0;\n if (now - lastLoggedAt > MISSING_PUBLIC_IP_LOG_INTERVAL) {\n missingPublicIpLogAtByTerminalId.set(terminal.terminal_id, now);\n console.info(formatTime(Date.now()), 'missing terminal public_ip tag, fallback to public-ip-unknown');\n }\n return 'public-ip-unknown';\n};\n\nconst createRequestContext = (): RequestContext => {\n if (shouldUseHttpProxy) {\n const ip = selectHTTPProxyIpRoundRobin(terminal);\n return { ip };\n }\n return { ip: resolveLocalPublicIp() };\n};\n\nconst BASE_URL = 'https://api.hyperliquid.xyz';\nconst shouldUseHttpProxy = process.env.USE_HTTP_PROXY === 'true';\nconst fetchImpl = shouldUseHttpProxy ? fetch : globalThis.fetch ?? fetch;\nconst terminal = Terminal.fromNodeEnv();\nconst MISSING_PUBLIC_IP_LOG_INTERVAL = 3_600_000;\nconst missingPublicIpLogAtByTerminalId = new Map<string, number>();\n\nif (shouldUseHttpProxy) {\n globalThis.fetch = fetch;\n}\n\nconst getRequestKey = (ctx: ReturnType<typeof getRestRequestContext>) => {\n if (ctx.kind === 'info') return `info:${ctx.infoType ?? 'unknown'}`;\n if (ctx.kind === 'exchange') return `exchange:${ctx.exchangeActionType ?? 'unknown'}`;\n if (ctx.kind === 'explorer') return `explorer:${ctx.path}`;\n return `other:${ctx.path}`;\n};\n\nconst buildUrl = (path: string, method: HttpMethod, params?: any) => {\n const url = new URL(BASE_URL);\n url.pathname = path;\n if (method === 'GET' && params) {\n const entries = Object.entries(params).sort(([a], [b]) => a.localeCompare(b));\n for (const [key, value] of entries) {\n url.searchParams.set(key, '' + value);\n }\n }\n return url;\n};\n\nconst callApi = async (method: HttpMethod, path: string, params?: any) => {\n const url = buildUrl(path, method, params);\n const body = method === 'GET' ? '' : JSON.stringify(params ?? {});\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n console.info(formatTime(Date.now()), 'HyperliquidRequest', method, url.host, url.pathname);\n\n const requestContext = getRestRequestContext(method, path, params);\n const requestKey = getRequestKey(requestContext);\n const proxyContext = createRequestContext();\n\n beforeRestRequest(\n { method, url: url.href, path, kind: requestContext.kind, infoType: requestContext.infoType, requestKey },\n requestContext,\n proxyContext.ip,\n );\n\n const res = await fetchImpl(\n url.href,\n shouldUseHttpProxy\n ? {\n method,\n headers,\n body: method === 'GET' ? undefined : body || undefined,\n labels: proxyContext.ip ? { ip: proxyContext.ip } : undefined,\n terminal,\n }\n : {\n method,\n headers,\n body: method === 'GET' ? undefined : body || undefined,\n },\n );\n const retStr = await res.text();\n if (res.status === 429) {\n console.info(\n formatTime(Date.now()),\n 'HyperliquidResponse',\n method,\n url.host,\n url.pathname,\n `status=${res.status}`,\n );\n throw newError('HYPERLIQUID_HTTP_429', {\n status: res.status,\n requestKey,\n method,\n path,\n url: `${url.host}${url.pathname}`,\n });\n }\n try {\n if (process.env.LOG_LEVEL === 'DEBUG') {\n console.debug(formatTime(Date.now()), 'HyperliquidResponse', path, retStr);\n }\n const response = JSON.parse(retStr);\n // await afterRestResponse(\n // {\n // method,\n // url: url.href,\n // path,\n // kind: requestContext.kind,\n // infoType: requestContext.infoType,\n // requestKey,\n // },\n // requestContext,\n // response,\n // estimatedExtraWeight,\n // );\n return response;\n } catch (err) {\n console.error(formatTime(Date.now()), 'HyperliquidRequestFailed', path, retStr, err);\n throw err;\n }\n};\n\ntype FlowController = {\n requestQueue: Array<{ trace_id: string; method: HttpMethod; path: string; params?: any }>;\n responseChannel: Subject<{ trace_id: string; response?: any; error?: Error }>;\n};\n\nconst controllers = new Map<string, FlowController>();\n\nconst ensureController = (path: string, period: number, limit: number) => {\n if (controllers.has(path)) {\n return controllers.get(path)!;\n }\n const controller: FlowController = {\n requestQueue: [],\n responseChannel: new Subject(),\n };\n timer(0, period)\n .pipe(\n filter(() => controller.requestQueue.length > 0),\n mergeMap(() => controller.requestQueue.splice(0, limit)),\n mergeMap(async (request) => {\n try {\n const response = await callApi(request.method, request.path, request.params);\n return { trace_id: request.trace_id, response };\n } catch (error) {\n return { trace_id: request.trace_id, error: error as Error };\n }\n }),\n )\n .subscribe(controller.responseChannel);\n controllers.set(path, controller);\n return controller;\n};\n\nexport const request = <T = any>(method: HttpMethod, path: string, params?: any) =>\n callApi(method, path, params) as Promise<T>;\n\nexport const requestWithFlowControl = async <T = any>(\n method: HttpMethod,\n path: string,\n flowControl: { period: number; limit: number },\n params?: any,\n) => {\n const controller = ensureController(path, flowControl.period, flowControl.limit);\n const trace_id = UUID();\n const res$ = controller.responseChannel.pipe(\n filter((resp) => resp.trace_id === trace_id),\n mergeMap((resp) => (resp.error ? throwError(() => resp.error) : of(resp))),\n timeout(30_000),\n shareReplay(1),\n );\n controller.requestQueue.push({ trace_id, method, path, params });\n return ((await firstValueFrom(res$)).response ?? null) as T;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { fetch, selectHTTPProxyIpRoundRobinAsync } from '@yuants/http-services';\nimport { Terminal } from '@yuants/protocol';\nimport { UUID, formatTime, newError } from '@yuants/utils';\nimport { Subject, filter, firstValueFrom, mergeMap, of, shareReplay, throwError, timeout, timer } from 'rxjs';\nimport { afterRestResponse, beforeRestRequest, getRestRequestContext } from './rate-limit';\n\nvoid afterRestResponse;\n\ntype HttpMethod = 'GET' | 'POST';\n\ntype RequestContext = { ip: string };\n\nconst resolveLocalPublicIp = (): string => {\n const ip = terminal.terminalInfo.tags?.public_ip?.trim();\n if (ip) return ip;\n const now = Date.now();\n const lastLoggedAt = missingPublicIpLogAtByTerminalId.get(terminal.terminal_id) ?? 0;\n if (now - lastLoggedAt > MISSING_PUBLIC_IP_LOG_INTERVAL) {\n missingPublicIpLogAtByTerminalId.set(terminal.terminal_id, now);\n console.info(formatTime(Date.now()), 'missing terminal public_ip tag, fallback to public-ip-unknown');\n }\n return 'public-ip-unknown';\n};\n\nconst createRequestContext = async (): Promise<RequestContext> => {\n if (shouldUseHttpProxy) {\n const ip = await selectHTTPProxyIpRoundRobinAsync(terminal);\n return { ip };\n }\n return { ip: resolveLocalPublicIp() };\n};\n\nconst BASE_URL = 'https://api.hyperliquid.xyz';\nconst shouldUseHttpProxy = process.env.USE_HTTP_PROXY === 'true';\nconst fetchImpl = shouldUseHttpProxy ? fetch : globalThis.fetch ?? fetch;\nconst terminal = Terminal.fromNodeEnv();\nconst MISSING_PUBLIC_IP_LOG_INTERVAL = 3_600_000;\nconst missingPublicIpLogAtByTerminalId = new Map<string, number>();\n\nif (shouldUseHttpProxy) {\n globalThis.fetch = fetch;\n}\n\nconst getRequestKey = (ctx: ReturnType<typeof getRestRequestContext>) => {\n if (ctx.kind === 'info') return `info:${ctx.infoType ?? 'unknown'}`;\n if (ctx.kind === 'exchange') return `exchange:${ctx.exchangeActionType ?? 'unknown'}`;\n if (ctx.kind === 'explorer') return `explorer:${ctx.path}`;\n return `other:${ctx.path}`;\n};\n\nconst buildUrl = (path: string, method: HttpMethod, params?: any) => {\n const url = new URL(BASE_URL);\n url.pathname = path;\n if (method === 'GET' && params) {\n const entries = Object.entries(params).sort(([a], [b]) => a.localeCompare(b));\n for (const [key, value] of entries) {\n url.searchParams.set(key, '' + value);\n }\n }\n return url;\n};\n\nconst callApi = async (method: HttpMethod, path: string, params?: any) => {\n const url = buildUrl(path, method, params);\n const body = method === 'GET' ? '' : JSON.stringify(params ?? {});\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n console.info(formatTime(Date.now()), 'HyperliquidRequest', method, url.host, url.pathname);\n\n const requestContext = getRestRequestContext(method, path, params);\n const requestKey = getRequestKey(requestContext);\n const proxyContext = await createRequestContext();\n\n beforeRestRequest(\n { method, url: url.href, path, kind: requestContext.kind, infoType: requestContext.infoType, requestKey },\n requestContext,\n proxyContext.ip,\n );\n\n const res = await fetchImpl(\n url.href,\n shouldUseHttpProxy\n ? {\n method,\n headers,\n body: method === 'GET' ? undefined : body || undefined,\n labels: proxyContext.ip ? { ip: proxyContext.ip } : undefined,\n terminal,\n }\n : {\n method,\n headers,\n body: method === 'GET' ? undefined : body || undefined,\n },\n );\n const retStr = await res.text();\n if (res.status === 429) {\n console.info(\n formatTime(Date.now()),\n 'HyperliquidResponse',\n method,\n url.host,\n url.pathname,\n `status=${res.status}`,\n );\n throw newError('HYPERLIQUID_HTTP_429', {\n status: res.status,\n requestKey,\n method,\n path,\n url: `${url.host}${url.pathname}`,\n });\n }\n try {\n if (process.env.LOG_LEVEL === 'DEBUG') {\n console.debug(formatTime(Date.now()), 'HyperliquidResponse', path, retStr);\n }\n const response = JSON.parse(retStr);\n // await afterRestResponse(\n // {\n // method,\n // url: url.href,\n // path,\n // kind: requestContext.kind,\n // infoType: requestContext.infoType,\n // requestKey,\n // },\n // requestContext,\n // response,\n // estimatedExtraWeight,\n // );\n return response;\n } catch (err) {\n console.error(formatTime(Date.now()), 'HyperliquidRequestFailed', path, retStr, err);\n throw err;\n }\n};\n\ntype FlowController = {\n requestQueue: Array<{ trace_id: string; method: HttpMethod; path: string; params?: any }>;\n responseChannel: Subject<{ trace_id: string; response?: any; error?: Error }>;\n};\n\nconst controllers = new Map<string, FlowController>();\n\nconst ensureController = (path: string, period: number, limit: number) => {\n if (controllers.has(path)) {\n return controllers.get(path)!;\n }\n const controller: FlowController = {\n requestQueue: [],\n responseChannel: new Subject(),\n };\n timer(0, period)\n .pipe(\n filter(() => controller.requestQueue.length > 0),\n mergeMap(() => controller.requestQueue.splice(0, limit)),\n mergeMap(async (request) => {\n try {\n const response = await callApi(request.method, request.path, request.params);\n return { trace_id: request.trace_id, response };\n } catch (error) {\n return { trace_id: request.trace_id, error: error as Error };\n }\n }),\n )\n .subscribe(controller.responseChannel);\n controllers.set(path, controller);\n return controller;\n};\n\nexport const request = <T = any>(method: HttpMethod, path: string, params?: any) =>\n callApi(method, path, params) as Promise<T>;\n\nexport const requestWithFlowControl = async <T = any>(\n method: HttpMethod,\n path: string,\n flowControl: { period: number; limit: number },\n params?: any,\n) => {\n const controller = ensureController(path, flowControl.period, flowControl.limit);\n const trace_id = UUID();\n const res$ = controller.responseChannel.pipe(\n filter((resp) => resp.trace_id === trace_id),\n mergeMap((resp) => (resp.error ? throwError(() => resp.error) : of(resp))),\n timeout(30_000),\n shareReplay(1),\n );\n controller.requestQueue.push({ trace_id, method, path, params });\n return ((await firstValueFrom(res$)).response ?? null) as T;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yuants/vendor-hyperliquid",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.7",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
@@ -12,20 +12,20 @@
|
|
|
12
12
|
"hyperliquid": "~1.6.2",
|
|
13
13
|
"ethers": "~6.13.5",
|
|
14
14
|
"@msgpack/msgpack": "~3.1.2",
|
|
15
|
-
"@yuants/
|
|
16
|
-
"@yuants/protocol": "0.54.
|
|
17
|
-
"@yuants/
|
|
18
|
-
"@yuants/
|
|
19
|
-
"@yuants/
|
|
20
|
-
"@yuants/sql": "0.9.
|
|
21
|
-
"@yuants/
|
|
22
|
-
"@yuants/data-
|
|
23
|
-
"@yuants/data-order": "0.7.
|
|
24
|
-
"@yuants/data-
|
|
25
|
-
"@yuants/data-
|
|
26
|
-
"@yuants/
|
|
27
|
-
"@yuants/
|
|
28
|
-
"@yuants/
|
|
15
|
+
"@yuants/cache": "0.3.14",
|
|
16
|
+
"@yuants/protocol": "0.54.4",
|
|
17
|
+
"@yuants/transfer": "0.2.51",
|
|
18
|
+
"@yuants/utils": "0.19.6",
|
|
19
|
+
"@yuants/data-account": "0.11.11",
|
|
20
|
+
"@yuants/sql": "0.9.42",
|
|
21
|
+
"@yuants/data-product": "0.5.12",
|
|
22
|
+
"@yuants/data-interest-rate": "0.2.12",
|
|
23
|
+
"@yuants/data-order": "0.7.12",
|
|
24
|
+
"@yuants/data-series": "0.3.64",
|
|
25
|
+
"@yuants/data-quote": "0.4.11",
|
|
26
|
+
"@yuants/http-services": "0.5.1",
|
|
27
|
+
"@yuants/exchange": "0.8.22",
|
|
28
|
+
"@yuants/data-ohlc": "0.6.7"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@microsoft/api-extractor": "~7.55.2",
|
|
@@ -36,8 +36,8 @@
|
|
|
36
36
|
"@types/node": "24",
|
|
37
37
|
"typescript": "~5.9.3",
|
|
38
38
|
"ts-node": "~10.9.2",
|
|
39
|
-
"@yuants/
|
|
40
|
-
"@yuants/
|
|
39
|
+
"@yuants/tool-kit": "0.2.3",
|
|
40
|
+
"@yuants/extension": "0.2.42"
|
|
41
41
|
},
|
|
42
42
|
"publishConfig": {
|
|
43
43
|
"registry": "https://registry.npmjs.org",
|