@lifi/perps-sdk 0.0.0-preview-64fca0d
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/LICENSE +201 -0
- package/dist/cjs/client/PerpsClient.d.ts +63 -0
- package/dist/cjs/client/PerpsClient.d.ts.map +1 -0
- package/dist/cjs/client/PerpsClient.js +269 -0
- package/dist/cjs/client/PerpsClient.js.map +1 -0
- package/dist/cjs/client/bindProvider.d.ts +3 -0
- package/dist/cjs/client/bindProvider.d.ts.map +1 -0
- package/dist/cjs/client/bindProvider.js +9 -0
- package/dist/cjs/client/bindProvider.js.map +1 -0
- package/dist/cjs/client/createPerpsClient.d.ts +10 -0
- package/dist/cjs/client/createPerpsClient.d.ts.map +1 -0
- package/dist/cjs/client/createPerpsClient.js +54 -0
- package/dist/cjs/client/createPerpsClient.js.map +1 -0
- package/dist/cjs/client/requireProvider.d.ts +3 -0
- package/dist/cjs/client/requireProvider.d.ts.map +1 -0
- package/dist/cjs/client/requireProvider.js +16 -0
- package/dist/cjs/client/requireProvider.js.map +1 -0
- package/dist/cjs/errors/PerpsError.d.ts +8 -0
- package/dist/cjs/errors/PerpsError.d.ts.map +1 -0
- package/dist/cjs/errors/PerpsError.js +15 -0
- package/dist/cjs/errors/PerpsError.js.map +1 -0
- package/dist/cjs/errors/constants.d.ts +5 -0
- package/dist/cjs/errors/constants.d.ts.map +1 -0
- package/dist/cjs/errors/constants.js +9 -0
- package/dist/cjs/errors/constants.js.map +1 -0
- package/dist/cjs/index.d.ts +78 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +168 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/registry/assetRegistry.d.ts +11 -0
- package/dist/cjs/registry/assetRegistry.d.ts.map +1 -0
- package/dist/cjs/registry/assetRegistry.js +39 -0
- package/dist/cjs/registry/assetRegistry.js.map +1 -0
- package/dist/cjs/registry/marketRegistry.d.ts +13 -0
- package/dist/cjs/registry/marketRegistry.d.ts.map +1 -0
- package/dist/cjs/registry/marketRegistry.js +58 -0
- package/dist/cjs/registry/marketRegistry.js.map +1 -0
- package/dist/cjs/registry/referenceDataRegistry.d.ts +20 -0
- package/dist/cjs/registry/referenceDataRegistry.d.ts.map +1 -0
- package/dist/cjs/registry/referenceDataRegistry.js +59 -0
- package/dist/cjs/registry/referenceDataRegistry.js.map +1 -0
- package/dist/cjs/services/createAction.d.ts +13 -0
- package/dist/cjs/services/createAction.d.ts.map +1 -0
- package/dist/cjs/services/createAction.js +17 -0
- package/dist/cjs/services/createAction.js.map +1 -0
- package/dist/cjs/services/executeAction.d.ts +13 -0
- package/dist/cjs/services/executeAction.d.ts.map +1 -0
- package/dist/cjs/services/executeAction.js +18 -0
- package/dist/cjs/services/executeAction.js.map +1 -0
- package/dist/cjs/services/getAccount.d.ts +10 -0
- package/dist/cjs/services/getAccount.d.ts.map +1 -0
- package/dist/cjs/services/getAccount.js +8 -0
- package/dist/cjs/services/getAccount.js.map +1 -0
- package/dist/cjs/services/getActivity.d.ts +15 -0
- package/dist/cjs/services/getActivity.d.ts.map +1 -0
- package/dist/cjs/services/getActivity.js +15 -0
- package/dist/cjs/services/getActivity.js.map +1 -0
- package/dist/cjs/services/getAssets.d.ts +8 -0
- package/dist/cjs/services/getAssets.d.ts.map +1 -0
- package/dist/cjs/services/getAssets.js +11 -0
- package/dist/cjs/services/getAssets.js.map +1 -0
- package/dist/cjs/services/getFills.d.ts +14 -0
- package/dist/cjs/services/getFills.d.ts.map +1 -0
- package/dist/cjs/services/getFills.js +14 -0
- package/dist/cjs/services/getFills.js.map +1 -0
- package/dist/cjs/services/getMarket.d.ts +9 -0
- package/dist/cjs/services/getMarket.d.ts.map +1 -0
- package/dist/cjs/services/getMarket.js +13 -0
- package/dist/cjs/services/getMarket.js.map +1 -0
- package/dist/cjs/services/getMarkets.d.ts +9 -0
- package/dist/cjs/services/getMarkets.d.ts.map +1 -0
- package/dist/cjs/services/getMarkets.js +12 -0
- package/dist/cjs/services/getMarkets.js.map +1 -0
- package/dist/cjs/services/getMeta.d.ts +5 -0
- package/dist/cjs/services/getMeta.d.ts.map +1 -0
- package/dist/cjs/services/getMeta.js +8 -0
- package/dist/cjs/services/getMeta.js.map +1 -0
- package/dist/cjs/services/getOhlcv.d.ts +13 -0
- package/dist/cjs/services/getOhlcv.d.ts.map +1 -0
- package/dist/cjs/services/getOhlcv.js +16 -0
- package/dist/cjs/services/getOhlcv.js.map +1 -0
- package/dist/cjs/services/getOrder.d.ts +11 -0
- package/dist/cjs/services/getOrder.d.ts.map +1 -0
- package/dist/cjs/services/getOrder.js +8 -0
- package/dist/cjs/services/getOrder.js.map +1 -0
- package/dist/cjs/services/getOrderbook.d.ts +10 -0
- package/dist/cjs/services/getOrderbook.d.ts.map +1 -0
- package/dist/cjs/services/getOrderbook.js +13 -0
- package/dist/cjs/services/getOrderbook.js.map +1 -0
- package/dist/cjs/services/getOrders.d.ts +13 -0
- package/dist/cjs/services/getOrders.d.ts.map +1 -0
- package/dist/cjs/services/getOrders.js +13 -0
- package/dist/cjs/services/getOrders.js.map +1 -0
- package/dist/cjs/services/getPositions.d.ts +13 -0
- package/dist/cjs/services/getPositions.d.ts.map +1 -0
- package/dist/cjs/services/getPositions.js +13 -0
- package/dist/cjs/services/getPositions.js.map +1 -0
- package/dist/cjs/services/getPrices.d.ts +9 -0
- package/dist/cjs/services/getPrices.d.ts.map +1 -0
- package/dist/cjs/services/getPrices.js +12 -0
- package/dist/cjs/services/getPrices.js.map +1 -0
- package/dist/cjs/services/getProviders.d.ts +5 -0
- package/dist/cjs/services/getProviders.d.ts.map +1 -0
- package/dist/cjs/services/getProviders.js +8 -0
- package/dist/cjs/services/getProviders.js.map +1 -0
- package/dist/cjs/services/getQuote.d.ts +12 -0
- package/dist/cjs/services/getQuote.d.ts.map +1 -0
- package/dist/cjs/services/getQuote.js +13 -0
- package/dist/cjs/services/getQuote.js.map +1 -0
- package/dist/cjs/services/getTermsAcceptance.d.ts +6 -0
- package/dist/cjs/services/getTermsAcceptance.d.ts.map +1 -0
- package/dist/cjs/services/getTermsAcceptance.js +9 -0
- package/dist/cjs/services/getTermsAcceptance.js.map +1 -0
- package/dist/cjs/services/resolveQuote.d.ts +6 -0
- package/dist/cjs/services/resolveQuote.d.ts.map +1 -0
- package/dist/cjs/services/resolveQuote.js +36 -0
- package/dist/cjs/services/resolveQuote.js.map +1 -0
- package/dist/cjs/services/resolveSubscribeQuote.d.ts +6 -0
- package/dist/cjs/services/resolveSubscribeQuote.d.ts.map +1 -0
- package/dist/cjs/services/resolveSubscribeQuote.js +63 -0
- package/dist/cjs/services/resolveSubscribeQuote.js.map +1 -0
- package/dist/cjs/storage/parseStoredRecord.d.ts +4 -0
- package/dist/cjs/storage/parseStoredRecord.d.ts.map +1 -0
- package/dist/cjs/storage/parseStoredRecord.js +26 -0
- package/dist/cjs/storage/parseStoredRecord.js.map +1 -0
- package/dist/cjs/storage/storage.d.ts +4 -0
- package/dist/cjs/storage/storage.d.ts.map +1 -0
- package/dist/cjs/storage/storage.js +47 -0
- package/dist/cjs/storage/storage.js.map +1 -0
- package/dist/cjs/storage/types.d.ts +6 -0
- package/dist/cjs/storage/types.d.ts.map +1 -0
- package/dist/cjs/storage/types.js +3 -0
- package/dist/cjs/storage/types.js.map +1 -0
- package/dist/cjs/transport/fetchWithRetry.d.ts +8 -0
- package/dist/cjs/transport/fetchWithRetry.d.ts.map +1 -0
- package/dist/cjs/transport/fetchWithRetry.js +81 -0
- package/dist/cjs/transport/fetchWithRetry.js.map +1 -0
- package/dist/cjs/transport/request.d.ts +8 -0
- package/dist/cjs/transport/request.d.ts.map +1 -0
- package/dist/cjs/transport/request.js +75 -0
- package/dist/cjs/transport/request.js.map +1 -0
- package/dist/cjs/transport/retryPolicy.d.ts +37 -0
- package/dist/cjs/transport/retryPolicy.d.ts.map +1 -0
- package/dist/cjs/transport/retryPolicy.js +79 -0
- package/dist/cjs/transport/retryPolicy.js.map +1 -0
- package/dist/cjs/types/api.d.ts +85 -0
- package/dist/cjs/types/api.d.ts.map +1 -0
- package/dist/cjs/types/api.js +3 -0
- package/dist/cjs/types/api.js.map +1 -0
- package/dist/cjs/types/config.d.ts +26 -0
- package/dist/cjs/types/config.d.ts.map +1 -0
- package/dist/cjs/types/config.js +3 -0
- package/dist/cjs/types/config.js.map +1 -0
- package/dist/cjs/types/provider.d.ts +84 -0
- package/dist/cjs/types/provider.d.ts.map +1 -0
- package/dist/cjs/types/provider.js +3 -0
- package/dist/cjs/types/provider.js.map +1 -0
- package/dist/cjs/utils/accountSummary.d.ts +3 -0
- package/dist/cjs/utils/accountSummary.d.ts.map +1 -0
- package/dist/cjs/utils/accountSummary.js +25 -0
- package/dist/cjs/utils/accountSummary.js.map +1 -0
- package/dist/cjs/utils/assertNever.d.ts +2 -0
- package/dist/cjs/utils/assertNever.d.ts.map +1 -0
- package/dist/cjs/utils/assertNever.js +7 -0
- package/dist/cjs/utils/assertNever.js.map +1 -0
- package/dist/cjs/utils/calculations.d.ts +51 -0
- package/dist/cjs/utils/calculations.d.ts.map +1 -0
- package/dist/cjs/utils/calculations.js +149 -0
- package/dist/cjs/utils/calculations.js.map +1 -0
- package/dist/cjs/utils/depositChain.d.ts +6 -0
- package/dist/cjs/utils/depositChain.d.ts.map +1 -0
- package/dist/cjs/utils/depositChain.js +13 -0
- package/dist/cjs/utils/depositChain.js.map +1 -0
- package/dist/cjs/utils/explorer.d.ts +9 -0
- package/dist/cjs/utils/explorer.d.ts.map +1 -0
- package/dist/cjs/utils/explorer.js +23 -0
- package/dist/cjs/utils/explorer.js.map +1 -0
- package/dist/cjs/utils/fillClassification.d.ts +3 -0
- package/dist/cjs/utils/fillClassification.d.ts.map +1 -0
- package/dist/cjs/utils/fillClassification.js +37 -0
- package/dist/cjs/utils/fillClassification.js.map +1 -0
- package/dist/cjs/utils/format.d.ts +13 -0
- package/dist/cjs/utils/format.d.ts.map +1 -0
- package/dist/cjs/utils/format.js +117 -0
- package/dist/cjs/utils/format.js.map +1 -0
- package/dist/cjs/utils/orderClassification.d.ts +10 -0
- package/dist/cjs/utils/orderClassification.d.ts.map +1 -0
- package/dist/cjs/utils/orderClassification.js +49 -0
- package/dist/cjs/utils/orderClassification.js.map +1 -0
- package/dist/cjs/utils/orderMath.d.ts +6 -0
- package/dist/cjs/utils/orderMath.d.ts.map +1 -0
- package/dist/cjs/utils/orderMath.js +71 -0
- package/dist/cjs/utils/orderMath.js.map +1 -0
- package/dist/cjs/utils/parse.d.ts +2 -0
- package/dist/cjs/utils/parse.d.ts.map +1 -0
- package/dist/cjs/utils/parse.js +14 -0
- package/dist/cjs/utils/parse.js.map +1 -0
- package/dist/cjs/utils/positionMath.d.ts +32 -0
- package/dist/cjs/utils/positionMath.d.ts.map +1 -0
- package/dist/cjs/utils/positionMath.js +52 -0
- package/dist/cjs/utils/positionMath.js.map +1 -0
- package/dist/cjs/utils/signTypedData.d.ts +5 -0
- package/dist/cjs/utils/signTypedData.d.ts.map +1 -0
- package/dist/cjs/utils/signTypedData.js +23 -0
- package/dist/cjs/utils/signTypedData.js.map +1 -0
- package/dist/cjs/utils/sleep.d.ts +2 -0
- package/dist/cjs/utils/sleep.d.ts.map +1 -0
- package/dist/cjs/utils/sleep.js +6 -0
- package/dist/cjs/utils/sleep.js.map +1 -0
- package/dist/cjs/utils/units.d.ts +3 -0
- package/dist/cjs/utils/units.d.ts.map +1 -0
- package/dist/cjs/utils/units.js +18 -0
- package/dist/cjs/utils/units.js.map +1 -0
- package/dist/cjs/utils/validation.d.ts +2 -0
- package/dist/cjs/utils/validation.d.ts.map +1 -0
- package/dist/cjs/utils/validation.js +16 -0
- package/dist/cjs/utils/validation.js.map +1 -0
- package/dist/cjs/version.d.ts +3 -0
- package/dist/cjs/version.d.ts.map +1 -0
- package/dist/cjs/version.js +6 -0
- package/dist/cjs/version.js.map +1 -0
- package/dist/cjs/websocket/PerpsWsClient.d.ts +27 -0
- package/dist/cjs/websocket/PerpsWsClient.d.ts.map +1 -0
- package/dist/cjs/websocket/PerpsWsClient.js +84 -0
- package/dist/cjs/websocket/PerpsWsClient.js.map +1 -0
- package/dist/cjs/websocket/ReconnectingWebSocket.d.ts +52 -0
- package/dist/cjs/websocket/ReconnectingWebSocket.d.ts.map +1 -0
- package/dist/cjs/websocket/ReconnectingWebSocket.js +213 -0
- package/dist/cjs/websocket/ReconnectingWebSocket.js.map +1 -0
- package/dist/cjs/websocket/WsProviderBase.d.ts +31 -0
- package/dist/cjs/websocket/WsProviderBase.d.ts.map +1 -0
- package/dist/cjs/websocket/WsProviderBase.js +197 -0
- package/dist/cjs/websocket/WsProviderBase.js.map +1 -0
- package/dist/cjs/websocket/cachePromise.d.ts +2 -0
- package/dist/cjs/websocket/cachePromise.d.ts.map +1 -0
- package/dist/cjs/websocket/cachePromise.js +18 -0
- package/dist/cjs/websocket/cachePromise.js.map +1 -0
- package/dist/cjs/websocket/types.d.ts +15 -0
- package/dist/cjs/websocket/types.d.ts.map +1 -0
- package/dist/cjs/websocket/types.js +3 -0
- package/dist/cjs/websocket/types.js.map +1 -0
- package/dist/cjs/websocket/wsLog.d.ts +10 -0
- package/dist/cjs/websocket/wsLog.d.ts.map +1 -0
- package/dist/cjs/websocket/wsLog.js +31 -0
- package/dist/cjs/websocket/wsLog.js.map +1 -0
- package/dist/esm/client/PerpsClient.d.ts +285 -0
- package/dist/esm/client/PerpsClient.d.ts.map +1 -0
- package/dist/esm/client/PerpsClient.js +498 -0
- package/dist/esm/client/PerpsClient.js.map +1 -0
- package/dist/esm/client/bindProvider.d.ts +13 -0
- package/dist/esm/client/bindProvider.d.ts.map +1 -0
- package/dist/esm/client/bindProvider.js +16 -0
- package/dist/esm/client/bindProvider.js.map +1 -0
- package/dist/esm/client/createPerpsClient.d.ts +37 -0
- package/dist/esm/client/createPerpsClient.d.ts.map +1 -0
- package/dist/esm/client/createPerpsClient.js +76 -0
- package/dist/esm/client/createPerpsClient.js.map +1 -0
- package/dist/esm/client/requireProvider.d.ts +12 -0
- package/dist/esm/client/requireProvider.d.ts.map +1 -0
- package/dist/esm/client/requireProvider.js +22 -0
- package/dist/esm/client/requireProvider.js.map +1 -0
- package/dist/esm/errors/PerpsError.d.ts +16 -0
- package/dist/esm/errors/PerpsError.d.ts.map +1 -0
- package/dist/esm/errors/PerpsError.js +19 -0
- package/dist/esm/errors/PerpsError.js.map +1 -0
- package/dist/esm/errors/constants.d.ts +11 -0
- package/dist/esm/errors/constants.d.ts.map +1 -0
- package/dist/esm/errors/constants.js +12 -0
- package/dist/esm/errors/constants.js.map +1 -0
- package/dist/esm/index.d.ts +86 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +63 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/registry/assetRegistry.d.ts +25 -0
- package/dist/esm/registry/assetRegistry.d.ts.map +1 -0
- package/dist/esm/registry/assetRegistry.js +48 -0
- package/dist/esm/registry/assetRegistry.js.map +1 -0
- package/dist/esm/registry/marketRegistry.d.ts +42 -0
- package/dist/esm/registry/marketRegistry.d.ts.map +1 -0
- package/dist/esm/registry/marketRegistry.js +81 -0
- package/dist/esm/registry/marketRegistry.js.map +1 -0
- package/dist/esm/registry/referenceDataRegistry.d.ts +44 -0
- package/dist/esm/registry/referenceDataRegistry.d.ts.map +1 -0
- package/dist/esm/registry/referenceDataRegistry.js +79 -0
- package/dist/esm/registry/referenceDataRegistry.js.map +1 -0
- package/dist/esm/services/createAction.d.ts +26 -0
- package/dist/esm/services/createAction.d.ts.map +1 -0
- package/dist/esm/services/createAction.js +22 -0
- package/dist/esm/services/createAction.js.map +1 -0
- package/dist/esm/services/executeAction.d.ts +26 -0
- package/dist/esm/services/executeAction.d.ts.map +1 -0
- package/dist/esm/services/executeAction.js +26 -0
- package/dist/esm/services/executeAction.js.map +1 -0
- package/dist/esm/services/getAccount.d.ts +35 -0
- package/dist/esm/services/getAccount.d.ts.map +1 -0
- package/dist/esm/services/getAccount.js +25 -0
- package/dist/esm/services/getAccount.js.map +1 -0
- package/dist/esm/services/getActivity.d.ts +39 -0
- package/dist/esm/services/getActivity.d.ts.map +1 -0
- package/dist/esm/services/getActivity.js +29 -0
- package/dist/esm/services/getActivity.js.map +1 -0
- package/dist/esm/services/getAssets.d.ts +27 -0
- package/dist/esm/services/getAssets.d.ts.map +1 -0
- package/dist/esm/services/getAssets.js +22 -0
- package/dist/esm/services/getAssets.js.map +1 -0
- package/dist/esm/services/getFills.d.ts +38 -0
- package/dist/esm/services/getFills.d.ts.map +1 -0
- package/dist/esm/services/getFills.js +28 -0
- package/dist/esm/services/getFills.js.map +1 -0
- package/dist/esm/services/getMarket.d.ts +34 -0
- package/dist/esm/services/getMarket.d.ts.map +1 -0
- package/dist/esm/services/getMarket.js +25 -0
- package/dist/esm/services/getMarket.js.map +1 -0
- package/dist/esm/services/getMarkets.d.ts +28 -0
- package/dist/esm/services/getMarkets.d.ts.map +1 -0
- package/dist/esm/services/getMarkets.js +22 -0
- package/dist/esm/services/getMarkets.js.map +1 -0
- package/dist/esm/services/getMeta.d.ts +21 -0
- package/dist/esm/services/getMeta.d.ts.map +1 -0
- package/dist/esm/services/getMeta.js +21 -0
- package/dist/esm/services/getMeta.js.map +1 -0
- package/dist/esm/services/getOhlcv.d.ts +36 -0
- package/dist/esm/services/getOhlcv.d.ts.map +1 -0
- package/dist/esm/services/getOhlcv.js +28 -0
- package/dist/esm/services/getOhlcv.js.map +1 -0
- package/dist/esm/services/getOrder.d.ts +33 -0
- package/dist/esm/services/getOrder.d.ts.map +1 -0
- package/dist/esm/services/getOrder.js +22 -0
- package/dist/esm/services/getOrder.js.map +1 -0
- package/dist/esm/services/getOrderbook.d.ts +24 -0
- package/dist/esm/services/getOrderbook.d.ts.map +1 -0
- package/dist/esm/services/getOrderbook.js +17 -0
- package/dist/esm/services/getOrderbook.js.map +1 -0
- package/dist/esm/services/getOrders.d.ts +35 -0
- package/dist/esm/services/getOrders.d.ts.map +1 -0
- package/dist/esm/services/getOrders.js +26 -0
- package/dist/esm/services/getOrders.js.map +1 -0
- package/dist/esm/services/getPositions.d.ts +35 -0
- package/dist/esm/services/getPositions.d.ts.map +1 -0
- package/dist/esm/services/getPositions.js +26 -0
- package/dist/esm/services/getPositions.js.map +1 -0
- package/dist/esm/services/getPrices.d.ts +21 -0
- package/dist/esm/services/getPrices.d.ts.map +1 -0
- package/dist/esm/services/getPrices.js +15 -0
- package/dist/esm/services/getPrices.js.map +1 -0
- package/dist/esm/services/getProviders.d.ts +22 -0
- package/dist/esm/services/getProviders.d.ts.map +1 -0
- package/dist/esm/services/getProviders.js +22 -0
- package/dist/esm/services/getProviders.js.map +1 -0
- package/dist/esm/services/getQuote.d.ts +42 -0
- package/dist/esm/services/getQuote.d.ts.map +1 -0
- package/dist/esm/services/getQuote.js +33 -0
- package/dist/esm/services/getQuote.js.map +1 -0
- package/dist/esm/services/getTermsAcceptance.d.ts +26 -0
- package/dist/esm/services/getTermsAcceptance.d.ts.map +1 -0
- package/dist/esm/services/getTermsAcceptance.js +26 -0
- package/dist/esm/services/getTermsAcceptance.js.map +1 -0
- package/dist/esm/services/resolveQuote.d.ts +26 -0
- package/dist/esm/services/resolveQuote.d.ts.map +1 -0
- package/dist/esm/services/resolveQuote.js +52 -0
- package/dist/esm/services/resolveQuote.js.map +1 -0
- package/dist/esm/services/resolveSubscribeQuote.d.ts +31 -0
- package/dist/esm/services/resolveSubscribeQuote.d.ts.map +1 -0
- package/dist/esm/services/resolveSubscribeQuote.js +84 -0
- package/dist/esm/services/resolveSubscribeQuote.js.map +1 -0
- package/dist/esm/storage/parseStoredRecord.d.ts +29 -0
- package/dist/esm/storage/parseStoredRecord.d.ts.map +1 -0
- package/dist/esm/storage/parseStoredRecord.js +47 -0
- package/dist/esm/storage/parseStoredRecord.js.map +1 -0
- package/dist/esm/storage/storage.d.ts +15 -0
- package/dist/esm/storage/storage.d.ts.map +1 -0
- package/dist/esm/storage/storage.js +56 -0
- package/dist/esm/storage/storage.js.map +1 -0
- package/dist/esm/storage/types.d.ts +14 -0
- package/dist/esm/storage/types.d.ts.map +1 -0
- package/dist/esm/storage/types.js +2 -0
- package/dist/esm/storage/types.js.map +1 -0
- package/dist/esm/transport/fetchWithRetry.d.ts +22 -0
- package/dist/esm/transport/fetchWithRetry.d.ts.map +1 -0
- package/dist/esm/transport/fetchWithRetry.js +87 -0
- package/dist/esm/transport/fetchWithRetry.js.map +1 -0
- package/dist/esm/transport/request.d.ts +25 -0
- package/dist/esm/transport/request.d.ts.map +1 -0
- package/dist/esm/transport/request.js +82 -0
- package/dist/esm/transport/request.js.map +1 -0
- package/dist/esm/transport/retryPolicy.d.ts +106 -0
- package/dist/esm/transport/retryPolicy.d.ts.map +1 -0
- package/dist/esm/transport/retryPolicy.js +99 -0
- package/dist/esm/transport/retryPolicy.js.map +1 -0
- package/dist/esm/types/api.d.ts +214 -0
- package/dist/esm/types/api.d.ts.map +1 -0
- package/dist/esm/types/api.js +2 -0
- package/dist/esm/types/api.js.map +1 -0
- package/dist/esm/types/config.d.ts +70 -0
- package/dist/esm/types/config.d.ts.map +1 -0
- package/dist/esm/types/config.js +2 -0
- package/dist/esm/types/config.js.map +1 -0
- package/dist/esm/types/provider.d.ts +330 -0
- package/dist/esm/types/provider.d.ts.map +1 -0
- package/dist/esm/types/provider.js +2 -0
- package/dist/esm/types/provider.js.map +1 -0
- package/dist/esm/utils/accountSummary.d.ts +13 -0
- package/dist/esm/utils/accountSummary.d.ts.map +1 -0
- package/dist/esm/utils/accountSummary.js +32 -0
- package/dist/esm/utils/accountSummary.js.map +1 -0
- package/dist/esm/utils/assertNever.d.ts +20 -0
- package/dist/esm/utils/assertNever.d.ts.map +1 -0
- package/dist/esm/utils/assertNever.js +22 -0
- package/dist/esm/utils/assertNever.js.map +1 -0
- package/dist/esm/utils/calculations.d.ts +223 -0
- package/dist/esm/utils/calculations.d.ts.map +1 -0
- package/dist/esm/utils/calculations.js +291 -0
- package/dist/esm/utils/calculations.js.map +1 -0
- package/dist/esm/utils/depositChain.d.ts +25 -0
- package/dist/esm/utils/depositChain.d.ts.map +1 -0
- package/dist/esm/utils/depositChain.js +23 -0
- package/dist/esm/utils/depositChain.js.map +1 -0
- package/dist/esm/utils/explorer.d.ts +33 -0
- package/dist/esm/utils/explorer.d.ts.map +1 -0
- package/dist/esm/utils/explorer.js +38 -0
- package/dist/esm/utils/explorer.js.map +1 -0
- package/dist/esm/utils/fillClassification.d.ts +13 -0
- package/dist/esm/utils/fillClassification.d.ts.map +1 -0
- package/dist/esm/utils/fillClassification.js +44 -0
- package/dist/esm/utils/fillClassification.js.map +1 -0
- package/dist/esm/utils/format.d.ts +66 -0
- package/dist/esm/utils/format.d.ts.map +1 -0
- package/dist/esm/utils/format.js +171 -0
- package/dist/esm/utils/format.js.map +1 -0
- package/dist/esm/utils/orderClassification.d.ts +47 -0
- package/dist/esm/utils/orderClassification.d.ts.map +1 -0
- package/dist/esm/utils/orderClassification.js +78 -0
- package/dist/esm/utils/orderClassification.js.map +1 -0
- package/dist/esm/utils/orderMath.d.ts +44 -0
- package/dist/esm/utils/orderMath.d.ts.map +1 -0
- package/dist/esm/utils/orderMath.js +103 -0
- package/dist/esm/utils/orderMath.js.map +1 -0
- package/dist/esm/utils/parse.d.ts +22 -0
- package/dist/esm/utils/parse.d.ts.map +1 -0
- package/dist/esm/utils/parse.js +31 -0
- package/dist/esm/utils/parse.js.map +1 -0
- package/dist/esm/utils/positionMath.d.ts +107 -0
- package/dist/esm/utils/positionMath.d.ts.map +1 -0
- package/dist/esm/utils/positionMath.js +119 -0
- package/dist/esm/utils/positionMath.js.map +1 -0
- package/dist/esm/utils/signTypedData.d.ts +18 -0
- package/dist/esm/utils/signTypedData.d.ts.map +1 -0
- package/dist/esm/utils/signTypedData.js +32 -0
- package/dist/esm/utils/signTypedData.js.map +1 -0
- package/dist/esm/utils/sleep.d.ts +7 -0
- package/dist/esm/utils/sleep.d.ts.map +1 -0
- package/dist/esm/utils/sleep.js +7 -0
- package/dist/esm/utils/sleep.js.map +1 -0
- package/dist/esm/utils/units.d.ts +27 -0
- package/dist/esm/utils/units.d.ts.map +1 -0
- package/dist/esm/utils/units.js +38 -0
- package/dist/esm/utils/units.js.map +1 -0
- package/dist/esm/utils/validation.d.ts +18 -0
- package/dist/esm/utils/validation.d.ts.map +1 -0
- package/dist/esm/utils/validation.js +29 -0
- package/dist/esm/utils/validation.js.map +1 -0
- package/dist/esm/version.d.ts +3 -0
- package/dist/esm/version.d.ts.map +1 -0
- package/dist/esm/version.js +3 -0
- package/dist/esm/version.js.map +1 -0
- package/dist/esm/websocket/PerpsWsClient.d.ts +100 -0
- package/dist/esm/websocket/PerpsWsClient.d.ts.map +1 -0
- package/dist/esm/websocket/PerpsWsClient.js +121 -0
- package/dist/esm/websocket/PerpsWsClient.js.map +1 -0
- package/dist/esm/websocket/ReconnectingWebSocket.d.ts +130 -0
- package/dist/esm/websocket/ReconnectingWebSocket.d.ts.map +1 -0
- package/dist/esm/websocket/ReconnectingWebSocket.js +288 -0
- package/dist/esm/websocket/ReconnectingWebSocket.js.map +1 -0
- package/dist/esm/websocket/WsProviderBase.d.ts +89 -0
- package/dist/esm/websocket/WsProviderBase.d.ts.map +1 -0
- package/dist/esm/websocket/WsProviderBase.js +246 -0
- package/dist/esm/websocket/WsProviderBase.js.map +1 -0
- package/dist/esm/websocket/cachePromise.d.ts +14 -0
- package/dist/esm/websocket/cachePromise.d.ts.map +1 -0
- package/dist/esm/websocket/cachePromise.js +27 -0
- package/dist/esm/websocket/cachePromise.js.map +1 -0
- package/dist/esm/websocket/types.d.ts +60 -0
- package/dist/esm/websocket/types.d.ts.map +1 -0
- package/dist/esm/websocket/types.js +2 -0
- package/dist/esm/websocket/types.js.map +1 -0
- package/dist/esm/websocket/wsLog.d.ts +50 -0
- package/dist/esm/websocket/wsLog.d.ts.map +1 -0
- package/dist/esm/websocket/wsLog.js +68 -0
- package/dist/esm/websocket/wsLog.js.map +1 -0
- package/dist/types/client/PerpsClient.d.ts +285 -0
- package/dist/types/client/PerpsClient.d.ts.map +1 -0
- package/dist/types/client/bindProvider.d.ts +13 -0
- package/dist/types/client/bindProvider.d.ts.map +1 -0
- package/dist/types/client/createPerpsClient.d.ts +37 -0
- package/dist/types/client/createPerpsClient.d.ts.map +1 -0
- package/dist/types/client/requireProvider.d.ts +12 -0
- package/dist/types/client/requireProvider.d.ts.map +1 -0
- package/dist/types/errors/PerpsError.d.ts +16 -0
- package/dist/types/errors/PerpsError.d.ts.map +1 -0
- package/dist/types/errors/constants.d.ts +11 -0
- package/dist/types/errors/constants.d.ts.map +1 -0
- package/dist/types/index.d.ts +86 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/registry/assetRegistry.d.ts +25 -0
- package/dist/types/registry/assetRegistry.d.ts.map +1 -0
- package/dist/types/registry/marketRegistry.d.ts +42 -0
- package/dist/types/registry/marketRegistry.d.ts.map +1 -0
- package/dist/types/registry/referenceDataRegistry.d.ts +44 -0
- package/dist/types/registry/referenceDataRegistry.d.ts.map +1 -0
- package/dist/types/services/createAction.d.ts +26 -0
- package/dist/types/services/createAction.d.ts.map +1 -0
- package/dist/types/services/executeAction.d.ts +26 -0
- package/dist/types/services/executeAction.d.ts.map +1 -0
- package/dist/types/services/getAccount.d.ts +35 -0
- package/dist/types/services/getAccount.d.ts.map +1 -0
- package/dist/types/services/getActivity.d.ts +39 -0
- package/dist/types/services/getActivity.d.ts.map +1 -0
- package/dist/types/services/getAssets.d.ts +27 -0
- package/dist/types/services/getAssets.d.ts.map +1 -0
- package/dist/types/services/getFills.d.ts +38 -0
- package/dist/types/services/getFills.d.ts.map +1 -0
- package/dist/types/services/getMarket.d.ts +34 -0
- package/dist/types/services/getMarket.d.ts.map +1 -0
- package/dist/types/services/getMarkets.d.ts +28 -0
- package/dist/types/services/getMarkets.d.ts.map +1 -0
- package/dist/types/services/getMeta.d.ts +21 -0
- package/dist/types/services/getMeta.d.ts.map +1 -0
- package/dist/types/services/getOhlcv.d.ts +36 -0
- package/dist/types/services/getOhlcv.d.ts.map +1 -0
- package/dist/types/services/getOrder.d.ts +33 -0
- package/dist/types/services/getOrder.d.ts.map +1 -0
- package/dist/types/services/getOrderbook.d.ts +24 -0
- package/dist/types/services/getOrderbook.d.ts.map +1 -0
- package/dist/types/services/getOrders.d.ts +35 -0
- package/dist/types/services/getOrders.d.ts.map +1 -0
- package/dist/types/services/getPositions.d.ts +35 -0
- package/dist/types/services/getPositions.d.ts.map +1 -0
- package/dist/types/services/getPrices.d.ts +21 -0
- package/dist/types/services/getPrices.d.ts.map +1 -0
- package/dist/types/services/getProviders.d.ts +22 -0
- package/dist/types/services/getProviders.d.ts.map +1 -0
- package/dist/types/services/getQuote.d.ts +42 -0
- package/dist/types/services/getQuote.d.ts.map +1 -0
- package/dist/types/services/getTermsAcceptance.d.ts +26 -0
- package/dist/types/services/getTermsAcceptance.d.ts.map +1 -0
- package/dist/types/services/resolveQuote.d.ts +26 -0
- package/dist/types/services/resolveQuote.d.ts.map +1 -0
- package/dist/types/services/resolveSubscribeQuote.d.ts +31 -0
- package/dist/types/services/resolveSubscribeQuote.d.ts.map +1 -0
- package/dist/types/storage/parseStoredRecord.d.ts +29 -0
- package/dist/types/storage/parseStoredRecord.d.ts.map +1 -0
- package/dist/types/storage/storage.d.ts +15 -0
- package/dist/types/storage/storage.d.ts.map +1 -0
- package/dist/types/storage/types.d.ts +14 -0
- package/dist/types/storage/types.d.ts.map +1 -0
- package/dist/types/transport/fetchWithRetry.d.ts +22 -0
- package/dist/types/transport/fetchWithRetry.d.ts.map +1 -0
- package/dist/types/transport/request.d.ts +25 -0
- package/dist/types/transport/request.d.ts.map +1 -0
- package/dist/types/transport/retryPolicy.d.ts +106 -0
- package/dist/types/transport/retryPolicy.d.ts.map +1 -0
- package/dist/types/types/api.d.ts +214 -0
- package/dist/types/types/api.d.ts.map +1 -0
- package/dist/types/types/config.d.ts +70 -0
- package/dist/types/types/config.d.ts.map +1 -0
- package/dist/types/types/provider.d.ts +330 -0
- package/dist/types/types/provider.d.ts.map +1 -0
- package/dist/types/utils/accountSummary.d.ts +13 -0
- package/dist/types/utils/accountSummary.d.ts.map +1 -0
- package/dist/types/utils/assertNever.d.ts +20 -0
- package/dist/types/utils/assertNever.d.ts.map +1 -0
- package/dist/types/utils/calculations.d.ts +223 -0
- package/dist/types/utils/calculations.d.ts.map +1 -0
- package/dist/types/utils/depositChain.d.ts +25 -0
- package/dist/types/utils/depositChain.d.ts.map +1 -0
- package/dist/types/utils/explorer.d.ts +33 -0
- package/dist/types/utils/explorer.d.ts.map +1 -0
- package/dist/types/utils/fillClassification.d.ts +13 -0
- package/dist/types/utils/fillClassification.d.ts.map +1 -0
- package/dist/types/utils/format.d.ts +66 -0
- package/dist/types/utils/format.d.ts.map +1 -0
- package/dist/types/utils/orderClassification.d.ts +47 -0
- package/dist/types/utils/orderClassification.d.ts.map +1 -0
- package/dist/types/utils/orderMath.d.ts +44 -0
- package/dist/types/utils/orderMath.d.ts.map +1 -0
- package/dist/types/utils/parse.d.ts +22 -0
- package/dist/types/utils/parse.d.ts.map +1 -0
- package/dist/types/utils/positionMath.d.ts +107 -0
- package/dist/types/utils/positionMath.d.ts.map +1 -0
- package/dist/types/utils/signTypedData.d.ts +18 -0
- package/dist/types/utils/signTypedData.d.ts.map +1 -0
- package/dist/types/utils/sleep.d.ts +7 -0
- package/dist/types/utils/sleep.d.ts.map +1 -0
- package/dist/types/utils/units.d.ts +27 -0
- package/dist/types/utils/units.d.ts.map +1 -0
- package/dist/types/utils/validation.d.ts +18 -0
- package/dist/types/utils/validation.d.ts.map +1 -0
- package/dist/types/version.d.ts +3 -0
- package/dist/types/version.d.ts.map +1 -0
- package/dist/types/websocket/PerpsWsClient.d.ts +100 -0
- package/dist/types/websocket/PerpsWsClient.d.ts.map +1 -0
- package/dist/types/websocket/ReconnectingWebSocket.d.ts +130 -0
- package/dist/types/websocket/ReconnectingWebSocket.d.ts.map +1 -0
- package/dist/types/websocket/WsProviderBase.d.ts +89 -0
- package/dist/types/websocket/WsProviderBase.d.ts.map +1 -0
- package/dist/types/websocket/cachePromise.d.ts +14 -0
- package/dist/types/websocket/cachePromise.d.ts.map +1 -0
- package/dist/types/websocket/types.d.ts +60 -0
- package/dist/types/websocket/types.d.ts.map +1 -0
- package/dist/types/websocket/wsLog.d.ts +50 -0
- package/dist/types/websocket/wsLog.d.ts.map +1 -0
- package/package.json +63 -0
- package/src/client/PerpsClient.ts +686 -0
- package/src/client/bindProvider.ts +24 -0
- package/src/client/createPerpsClient.ts +100 -0
- package/src/client/requireProvider.ts +29 -0
- package/src/errors/PerpsError.ts +23 -0
- package/src/errors/constants.ts +10 -0
- package/src/index.ts +215 -0
- package/src/registry/assetRegistry.ts +62 -0
- package/src/registry/marketRegistry.ts +100 -0
- package/src/registry/referenceDataRegistry.ts +95 -0
- package/src/services/createAction.ts +52 -0
- package/src/services/executeAction.ts +56 -0
- package/src/services/getAccount.ts +46 -0
- package/src/services/getActivity.ts +57 -0
- package/src/services/getAssets.ts +38 -0
- package/src/services/getFills.ts +55 -0
- package/src/services/getMarket.ts +52 -0
- package/src/services/getMarkets.ts +40 -0
- package/src/services/getMeta.ts +32 -0
- package/src/services/getOhlcv.ts +52 -0
- package/src/services/getOrder.ts +44 -0
- package/src/services/getOrderbook.ts +37 -0
- package/src/services/getOrders.ts +51 -0
- package/src/services/getPositions.ts +51 -0
- package/src/services/getPrices.ts +33 -0
- package/src/services/getProviders.ts +33 -0
- package/src/services/getQuote.ts +58 -0
- package/src/services/getTermsAcceptance.ts +34 -0
- package/src/services/resolveQuote.ts +90 -0
- package/src/services/resolveSubscribeQuote.ts +107 -0
- package/src/storage/parseStoredRecord.ts +55 -0
- package/src/storage/storage.ts +60 -0
- package/src/storage/types.ts +13 -0
- package/src/transport/fetchWithRetry.ts +116 -0
- package/src/transport/request.ts +123 -0
- package/src/transport/retryPolicy.ts +202 -0
- package/src/types/api.ts +239 -0
- package/src/types/config.ts +79 -0
- package/src/types/provider.ts +429 -0
- package/src/utils/accountSummary.ts +46 -0
- package/src/utils/assertNever.ts +23 -0
- package/src/utils/calculations.ts +407 -0
- package/src/utils/depositChain.ts +37 -0
- package/src/utils/explorer.ts +51 -0
- package/src/utils/fillClassification.ts +51 -0
- package/src/utils/format.ts +212 -0
- package/src/utils/orderClassification.ts +96 -0
- package/src/utils/orderMath.ts +134 -0
- package/src/utils/parse.ts +30 -0
- package/src/utils/positionMath.ts +149 -0
- package/src/utils/signTypedData.ts +41 -0
- package/src/utils/sleep.ts +7 -0
- package/src/utils/units.ts +39 -0
- package/src/utils/validation.ts +38 -0
- package/src/version.ts +2 -0
- package/src/websocket/PerpsWsClient.ts +204 -0
- package/src/websocket/ReconnectingWebSocket.ts +353 -0
- package/src/websocket/WsProviderBase.ts +333 -0
- package/src/websocket/cachePromise.ts +30 -0
- package/src/websocket/types.ts +75 -0
- package/src/websocket/wsLog.ts +82 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Quote, QuoteSide, TradeType } from '@lifi/perps-types'
|
|
2
|
+
import { requireProvider } from '../client/requireProvider.js'
|
|
3
|
+
import type { SDKRequestOptions } from '../types/config.js'
|
|
4
|
+
import type { PerpsSDKClient } from '../types/provider.js'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Parameters for {@link getQuote}.
|
|
8
|
+
*
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
export interface GetQuoteParams {
|
|
12
|
+
provider: string
|
|
13
|
+
/** Human `displaySymbol`, e.g. `"BTC"`. */
|
|
14
|
+
symbol: string
|
|
15
|
+
side: QuoteSide
|
|
16
|
+
/** USD notional to fill. */
|
|
17
|
+
size: number
|
|
18
|
+
type: TradeType
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Get a one-shot fill quote for `size` USD notional of `symbol` on a single
|
|
23
|
+
* venue: VWAP expected fill, price impact (bps), base-tier taker fee, and
|
|
24
|
+
* funding (perps only). Delegates to the registered venue plugin, which
|
|
25
|
+
* resolves the symbol against its own markets (scoped by `type`) and walks its
|
|
26
|
+
* orderbook. Cross-venue comparison is a consumer-side loop over
|
|
27
|
+
* `client.providers`.
|
|
28
|
+
*
|
|
29
|
+
* @throws {PerpsError} When the provider plugin is not registered, no market
|
|
30
|
+
* matches the symbol+type, or on network / parsing errors.
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* const quote = await getQuote(client, {
|
|
34
|
+
* provider: 'hyperliquid',
|
|
35
|
+
* symbol: 'BTC',
|
|
36
|
+
* side: 'buy',
|
|
37
|
+
* size: 10_000,
|
|
38
|
+
* type: 'perps',
|
|
39
|
+
* })
|
|
40
|
+
* console.log(quote.expectedFillPrice, quote.priceImpactBps)
|
|
41
|
+
* ```
|
|
42
|
+
* @public
|
|
43
|
+
*/
|
|
44
|
+
export async function getQuote(
|
|
45
|
+
client: PerpsSDKClient,
|
|
46
|
+
params: GetQuoteParams,
|
|
47
|
+
options?: SDKRequestOptions
|
|
48
|
+
): Promise<Quote> {
|
|
49
|
+
return requireProvider(client, params.provider).getQuote(
|
|
50
|
+
{
|
|
51
|
+
symbol: params.symbol,
|
|
52
|
+
side: params.side,
|
|
53
|
+
size: params.size,
|
|
54
|
+
type: params.type,
|
|
55
|
+
},
|
|
56
|
+
options
|
|
57
|
+
)
|
|
58
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { TermsAcceptanceStatus } from '@lifi/perps-types'
|
|
2
|
+
import type { Address } from 'viem'
|
|
3
|
+
import { buildUrl, request } from '../transport/request.js'
|
|
4
|
+
import type { SDKRequestOptions } from '../types/config.js'
|
|
5
|
+
import type { PerpsSDKClient } from '../types/provider.js'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Get the current Terms of Service (version + full content) and whether the
|
|
9
|
+
* given address has accepted them. Provider-independent — reads from the
|
|
10
|
+
* platform `meta` surface, not a venue plugin.
|
|
11
|
+
*
|
|
12
|
+
* @param client - The SDK client instance
|
|
13
|
+
* @param address - Address whose acceptance status to resolve
|
|
14
|
+
* @param options - Request options (e.g., AbortSignal)
|
|
15
|
+
* @throws {PerpsError} On backend error responses, network, or parsing errors.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const client = createPerpsClient({ integrator: 'my-app' })
|
|
20
|
+
* const terms = await getTermsAcceptance(client, '0x1234...')
|
|
21
|
+
* if (!terms.accepted) {
|
|
22
|
+
* // prompt the user to accept terms.content (version terms.termsVersion)
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
* @public
|
|
26
|
+
*/
|
|
27
|
+
export async function getTermsAcceptance(
|
|
28
|
+
client: PerpsSDKClient,
|
|
29
|
+
address: Address,
|
|
30
|
+
options?: SDKRequestOptions
|
|
31
|
+
): Promise<TermsAcceptanceStatus> {
|
|
32
|
+
const url = buildUrl(`${client.config.apiUrl}/meta/terms`, { address })
|
|
33
|
+
return request<TermsAcceptanceStatus>(client.config, url, {}, options)
|
|
34
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type FeeTier,
|
|
3
|
+
type Market,
|
|
4
|
+
PerpsErrorCode,
|
|
5
|
+
type Quote,
|
|
6
|
+
} from '@lifi/perps-types'
|
|
7
|
+
import { PerpsError } from '../errors/PerpsError.js'
|
|
8
|
+
import type { SDKRequestOptions } from '../types/config.js'
|
|
9
|
+
import type {
|
|
10
|
+
PerpsSDKClient,
|
|
11
|
+
ProviderGetQuoteParams,
|
|
12
|
+
} from '../types/provider.js'
|
|
13
|
+
import { buildQuote } from '../utils/calculations.js'
|
|
14
|
+
import { getMarkets } from './getMarkets.js'
|
|
15
|
+
import { getOrderbook } from './getOrderbook.js'
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Shared provider-side `getQuote` implementation: resolve `params.symbol` to a
|
|
19
|
+
* market on `provider` (matching `baseAsset.displaySymbol`, scoped by
|
|
20
|
+
* `params.type`), fetch the orderbook snapshot, and build the {@link Quote}
|
|
21
|
+
* with the provider's public base `feeTier`. Both venue plugins delegate here
|
|
22
|
+
* so symbol resolution and the book walk live in one place; each plugin only
|
|
23
|
+
* supplies its own base tier.
|
|
24
|
+
*
|
|
25
|
+
* @throws {PerpsError} `MarketNotFound` when no market matches symbol+type.
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
export async function resolveQuote(
|
|
29
|
+
client: PerpsSDKClient,
|
|
30
|
+
provider: string,
|
|
31
|
+
params: ProviderGetQuoteParams,
|
|
32
|
+
feeTier: FeeTier,
|
|
33
|
+
options?: SDKRequestOptions
|
|
34
|
+
): Promise<Quote> {
|
|
35
|
+
const market = await resolveQuoteMarket(client, provider, params, options)
|
|
36
|
+
|
|
37
|
+
const { bids, asks } = await getOrderbook(
|
|
38
|
+
client,
|
|
39
|
+
{ provider, marketId: market.id },
|
|
40
|
+
options
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
return buildQuote({
|
|
44
|
+
provider,
|
|
45
|
+
symbol: params.symbol,
|
|
46
|
+
type: params.type,
|
|
47
|
+
side: params.side,
|
|
48
|
+
sizeUsd: params.size,
|
|
49
|
+
market,
|
|
50
|
+
bids,
|
|
51
|
+
asks,
|
|
52
|
+
feeTier,
|
|
53
|
+
timestamp: Date.now(),
|
|
54
|
+
})
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Resolve `params.symbol` to a market on `provider` (matching
|
|
59
|
+
* `baseAsset.displaySymbol`, scoped by `params.type`). Shared by the one-shot
|
|
60
|
+
* {@link resolveQuote} and the streaming quote subscription so both quote the
|
|
61
|
+
* same market for a given symbol+type.
|
|
62
|
+
*
|
|
63
|
+
* @throws {PerpsError} `MarketNotFound` when no market matches symbol+type.
|
|
64
|
+
* @internal
|
|
65
|
+
*/
|
|
66
|
+
export async function resolveQuoteMarket(
|
|
67
|
+
client: PerpsSDKClient,
|
|
68
|
+
provider: string,
|
|
69
|
+
params: Pick<ProviderGetQuoteParams, 'symbol' | 'type'>,
|
|
70
|
+
options?: SDKRequestOptions
|
|
71
|
+
): Promise<Market> {
|
|
72
|
+
const { markets } = await getMarkets(client, { provider }, options)
|
|
73
|
+
const market = markets.find(
|
|
74
|
+
(m) =>
|
|
75
|
+
m.baseAsset.displaySymbol === params.symbol &&
|
|
76
|
+
isMarketOfType(m, params.type)
|
|
77
|
+
)
|
|
78
|
+
if (market === undefined) {
|
|
79
|
+
throw new PerpsError(
|
|
80
|
+
PerpsErrorCode.MarketNotFound,
|
|
81
|
+
`No ${params.type} market found on '${provider}' for symbol '${params.symbol}'.`
|
|
82
|
+
)
|
|
83
|
+
}
|
|
84
|
+
return market
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const isMarketOfType = (
|
|
88
|
+
market: Market,
|
|
89
|
+
type: ProviderGetQuoteParams['type']
|
|
90
|
+
): boolean => ('funding' in market ? type === 'perps' : type === 'spot')
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { FeeTier, OrderbookResponse } from '@lifi/perps-types'
|
|
2
|
+
import type {
|
|
3
|
+
PerpsSDKClient,
|
|
4
|
+
ProviderGetQuoteParams,
|
|
5
|
+
QuoteListener,
|
|
6
|
+
} from '../types/provider.js'
|
|
7
|
+
import { buildQuote } from '../utils/calculations.js'
|
|
8
|
+
import type { WsProvider } from '../websocket/types.js'
|
|
9
|
+
import { resolveQuoteMarket } from './resolveQuote.js'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Minimum gap between successive streamed {@link Quote} emissions — the same
|
|
13
|
+
* 100 ms pacing applied to streamed orderbook rendering, so a quote ticks no
|
|
14
|
+
* faster than the book it derives from.
|
|
15
|
+
*
|
|
16
|
+
* @public
|
|
17
|
+
*/
|
|
18
|
+
export const QUOTE_THROTTLE_MS = 100
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Shared provider-side `subscribeQuote` implementation: resolve
|
|
22
|
+
* `params.symbol` to a market on `provider` (via {@link resolveQuoteMarket}),
|
|
23
|
+
* subscribe to that market's orderbook channel on `ws`, and on each book
|
|
24
|
+
* update rebuild the {@link Quote} with the provider's public base `feeTier` —
|
|
25
|
+
* the same transform the one-shot `resolveQuote` applies to a REST snapshot.
|
|
26
|
+
* Emissions are throttled to {@link QUOTE_THROTTLE_MS}: the first book update
|
|
27
|
+
* emits immediately, then at most one (trailing, latest-book) emission per
|
|
28
|
+
* interval. Both venue WS plugins delegate here; each only supplies its own
|
|
29
|
+
* base tier.
|
|
30
|
+
*
|
|
31
|
+
* The returned unsubscribe is idempotent — it releases the underlying
|
|
32
|
+
* orderbook listener once and cancels any pending trailing emission, so the
|
|
33
|
+
* wire subscription's ref count cannot be double-decremented.
|
|
34
|
+
*
|
|
35
|
+
* @throws {PerpsError} `MarketNotFound` when no market matches symbol+type.
|
|
36
|
+
* @internal
|
|
37
|
+
*/
|
|
38
|
+
export async function resolveSubscribeQuote(
|
|
39
|
+
client: PerpsSDKClient,
|
|
40
|
+
provider: string,
|
|
41
|
+
ws: Pick<WsProvider, 'subscribe'>,
|
|
42
|
+
params: ProviderGetQuoteParams,
|
|
43
|
+
feeTier: FeeTier,
|
|
44
|
+
onQuote: QuoteListener
|
|
45
|
+
): Promise<() => void> {
|
|
46
|
+
const market = await resolveQuoteMarket(client, provider, params)
|
|
47
|
+
|
|
48
|
+
let latestBook: OrderbookResponse | undefined
|
|
49
|
+
let lastEmitAt = Number.NEGATIVE_INFINITY
|
|
50
|
+
let trailing: ReturnType<typeof setTimeout> | undefined
|
|
51
|
+
|
|
52
|
+
const emit = () => {
|
|
53
|
+
if (latestBook === undefined) {
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
lastEmitAt = Date.now()
|
|
57
|
+
onQuote(
|
|
58
|
+
buildQuote({
|
|
59
|
+
provider,
|
|
60
|
+
symbol: params.symbol,
|
|
61
|
+
type: params.type,
|
|
62
|
+
side: params.side,
|
|
63
|
+
sizeUsd: params.size,
|
|
64
|
+
market,
|
|
65
|
+
bids: latestBook.bids,
|
|
66
|
+
asks: latestBook.asks,
|
|
67
|
+
feeTier,
|
|
68
|
+
timestamp: Date.now(),
|
|
69
|
+
})
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const unsubscribe = await ws.subscribe(
|
|
74
|
+
{ channel: 'orderbook', dex: provider, marketId: market.id },
|
|
75
|
+
(event) => {
|
|
76
|
+
if (event.channel !== 'orderbook') {
|
|
77
|
+
return
|
|
78
|
+
}
|
|
79
|
+
latestBook = event.data
|
|
80
|
+
if (trailing !== undefined) {
|
|
81
|
+
return
|
|
82
|
+
}
|
|
83
|
+
const wait = QUOTE_THROTTLE_MS - (Date.now() - lastEmitAt)
|
|
84
|
+
if (wait <= 0) {
|
|
85
|
+
emit()
|
|
86
|
+
} else {
|
|
87
|
+
trailing = setTimeout(() => {
|
|
88
|
+
trailing = undefined
|
|
89
|
+
emit()
|
|
90
|
+
}, wait)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
let released = false
|
|
96
|
+
return () => {
|
|
97
|
+
if (released) {
|
|
98
|
+
return
|
|
99
|
+
}
|
|
100
|
+
released = true
|
|
101
|
+
if (trailing !== undefined) {
|
|
102
|
+
clearTimeout(trailing)
|
|
103
|
+
trailing = undefined
|
|
104
|
+
}
|
|
105
|
+
unsubscribe()
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { StorageAdapter } from './types.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Parse a persisted (browser-writable) JSON record and validate it against a
|
|
5
|
+
* caller-supplied shape guard. localStorage is user-writable, so a stored value
|
|
6
|
+
* may be truncated, hand-edited, or written by an older schema; `JSON.parse(...)
|
|
7
|
+
* as T` would type-check such a record yet carry missing/invalid fields that
|
|
8
|
+
* fail far from here.
|
|
9
|
+
*
|
|
10
|
+
* Returns the parsed value when `isValid` accepts it; returns `null` when the
|
|
11
|
+
* record is absent, unparseable, or fails validation (i.e. poisoned). A `null`
|
|
12
|
+
* result is the "malformed-or-absent" signal — callers decide whether that
|
|
13
|
+
* means "regenerate deliberately" or "surface an error", but they never get a
|
|
14
|
+
* structurally-invalid `T`.
|
|
15
|
+
*
|
|
16
|
+
* @param raw Stored string, or `null` when the key is absent.
|
|
17
|
+
* @param isValid Shape guard run against the parsed value.
|
|
18
|
+
*/
|
|
19
|
+
export function parseStoredRecord<T>(
|
|
20
|
+
raw: string | null,
|
|
21
|
+
isValid: (value: unknown) => value is T
|
|
22
|
+
): T | null {
|
|
23
|
+
if (raw === null) {
|
|
24
|
+
return null
|
|
25
|
+
}
|
|
26
|
+
let parsed: unknown
|
|
27
|
+
try {
|
|
28
|
+
parsed = JSON.parse(raw)
|
|
29
|
+
} catch {
|
|
30
|
+
return null
|
|
31
|
+
}
|
|
32
|
+
return isValid(parsed) ? parsed : null
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Read and validate a persisted record in one step, evicting the key when the
|
|
37
|
+
* stored value is present but poisoned (unparseable or failing `isValid`) so a
|
|
38
|
+
* later read does not keep tripping over the same corrupt entry.
|
|
39
|
+
*
|
|
40
|
+
* Returns `null` for both the genuine-absence and the evicted-poison cases;
|
|
41
|
+
* callers that must distinguish them should compare against the pre-read
|
|
42
|
+
* presence of the key themselves.
|
|
43
|
+
*/
|
|
44
|
+
export async function readValidatedRecord<T>(
|
|
45
|
+
storage: StorageAdapter,
|
|
46
|
+
key: string,
|
|
47
|
+
isValid: (value: unknown) => value is T
|
|
48
|
+
): Promise<T | null> {
|
|
49
|
+
const raw = await storage.get(key)
|
|
50
|
+
const parsed = parseStoredRecord(raw, isValid)
|
|
51
|
+
if (parsed === null && raw !== null) {
|
|
52
|
+
await storage.remove(key)
|
|
53
|
+
}
|
|
54
|
+
return parsed
|
|
55
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { StorageAdapter } from './types.js'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* localStorage adapter for browser environments. Falls back to a no-op when
|
|
5
|
+
* `localStorage` is unavailable (e.g. SSR).
|
|
6
|
+
*
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export const localStorageAdapter: StorageAdapter = {
|
|
10
|
+
get: (key: string): Promise<string | null> => {
|
|
11
|
+
try {
|
|
12
|
+
return Promise.resolve(localStorage.getItem(key))
|
|
13
|
+
} catch {
|
|
14
|
+
return Promise.resolve(null)
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
set: (key: string, value: string): Promise<void> => {
|
|
19
|
+
try {
|
|
20
|
+
localStorage.setItem(key, value)
|
|
21
|
+
} catch {
|
|
22
|
+
// localStorage not available
|
|
23
|
+
}
|
|
24
|
+
return Promise.resolve()
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
remove: (key: string): Promise<void> => {
|
|
28
|
+
try {
|
|
29
|
+
localStorage.removeItem(key)
|
|
30
|
+
} catch {
|
|
31
|
+
// localStorage not available
|
|
32
|
+
}
|
|
33
|
+
return Promise.resolve()
|
|
34
|
+
},
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* In-memory storage adapter for testing or server-side use.
|
|
39
|
+
*
|
|
40
|
+
* @public
|
|
41
|
+
*/
|
|
42
|
+
export function createMemoryStorage(): StorageAdapter {
|
|
43
|
+
const store = new Map<string, string>()
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
get: (key: string): Promise<string | null> => {
|
|
47
|
+
return Promise.resolve(store.get(key) ?? null)
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
set: (key: string, value: string): Promise<void> => {
|
|
51
|
+
store.set(key, value)
|
|
52
|
+
return Promise.resolve()
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
remove: (key: string): Promise<void> => {
|
|
56
|
+
store.delete(key)
|
|
57
|
+
return Promise.resolve()
|
|
58
|
+
},
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage adapter interface for persisting SDK session credentials (provider
|
|
3
|
+
* agent keypairs, API keys, read-only tokens). Implement this to use custom
|
|
4
|
+
* storage (e.g. encrypted storage, a database, async key-value stores).
|
|
5
|
+
*/
|
|
6
|
+
export interface StorageAdapter {
|
|
7
|
+
/** Get a value by key. */
|
|
8
|
+
get(key: string): Promise<string | null>
|
|
9
|
+
/** Set a value by key. */
|
|
10
|
+
set(key: string, value: string): Promise<void>
|
|
11
|
+
/** Remove a value by key. */
|
|
12
|
+
remove(key: string): Promise<void>
|
|
13
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { sleep } from '../utils/sleep.js'
|
|
2
|
+
import type { ResolvedRetryPolicy, RetryClassification } from './retryPolicy.js'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Options for {@link fetchWithRetry}.
|
|
6
|
+
*
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export interface FetchWithRetryOptions {
|
|
10
|
+
policy: ResolvedRetryPolicy
|
|
11
|
+
fetchImpl?: typeof fetch
|
|
12
|
+
signal?: AbortSignal
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Wrap `fetch` with policy-driven retry. Honors `Retry-After` (when present
|
|
17
|
+
* and `respectRetryAfter` is true), otherwise falls back to exponential
|
|
18
|
+
* backoff with full jitter, capped by `maxDelayMs`. Network errors (thrown
|
|
19
|
+
* `fetch` rejections) are treated as `retry-network` — same retry budget as
|
|
20
|
+
* 5xx. An aborted signal short-circuits without further attempts.
|
|
21
|
+
*
|
|
22
|
+
* @public
|
|
23
|
+
*/
|
|
24
|
+
export async function fetchWithRetry(
|
|
25
|
+
input: RequestInfo | URL,
|
|
26
|
+
init: RequestInit | undefined,
|
|
27
|
+
options: FetchWithRetryOptions
|
|
28
|
+
): Promise<Response> {
|
|
29
|
+
const { policy, fetchImpl = fetch, signal } = options
|
|
30
|
+
const mergedInit: RequestInit = signal ? { ...init, signal } : (init ?? {})
|
|
31
|
+
|
|
32
|
+
let attempt = 0
|
|
33
|
+
while (true) {
|
|
34
|
+
if (signal?.aborted) {
|
|
35
|
+
throw signal.reason ?? new DOMException('Aborted', 'AbortError')
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let response: Response | undefined
|
|
39
|
+
let networkError: unknown
|
|
40
|
+
try {
|
|
41
|
+
response = await fetchImpl(input, mergedInit)
|
|
42
|
+
} catch (error) {
|
|
43
|
+
networkError = error
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (response?.ok) {
|
|
47
|
+
return response
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const classification: RetryClassification = response
|
|
51
|
+
? policy.classify({ response })
|
|
52
|
+
: 'retry-network'
|
|
53
|
+
|
|
54
|
+
const attemptsRemaining = policy.maxAttempts - attempt - 1
|
|
55
|
+
const isRetriable = classification !== 'fail' && attemptsRemaining > 0
|
|
56
|
+
|
|
57
|
+
if (!isRetriable) {
|
|
58
|
+
if (response) {
|
|
59
|
+
return response
|
|
60
|
+
}
|
|
61
|
+
throw networkError
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (policy.shouldRetry) {
|
|
65
|
+
const ok = await policy.shouldRetry({
|
|
66
|
+
attempt,
|
|
67
|
+
response,
|
|
68
|
+
error: networkError,
|
|
69
|
+
classification,
|
|
70
|
+
})
|
|
71
|
+
if (!ok) {
|
|
72
|
+
if (response) {
|
|
73
|
+
return response
|
|
74
|
+
}
|
|
75
|
+
throw networkError
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const delayMs = computeDelay(policy, attempt, response)
|
|
80
|
+
if (delayMs > 0) {
|
|
81
|
+
await sleep(delayMs)
|
|
82
|
+
}
|
|
83
|
+
attempt++
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function computeDelay(
|
|
88
|
+
policy: ResolvedRetryPolicy,
|
|
89
|
+
attempt: number,
|
|
90
|
+
response: Response | undefined
|
|
91
|
+
): number {
|
|
92
|
+
if (policy.respectRetryAfter && response) {
|
|
93
|
+
const header = response.headers.get('Retry-After')
|
|
94
|
+
if (header) {
|
|
95
|
+
const parsed = parseRetryAfter(header)
|
|
96
|
+
if (parsed !== undefined) {
|
|
97
|
+
return Math.min(parsed, policy.maxDelayMs)
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const exp = policy.baseDelayMs * 2 ** attempt
|
|
102
|
+
const capped = Math.min(exp, policy.maxDelayMs)
|
|
103
|
+
return Math.floor(Math.random() * capped)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function parseRetryAfter(header: string): number | undefined {
|
|
107
|
+
const seconds = Number(header)
|
|
108
|
+
if (Number.isFinite(seconds) && seconds >= 0) {
|
|
109
|
+
return seconds * 1000
|
|
110
|
+
}
|
|
111
|
+
const dateMs = Date.parse(header)
|
|
112
|
+
if (!Number.isNaN(dateMs)) {
|
|
113
|
+
return Math.max(0, dateMs - Date.now())
|
|
114
|
+
}
|
|
115
|
+
return undefined
|
|
116
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type { PerpsErrorBody } from '@lifi/perps-types'
|
|
2
|
+
import { PerpsErrorCode } from '@lifi/perps-types'
|
|
3
|
+
import { PerpsError } from '../errors/PerpsError.js'
|
|
4
|
+
import type { PerpsBaseConfig, SDKRequestOptions } from '../types/config.js'
|
|
5
|
+
import { version } from '../version.js'
|
|
6
|
+
import { fetchWithRetry } from './fetchWithRetry.js'
|
|
7
|
+
import {
|
|
8
|
+
LIFI_REQUEST_KEY,
|
|
9
|
+
LIFI_RETRY_DEFAULTS,
|
|
10
|
+
type RetryPolicy,
|
|
11
|
+
resolveRetryPolicy,
|
|
12
|
+
} from './retryPolicy.js'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* `RequestInit` plus a per-call retry override.
|
|
16
|
+
*
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
export interface RequestOptions extends RequestInit {
|
|
20
|
+
/** Per-call retry override. Falls back to the resolved client-level policy. */
|
|
21
|
+
retry?: RetryPolicy | false
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Internal HTTP helper: applies SDK headers, retry policy, and the request
|
|
26
|
+
* interceptor, then normalizes failures into {@link PerpsError}.
|
|
27
|
+
*
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
30
|
+
export async function request<T>(
|
|
31
|
+
config: PerpsBaseConfig,
|
|
32
|
+
url: string,
|
|
33
|
+
options: RequestOptions = {},
|
|
34
|
+
sdkOptions?: SDKRequestOptions
|
|
35
|
+
): Promise<T> {
|
|
36
|
+
const { retry, ...fetchInit } = options
|
|
37
|
+
const policy =
|
|
38
|
+
retry !== undefined
|
|
39
|
+
? resolveRetryPolicy(LIFI_RETRY_DEFAULTS, retry, LIFI_REQUEST_KEY)
|
|
40
|
+
: resolveRetryPolicy(LIFI_RETRY_DEFAULTS, config.retry, LIFI_REQUEST_KEY)
|
|
41
|
+
|
|
42
|
+
const headers: Record<string, string> = {
|
|
43
|
+
'Content-Type': 'application/json',
|
|
44
|
+
'x-lifi-integrator': config.integrator,
|
|
45
|
+
'x-lifi-perps-sdk': version,
|
|
46
|
+
...(fetchInit.headers as Record<string, string>),
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (config.apiKey) {
|
|
50
|
+
headers['x-lifi-api-key'] = config.apiKey
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
let finalOptions: RequestInit = {
|
|
54
|
+
...fetchInit,
|
|
55
|
+
headers,
|
|
56
|
+
signal: sdkOptions?.signal ?? fetchInit.signal,
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (config.requestInterceptor) {
|
|
60
|
+
finalOptions = await config.requestInterceptor(url, finalOptions)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
const response = await fetchWithRetry(url, finalOptions, {
|
|
65
|
+
policy,
|
|
66
|
+
fetchImpl: config.fetch,
|
|
67
|
+
signal: sdkOptions?.signal ?? finalOptions.signal ?? undefined,
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
let body: PerpsErrorBody | undefined
|
|
72
|
+
try {
|
|
73
|
+
body = await response.json()
|
|
74
|
+
} catch {}
|
|
75
|
+
|
|
76
|
+
const fallbackMessage = `Request failed with status code ${response.status}`
|
|
77
|
+
if (
|
|
78
|
+
body &&
|
|
79
|
+
typeof body.code === 'number' &&
|
|
80
|
+
typeof body.message === 'string'
|
|
81
|
+
) {
|
|
82
|
+
const error = new PerpsError(body.code, body.message)
|
|
83
|
+
error.tool = body.tool ?? 'unknown'
|
|
84
|
+
throw error
|
|
85
|
+
}
|
|
86
|
+
const error = new PerpsError(PerpsErrorCode.DefaultError, fallbackMessage)
|
|
87
|
+
error.tool = 'unknown'
|
|
88
|
+
throw error
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return (await response.json()) as T
|
|
92
|
+
} catch (error) {
|
|
93
|
+
if (error instanceof PerpsError) {
|
|
94
|
+
throw error
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
throw new PerpsError(
|
|
98
|
+
PerpsErrorCode.ServerError,
|
|
99
|
+
error instanceof Error ? error.message : 'Request failed'
|
|
100
|
+
)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Build a URL with a query string from defined params (skips `undefined`).
|
|
106
|
+
*
|
|
107
|
+
* @internal
|
|
108
|
+
*/
|
|
109
|
+
export function buildUrl(
|
|
110
|
+
baseUrl: string,
|
|
111
|
+
params: Record<string, string | number | boolean | undefined>
|
|
112
|
+
): string {
|
|
113
|
+
const searchParams = new URLSearchParams()
|
|
114
|
+
|
|
115
|
+
for (const [key, value] of Object.entries(params)) {
|
|
116
|
+
if (value !== undefined) {
|
|
117
|
+
searchParams.set(key, String(value))
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const queryString = searchParams.toString()
|
|
122
|
+
return queryString ? `${baseUrl}?${queryString}` : baseUrl
|
|
123
|
+
}
|