@lifi/perps-sdk 0.2.0-alpha.0 → 1.0.0
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/README.md +138 -24
- package/dist/cjs/client/PerpsClient.d.ts +27 -48
- package/dist/cjs/client/PerpsClient.d.ts.map +1 -1
- package/dist/cjs/client/PerpsClient.js +119 -578
- package/dist/cjs/client/PerpsClient.js.map +1 -1
- 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 +7 -38
- package/dist/cjs/client/createPerpsClient.d.ts.map +1 -1
- package/dist/cjs/client/createPerpsClient.js +25 -8
- package/dist/cjs/client/createPerpsClient.js.map +1 -1
- 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.map +1 -1
- package/dist/cjs/errors/PerpsError.js.map +1 -1
- package/dist/cjs/errors/constants.d.ts +2 -2
- package/dist/cjs/errors/constants.d.ts.map +1 -1
- package/dist/cjs/errors/constants.js +2 -2
- package/dist/cjs/errors/constants.js.map +1 -1
- package/dist/cjs/index.d.ts +41 -23
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +73 -41
- package/dist/cjs/index.js.map +1 -1
- 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 +4 -2
- package/dist/cjs/services/createAction.d.ts.map +1 -1
- package/dist/cjs/services/createAction.js +1 -1
- package/dist/cjs/services/createAction.js.map +1 -1
- package/dist/cjs/services/executeAction.d.ts +4 -2
- package/dist/cjs/services/executeAction.d.ts.map +1 -1
- package/dist/cjs/services/executeAction.js +2 -1
- package/dist/cjs/services/executeAction.js.map +1 -1
- package/dist/cjs/services/getAccount.d.ts +4 -2
- package/dist/cjs/services/getAccount.d.ts.map +1 -1
- package/dist/cjs/services/getAccount.js +2 -6
- package/dist/cjs/services/getAccount.js.map +1 -1
- package/dist/cjs/services/getActivity.d.ts +4 -2
- package/dist/cjs/services/getActivity.d.ts.map +1 -1
- package/dist/cjs/services/getActivity.js +4 -10
- package/dist/cjs/services/getActivity.js.map +1 -1
- package/dist/cjs/services/getAssets.d.ts +2 -1
- package/dist/cjs/services/getAssets.d.ts.map +1 -1
- package/dist/cjs/services/getAssets.js +1 -1
- package/dist/cjs/services/getAssets.js.map +1 -1
- package/dist/cjs/services/getFills.d.ts +4 -2
- package/dist/cjs/services/getFills.d.ts.map +1 -1
- package/dist/cjs/services/getFills.js +3 -5
- package/dist/cjs/services/getFills.js.map +1 -1
- 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/{getAsset.js → getMarkets.js} +6 -5
- 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 +3 -2
- package/dist/cjs/services/getOhlcv.d.ts.map +1 -1
- package/dist/cjs/services/getOhlcv.js +3 -2
- package/dist/cjs/services/getOhlcv.js.map +1 -1
- package/dist/cjs/services/getOrder.d.ts +4 -2
- package/dist/cjs/services/getOrder.d.ts.map +1 -1
- package/dist/cjs/services/getOrder.js +2 -6
- package/dist/cjs/services/getOrder.js.map +1 -1
- package/dist/cjs/services/getOrderbook.d.ts +3 -2
- package/dist/cjs/services/getOrderbook.d.ts.map +1 -1
- package/dist/cjs/services/getOrderbook.js +3 -2
- package/dist/cjs/services/getOrderbook.js.map +1 -1
- package/dist/cjs/services/getOrders.d.ts +5 -3
- package/dist/cjs/services/getOrders.d.ts.map +1 -1
- package/dist/cjs/services/getOrders.js +6 -8
- package/dist/cjs/services/getOrders.js.map +1 -1
- package/dist/cjs/services/getPositions.d.ts +5 -3
- package/dist/cjs/services/getPositions.d.ts.map +1 -1
- package/dist/cjs/services/getPositions.js +6 -8
- package/dist/cjs/services/getPositions.js.map +1 -1
- package/dist/cjs/services/getPrices.d.ts +3 -2
- package/dist/cjs/services/getPrices.d.ts.map +1 -1
- package/dist/cjs/services/getPrices.js +2 -2
- package/dist/cjs/services/getPrices.js.map +1 -1
- package/dist/cjs/services/getProviders.d.ts +2 -1
- package/dist/cjs/services/getProviders.d.ts.map +1 -1
- package/dist/cjs/services/getProviders.js +1 -1
- package/dist/cjs/services/getProviders.js.map +1 -1
- 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 +7 -0
- package/dist/cjs/services/resolveQuote.d.ts.map +1 -0
- package/dist/cjs/services/resolveQuote.js +50 -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 +65 -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.map +1 -0
- package/dist/cjs/storage/storage.js.map +1 -0
- package/dist/cjs/{agent → storage}/types.d.ts +0 -5
- package/dist/cjs/storage/types.d.ts.map +1 -0
- package/dist/cjs/{agent → storage}/types.js.map +1 -1
- 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/{utils → transport}/request.d.ts +3 -2
- package/dist/cjs/transport/request.d.ts.map +1 -0
- package/dist/cjs/{utils → transport}/request.js +14 -14
- 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/{realtime/lighter/types.js → types/api.js} +1 -1
- 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/{realtime/types.js → types/config.js} +1 -1
- 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 +2 -8
- package/dist/cjs/utils/accountSummary.d.ts.map +1 -1
- package/dist/cjs/utils/accountSummary.js +12 -70
- package/dist/cjs/utils/accountSummary.js.map +1 -1
- package/dist/cjs/utils/assertNever.d.ts.map +1 -1
- package/dist/cjs/utils/assertNever.js.map +1 -1
- package/dist/cjs/utils/calculations.d.ts +36 -0
- package/dist/cjs/utils/calculations.d.ts.map +1 -1
- package/dist/cjs/utils/calculations.js +77 -0
- package/dist/cjs/utils/calculations.js.map +1 -1
- 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 +3 -1
- package/dist/cjs/utils/orderClassification.d.ts.map +1 -1
- package/dist/cjs/utils/orderClassification.js +11 -1
- package/dist/cjs/utils/orderClassification.js.map +1 -1
- package/dist/cjs/utils/orderMath.d.ts +1 -1
- package/dist/cjs/utils/orderMath.d.ts.map +1 -1
- package/dist/cjs/utils/orderMath.js +2 -2
- package/dist/cjs/utils/orderMath.js.map +1 -1
- package/dist/cjs/utils/parse.d.ts.map +1 -1
- package/dist/cjs/utils/parse.js.map +1 -1
- package/dist/cjs/utils/positionMath.d.ts +6 -0
- package/dist/cjs/utils/positionMath.d.ts.map +1 -1
- package/dist/cjs/utils/positionMath.js +14 -0
- package/dist/cjs/utils/positionMath.js.map +1 -1
- package/dist/cjs/utils/signTypedData.d.ts +3 -3
- package/dist/cjs/utils/signTypedData.d.ts.map +1 -1
- package/dist/cjs/utils/signTypedData.js +3 -2
- package/dist/cjs/utils/signTypedData.js.map +1 -1
- package/dist/cjs/utils/sleep.d.ts.map +1 -1
- package/dist/cjs/utils/sleep.js.map +1 -1
- package/dist/cjs/utils/units.d.ts.map +1 -1
- package/dist/cjs/utils/units.js.map +1 -1
- package/dist/cjs/utils/validation.d.ts.map +1 -1
- package/dist/cjs/utils/validation.js.map +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.d.ts.map +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/version.js.map +1 -1
- 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/{types/realtime → cjs/websocket}/ReconnectingWebSocket.d.ts +23 -7
- 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/{realtime → websocket}/types.js.map +1 -1
- 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 +200 -195
- package/dist/esm/client/PerpsClient.d.ts.map +1 -1
- package/dist/esm/client/PerpsClient.js +305 -794
- package/dist/esm/client/PerpsClient.js.map +1 -1
- 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 +34 -53
- package/dist/esm/client/createPerpsClient.d.ts.map +1 -1
- package/dist/esm/client/createPerpsClient.js +51 -8
- package/dist/esm/client/createPerpsClient.js.map +1 -1
- 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 +8 -0
- package/dist/esm/errors/PerpsError.d.ts.map +1 -1
- package/dist/esm/errors/PerpsError.js +8 -0
- package/dist/esm/errors/PerpsError.js.map +1 -1
- package/dist/esm/errors/constants.d.ts +8 -2
- package/dist/esm/errors/constants.d.ts.map +1 -1
- package/dist/esm/errors/constants.js +8 -2
- package/dist/esm/errors/constants.js.map +1 -1
- package/dist/esm/index.d.ts +49 -23
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +38 -23
- package/dist/esm/index.js.map +1 -1
- 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 +17 -2
- package/dist/esm/services/createAction.d.ts.map +1 -1
- package/dist/esm/services/createAction.js +9 -1
- package/dist/esm/services/createAction.js.map +1 -1
- package/dist/esm/services/executeAction.d.ts +17 -2
- package/dist/esm/services/executeAction.d.ts.map +1 -1
- package/dist/esm/services/executeAction.js +13 -1
- package/dist/esm/services/executeAction.js.map +1 -1
- package/dist/esm/services/getAccount.d.ts +19 -16
- package/dist/esm/services/getAccount.d.ts.map +1 -1
- package/dist/esm/services/getAccount.js +12 -18
- package/dist/esm/services/getAccount.js.map +1 -1
- package/dist/esm/services/getActivity.d.ts +15 -25
- package/dist/esm/services/getActivity.d.ts.map +1 -1
- package/dist/esm/services/getActivity.js +10 -28
- package/dist/esm/services/getActivity.js.map +1 -1
- package/dist/esm/services/getAssets.d.ts +14 -5
- package/dist/esm/services/getAssets.d.ts.map +1 -1
- package/dist/esm/services/getAssets.js +8 -4
- package/dist/esm/services/getAssets.js.map +1 -1
- package/dist/esm/services/getFills.d.ts +18 -29
- package/dist/esm/services/getFills.d.ts.map +1 -1
- package/dist/esm/services/getFills.js +10 -26
- package/dist/esm/services/getFills.js.map +1 -1
- 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 +19 -0
- package/dist/esm/services/getMeta.d.ts.map +1 -0
- package/dist/esm/services/getMeta.js +19 -0
- package/dist/esm/services/getMeta.js.map +1 -0
- package/dist/esm/services/getOhlcv.d.ts +15 -19
- package/dist/esm/services/getOhlcv.d.ts.map +1 -1
- package/dist/esm/services/getOhlcv.js +7 -13
- package/dist/esm/services/getOhlcv.js.map +1 -1
- package/dist/esm/services/getOrder.d.ts +16 -16
- package/dist/esm/services/getOrder.d.ts.map +1 -1
- package/dist/esm/services/getOrder.js +9 -17
- package/dist/esm/services/getOrder.js.map +1 -1
- package/dist/esm/services/getOrderbook.d.ts +13 -23
- package/dist/esm/services/getOrderbook.d.ts.map +1 -1
- package/dist/esm/services/getOrderbook.js +7 -21
- package/dist/esm/services/getOrderbook.js.map +1 -1
- package/dist/esm/services/getOrders.d.ts +17 -9
- package/dist/esm/services/getOrders.d.ts.map +1 -1
- package/dist/esm/services/getOrders.js +12 -9
- package/dist/esm/services/getOrders.js.map +1 -1
- package/dist/esm/services/getPositions.d.ts +17 -9
- package/dist/esm/services/getPositions.d.ts.map +1 -1
- package/dist/esm/services/getPositions.js +12 -9
- package/dist/esm/services/getPositions.js.map +1 -1
- package/dist/esm/services/getPrices.d.ts +12 -24
- package/dist/esm/services/getPrices.d.ts.map +1 -1
- package/dist/esm/services/getPrices.js +5 -22
- package/dist/esm/services/getPrices.js.map +1 -1
- package/dist/esm/services/getProviders.d.ts +3 -3
- package/dist/esm/services/getProviders.d.ts.map +1 -1
- package/dist/esm/services/getProviders.js +2 -3
- package/dist/esm/services/getProviders.js.map +1 -1
- 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 +24 -0
- package/dist/esm/services/getTermsAcceptance.d.ts.map +1 -0
- package/dist/esm/services/getTermsAcceptance.js +24 -0
- package/dist/esm/services/getTermsAcceptance.js.map +1 -0
- package/dist/esm/services/resolveQuote.d.ts +36 -0
- package/dist/esm/services/resolveQuote.d.ts.map +1 -0
- package/dist/esm/services/resolveQuote.js +74 -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 +86 -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/{types/agent → esm/storage}/storage.d.ts +6 -3
- package/dist/esm/storage/storage.d.ts.map +1 -0
- package/dist/esm/{agent → storage}/storage.js +6 -4
- 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/{agent → storage}/types.js.map +1 -1
- 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/{utils → transport}/request.js +19 -31
- 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 +12 -12
- package/dist/esm/utils/accountSummary.d.ts.map +1 -1
- package/dist/esm/utils/accountSummary.js +18 -83
- package/dist/esm/utils/accountSummary.js.map +1 -1
- package/dist/esm/utils/assertNever.d.ts +1 -0
- package/dist/esm/utils/assertNever.d.ts.map +1 -1
- package/dist/esm/utils/assertNever.js +1 -0
- package/dist/esm/utils/assertNever.js.map +1 -1
- package/dist/esm/utils/calculations.d.ts +116 -0
- package/dist/esm/utils/calculations.d.ts.map +1 -1
- package/dist/esm/utils/calculations.js +140 -3
- package/dist/esm/utils/calculations.js.map +1 -1
- 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 +19 -1
- package/dist/esm/utils/orderClassification.d.ts.map +1 -1
- package/dist/esm/utils/orderClassification.js +26 -1
- package/dist/esm/utils/orderClassification.js.map +1 -1
- package/dist/esm/utils/orderMath.d.ts +8 -4
- package/dist/esm/utils/orderMath.d.ts.map +1 -1
- package/dist/esm/utils/orderMath.js +9 -5
- package/dist/esm/utils/orderMath.js.map +1 -1
- package/dist/esm/utils/parse.d.ts +8 -5
- package/dist/esm/utils/parse.d.ts.map +1 -1
- package/dist/esm/utils/parse.js +8 -6
- package/dist/esm/utils/parse.js.map +1 -1
- package/dist/esm/utils/positionMath.d.ts +29 -0
- package/dist/esm/utils/positionMath.d.ts.map +1 -1
- package/dist/esm/utils/positionMath.js +36 -0
- package/dist/esm/utils/positionMath.js.map +1 -1
- package/dist/esm/utils/signTypedData.d.ts +9 -4
- package/dist/esm/utils/signTypedData.d.ts.map +1 -1
- package/dist/esm/utils/signTypedData.js +9 -3
- package/dist/esm/utils/signTypedData.js.map +1 -1
- package/dist/esm/utils/sleep.d.ts +5 -0
- package/dist/esm/utils/sleep.d.ts.map +1 -1
- package/dist/esm/utils/sleep.js +5 -0
- package/dist/esm/utils/sleep.js.map +1 -1
- package/dist/esm/utils/units.d.ts +8 -1
- package/dist/esm/utils/units.d.ts.map +1 -1
- package/dist/esm/utils/units.js +8 -1
- package/dist/esm/utils/units.js.map +1 -1
- package/dist/esm/utils/validation.d.ts +4 -1
- package/dist/esm/utils/validation.d.ts.map +1 -1
- package/dist/esm/utils/validation.js +4 -1
- package/dist/esm/utils/validation.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.d.ts.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/version.js.map +1 -1
- 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/{realtime → websocket}/types.js.map +1 -1
- 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 +200 -195
- package/dist/types/client/PerpsClient.d.ts.map +1 -1
- 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 +34 -53
- package/dist/types/client/createPerpsClient.d.ts.map +1 -1
- 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 +8 -0
- package/dist/types/errors/PerpsError.d.ts.map +1 -1
- package/dist/types/errors/constants.d.ts +8 -2
- package/dist/types/errors/constants.d.ts.map +1 -1
- package/dist/types/index.d.ts +49 -23
- package/dist/types/index.d.ts.map +1 -1
- 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 +17 -2
- package/dist/types/services/createAction.d.ts.map +1 -1
- package/dist/types/services/executeAction.d.ts +17 -2
- package/dist/types/services/executeAction.d.ts.map +1 -1
- package/dist/types/services/getAccount.d.ts +19 -16
- package/dist/types/services/getAccount.d.ts.map +1 -1
- package/dist/types/services/getActivity.d.ts +15 -25
- package/dist/types/services/getActivity.d.ts.map +1 -1
- package/dist/types/services/getAssets.d.ts +14 -5
- package/dist/types/services/getAssets.d.ts.map +1 -1
- package/dist/types/services/getFills.d.ts +18 -29
- package/dist/types/services/getFills.d.ts.map +1 -1
- 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 +19 -0
- package/dist/types/services/getMeta.d.ts.map +1 -0
- package/dist/types/services/getOhlcv.d.ts +15 -19
- package/dist/types/services/getOhlcv.d.ts.map +1 -1
- package/dist/types/services/getOrder.d.ts +16 -16
- package/dist/types/services/getOrder.d.ts.map +1 -1
- package/dist/types/services/getOrderbook.d.ts +13 -23
- package/dist/types/services/getOrderbook.d.ts.map +1 -1
- package/dist/types/services/getOrders.d.ts +17 -9
- package/dist/types/services/getOrders.d.ts.map +1 -1
- package/dist/types/services/getPositions.d.ts +17 -9
- package/dist/types/services/getPositions.d.ts.map +1 -1
- package/dist/types/services/getPrices.d.ts +12 -24
- package/dist/types/services/getPrices.d.ts.map +1 -1
- package/dist/types/services/getProviders.d.ts +3 -3
- package/dist/types/services/getProviders.d.ts.map +1 -1
- 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 +24 -0
- package/dist/types/services/getTermsAcceptance.d.ts.map +1 -0
- package/dist/types/services/resolveQuote.d.ts +36 -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/{esm/agent → types/storage}/storage.d.ts +6 -3
- 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 +12 -12
- package/dist/types/utils/accountSummary.d.ts.map +1 -1
- package/dist/types/utils/assertNever.d.ts +1 -0
- package/dist/types/utils/assertNever.d.ts.map +1 -1
- package/dist/types/utils/calculations.d.ts +116 -0
- package/dist/types/utils/calculations.d.ts.map +1 -1
- 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 +19 -1
- package/dist/types/utils/orderClassification.d.ts.map +1 -1
- package/dist/types/utils/orderMath.d.ts +8 -4
- package/dist/types/utils/orderMath.d.ts.map +1 -1
- package/dist/types/utils/parse.d.ts +8 -5
- package/dist/types/utils/parse.d.ts.map +1 -1
- package/dist/types/utils/positionMath.d.ts +29 -0
- package/dist/types/utils/positionMath.d.ts.map +1 -1
- package/dist/types/utils/signTypedData.d.ts +9 -4
- package/dist/types/utils/signTypedData.d.ts.map +1 -1
- package/dist/types/utils/sleep.d.ts +5 -0
- package/dist/types/utils/sleep.d.ts.map +1 -1
- package/dist/types/utils/units.d.ts +8 -1
- package/dist/types/utils/units.d.ts.map +1 -1
- package/dist/types/utils/validation.d.ts +4 -1
- package/dist/types/utils/validation.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/dist/types/version.d.ts.map +1 -1
- 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 +13 -60
- package/src/client/PerpsClient.ts +404 -1115
- package/src/client/bindProvider.ts +24 -0
- package/src/client/createPerpsClient.ts +68 -72
- package/src/client/requireProvider.ts +29 -0
- package/src/errors/PerpsError.ts +8 -0
- package/src/errors/constants.ts +8 -2
- package/src/index.ts +138 -82
- 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 +17 -6
- package/src/services/executeAction.ts +21 -6
- package/src/services/getAccount.ts +24 -25
- package/src/services/getActivity.ts +27 -47
- package/src/services/getAssets.ts +15 -9
- package/src/services/getFills.ts +29 -42
- package/src/services/getMarket.ts +52 -0
- package/src/services/getMarkets.ts +40 -0
- package/src/services/getMeta.ts +30 -0
- package/src/services/getOhlcv.ts +24 -33
- package/src/services/getOrder.ts +20 -27
- package/src/services/getOrderbook.ts +19 -34
- package/src/services/getOrders.ts +27 -21
- package/src/services/getPositions.ts +27 -21
- package/src/services/getPrices.ts +14 -29
- package/src/services/getProviders.ts +4 -7
- package/src/services/getQuote.ts +58 -0
- package/src/services/getTermsAcceptance.ts +32 -0
- package/src/services/resolveQuote.ts +122 -0
- package/src/services/resolveSubscribeQuote.ts +109 -0
- package/src/storage/parseStoredRecord.ts +55 -0
- package/src/{agent → storage}/storage.ts +6 -4
- package/src/storage/types.ts +13 -0
- package/src/transport/fetchWithRetry.ts +116 -0
- package/src/{utils → transport}/request.ts +33 -45
- 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 +25 -109
- package/src/utils/assertNever.ts +1 -0
- package/src/utils/calculations.ts +204 -7
- 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 +33 -1
- package/src/utils/orderMath.ts +9 -5
- package/src/utils/parse.ts +8 -7
- package/src/utils/positionMath.ts +42 -0
- package/src/utils/signTypedData.ts +11 -5
- package/src/utils/sleep.ts +5 -0
- package/src/utils/units.ts +8 -1
- package/src/utils/validation.ts +4 -1
- package/src/version.ts +1 -1
- 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
- package/dist/cjs/agent/AgentManager.d.ts +0 -15
- package/dist/cjs/agent/AgentManager.d.ts.map +0 -1
- package/dist/cjs/agent/AgentManager.js +0 -82
- package/dist/cjs/agent/AgentManager.js.map +0 -1
- package/dist/cjs/agent/storage.d.ts.map +0 -1
- package/dist/cjs/agent/storage.js.map +0 -1
- package/dist/cjs/agent/types.d.ts.map +0 -1
- package/dist/cjs/client/projectAccountConfigSettings.d.ts +0 -3
- package/dist/cjs/client/projectAccountConfigSettings.d.ts.map +0 -1
- package/dist/cjs/client/projectAccountConfigSettings.js +0 -17
- package/dist/cjs/client/projectAccountConfigSettings.js.map +0 -1
- package/dist/cjs/client/types.d.ts +0 -85
- package/dist/cjs/client/types.d.ts.map +0 -1
- package/dist/cjs/client/types.js +0 -9
- package/dist/cjs/client/types.js.map +0 -1
- package/dist/cjs/providers/hyperliquid/accountConfig.d.ts +0 -3
- package/dist/cjs/providers/hyperliquid/accountConfig.d.ts.map +0 -1
- package/dist/cjs/providers/hyperliquid/accountConfig.js +0 -41
- package/dist/cjs/providers/hyperliquid/accountConfig.js.map +0 -1
- package/dist/cjs/providers/lighter/accountConfig.d.ts +0 -3
- package/dist/cjs/providers/lighter/accountConfig.d.ts.map +0 -1
- package/dist/cjs/providers/lighter/accountConfig.js +0 -45
- package/dist/cjs/providers/lighter/accountConfig.js.map +0 -1
- package/dist/cjs/realtime/PerpsWsClient.d.ts +0 -20
- package/dist/cjs/realtime/PerpsWsClient.d.ts.map +0 -1
- package/dist/cjs/realtime/PerpsWsClient.js +0 -69
- package/dist/cjs/realtime/PerpsWsClient.js.map +0 -1
- package/dist/cjs/realtime/ReconnectingWebSocket.d.ts +0 -36
- package/dist/cjs/realtime/ReconnectingWebSocket.d.ts.map +0 -1
- package/dist/cjs/realtime/ReconnectingWebSocket.js +0 -132
- package/dist/cjs/realtime/ReconnectingWebSocket.js.map +0 -1
- package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.d.ts +0 -30
- package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +0 -1
- package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.js +0 -331
- package/dist/cjs/realtime/hyperliquid/HyperliquidWsProvider.js.map +0 -1
- package/dist/cjs/realtime/hyperliquid/types.d.ts +0 -37
- package/dist/cjs/realtime/hyperliquid/types.d.ts.map +0 -1
- package/dist/cjs/realtime/hyperliquid/types.js.map +0 -1
- package/dist/cjs/realtime/lighter/LighterWsProvider.d.ts +0 -48
- package/dist/cjs/realtime/lighter/LighterWsProvider.d.ts.map +0 -1
- package/dist/cjs/realtime/lighter/LighterWsProvider.js +0 -424
- package/dist/cjs/realtime/lighter/LighterWsProvider.js.map +0 -1
- package/dist/cjs/realtime/lighter/types.d.ts +0 -84
- package/dist/cjs/realtime/lighter/types.d.ts.map +0 -1
- package/dist/cjs/realtime/lighter/types.js.map +0 -1
- package/dist/cjs/realtime/types.d.ts +0 -10
- package/dist/cjs/realtime/types.d.ts.map +0 -1
- package/dist/cjs/services/getAsset.d.ts +0 -8
- package/dist/cjs/services/getAsset.d.ts.map +0 -1
- package/dist/cjs/services/getAsset.js.map +0 -1
- package/dist/cjs/signers/lighter/LighterKeyStore.d.ts +0 -20
- package/dist/cjs/signers/lighter/LighterKeyStore.d.ts.map +0 -1
- package/dist/cjs/signers/lighter/LighterKeyStore.js +0 -42
- package/dist/cjs/signers/lighter/LighterKeyStore.js.map +0 -1
- package/dist/cjs/signers/lighter/LighterReadOnlyTokenManager.d.ts +0 -66
- package/dist/cjs/signers/lighter/LighterReadOnlyTokenManager.d.ts.map +0 -1
- package/dist/cjs/signers/lighter/LighterReadOnlyTokenManager.js +0 -141
- package/dist/cjs/signers/lighter/LighterReadOnlyTokenManager.js.map +0 -1
- package/dist/cjs/signers/lighter/LighterSigner.d.ts +0 -41
- package/dist/cjs/signers/lighter/LighterSigner.d.ts.map +0 -1
- package/dist/cjs/signers/lighter/LighterSigner.js +0 -176
- package/dist/cjs/signers/lighter/LighterSigner.js.map +0 -1
- package/dist/cjs/signers/lighter/index.d.ts +0 -9
- package/dist/cjs/signers/lighter/index.d.ts.map +0 -1
- package/dist/cjs/signers/lighter/index.js +0 -20
- package/dist/cjs/signers/lighter/index.js.map +0 -1
- package/dist/cjs/signers/lighter/wasmLoader.d.ts +0 -42
- package/dist/cjs/signers/lighter/wasmLoader.d.ts.map +0 -1
- package/dist/cjs/signers/lighter/wasmLoader.js +0 -166
- package/dist/cjs/signers/lighter/wasmLoader.js.map +0 -1
- package/dist/cjs/utils/hyperliquid/index.d.ts +0 -3
- package/dist/cjs/utils/hyperliquid/index.d.ts.map +0 -1
- package/dist/cjs/utils/hyperliquid/index.js +0 -11
- package/dist/cjs/utils/hyperliquid/index.js.map +0 -1
- package/dist/cjs/utils/hyperliquid/liquidation.d.ts +0 -3
- package/dist/cjs/utils/hyperliquid/liquidation.d.ts.map +0 -1
- package/dist/cjs/utils/hyperliquid/liquidation.js +0 -24
- package/dist/cjs/utils/hyperliquid/liquidation.js.map +0 -1
- package/dist/cjs/utils/hyperliquid/orderFormatting.d.ts +0 -4
- package/dist/cjs/utils/hyperliquid/orderFormatting.d.ts.map +0 -1
- package/dist/cjs/utils/hyperliquid/orderFormatting.js +0 -33
- package/dist/cjs/utils/hyperliquid/orderFormatting.js.map +0 -1
- package/dist/cjs/utils/request.d.ts.map +0 -1
- package/dist/cjs/utils/request.js.map +0 -1
- package/dist/cjs/wasm/lighter-signer.wasm +0 -0
- package/dist/cjs/wasm/wasm_exec.js +0 -575
- package/dist/esm/agent/AgentManager.d.ts +0 -45
- package/dist/esm/agent/AgentManager.d.ts.map +0 -1
- package/dist/esm/agent/AgentManager.js +0 -112
- package/dist/esm/agent/AgentManager.js.map +0 -1
- package/dist/esm/agent/storage.d.ts.map +0 -1
- package/dist/esm/agent/storage.js.map +0 -1
- package/dist/esm/agent/types.d.ts +0 -23
- package/dist/esm/agent/types.d.ts.map +0 -1
- package/dist/esm/client/projectAccountConfigSettings.d.ts +0 -18
- package/dist/esm/client/projectAccountConfigSettings.d.ts.map +0 -1
- package/dist/esm/client/projectAccountConfigSettings.js +0 -29
- package/dist/esm/client/projectAccountConfigSettings.js.map +0 -1
- package/dist/esm/client/types.d.ts +0 -200
- package/dist/esm/client/types.d.ts.map +0 -1
- package/dist/esm/client/types.js +0 -12
- package/dist/esm/client/types.js.map +0 -1
- package/dist/esm/providers/hyperliquid/accountConfig.d.ts +0 -13
- package/dist/esm/providers/hyperliquid/accountConfig.d.ts.map +0 -1
- package/dist/esm/providers/hyperliquid/accountConfig.js +0 -69
- package/dist/esm/providers/hyperliquid/accountConfig.js.map +0 -1
- package/dist/esm/providers/lighter/accountConfig.d.ts +0 -13
- package/dist/esm/providers/lighter/accountConfig.d.ts.map +0 -1
- package/dist/esm/providers/lighter/accountConfig.js +0 -79
- package/dist/esm/providers/lighter/accountConfig.js.map +0 -1
- package/dist/esm/realtime/PerpsWsClient.d.ts +0 -26
- package/dist/esm/realtime/PerpsWsClient.d.ts.map +0 -1
- package/dist/esm/realtime/PerpsWsClient.js +0 -65
- package/dist/esm/realtime/PerpsWsClient.js.map +0 -1
- package/dist/esm/realtime/ReconnectingWebSocket.d.ts +0 -36
- package/dist/esm/realtime/ReconnectingWebSocket.d.ts.map +0 -1
- package/dist/esm/realtime/ReconnectingWebSocket.js +0 -128
- package/dist/esm/realtime/ReconnectingWebSocket.js.map +0 -1
- package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.d.ts +0 -32
- package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +0 -1
- package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.js +0 -339
- package/dist/esm/realtime/hyperliquid/HyperliquidWsProvider.js.map +0 -1
- package/dist/esm/realtime/hyperliquid/types.d.ts +0 -37
- package/dist/esm/realtime/hyperliquid/types.d.ts.map +0 -1
- package/dist/esm/realtime/hyperliquid/types.js +0 -4
- package/dist/esm/realtime/hyperliquid/types.js.map +0 -1
- package/dist/esm/realtime/lighter/LighterWsProvider.d.ts +0 -68
- package/dist/esm/realtime/lighter/LighterWsProvider.d.ts.map +0 -1
- package/dist/esm/realtime/lighter/LighterWsProvider.js +0 -474
- package/dist/esm/realtime/lighter/LighterWsProvider.js.map +0 -1
- package/dist/esm/realtime/lighter/types.d.ts +0 -108
- package/dist/esm/realtime/lighter/types.d.ts.map +0 -1
- package/dist/esm/realtime/lighter/types.js +0 -14
- package/dist/esm/realtime/lighter/types.js.map +0 -1
- package/dist/esm/realtime/types.d.ts +0 -10
- package/dist/esm/realtime/types.d.ts.map +0 -1
- package/dist/esm/services/getAsset.d.ts +0 -20
- package/dist/esm/services/getAsset.d.ts.map +0 -1
- package/dist/esm/services/getAsset.js +0 -18
- package/dist/esm/services/getAsset.js.map +0 -1
- package/dist/esm/signers/lighter/LighterKeyStore.d.ts +0 -29
- package/dist/esm/signers/lighter/LighterKeyStore.d.ts.map +0 -1
- package/dist/esm/signers/lighter/LighterKeyStore.js +0 -53
- package/dist/esm/signers/lighter/LighterKeyStore.js.map +0 -1
- package/dist/esm/signers/lighter/LighterReadOnlyTokenManager.d.ts +0 -174
- package/dist/esm/signers/lighter/LighterReadOnlyTokenManager.d.ts.map +0 -1
- package/dist/esm/signers/lighter/LighterReadOnlyTokenManager.js +0 -214
- package/dist/esm/signers/lighter/LighterReadOnlyTokenManager.js.map +0 -1
- package/dist/esm/signers/lighter/LighterSigner.d.ts +0 -88
- package/dist/esm/signers/lighter/LighterSigner.d.ts.map +0 -1
- package/dist/esm/signers/lighter/LighterSigner.js +0 -226
- package/dist/esm/signers/lighter/LighterSigner.js.map +0 -1
- package/dist/esm/signers/lighter/index.d.ts +0 -9
- package/dist/esm/signers/lighter/index.d.ts.map +0 -1
- package/dist/esm/signers/lighter/index.js +0 -5
- package/dist/esm/signers/lighter/index.js.map +0 -1
- package/dist/esm/signers/lighter/wasmLoader.d.ts +0 -71
- package/dist/esm/signers/lighter/wasmLoader.d.ts.map +0 -1
- package/dist/esm/signers/lighter/wasmLoader.js +0 -181
- package/dist/esm/signers/lighter/wasmLoader.js.map +0 -1
- package/dist/esm/utils/hyperliquid/index.d.ts +0 -3
- package/dist/esm/utils/hyperliquid/index.d.ts.map +0 -1
- package/dist/esm/utils/hyperliquid/index.js +0 -3
- package/dist/esm/utils/hyperliquid/index.js.map +0 -1
- package/dist/esm/utils/hyperliquid/liquidation.d.ts +0 -46
- package/dist/esm/utils/hyperliquid/liquidation.d.ts.map +0 -1
- package/dist/esm/utils/hyperliquid/liquidation.js +0 -63
- package/dist/esm/utils/hyperliquid/liquidation.js.map +0 -1
- package/dist/esm/utils/hyperliquid/orderFormatting.d.ts +0 -44
- package/dist/esm/utils/hyperliquid/orderFormatting.d.ts.map +0 -1
- package/dist/esm/utils/hyperliquid/orderFormatting.js +0 -79
- package/dist/esm/utils/hyperliquid/orderFormatting.js.map +0 -1
- package/dist/esm/utils/request.d.ts +0 -25
- package/dist/esm/utils/request.d.ts.map +0 -1
- package/dist/esm/utils/request.js.map +0 -1
- package/dist/esm/wasm/lighter-signer.wasm +0 -0
- package/dist/esm/wasm/wasm_exec.js +0 -575
- package/dist/types/agent/AgentManager.d.ts +0 -45
- package/dist/types/agent/AgentManager.d.ts.map +0 -1
- package/dist/types/agent/storage.d.ts.map +0 -1
- package/dist/types/agent/types.d.ts +0 -23
- package/dist/types/agent/types.d.ts.map +0 -1
- package/dist/types/client/projectAccountConfigSettings.d.ts +0 -18
- package/dist/types/client/projectAccountConfigSettings.d.ts.map +0 -1
- package/dist/types/client/types.d.ts +0 -200
- package/dist/types/client/types.d.ts.map +0 -1
- package/dist/types/providers/hyperliquid/accountConfig.d.ts +0 -13
- package/dist/types/providers/hyperliquid/accountConfig.d.ts.map +0 -1
- package/dist/types/providers/lighter/accountConfig.d.ts +0 -13
- package/dist/types/providers/lighter/accountConfig.d.ts.map +0 -1
- package/dist/types/realtime/PerpsWsClient.d.ts +0 -26
- package/dist/types/realtime/PerpsWsClient.d.ts.map +0 -1
- package/dist/types/realtime/ReconnectingWebSocket.d.ts.map +0 -1
- package/dist/types/realtime/hyperliquid/HyperliquidWsProvider.d.ts +0 -32
- package/dist/types/realtime/hyperliquid/HyperliquidWsProvider.d.ts.map +0 -1
- package/dist/types/realtime/hyperliquid/types.d.ts +0 -37
- package/dist/types/realtime/hyperliquid/types.d.ts.map +0 -1
- package/dist/types/realtime/lighter/LighterWsProvider.d.ts +0 -68
- package/dist/types/realtime/lighter/LighterWsProvider.d.ts.map +0 -1
- package/dist/types/realtime/lighter/types.d.ts +0 -108
- package/dist/types/realtime/lighter/types.d.ts.map +0 -1
- package/dist/types/realtime/types.d.ts +0 -10
- package/dist/types/realtime/types.d.ts.map +0 -1
- package/dist/types/services/getAsset.d.ts +0 -20
- package/dist/types/services/getAsset.d.ts.map +0 -1
- package/dist/types/signers/lighter/LighterKeyStore.d.ts +0 -29
- package/dist/types/signers/lighter/LighterKeyStore.d.ts.map +0 -1
- package/dist/types/signers/lighter/LighterReadOnlyTokenManager.d.ts +0 -174
- package/dist/types/signers/lighter/LighterReadOnlyTokenManager.d.ts.map +0 -1
- package/dist/types/signers/lighter/LighterSigner.d.ts +0 -88
- package/dist/types/signers/lighter/LighterSigner.d.ts.map +0 -1
- package/dist/types/signers/lighter/index.d.ts +0 -9
- package/dist/types/signers/lighter/index.d.ts.map +0 -1
- package/dist/types/signers/lighter/wasmLoader.d.ts +0 -71
- package/dist/types/signers/lighter/wasmLoader.d.ts.map +0 -1
- package/dist/types/utils/hyperliquid/index.d.ts +0 -3
- package/dist/types/utils/hyperliquid/index.d.ts.map +0 -1
- package/dist/types/utils/hyperliquid/liquidation.d.ts +0 -46
- package/dist/types/utils/hyperliquid/liquidation.d.ts.map +0 -1
- package/dist/types/utils/hyperliquid/orderFormatting.d.ts +0 -44
- package/dist/types/utils/hyperliquid/orderFormatting.d.ts.map +0 -1
- package/dist/types/utils/request.d.ts +0 -25
- package/dist/types/utils/request.d.ts.map +0 -1
- package/src/agent/AgentManager.ts +0 -137
- package/src/agent/types.ts +0 -24
- package/src/client/projectAccountConfigSettings.ts +0 -39
- package/src/client/types.ts +0 -240
- package/src/providers/hyperliquid/accountConfig.ts +0 -92
- package/src/providers/lighter/accountConfig.ts +0 -103
- package/src/realtime/PerpsWsClient.ts +0 -108
- package/src/realtime/ReconnectingWebSocket.ts +0 -156
- package/src/realtime/hyperliquid/HyperliquidWsProvider.ts +0 -413
- package/src/realtime/hyperliquid/types.ts +0 -46
- package/src/realtime/lighter/LighterWsProvider.ts +0 -682
- package/src/realtime/lighter/types.ts +0 -121
- package/src/realtime/types.ts +0 -16
- package/src/services/getAsset.ts +0 -37
- package/src/signers/lighter/LighterKeyStore.ts +0 -74
- package/src/signers/lighter/LighterReadOnlyTokenManager.ts +0 -358
- package/src/signers/lighter/LighterSigner.ts +0 -396
- package/src/signers/lighter/index.ts +0 -36
- package/src/signers/lighter/wasmLoader.ts +0 -291
- package/src/utils/hyperliquid/index.ts +0 -9
- package/src/utils/hyperliquid/liquidation.ts +0 -71
- package/src/utils/hyperliquid/orderFormatting.ts +0 -96
- package/wasm/lighter-signer.wasm +0 -0
- package/wasm/wasm_exec.js +0 -575
- /package/dist/cjs/{agent → storage}/storage.d.ts +0 -0
- /package/dist/cjs/{agent → storage}/storage.js +0 -0
- /package/dist/cjs/{agent → storage}/types.js +0 -0
- /package/dist/cjs/{realtime/hyperliquid → websocket}/types.js +0 -0
- /package/dist/esm/{agent → storage}/types.js +0 -0
- /package/dist/esm/{realtime → websocket}/types.js +0 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
CloseEvent as PartySocketCloseEvent,
|
|
3
|
+
ErrorEvent as PartySocketErrorEvent,
|
|
4
|
+
} from 'partysocket/ws'
|
|
5
|
+
import PartySocketWebSocket from 'partysocket/ws'
|
|
6
|
+
import type { WsConnectionStatus, WsStatusListener } from './types.js'
|
|
7
|
+
import { wsLog } from './wsLog.js'
|
|
8
|
+
|
|
9
|
+
type WsEventMap = {
|
|
10
|
+
open: () => void
|
|
11
|
+
close: (code: number, reason: string) => void
|
|
12
|
+
error: (error: Event) => void
|
|
13
|
+
message: (data: string) => void
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type WsEvent = keyof WsEventMap
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Default reconnect attempt cap. With the jittered backoff below, ten attempts
|
|
20
|
+
* span roughly 20–60s of retries before the socket is declared `disconnected`
|
|
21
|
+
* — long enough for a live trading feed to ride out a transient network blip.
|
|
22
|
+
*/
|
|
23
|
+
const DEFAULT_MAX_RETRIES = 10
|
|
24
|
+
|
|
25
|
+
/** Default watchdog window: three keepalive intervals without inbound traffic. */
|
|
26
|
+
const DEFAULT_STALE_WINDOW_PING_INTERVALS = 3
|
|
27
|
+
|
|
28
|
+
const CONNECTION_TIMEOUT_MS = 4_000
|
|
29
|
+
/** Uptime below which an open does not reset the retry budget, so an accept-then-drop server still exhausts. */
|
|
30
|
+
const MIN_UPTIME_MS = 5_000
|
|
31
|
+
const MAX_ENQUEUED_MESSAGES = 1_000
|
|
32
|
+
/** First-retry delay is drawn once per socket from [500, 1500)ms to de-synchronize reconnect storms. */
|
|
33
|
+
const MIN_RECONNECTION_DELAY_MS = 500
|
|
34
|
+
const RECONNECTION_JITTER_MS = 1_000
|
|
35
|
+
const MAX_RECONNECTION_DELAY_MS = 10_000
|
|
36
|
+
|
|
37
|
+
const CLOSED_ERROR = 'WebSocket closed'
|
|
38
|
+
const EXHAUSTED_ERROR = 'WebSocket max reconnect attempts reached'
|
|
39
|
+
const WS_PROVIDER_KEY = 'reconnecting-websocket'
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Options for {@link ReconnectingWebSocket}.
|
|
43
|
+
*
|
|
44
|
+
* @public
|
|
45
|
+
*/
|
|
46
|
+
export interface ReconnectingWebSocketOptions {
|
|
47
|
+
maxRetries?: number
|
|
48
|
+
pingIntervalMs?: number
|
|
49
|
+
/**
|
|
50
|
+
* Keepalive frame sent every `pingIntervalMs` while the socket is open.
|
|
51
|
+
* Framing is venue-specific, so when omitted no keepalive is sent.
|
|
52
|
+
*/
|
|
53
|
+
pingPayload?: string
|
|
54
|
+
/**
|
|
55
|
+
* Stale-stream watchdog window. With `pingPayload` configured, the socket is
|
|
56
|
+
* force-reconnected when no inbound frame arrives within this window.
|
|
57
|
+
* Defaults to 3× `pingIntervalMs`.
|
|
58
|
+
*/
|
|
59
|
+
staleWindowMs?: number
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* A `WebSocket` transport that auto-reconnects with jittered exponential
|
|
64
|
+
* backoff (`partysocket` internals), buffers sends (bounded) while
|
|
65
|
+
* disconnected, keepalive-pings with the caller-supplied `pingPayload`, and
|
|
66
|
+
* force-reconnects a silently stale stream. Surfaces the
|
|
67
|
+
* {@link WsConnectionStatus} state machine: `reconnecting` on transient drops,
|
|
68
|
+
* terminal `disconnected` once the retry budget is exhausted.
|
|
69
|
+
*
|
|
70
|
+
* @public
|
|
71
|
+
*/
|
|
72
|
+
export class ReconnectingWebSocket {
|
|
73
|
+
private readonly socket: PartySocketWebSocket
|
|
74
|
+
private readonly maxRetries: number
|
|
75
|
+
private readonly pingIntervalMs: number
|
|
76
|
+
private readonly pingPayload: string | undefined
|
|
77
|
+
private readonly staleWindowMs: number
|
|
78
|
+
private closed = false
|
|
79
|
+
private reconnectRequested = false
|
|
80
|
+
private lastCloseRetryCount: number
|
|
81
|
+
private pingTimer: ReturnType<typeof setInterval> | null = null
|
|
82
|
+
private staleTimer: ReturnType<typeof setTimeout> | null = null
|
|
83
|
+
private listeners = {
|
|
84
|
+
open: new Set<WsEventMap['open']>(),
|
|
85
|
+
close: new Set<WsEventMap['close']>(),
|
|
86
|
+
error: new Set<WsEventMap['error']>(),
|
|
87
|
+
message: new Set<WsEventMap['message']>(),
|
|
88
|
+
}
|
|
89
|
+
private statusListeners = new Set<WsStatusListener>()
|
|
90
|
+
private status: WsConnectionStatus = 'reconnecting'
|
|
91
|
+
private readyResolvers: Array<{
|
|
92
|
+
resolve: () => void
|
|
93
|
+
reject: (e: Error) => void
|
|
94
|
+
}> = []
|
|
95
|
+
|
|
96
|
+
constructor(url: string, options?: ReconnectingWebSocketOptions) {
|
|
97
|
+
this.maxRetries = options?.maxRetries ?? DEFAULT_MAX_RETRIES
|
|
98
|
+
this.pingIntervalMs = options?.pingIntervalMs ?? 30_000
|
|
99
|
+
this.pingPayload = options?.pingPayload
|
|
100
|
+
this.staleWindowMs =
|
|
101
|
+
options?.staleWindowMs ??
|
|
102
|
+
this.pingIntervalMs * DEFAULT_STALE_WINDOW_PING_INTERVALS
|
|
103
|
+
this.socket = new PartySocketWebSocket(url, undefined, {
|
|
104
|
+
maxRetries: this.maxRetries,
|
|
105
|
+
connectionTimeout: CONNECTION_TIMEOUT_MS,
|
|
106
|
+
minUptime: MIN_UPTIME_MS,
|
|
107
|
+
maxEnqueuedMessages: MAX_ENQUEUED_MESSAGES,
|
|
108
|
+
minReconnectionDelay:
|
|
109
|
+
MIN_RECONNECTION_DELAY_MS + Math.random() * RECONNECTION_JITTER_MS,
|
|
110
|
+
maxReconnectionDelay: MAX_RECONNECTION_DELAY_MS,
|
|
111
|
+
})
|
|
112
|
+
this.lastCloseRetryCount = this.socket.retryCount
|
|
113
|
+
// The onX handlers receive the raw events; addEventListener would hand out
|
|
114
|
+
// partysocket's clones, which rewrite an empty close reason in Node.
|
|
115
|
+
this.socket.onopen = this.handleOpen
|
|
116
|
+
this.socket.onclose = this.handleClose
|
|
117
|
+
this.socket.onerror = this.handleError
|
|
118
|
+
this.socket.onmessage = this.handleMessage
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
private handleOpen = () => {
|
|
122
|
+
this.startPing()
|
|
123
|
+
this.armWatchdog()
|
|
124
|
+
this.setStatus('connected')
|
|
125
|
+
for (const fn of this.listeners.open) {
|
|
126
|
+
this.callListener('open', fn)
|
|
127
|
+
}
|
|
128
|
+
for (const { resolve } of this.readyResolvers) {
|
|
129
|
+
resolve()
|
|
130
|
+
}
|
|
131
|
+
this.readyResolvers = []
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
private handleClose = (event: PartySocketCloseEvent) => {
|
|
135
|
+
this.stopPing()
|
|
136
|
+
this.clearWatchdog()
|
|
137
|
+
if (this.closed) {
|
|
138
|
+
return
|
|
139
|
+
}
|
|
140
|
+
for (const fn of this.listeners.close) {
|
|
141
|
+
this.callListener('close', fn, event.code, event.reason)
|
|
142
|
+
}
|
|
143
|
+
// partysocket schedules the next attempt — incrementing retryCount —
|
|
144
|
+
// before dispatching close, and exhausts silently: a retryCount at the cap
|
|
145
|
+
// that did not move since the previous close means no attempt was
|
|
146
|
+
// scheduled, i.e. the retry budget is spent.
|
|
147
|
+
const retryCount = this.socket.retryCount
|
|
148
|
+
const exhausted =
|
|
149
|
+
!this.reconnectRequested &&
|
|
150
|
+
retryCount >= this.maxRetries &&
|
|
151
|
+
retryCount === this.lastCloseRetryCount
|
|
152
|
+
this.lastCloseRetryCount = retryCount
|
|
153
|
+
if (exhausted) {
|
|
154
|
+
for (const { reject } of this.readyResolvers) {
|
|
155
|
+
reject(new Error(EXHAUSTED_ERROR))
|
|
156
|
+
}
|
|
157
|
+
this.readyResolvers = []
|
|
158
|
+
this.setStatus('disconnected')
|
|
159
|
+
} else {
|
|
160
|
+
this.setStatus('reconnecting')
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
private handleError = (event: PartySocketErrorEvent) => {
|
|
165
|
+
for (const fn of this.listeners.error) {
|
|
166
|
+
this.callListener('error', fn, event)
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
private handleMessage = (event: MessageEvent) => {
|
|
171
|
+
this.armWatchdog()
|
|
172
|
+
const data =
|
|
173
|
+
typeof event.data === 'string' ? event.data : String(event.data)
|
|
174
|
+
for (const fn of this.listeners.message) {
|
|
175
|
+
this.callListener('message', fn, data)
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
private setStatus(status: WsConnectionStatus) {
|
|
180
|
+
if (this.status === status) {
|
|
181
|
+
return
|
|
182
|
+
}
|
|
183
|
+
this.status = status
|
|
184
|
+
for (const fn of this.statusListeners) {
|
|
185
|
+
this.callListener('status', fn, status)
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
private callListener<TArgs extends unknown[]>(
|
|
190
|
+
listenerType: string,
|
|
191
|
+
listener: (...args: TArgs) => void,
|
|
192
|
+
...args: TArgs
|
|
193
|
+
) {
|
|
194
|
+
try {
|
|
195
|
+
listener(...args)
|
|
196
|
+
} catch (error) {
|
|
197
|
+
wsLog.listenerFailure(WS_PROVIDER_KEY, listenerType, error)
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
private startPing() {
|
|
202
|
+
const payload = this.pingPayload
|
|
203
|
+
if (payload === undefined) {
|
|
204
|
+
return
|
|
205
|
+
}
|
|
206
|
+
this.pingTimer = setInterval(() => {
|
|
207
|
+
if (this.socket.readyState === PartySocketWebSocket.OPEN) {
|
|
208
|
+
this.socket.send(payload)
|
|
209
|
+
}
|
|
210
|
+
}, this.pingIntervalMs)
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
private stopPing() {
|
|
214
|
+
if (this.pingTimer) {
|
|
215
|
+
clearInterval(this.pingTimer)
|
|
216
|
+
this.pingTimer = null
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
private armWatchdog() {
|
|
221
|
+
if (this.pingPayload === undefined || this.closed) {
|
|
222
|
+
return
|
|
223
|
+
}
|
|
224
|
+
this.clearWatchdog()
|
|
225
|
+
this.staleTimer = setTimeout(() => {
|
|
226
|
+
// The keepalive went unanswered for the whole window: the connection is
|
|
227
|
+
// half-open and serving stale data — tear it down and reconnect.
|
|
228
|
+
this.reconnect()
|
|
229
|
+
}, this.staleWindowMs)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
private clearWatchdog() {
|
|
233
|
+
if (this.staleTimer) {
|
|
234
|
+
clearTimeout(this.staleTimer)
|
|
235
|
+
this.staleTimer = null
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Send `data`, buffering it (bounded) for replay when the socket is not yet
|
|
241
|
+
* open.
|
|
242
|
+
*
|
|
243
|
+
* @public
|
|
244
|
+
*/
|
|
245
|
+
send(data: string) {
|
|
246
|
+
this.socket.send(data)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Permanently close the socket and suppress further reconnection.
|
|
251
|
+
*
|
|
252
|
+
* @public
|
|
253
|
+
*/
|
|
254
|
+
close() {
|
|
255
|
+
this.closed = true
|
|
256
|
+
this.stopPing()
|
|
257
|
+
this.clearWatchdog()
|
|
258
|
+
this.socket.close()
|
|
259
|
+
for (const { reject } of this.readyResolvers) {
|
|
260
|
+
reject(new Error(CLOSED_ERROR))
|
|
261
|
+
}
|
|
262
|
+
this.readyResolvers = []
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Drop the current connection (if any) and reconnect with a fresh retry
|
|
267
|
+
* budget. Recovers a socket that reached terminal `disconnected`: status
|
|
268
|
+
* returns to `reconnecting` and the normal backoff cycle restarts.
|
|
269
|
+
*
|
|
270
|
+
* @public
|
|
271
|
+
*/
|
|
272
|
+
reconnect() {
|
|
273
|
+
this.closed = false
|
|
274
|
+
// Suppress the exhaustion check for the synchronous teardown close the
|
|
275
|
+
// underlying reconnect dispatches — a fresh attempt is always scheduled.
|
|
276
|
+
this.reconnectRequested = true
|
|
277
|
+
this.socket.reconnect()
|
|
278
|
+
this.reconnectRequested = false
|
|
279
|
+
this.lastCloseRetryCount = this.socket.retryCount
|
|
280
|
+
this.setStatus('reconnecting')
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Register a listener for a socket lifecycle event.
|
|
285
|
+
*
|
|
286
|
+
* @public
|
|
287
|
+
*/
|
|
288
|
+
on<E extends WsEvent>(event: E, fn: WsEventMap[E]) {
|
|
289
|
+
;(this.listeners[event] as Set<WsEventMap[E]>).add(fn)
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Remove a previously registered lifecycle-event listener.
|
|
294
|
+
*
|
|
295
|
+
* @public
|
|
296
|
+
*/
|
|
297
|
+
off<E extends WsEvent>(event: E, fn: WsEventMap[E]) {
|
|
298
|
+
;(this.listeners[event] as Set<WsEventMap[E]>).delete(fn)
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Current connection health. `reconnecting` until the first open;
|
|
303
|
+
* `disconnected` once auto-reconnect is abandoned (terminal until
|
|
304
|
+
* {@link ReconnectingWebSocket.reconnect} is called).
|
|
305
|
+
*
|
|
306
|
+
* @public
|
|
307
|
+
*/
|
|
308
|
+
getStatus(): WsConnectionStatus {
|
|
309
|
+
return this.status
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Register a connection-health listener. Fires on every status transition,
|
|
314
|
+
* including the terminal `disconnected` emitted on reconnect exhaustion.
|
|
315
|
+
*
|
|
316
|
+
* @public
|
|
317
|
+
*/
|
|
318
|
+
onStatus(fn: WsStatusListener) {
|
|
319
|
+
this.statusListeners.add(fn)
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Remove a previously registered connection-health listener.
|
|
324
|
+
*
|
|
325
|
+
* @public
|
|
326
|
+
*/
|
|
327
|
+
offStatus(fn: WsStatusListener) {
|
|
328
|
+
this.statusListeners.delete(fn)
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Resolve once the socket is open; reject if it closes or exhausts retries
|
|
333
|
+
* before opening. When the socket is already terminally dead — `close()`d or
|
|
334
|
+
* reconnect-exhausted (`disconnected`) — rejects immediately rather than
|
|
335
|
+
* queuing a waiter nothing would ever settle.
|
|
336
|
+
*
|
|
337
|
+
* @public
|
|
338
|
+
*/
|
|
339
|
+
ready(): Promise<void> {
|
|
340
|
+
if (this.socket.readyState === PartySocketWebSocket.OPEN) {
|
|
341
|
+
return Promise.resolve()
|
|
342
|
+
}
|
|
343
|
+
if (this.closed) {
|
|
344
|
+
return Promise.reject(new Error(CLOSED_ERROR))
|
|
345
|
+
}
|
|
346
|
+
if (this.status === 'disconnected') {
|
|
347
|
+
return Promise.reject(new Error(EXHAUSTED_ERROR))
|
|
348
|
+
}
|
|
349
|
+
return new Promise((resolve, reject) => {
|
|
350
|
+
this.readyResolvers.push({ resolve, reject })
|
|
351
|
+
})
|
|
352
|
+
}
|
|
353
|
+
}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import type { Subscription, SubscriptionEvent } from '@lifi/perps-types'
|
|
2
|
+
import type {
|
|
3
|
+
ProviderGetQuoteParams,
|
|
4
|
+
QuoteListener,
|
|
5
|
+
} from '../types/provider.js'
|
|
6
|
+
import type { ReconnectingWebSocket } from './ReconnectingWebSocket.js'
|
|
7
|
+
import type {
|
|
8
|
+
SubscriptionListener,
|
|
9
|
+
WsProvider,
|
|
10
|
+
WsStatusListener,
|
|
11
|
+
} from './types.js'
|
|
12
|
+
import { wsLog } from './wsLog.js'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Linger before tearing a channel off the wire after its last listener
|
|
16
|
+
* releases. A re-subscribe to the same key within this window cancels the
|
|
17
|
+
* pending teardown, so React StrictMode's synchronous unmount→remount (ref
|
|
18
|
+
* count 1→0→1) and fast route flips collapse to one wire subscription rather
|
|
19
|
+
* than a subscribe→unsubscribe→subscribe churn the venue would reject.
|
|
20
|
+
*
|
|
21
|
+
* @public
|
|
22
|
+
*/
|
|
23
|
+
export const WS_CHANNEL_TEARDOWN_LINGER_MS = 250
|
|
24
|
+
|
|
25
|
+
interface ChannelEntry {
|
|
26
|
+
/**
|
|
27
|
+
* Per-listener ref count — a `Map`, not a `Set`, because the same listener
|
|
28
|
+
* reference may subscribe twice (StrictMode) and only the matching number of
|
|
29
|
+
* releases may drop it; a `Set` would lose it on the first sibling release.
|
|
30
|
+
*/
|
|
31
|
+
listeners: Map<SubscriptionListener, number>
|
|
32
|
+
/** Wire teardown from {@link WsProviderBase.openChannel}, set once the open resolves. */
|
|
33
|
+
teardown?: () => void
|
|
34
|
+
/** In-flight open, set on the 0→1 transition so concurrent subscribes share it. */
|
|
35
|
+
opening?: Promise<() => void>
|
|
36
|
+
/** Deferred-teardown timer, set on the 1→0 transition; cleared if re-subscribed within the linger. */
|
|
37
|
+
pendingTeardown?: ReturnType<typeof setTimeout>
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Base for per-provider realtime transports. Owns the {@link
|
|
42
|
+
* ReconnectingWebSocket}, the fan-out lifecycle — ref-counted multi-listener
|
|
43
|
+
* subscription per channel key, deferred teardown, status fan-out — so any
|
|
44
|
+
* number of consumers (and StrictMode double-mounts) collapse to exactly one
|
|
45
|
+
* wire subscribe/unsubscribe per key, and the wire-subscription registry:
|
|
46
|
+
* subs recorded via {@link WsProviderBase.registerSub} are sent only while
|
|
47
|
+
* connected and replayed (failure-isolated) on every (re)open. Subclasses own
|
|
48
|
+
* everything wire-specific via {@link WsProviderBase.openChannel}, {@link
|
|
49
|
+
* WsProviderBase.sendSubscribe} and {@link WsProviderBase.handleMessage}:
|
|
50
|
+
* payload framing, frame validation and dispatch.
|
|
51
|
+
*
|
|
52
|
+
* `TSub` is the per-subscription state {@link WsProviderBase.sendSubscribe}
|
|
53
|
+
* needs to (re)build one subscribe frame.
|
|
54
|
+
*
|
|
55
|
+
* @public
|
|
56
|
+
*/
|
|
57
|
+
export abstract class WsProviderBase<TSub = unknown> implements WsProvider {
|
|
58
|
+
protected readonly rws: ReconnectingWebSocket
|
|
59
|
+
protected readonly providerKey: string
|
|
60
|
+
|
|
61
|
+
private readonly channels = new Map<string, ChannelEntry>()
|
|
62
|
+
private readonly statusListeners = new Map<WsStatusListener, number>()
|
|
63
|
+
private readonly wireSubs = new Map<string, TSub>()
|
|
64
|
+
|
|
65
|
+
constructor(rws: ReconnectingWebSocket, providerKey: string) {
|
|
66
|
+
this.providerKey = providerKey
|
|
67
|
+
this.rws = rws
|
|
68
|
+
this.rws.on('message', (data) => this.handleMessage(data))
|
|
69
|
+
this.rws.on('open', () => {
|
|
70
|
+
void this.replaySubs()
|
|
71
|
+
})
|
|
72
|
+
this.rws.onStatus((status) => {
|
|
73
|
+
for (const fn of this.statusListeners.keys()) {
|
|
74
|
+
this.callListener('status', fn, status)
|
|
75
|
+
}
|
|
76
|
+
})
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async subscribe(
|
|
80
|
+
sub: Subscription,
|
|
81
|
+
listener: SubscriptionListener,
|
|
82
|
+
onStatus?: WsStatusListener
|
|
83
|
+
): Promise<() => void> {
|
|
84
|
+
this.reconnect()
|
|
85
|
+
|
|
86
|
+
const key = this.toKey(sub)
|
|
87
|
+
await this.acquireChannel(key, sub, listener)
|
|
88
|
+
|
|
89
|
+
if (onStatus) {
|
|
90
|
+
this.statusListeners.set(
|
|
91
|
+
onStatus,
|
|
92
|
+
(this.statusListeners.get(onStatus) ?? 0) + 1
|
|
93
|
+
)
|
|
94
|
+
onStatus(this.rws.getStatus())
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return () => {
|
|
98
|
+
if (onStatus) {
|
|
99
|
+
const remaining = (this.statusListeners.get(onStatus) ?? 0) - 1
|
|
100
|
+
if (remaining > 0) {
|
|
101
|
+
this.statusListeners.set(onStatus, remaining)
|
|
102
|
+
} else {
|
|
103
|
+
this.statusListeners.delete(onStatus)
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
this.releaseChannel(key, listener)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
reconnect(): void {
|
|
111
|
+
if (this.rws.getStatus() !== 'disconnected') {
|
|
112
|
+
return
|
|
113
|
+
}
|
|
114
|
+
this.rws.reconnect()
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
close(): void {
|
|
118
|
+
for (const entry of this.channels.values()) {
|
|
119
|
+
if (entry.pendingTeardown !== undefined) {
|
|
120
|
+
clearTimeout(entry.pendingTeardown)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
this.onClose()
|
|
124
|
+
this.rws.close()
|
|
125
|
+
this.channels.clear()
|
|
126
|
+
this.statusListeners.clear()
|
|
127
|
+
this.wireSubs.clear()
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** Deliver an event to every listener on `key`. */
|
|
131
|
+
protected emit(key: string, event: SubscriptionEvent): void {
|
|
132
|
+
const entry = this.channels.get(key)
|
|
133
|
+
if (entry === undefined) {
|
|
134
|
+
return
|
|
135
|
+
}
|
|
136
|
+
for (const fn of entry.listeners.keys()) {
|
|
137
|
+
this.callListener(`subscription:${key}`, fn, event)
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Tear `key` off the wire immediately if no listener holds it — i.e. it is
|
|
143
|
+
* lingering in the deferred-teardown window (or its open is still
|
|
144
|
+
* unwinding). Returns `true` when the key is free (absent or just torn
|
|
145
|
+
* down), `false` — leaving the channel untouched — while live listeners
|
|
146
|
+
* hold it. Lets a subclass that enforces an exclusivity invariant across
|
|
147
|
+
* keys reclaim a released channel without waiting out the linger.
|
|
148
|
+
*/
|
|
149
|
+
protected closeChannelIfIdle(key: string): boolean {
|
|
150
|
+
const entry = this.channels.get(key)
|
|
151
|
+
if (entry === undefined) {
|
|
152
|
+
return true
|
|
153
|
+
}
|
|
154
|
+
if (entry.listeners.size > 0) {
|
|
155
|
+
return false
|
|
156
|
+
}
|
|
157
|
+
if (entry.pendingTeardown !== undefined) {
|
|
158
|
+
clearTimeout(entry.pendingTeardown)
|
|
159
|
+
}
|
|
160
|
+
entry.teardown?.()
|
|
161
|
+
this.channels.delete(key)
|
|
162
|
+
return true
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Record a wire subscription for replay-on-(re)open and, when the socket is
|
|
167
|
+
* already connected, send its subscribe frame via {@link sendSubscribe}.
|
|
168
|
+
* While the socket is down the replay loop on the next open is the sole
|
|
169
|
+
* sender — sending in both places would double-subscribe. A failed send
|
|
170
|
+
* removes the sub again so a rejected open leaves no registry entry behind.
|
|
171
|
+
*/
|
|
172
|
+
protected async registerSub(key: string, state: TSub): Promise<void> {
|
|
173
|
+
this.wireSubs.set(key, state)
|
|
174
|
+
if (this.rws.getStatus() !== 'connected') {
|
|
175
|
+
return
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
await this.sendSubscribe(state)
|
|
179
|
+
} catch (err) {
|
|
180
|
+
this.wireSubs.delete(key)
|
|
181
|
+
throw err
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** Forget a wire subscription so the next (re)open no longer replays it. */
|
|
186
|
+
protected unregisterSub(key: string): void {
|
|
187
|
+
this.wireSubs.delete(key)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
private async replaySubs(): Promise<void> {
|
|
191
|
+
for (const [key, state] of this.wireSubs) {
|
|
192
|
+
// Isolate each resubscribe: a send can reject (e.g. an auth-token fetch
|
|
193
|
+
// after reconnect), and one sub's failure must not abort the rest of
|
|
194
|
+
// the loop or escape as an unhandled rejection.
|
|
195
|
+
try {
|
|
196
|
+
await this.sendSubscribe(state)
|
|
197
|
+
} catch (err) {
|
|
198
|
+
wsLog.subscribeFailure(this.providerKey, key, err)
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/** Venue-specific {@link WsProvider.subscribeQuote}; see `resolveSubscribeQuote`. */
|
|
204
|
+
abstract subscribeQuote(
|
|
205
|
+
params: ProviderGetQuoteParams,
|
|
206
|
+
onQuote: QuoteListener
|
|
207
|
+
): Promise<() => void>
|
|
208
|
+
|
|
209
|
+
/** Canonical fan-out key for `sub`; must match the key the subclass emits to. */
|
|
210
|
+
protected abstract toKey(sub: Subscription): string
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Open the channel on the wire (0→1 transition only). Record the wire
|
|
214
|
+
* sub(s) via {@link registerSub} and return a closure that unregisters them
|
|
215
|
+
* and sends the unsubscribe frame(s).
|
|
216
|
+
*/
|
|
217
|
+
protected abstract openChannel(sub: Subscription): Promise<() => void>
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Encode and send the subscribe frame for one registered sub. Called by the
|
|
221
|
+
* base while connected — once on register and again on every (re)open — so
|
|
222
|
+
* it must be safe to invoke repeatedly with the same state (e.g. re-fetch a
|
|
223
|
+
* fresh auth token per call rather than embedding one in `state`).
|
|
224
|
+
*/
|
|
225
|
+
protected abstract sendSubscribe(state: TSub): void | Promise<void>
|
|
226
|
+
|
|
227
|
+
/** Parse one inbound frame and route it via {@link emit}. */
|
|
228
|
+
protected abstract handleMessage(raw: string): void
|
|
229
|
+
|
|
230
|
+
/** Release subclass-only resources on {@link close} (keep-alive, cached state). */
|
|
231
|
+
protected onClose(): void {}
|
|
232
|
+
|
|
233
|
+
private callListener<TArgs extends unknown[]>(
|
|
234
|
+
listenerType: string,
|
|
235
|
+
listener: (...args: TArgs) => void,
|
|
236
|
+
...args: TArgs
|
|
237
|
+
): void {
|
|
238
|
+
try {
|
|
239
|
+
listener(...args)
|
|
240
|
+
} catch (error) {
|
|
241
|
+
wsLog.listenerFailure(this.providerKey, listenerType, error)
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
private async acquireChannel(
|
|
246
|
+
key: string,
|
|
247
|
+
sub: Subscription,
|
|
248
|
+
listener: SubscriptionListener
|
|
249
|
+
): Promise<void> {
|
|
250
|
+
let entry = this.channels.get(key)
|
|
251
|
+
if (entry === undefined) {
|
|
252
|
+
entry = { listeners: new Map() }
|
|
253
|
+
this.channels.set(key, entry)
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Register first (ref-counted) so a frame arriving during an in-flight open
|
|
257
|
+
// is delivered; cancel any pending teardown (re-subscribe within the linger).
|
|
258
|
+
entry.listeners.set(listener, (entry.listeners.get(listener) ?? 0) + 1)
|
|
259
|
+
if (entry.pendingTeardown !== undefined) {
|
|
260
|
+
clearTimeout(entry.pendingTeardown)
|
|
261
|
+
entry.pendingTeardown = undefined
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if (entry.teardown !== undefined) {
|
|
265
|
+
return
|
|
266
|
+
}
|
|
267
|
+
if (entry.opening !== undefined) {
|
|
268
|
+
await entry.opening
|
|
269
|
+
return
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
const opening = this.openChannel(sub)
|
|
273
|
+
entry.opening = opening
|
|
274
|
+
try {
|
|
275
|
+
const teardown = await opening
|
|
276
|
+
const current = this.channels.get(key)
|
|
277
|
+
if (current === undefined || current.listeners.size === 0) {
|
|
278
|
+
// Every listener released while opening — unwind immediately.
|
|
279
|
+
teardown()
|
|
280
|
+
this.channels.delete(key)
|
|
281
|
+
return
|
|
282
|
+
}
|
|
283
|
+
current.teardown = teardown
|
|
284
|
+
current.opening = undefined
|
|
285
|
+
} catch (err) {
|
|
286
|
+
// Open failed: drop the channel so all (concurrent) subscribers reject
|
|
287
|
+
// cleanly and a later subscribe re-opens.
|
|
288
|
+
this.channels.delete(key)
|
|
289
|
+
throw err
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
private releaseChannel(key: string, listener: SubscriptionListener): void {
|
|
294
|
+
const entry = this.channels.get(key)
|
|
295
|
+
if (entry === undefined) {
|
|
296
|
+
return
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const remaining = (entry.listeners.get(listener) ?? 0) - 1
|
|
300
|
+
if (remaining > 0) {
|
|
301
|
+
entry.listeners.set(listener, remaining)
|
|
302
|
+
return
|
|
303
|
+
}
|
|
304
|
+
entry.listeners.delete(listener)
|
|
305
|
+
if (entry.listeners.size > 0) {
|
|
306
|
+
return
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
if (entry.teardown === undefined) {
|
|
310
|
+
// Open not resolved yet — acquireChannel's post-open check unwinds it.
|
|
311
|
+
if (entry.opening === undefined) {
|
|
312
|
+
this.channels.delete(key)
|
|
313
|
+
}
|
|
314
|
+
return
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
if (entry.pendingTeardown !== undefined) {
|
|
318
|
+
return
|
|
319
|
+
}
|
|
320
|
+
entry.pendingTeardown = setTimeout(() => {
|
|
321
|
+
const e = this.channels.get(key)
|
|
322
|
+
if (e === undefined) {
|
|
323
|
+
return
|
|
324
|
+
}
|
|
325
|
+
if (e.listeners.size > 0) {
|
|
326
|
+
e.pendingTeardown = undefined
|
|
327
|
+
return
|
|
328
|
+
}
|
|
329
|
+
e.teardown?.()
|
|
330
|
+
this.channels.delete(key)
|
|
331
|
+
}, WS_CHANNEL_TEARDOWN_LINGER_MS)
|
|
332
|
+
}
|
|
333
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single-flight a promise through a caller-owned cache slot, evicting the
|
|
3
|
+
* cached promise if it rejects so the next call retries cleanly.
|
|
4
|
+
*
|
|
5
|
+
* Concurrent callers share the one in-flight promise; the rejection still
|
|
6
|
+
* propagates to every awaiter that triggered it. Only a settled rejection is
|
|
7
|
+
* evicted — a resolved promise stays cached.
|
|
8
|
+
*
|
|
9
|
+
* @param read - Returns the currently cached promise, or `undefined` if none.
|
|
10
|
+
* @param write - Stores (or with `undefined`, clears) the cached promise.
|
|
11
|
+
* @param factory - Creates the promise when the slot is empty.
|
|
12
|
+
*/
|
|
13
|
+
export function cachePromise<T>(
|
|
14
|
+
read: () => Promise<T> | undefined,
|
|
15
|
+
write: (promise: Promise<T> | undefined) => void,
|
|
16
|
+
factory: () => Promise<T>
|
|
17
|
+
): Promise<T> {
|
|
18
|
+
const cached = read()
|
|
19
|
+
if (cached) {
|
|
20
|
+
return cached
|
|
21
|
+
}
|
|
22
|
+
const promise = factory()
|
|
23
|
+
promise.catch(() => {
|
|
24
|
+
if (read() === promise) {
|
|
25
|
+
write(undefined)
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
write(promise)
|
|
29
|
+
return promise
|
|
30
|
+
}
|