@avalabs/fusion-sdk 0.16.0 → 0.17.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/dist/constants.cjs +1 -1
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +21 -1
- package/dist/constants.d.ts +21 -1
- package/dist/constants.js +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/errors.cjs +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/mod.cjs +1 -1
- package/dist/mod.d.cts +7 -5
- package/dist/mod.d.ts +7 -5
- package/dist/mod.js +1 -1
- package/dist/transfer-manager.cjs +1 -1
- package/dist/transfer-manager.cjs.map +1 -1
- package/dist/transfer-manager.js +1 -1
- package/dist/transfer-manager.js.map +1 -1
- package/dist/transfer-service/_evm-gas.cjs +1 -1
- package/dist/transfer-service/_evm-gas.js +1 -1
- package/dist/transfer-service/_utils.cjs +1 -1
- package/dist/transfer-service/_utils.cjs.map +1 -1
- package/dist/transfer-service/_utils.js +1 -1
- package/dist/transfer-service/_utils.js.map +1 -1
- package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_type-guards.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_type-guards.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_type-guards.js +2 -0
- package/dist/transfer-service/avalanche-cct/_type-guards.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/addresses.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/addresses.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/addresses.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/addresses.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/fees.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/fees.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/fees.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/fees.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/p-chain.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/p-chain.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/p-chain.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/p-chain.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/polling.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/polling.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/polling.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/polling.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/transactions.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/transactions.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/transactions.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/transactions.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/avalanche-cct-service.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/avalanche-cct-service.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/avalanche-cct-service.js +2 -0
- package/dist/transfer-service/avalanche-cct/avalanche-cct-service.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/constants.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/constants.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/constants.js +2 -0
- package/dist/transfer-service/avalanche-cct/constants.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/types.d.cts +33 -0
- package/dist/transfer-service/avalanche-cct/types.d.ts +33 -0
- package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.cjs +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.cjs.map +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.js +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.js.map +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.cjs +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.js +1 -1
- package/dist/transfer-service/avalanche-evm/_utils/wrap.cjs +1 -1
- package/dist/transfer-service/avalanche-evm/_utils/wrap.js +1 -1
- package/dist/transfer-service/fetch-utilities.cjs +1 -1
- package/dist/transfer-service/fetch-utilities.cjs.map +1 -1
- package/dist/transfer-service/fetch-utilities.js +1 -1
- package/dist/transfer-service/fetch-utilities.js.map +1 -1
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.cjs +1 -1
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.cjs.map +1 -1
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.js +1 -1
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.js.map +1 -1
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.cjs +1 -1
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.cjs.map +1 -1
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.js +1 -1
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.js.map +1 -1
- package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs +1 -1
- package/dist/transfer-service/markr/_handlers/estimate-native-fee.js +1 -1
- package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.cjs +1 -1
- package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.cjs.map +1 -1
- package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.js +1 -1
- package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.js.map +1 -1
- package/dist/transfer-service/markr/_handlers/track-transfer.cjs +1 -1
- package/dist/transfer-service/markr/_handlers/track-transfer.js +1 -1
- package/dist/transfer-service/markr/_handlers/transfer-asset.cjs +1 -1
- package/dist/transfer-service/markr/_handlers/transfer-asset.js +1 -1
- package/dist/transfer-service/markr/markr-service.cjs.map +1 -1
- package/dist/transfer-service/markr/markr-service.js.map +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.cjs +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.cjs.map +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.js +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.js.map +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js +1 -1
- package/dist/types/asset.d.cts +18 -2
- package/dist/types/asset.d.ts +18 -2
- package/dist/types/service.d.cts +95 -7
- package/dist/types/service.d.ts +95 -7
- package/dist/types/transfer-manager.d.cts +19 -10
- package/dist/types/transfer-manager.d.ts +19 -10
- package/dist/types/utility-types.d.cts +8 -1
- package/dist/types/utility-types.d.ts +8 -1
- package/dist/utils/asset-id.cjs +1 -1
- package/dist/utils/asset-id.cjs.map +1 -1
- package/dist/utils/asset-id.js +1 -1
- package/dist/utils/asset-id.js.map +1 -1
- package/dist/utils/bridgeable-assets.cjs +2 -0
- package/dist/utils/bridgeable-assets.cjs.map +1 -0
- package/dist/utils/bridgeable-assets.d.cts +16 -0
- package/dist/utils/bridgeable-assets.d.ts +16 -0
- package/dist/utils/bridgeable-assets.js +2 -0
- package/dist/utils/bridgeable-assets.js.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{getAddressesAsBuffers as e,getChainIdFromContext as t,sortUTXOsByAmount as n}from"../_utils.js";import{TransferableOutput as r,avm as i,evm as a,pvm as o,utils as s}from"@avalabs/avalanchejs";function c({amountInNanoAvax:e,baseFeeInNanoAvax:n,context:r,destinationChainAlias:i,fromAddress:o,nonce:c,toAddress:l}){let u=t(i,r),d=s.hexToBuffer(o),[,,f]=s.parse(l);return a.newExportTxFromBaseFee(r,n,e,u,d,[f],c)}function l({amountInNanoAvax:i,changeAddress:a,context:c,destinationChainAlias:l,feeState:u,fromAddresses:d,toAddress:f,utxos:p}){let m=t(l,c),[,,h]=s.parse(f),[,,g]=s.parse(a),_=e(d),v=r.fromNative(c.avaxAssetID,i,[h]),y=n(p,!0);return o.newExportTx({changeAddressesBytes:[g],destinationChainId:m,feeState:u,fromAddressesBytes:_,outputs:[v],utxos:y},c)}function u({amountInNanoAvax:a,changeAddress:o,context:c,destinationChainAlias:l,fromAddresses:u,toAddress:d,utxos:f}){let p=t(l,c),[,,m]=s.parse(d),[,,h]=s.parse(o),g=e(u),_=r.fromNative(c.avaxAssetID,a,[m]),v=n(f,!0);return i.newExportTx(c,p,g,v,[_],{threshold:1,changeAddresses:[h]})}function d(e){switch(e.sourceChainAlias){case`C`:return c(e);case`P`:return l(e);case`X`:return u(e)}}function f({atomicUtxos:n,baseFeeInNanoAvax:r,context:i,fromAddresses:o,sourceChainAlias:c,toAddress:l}){let u=t(c,i),d=e(o),f=s.hexToBuffer(l);return a.newImportTxFromBaseFee(i,f,d,n,u,r)}function p({atomicUtxos:n,context:r,feeState:i,fromAddresses:a,sourceChainAlias:c,toAddress:l}){let u=t(c,r),d=e(a),[,,f]=s.parse(l);return o.newImportTx({fromAddressesBytes:d,feeState:i,sourceChainId:u,toAddressesBytes:[f],utxos:n},r)}function m({atomicUtxos:n,changeAddress:r,context:a,fromAddresses:o,sourceChainAlias:c,toAddress:l}){let u=t(c,a),d=e(o),[,,f]=s.parse(r),[,,p]=s.parse(l);return i.newImportTx(a,u,n,[p],d,{changeAddresses:[f]})}function h(e){switch(e.destinationChainAlias){case`C`:return f(e);case`P`:return p(e);case`X`:return m(e)}}export{d as exportTx,h as importTx};
|
|
2
|
+
//# sourceMappingURL=transactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactions.js","names":[],"sources":["../../../../src/transfer-service/avalanche-cct/_utils/transactions.ts"],"sourcesContent":["import {\n avm,\n evm,\n pvm,\n TransferableOutput,\n utils,\n type Context,\n type UnsignedTx,\n type Utxo,\n} from '@avalabs/avalanchejs';\nimport type { Address as EvmAddress } from 'viem';\nimport type { AvalancheBlockchainAlias } from '../../../constants';\nimport type { XpAddress } from '../types';\nimport { getAddressesAsBuffers, getChainIdFromContext, sortUTXOsByAmount } from '../_utils';\n\ninterface BaseExportTxParams<Alias extends AvalancheBlockchainAlias> {\n amountInNanoAvax: bigint;\n context: Context.Context;\n sourceChainAlias: Alias;\n destinationChainAlias: Exclude<AvalancheBlockchainAlias, Alias>;\n /**\n * The bech32 formatted address of the recipient on the destination chain.\n *\n * Do not use the EVM hex formatted address here for C-Chain. Use the Coreth bech32 formatted address.\n */\n toAddress: XpAddress;\n}\n\nexport interface ExportCChainTxParams extends BaseExportTxParams<'C'> {\n baseFeeInNanoAvax: bigint;\n fromAddress: EvmAddress;\n nonce: bigint;\n}\n\nfunction exportCChainTx({\n amountInNanoAvax,\n baseFeeInNanoAvax,\n context,\n destinationChainAlias,\n fromAddress,\n nonce,\n toAddress,\n}: ExportCChainTxParams): UnsignedTx {\n const destinationChainId = getChainIdFromContext(destinationChainAlias, context);\n const fromAddressBuffer = utils.hexToBuffer(fromAddress);\n const [, , toAddressBytes] = utils.parse(toAddress);\n\n return evm.newExportTxFromBaseFee(\n context,\n baseFeeInNanoAvax,\n amountInNanoAvax,\n destinationChainId,\n fromAddressBuffer,\n [toAddressBytes],\n nonce,\n );\n}\n\nexport interface ExportPChainTxParams extends BaseExportTxParams<'P'> {\n /** P-Chain change address. */\n changeAddress: XpAddress;\n feeState: pvm.FeeState;\n /** List of P-Chain bech32 addresses from user's wallet. */\n fromAddresses: XpAddress[];\n utxos: Utxo[];\n}\n\nfunction exportPChainTx({\n amountInNanoAvax,\n changeAddress,\n context,\n destinationChainAlias,\n feeState,\n fromAddresses,\n toAddress,\n utxos,\n}: ExportPChainTxParams): UnsignedTx {\n const destinationChainId = getChainIdFromContext(destinationChainAlias, context);\n const [, , toAddressBytes] = utils.parse(toAddress);\n\n const [, , changeAddressBytes] = utils.parse(changeAddress);\n const fromAddressesBytes = getAddressesAsBuffers(fromAddresses);\n const output = TransferableOutput.fromNative(context.avaxAssetID, amountInNanoAvax, [toAddressBytes]);\n const sortedUtxos = sortUTXOsByAmount(utxos, true);\n\n return pvm.newExportTx(\n {\n changeAddressesBytes: [changeAddressBytes],\n destinationChainId,\n feeState,\n fromAddressesBytes,\n outputs: [output],\n utxos: sortedUtxos,\n },\n context,\n );\n}\n\nexport interface ExportXChainTxParams extends BaseExportTxParams<'X'> {\n /** X-Chain change address. */\n changeAddress: XpAddress;\n /** List of X-Chain bech32 addresses from user's wallet. */\n fromAddresses: XpAddress[];\n utxos: Utxo[];\n}\n\nfunction exportXChainTx({\n amountInNanoAvax,\n changeAddress,\n context,\n destinationChainAlias,\n fromAddresses,\n toAddress,\n utxos,\n}: ExportXChainTxParams): UnsignedTx {\n const destinationChainId = getChainIdFromContext(destinationChainAlias, context);\n const [, , toAddressBytes] = utils.parse(toAddress);\n\n const [, , changeAddressBytes] = utils.parse(changeAddress);\n const fromAddressesBytes = getAddressesAsBuffers(fromAddresses);\n const output = TransferableOutput.fromNative(context.avaxAssetID, amountInNanoAvax, [toAddressBytes]);\n const sortedUtxos = sortUTXOsByAmount(utxos, true);\n\n return avm.newExportTx(context, destinationChainId, fromAddressesBytes, sortedUtxos, [output], {\n threshold: 1,\n changeAddresses: [changeAddressBytes],\n });\n}\n\nexport type ExportTxParams = ExportCChainTxParams | ExportPChainTxParams | ExportXChainTxParams;\n\nexport function exportTx(params: ExportTxParams): UnsignedTx {\n switch (params.sourceChainAlias) {\n case 'C': {\n return exportCChainTx(params);\n }\n\n case 'P': {\n return exportPChainTx(params);\n }\n\n case 'X': {\n return exportXChainTx(params);\n }\n }\n}\n\ninterface BaseImportTxParams<Alias extends AvalancheBlockchainAlias> {\n atomicUtxos: Utxo[];\n context: Context.Context;\n destinationChainAlias: Alias;\n fromAddresses: XpAddress[];\n sourceChainAlias: Exclude<AvalancheBlockchainAlias, Alias>;\n}\n\nexport interface ImportCChainTxParams extends BaseImportTxParams<'C'> {\n baseFeeInNanoAvax: bigint;\n toAddress: EvmAddress;\n}\n\nfunction importCChainTx({\n atomicUtxos,\n baseFeeInNanoAvax,\n context,\n fromAddresses,\n sourceChainAlias,\n toAddress,\n}: ImportCChainTxParams): UnsignedTx {\n const sourceChainId = getChainIdFromContext(sourceChainAlias, context);\n const fromAddressesBytes = getAddressesAsBuffers(fromAddresses);\n const toAddressBytes = utils.hexToBuffer(toAddress);\n\n return evm.newImportTxFromBaseFee(\n context,\n toAddressBytes,\n fromAddressesBytes,\n atomicUtxos,\n sourceChainId,\n baseFeeInNanoAvax,\n );\n}\n\nexport interface ImportPChainTxParams extends BaseImportTxParams<'P'> {\n feeState: pvm.FeeState;\n toAddress: XpAddress;\n}\n\nfunction importPChainTx({\n atomicUtxos,\n context,\n feeState,\n fromAddresses,\n sourceChainAlias,\n toAddress,\n}: ImportPChainTxParams): UnsignedTx {\n const sourceChainId = getChainIdFromContext(sourceChainAlias, context);\n const fromAddressesBytes = getAddressesAsBuffers(fromAddresses);\n const [, , toAddressBytes] = utils.parse(toAddress);\n\n return pvm.newImportTx(\n {\n fromAddressesBytes,\n feeState,\n sourceChainId,\n toAddressesBytes: [toAddressBytes],\n utxos: atomicUtxos,\n },\n context,\n );\n}\n\nexport interface ImportXChainTxParams extends BaseImportTxParams<'X'> {\n changeAddress: XpAddress;\n toAddress: XpAddress;\n}\n\nfunction importXChainTx({\n atomicUtxos,\n changeAddress,\n context,\n fromAddresses,\n sourceChainAlias,\n toAddress,\n}: ImportXChainTxParams): UnsignedTx {\n const sourceChainId = getChainIdFromContext(sourceChainAlias, context);\n const fromAddressesBytes = getAddressesAsBuffers(fromAddresses);\n const [, , changeAddressBytes] = utils.parse(changeAddress);\n const [, , toAddressBytes] = utils.parse(toAddress);\n\n return avm.newImportTx(context, sourceChainId, atomicUtxos, [toAddressBytes], fromAddressesBytes, {\n changeAddresses: [changeAddressBytes],\n });\n}\n\nexport type ImportTxParams = ImportCChainTxParams | ImportPChainTxParams | ImportXChainTxParams;\n\nexport function importTx(params: ImportTxParams): UnsignedTx {\n switch (params.destinationChainAlias) {\n case 'C': {\n return importCChainTx(params);\n }\n\n case 'P': {\n return importPChainTx(params);\n }\n\n case 'X': {\n return importXChainTx(params);\n }\n }\n}\n"],"mappings":"uMAkCA,SAAS,EAAe,CACtB,mBACA,oBACA,UACA,wBACA,cACA,QACA,aACmC,CACnC,IAAM,EAAqB,EAAsB,EAAuB,EAAQ,CAC1E,EAAoB,EAAM,YAAY,EAAY,CAClD,GAAK,GAAkB,EAAM,MAAM,EAAU,CAEnD,OAAO,EAAI,uBACT,EACA,EACA,EACA,EACA,EACA,CAAC,EAAe,CAChB,EACD,CAYH,SAAS,EAAe,CACtB,mBACA,gBACA,UACA,wBACA,WACA,gBACA,YACA,SACmC,CACnC,IAAM,EAAqB,EAAsB,EAAuB,EAAQ,CAC1E,GAAK,GAAkB,EAAM,MAAM,EAAU,CAE7C,GAAK,GAAsB,EAAM,MAAM,EAAc,CACrD,EAAqB,EAAsB,EAAc,CACzD,EAAS,EAAmB,WAAW,EAAQ,YAAa,EAAkB,CAAC,EAAe,CAAC,CAC/F,EAAc,EAAkB,EAAO,GAAK,CAElD,OAAO,EAAI,YACT,CACE,qBAAsB,CAAC,EAAmB,CAC1C,qBACA,WACA,qBACA,QAAS,CAAC,EAAO,CACjB,MAAO,EACR,CACD,EACD,CAWH,SAAS,EAAe,CACtB,mBACA,gBACA,UACA,wBACA,gBACA,YACA,SACmC,CACnC,IAAM,EAAqB,EAAsB,EAAuB,EAAQ,CAC1E,GAAK,GAAkB,EAAM,MAAM,EAAU,CAE7C,GAAK,GAAsB,EAAM,MAAM,EAAc,CACrD,EAAqB,EAAsB,EAAc,CACzD,EAAS,EAAmB,WAAW,EAAQ,YAAa,EAAkB,CAAC,EAAe,CAAC,CAC/F,EAAc,EAAkB,EAAO,GAAK,CAElD,OAAO,EAAI,YAAY,EAAS,EAAoB,EAAoB,EAAa,CAAC,EAAO,CAAE,CAC7F,UAAW,EACX,gBAAiB,CAAC,EAAmB,CACtC,CAAC,CAKJ,SAAgB,EAAS,EAAoC,CAC3D,OAAQ,EAAO,iBAAf,CACE,IAAK,IACH,OAAO,EAAe,EAAO,CAG/B,IAAK,IACH,OAAO,EAAe,EAAO,CAG/B,IAAK,IACH,OAAO,EAAe,EAAO,EAkBnC,SAAS,EAAe,CACtB,cACA,oBACA,UACA,gBACA,mBACA,aACmC,CACnC,IAAM,EAAgB,EAAsB,EAAkB,EAAQ,CAChE,EAAqB,EAAsB,EAAc,CACzD,EAAiB,EAAM,YAAY,EAAU,CAEnD,OAAO,EAAI,uBACT,EACA,EACA,EACA,EACA,EACA,EACD,CAQH,SAAS,EAAe,CACtB,cACA,UACA,WACA,gBACA,mBACA,aACmC,CACnC,IAAM,EAAgB,EAAsB,EAAkB,EAAQ,CAChE,EAAqB,EAAsB,EAAc,CACzD,GAAK,GAAkB,EAAM,MAAM,EAAU,CAEnD,OAAO,EAAI,YACT,CACE,qBACA,WACA,gBACA,iBAAkB,CAAC,EAAe,CAClC,MAAO,EACR,CACD,EACD,CAQH,SAAS,EAAe,CACtB,cACA,gBACA,UACA,gBACA,mBACA,aACmC,CACnC,IAAM,EAAgB,EAAsB,EAAkB,EAAQ,CAChE,EAAqB,EAAsB,EAAc,CACzD,GAAK,GAAsB,EAAM,MAAM,EAAc,CACrD,GAAK,GAAkB,EAAM,MAAM,EAAU,CAEnD,OAAO,EAAI,YAAY,EAAS,EAAe,EAAa,CAAC,EAAe,CAAE,EAAoB,CAChG,gBAAiB,CAAC,EAAmB,CACtC,CAAC,CAKJ,SAAgB,EAAS,EAAoC,CAC3D,OAAQ,EAAO,sBAAf,CACE,IAAK,IACH,OAAO,EAAe,EAAO,CAG/B,IAAK,IACH,OAAO,EAAe,EAAO,CAG/B,IAAK,IACH,OAAO,EAAe,EAAO"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants.cjs`),t=require(`../../errors.cjs`),n=require(`./constants.cjs`);let r=require(`@avalabs/avalanchejs`),i=require(`es-toolkit`);function a(e,t){try{return e()}catch(e){throw t(e)}}function o({amountIn:e,sourceAsset:{decimals:t},targetAsset:{decimals:n}}){return t<n?e*10n**BigInt(n-t):t>n?e/10n**BigInt(t-n):e}function s(e){return e&&e.replace(n.CHAIN_PREFIXES_REGEX,``)}function c(e,t){let n=t?`fuji`:`avax`;return s(e).startsWith(n)}function l(n,r){let i=r?e.AvalancheFujiBlockchainChainIds:e.AvalancheMainnetBlockchainChainIds;if(n===i.C)return`C`;if(n===i.P)return`P`;if(n===i.X)return`X`;throw new t.InvalidParamsError(`Unsupported Avalanche chainId for ${r?`testnet`:`mainnet`}: ${n}`,`Chain ID ${n} is not supported for ${r?`Fuji`:`Mainnet`}. Supported chain IDs are: ${Object.values(i).join(`, `)}.`)}function u(e){return e===`C`?n.AVALANCHE_C_CHAIN_NATIVE_ASSET:n.AVALANCHE_PX_CHAIN_NATIVE_ASSET}function d(r){switch(r){case e.Environment.TEST:return n.AVALANCHE_API_URIS.fuji;case e.Environment.PROD:return n.AVALANCHE_API_URIS.mainnet;default:throw new t.SdkError(`Unsupported environment for Avalanche CCT service.`,t.ErrorCode.INVALID_PARAMS)}}function f(e){return e*n.WEI_PER_NANO_AVAX_BIGINT}function p(e,n){switch(e){case`C`:return n.cBlockchainID;case`P`:return n.pBlockchainID;case`X`:return n.xBlockchainID;default:throw new t.InvalidParamsError(`Unsupported chain alias: ${e}`)}}function m(e,t){return(0,i.orderBy)(e.map(e=>({utxo:e,...r.utils.getUtxoInfo(e)})),[`amount`],[t?`desc`:`asc`]).map(({utxo:e})=>e)}function h(e){return e.map(e=>r.utils.parse(e)[2])}function g(n){switch(n){case e.Environment.TEST:return!0;case e.Environment.PROD:return!1;default:throw new t.SdkError(`Unsupported environment for Avalanche CCT service.`,t.ErrorCode.INVALID_PARAMS)}}function _(e,n){let i=d(e);switch(n){case`C`:return new r.evm.EVMApi(i);case`P`:return new r.pvm.PVMApi(i);case`X`:return new r.avm.AVMApi(i);default:throw new t.InvalidParamsError(`Unsupported chain alias: ${n}`,`Can not get Avalanche provider for unsupported chain alias.`)}}exports.convertNanoAvaxToWei=f,exports.getAddressesAsBuffers=h,exports.getAvalancheApiUrl=d,exports.getAvalancheProvider=_,exports.getChainAlias=l,exports.getChainIdFromContext=p,exports.getEnvironmentIsTestnet=g,exports.getNativeTokenForChainAlias=u,exports.getOutputAmountForAvalancheCct=o,exports.sortUTXOsByAmount=m,exports.stripAddressPrefix=s,exports.tryOrThrow=a,exports.xpAddressMatchesNetwork=c;
|
|
2
|
+
//# sourceMappingURL=_utils.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_utils.cjs","names":["CHAIN_PREFIXES_REGEX","AvalancheFujiBlockchainChainIds","AvalancheMainnetBlockchainChainIds","InvalidParamsError","AVALANCHE_C_CHAIN_NATIVE_ASSET","AVALANCHE_PX_CHAIN_NATIVE_ASSET","Environment","AVALANCHE_API_URIS","SdkError","ErrorCode","WEI_PER_NANO_AVAX_BIGINT","utils","evm","pvm","avm"],"sources":["../../../src/transfer-service/avalanche-cct/_utils.ts"],"sourcesContent":["import { avm, evm, pvm, utils, type Context, type Utxo } from '@avalabs/avalanchejs';\nimport { orderBy } from 'es-toolkit';\nimport {\n AvalancheChainIds,\n AvalancheFujiBlockchainChainIds,\n AvalancheMainnetBlockchainChainIds,\n Environment,\n type AvalancheBlockchainAlias,\n} from '../../constants';\nimport type { NativeAsset } from '../../types/asset';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { XpAddress } from './types';\nimport {\n AVALANCHE_API_URIS,\n AVALANCHE_C_CHAIN_NATIVE_ASSET,\n AVALANCHE_PX_CHAIN_NATIVE_ASSET,\n CHAIN_PREFIXES_REGEX,\n WEI_PER_NANO_AVAX_BIGINT,\n} from './constants';\nimport { ErrorCode, InvalidParamsError, SdkError } from '../../errors';\n\nexport function tryOrThrow<T>(fn: () => T, errorHandler: (error: unknown) => SdkError): T {\n try {\n return fn();\n } catch (error) {\n throw errorHandler(error);\n }\n}\n\n/**\n * Remaps Avalanche C-Chain CAIP2 chain IDs to their corresponding EIP-155 chain IDs.\n */\nexport function mapAvalancheBlockchainChainIdToEip155ChainId(caip2ChainId: Caip2ChainId): Caip2ChainId {\n switch (caip2ChainId) {\n case 'avax:8aDU0Kqh-5d23op-B-r-4YbQFRbsgF9a': {\n return AvalancheChainIds.MAINNET;\n }\n\n case 'avax:YRLfeDBJpfEqUWe2FYR1OpXsnDDZeKWd': {\n return AvalancheChainIds.FUJI;\n }\n\n default: {\n return caip2ChainId;\n }\n }\n}\n\nexport function getOutputAmountForAvalancheCct({\n amountIn,\n sourceAsset: { decimals: sourceDecimals },\n targetAsset: { decimals: targetDecimals },\n}: {\n amountIn: bigint;\n sourceAsset: NativeAsset;\n targetAsset: NativeAsset;\n}): bigint {\n if (sourceDecimals < targetDecimals) {\n return amountIn * 10n ** BigInt(targetDecimals - sourceDecimals);\n }\n\n if (sourceDecimals > targetDecimals) {\n return amountIn / 10n ** BigInt(sourceDecimals - targetDecimals);\n }\n\n return amountIn;\n}\n\nexport function stripAddressPrefix<T extends string>(address: T): T {\n return address ? (address.replace(CHAIN_PREFIXES_REGEX, '') as T) : address;\n}\n\nexport function xpAddressMatchesNetwork(xpAddress: XpAddress, isTestnet: boolean): boolean {\n const prefix = isTestnet ? 'fuji' : 'avax';\n return stripAddressPrefix(xpAddress).startsWith(prefix);\n}\n\nexport function getChainAlias(chainId: Caip2ChainId, isTestnet: boolean): AvalancheBlockchainAlias {\n const chainIds = isTestnet ? AvalancheFujiBlockchainChainIds : AvalancheMainnetBlockchainChainIds;\n\n if (chainId === chainIds.C) {\n return 'C';\n }\n\n if (chainId === chainIds.P) {\n return 'P';\n }\n\n if (chainId === chainIds.X) {\n return 'X';\n }\n throw new InvalidParamsError(\n `Unsupported Avalanche chainId for ${isTestnet ? 'testnet' : 'mainnet'}: ${chainId}`,\n `Chain ID ${chainId} is not supported for ${\n isTestnet ? 'Fuji' : 'Mainnet'\n }. Supported chain IDs are: ${Object.values(chainIds).join(', ')}.`,\n );\n}\n\nexport function getNativeTokenForChainAlias(chainAlias: AvalancheBlockchainAlias): NativeAsset {\n if (chainAlias === 'C') {\n return AVALANCHE_C_CHAIN_NATIVE_ASSET;\n }\n\n return AVALANCHE_PX_CHAIN_NATIVE_ASSET;\n}\n\nexport function getAvalancheApiUrl(environment: Environment): string {\n switch (environment) {\n case Environment.TEST: {\n return AVALANCHE_API_URIS.fuji;\n }\n\n case Environment.PROD: {\n return AVALANCHE_API_URIS.mainnet;\n }\n\n default: {\n throw new SdkError('Unsupported environment for Avalanche CCT service.', ErrorCode.INVALID_PARAMS);\n }\n }\n}\n\nexport function convertNanoAvaxToWei(nanoAvaxAmount: bigint): bigint {\n return nanoAvaxAmount * WEI_PER_NANO_AVAX_BIGINT;\n}\n\nexport function convertWeiToNanoAvax(weiAmount: bigint): bigint {\n return weiAmount / WEI_PER_NANO_AVAX_BIGINT;\n}\n\nexport function getChainIdFromContext(chainAlias: AvalancheBlockchainAlias, context: Context.Context): string {\n switch (chainAlias) {\n case 'C': {\n return context.cBlockchainID;\n }\n case 'P': {\n return context.pBlockchainID;\n }\n case 'X': {\n return context.xBlockchainID;\n }\n default: {\n throw new InvalidParamsError(`Unsupported chain alias: ${chainAlias}`);\n }\n }\n}\n\nexport function sortUTXOsByAmount(utxos: Utxo[], isDescending: boolean): Utxo[] {\n const utxosWithInfo = utxos.map((utxo) => ({\n utxo,\n ...utils.getUtxoInfo(utxo),\n }));\n\n return orderBy(utxosWithInfo, ['amount'], [isDescending ? 'desc' : 'asc']).map(({ utxo }) => utxo);\n}\n\nexport function getAddressesAsBuffers(addresses: string[]): Uint8Array[] {\n return addresses.map((address) => utils.parse(address)[2]);\n}\n\nexport function getEnvironmentIsTestnet(environment: Environment): boolean {\n switch (environment) {\n case Environment.TEST: {\n return true;\n }\n\n case Environment.PROD: {\n return false;\n }\n\n default: {\n throw new SdkError('Unsupported environment for Avalanche CCT service.', ErrorCode.INVALID_PARAMS);\n }\n }\n}\n\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'C'): evm.EVMApi;\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'P'): pvm.PVMApi;\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'X'): avm.AVMApi;\nexport function getAvalancheProvider(\n environment: Environment,\n chainAlias: AvalancheBlockchainAlias,\n): avm.AVMApi | pvm.PVMApi | evm.EVMApi {\n const baseUrl = getAvalancheApiUrl(environment);\n\n switch (chainAlias) {\n case 'C': {\n return new evm.EVMApi(baseUrl);\n }\n case 'P': {\n return new pvm.PVMApi(baseUrl);\n }\n case 'X': {\n return new avm.AVMApi(baseUrl);\n }\n default: {\n throw new InvalidParamsError(\n `Unsupported chain alias: ${chainAlias}`,\n 'Can not get Avalanche provider for unsupported chain alias.',\n );\n }\n }\n}\n"],"mappings":"gNAqBA,SAAgB,EAAc,EAAa,EAA+C,CACxF,GAAI,CACF,OAAO,GAAI,OACJ,EAAO,CACd,MAAM,EAAa,EAAM,EAuB7B,SAAgB,EAA+B,CAC7C,WACA,YAAa,CAAE,SAAU,GACzB,YAAa,CAAE,SAAU,IAKhB,CAST,OARI,EAAiB,EACZ,EAAW,KAAO,OAAO,EAAiB,EAAe,CAG9D,EAAiB,EACZ,EAAW,KAAO,OAAO,EAAiB,EAAe,CAG3D,EAGT,SAAgB,EAAqC,EAAe,CAClE,OAAO,GAAW,EAAQ,QAAQA,EAAAA,qBAAsB,GAAG,CAG7D,SAAgB,EAAwB,EAAsB,EAA6B,CACzF,IAAM,EAAS,EAAY,OAAS,OACpC,OAAO,EAAmB,EAAU,CAAC,WAAW,EAAO,CAGzD,SAAgB,EAAc,EAAuB,EAA8C,CACjG,IAAM,EAAW,EAAYC,EAAAA,gCAAkCC,EAAAA,mCAE/D,GAAI,IAAY,EAAS,EACvB,MAAO,IAGT,GAAI,IAAY,EAAS,EACvB,MAAO,IAGT,GAAI,IAAY,EAAS,EACvB,MAAO,IAET,MAAM,IAAIC,EAAAA,mBACR,qCAAqC,EAAY,UAAY,UAAU,IAAI,IAC3E,YAAY,EAAQ,wBAClB,EAAY,OAAS,UACtB,6BAA6B,OAAO,OAAO,EAAS,CAAC,KAAK,KAAK,CAAC,GAClE,CAGH,SAAgB,EAA4B,EAAmD,CAK7F,OAJI,IAAe,IACVC,EAAAA,+BAGFC,EAAAA,gCAGT,SAAgB,EAAmB,EAAkC,CACnE,OAAQ,EAAR,CACE,KAAKC,EAAAA,YAAY,KACf,OAAOC,EAAAA,mBAAmB,KAG5B,KAAKD,EAAAA,YAAY,KACf,OAAOC,EAAAA,mBAAmB,QAG5B,QACE,MAAM,IAAIC,EAAAA,SAAS,qDAAsDC,EAAAA,UAAU,eAAe,EAKxG,SAAgB,EAAqB,EAAgC,CACnE,OAAO,EAAiBC,EAAAA,yBAO1B,SAAgB,EAAsB,EAAsC,EAAkC,CAC5G,OAAQ,EAAR,CACE,IAAK,IACH,OAAO,EAAQ,cAEjB,IAAK,IACH,OAAO,EAAQ,cAEjB,IAAK,IACH,OAAO,EAAQ,cAEjB,QACE,MAAM,IAAIP,EAAAA,mBAAmB,4BAA4B,IAAa,EAK5E,SAAgB,EAAkB,EAAe,EAA+B,CAM9E,OAAA,EAAA,EAAA,SALsB,EAAM,IAAK,IAAU,CACzC,OACA,GAAGQ,EAAAA,MAAM,YAAY,EAAK,CAC3B,EAAE,CAE2B,CAAC,SAAS,CAAE,CAAC,EAAe,OAAS,MAAM,CAAC,CAAC,KAAK,CAAE,UAAW,EAAK,CAGpG,SAAgB,EAAsB,EAAmC,CACvE,OAAO,EAAU,IAAK,GAAYA,EAAAA,MAAM,MAAM,EAAQ,CAAC,GAAG,CAG5D,SAAgB,EAAwB,EAAmC,CACzE,OAAQ,EAAR,CACE,KAAKL,EAAAA,YAAY,KACf,MAAO,GAGT,KAAKA,EAAAA,YAAY,KACf,MAAO,GAGT,QACE,MAAM,IAAIE,EAAAA,SAAS,qDAAsDC,EAAAA,UAAU,eAAe,EAQxG,SAAgB,EACd,EACA,EACsC,CACtC,IAAM,EAAU,EAAmB,EAAY,CAE/C,OAAQ,EAAR,CACE,IAAK,IACH,OAAO,IAAIG,EAAAA,IAAI,OAAO,EAAQ,CAEhC,IAAK,IACH,OAAO,IAAIC,EAAAA,IAAI,OAAO,EAAQ,CAEhC,IAAK,IACH,OAAO,IAAIC,EAAAA,IAAI,OAAO,EAAQ,CAEhC,QACE,MAAM,IAAIX,EAAAA,mBACR,4BAA4B,IAC5B,8DACD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{AvalancheFujiBlockchainChainIds as e,AvalancheMainnetBlockchainChainIds as t,Environment as n}from"../../constants.js";import{ErrorCode as r,InvalidParamsError as i,SdkError as a}from"../../errors.js";import{AVALANCHE_API_URIS as o,AVALANCHE_C_CHAIN_NATIVE_ASSET as s,AVALANCHE_PX_CHAIN_NATIVE_ASSET as c,CHAIN_PREFIXES_REGEX as l,WEI_PER_NANO_AVAX_BIGINT as u}from"./constants.js";import{avm as d,evm as f,pvm as p,utils as m}from"@avalabs/avalanchejs";import{orderBy as h}from"es-toolkit";function g(e,t){try{return e()}catch(e){throw t(e)}}function _({amountIn:e,sourceAsset:{decimals:t},targetAsset:{decimals:n}}){return t<n?e*10n**BigInt(n-t):t>n?e/10n**BigInt(t-n):e}function v(e){return e&&e.replace(l,``)}function y(e,t){let n=t?`fuji`:`avax`;return v(e).startsWith(n)}function b(n,r){let a=r?e:t;if(n===a.C)return`C`;if(n===a.P)return`P`;if(n===a.X)return`X`;throw new i(`Unsupported Avalanche chainId for ${r?`testnet`:`mainnet`}: ${n}`,`Chain ID ${n} is not supported for ${r?`Fuji`:`Mainnet`}. Supported chain IDs are: ${Object.values(a).join(`, `)}.`)}function x(e){return e===`C`?s:c}function S(e){switch(e){case n.TEST:return o.fuji;case n.PROD:return o.mainnet;default:throw new a(`Unsupported environment for Avalanche CCT service.`,r.INVALID_PARAMS)}}function C(e){return e*u}function w(e,t){switch(e){case`C`:return t.cBlockchainID;case`P`:return t.pBlockchainID;case`X`:return t.xBlockchainID;default:throw new i(`Unsupported chain alias: ${e}`)}}function T(e,t){return h(e.map(e=>({utxo:e,...m.getUtxoInfo(e)})),[`amount`],[t?`desc`:`asc`]).map(({utxo:e})=>e)}function E(e){return e.map(e=>m.parse(e)[2])}function D(e){switch(e){case n.TEST:return!0;case n.PROD:return!1;default:throw new a(`Unsupported environment for Avalanche CCT service.`,r.INVALID_PARAMS)}}function O(e,t){let n=S(e);switch(t){case`C`:return new f.EVMApi(n);case`P`:return new p.PVMApi(n);case`X`:return new d.AVMApi(n);default:throw new i(`Unsupported chain alias: ${t}`,`Can not get Avalanche provider for unsupported chain alias.`)}}export{C as convertNanoAvaxToWei,E as getAddressesAsBuffers,S as getAvalancheApiUrl,O as getAvalancheProvider,b as getChainAlias,w as getChainIdFromContext,D as getEnvironmentIsTestnet,x as getNativeTokenForChainAlias,_ as getOutputAmountForAvalancheCct,T as sortUTXOsByAmount,v as stripAddressPrefix,g as tryOrThrow,y as xpAddressMatchesNetwork};
|
|
2
|
+
//# sourceMappingURL=_utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_utils.js","names":[],"sources":["../../../src/transfer-service/avalanche-cct/_utils.ts"],"sourcesContent":["import { avm, evm, pvm, utils, type Context, type Utxo } from '@avalabs/avalanchejs';\nimport { orderBy } from 'es-toolkit';\nimport {\n AvalancheChainIds,\n AvalancheFujiBlockchainChainIds,\n AvalancheMainnetBlockchainChainIds,\n Environment,\n type AvalancheBlockchainAlias,\n} from '../../constants';\nimport type { NativeAsset } from '../../types/asset';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { XpAddress } from './types';\nimport {\n AVALANCHE_API_URIS,\n AVALANCHE_C_CHAIN_NATIVE_ASSET,\n AVALANCHE_PX_CHAIN_NATIVE_ASSET,\n CHAIN_PREFIXES_REGEX,\n WEI_PER_NANO_AVAX_BIGINT,\n} from './constants';\nimport { ErrorCode, InvalidParamsError, SdkError } from '../../errors';\n\nexport function tryOrThrow<T>(fn: () => T, errorHandler: (error: unknown) => SdkError): T {\n try {\n return fn();\n } catch (error) {\n throw errorHandler(error);\n }\n}\n\n/**\n * Remaps Avalanche C-Chain CAIP2 chain IDs to their corresponding EIP-155 chain IDs.\n */\nexport function mapAvalancheBlockchainChainIdToEip155ChainId(caip2ChainId: Caip2ChainId): Caip2ChainId {\n switch (caip2ChainId) {\n case 'avax:8aDU0Kqh-5d23op-B-r-4YbQFRbsgF9a': {\n return AvalancheChainIds.MAINNET;\n }\n\n case 'avax:YRLfeDBJpfEqUWe2FYR1OpXsnDDZeKWd': {\n return AvalancheChainIds.FUJI;\n }\n\n default: {\n return caip2ChainId;\n }\n }\n}\n\nexport function getOutputAmountForAvalancheCct({\n amountIn,\n sourceAsset: { decimals: sourceDecimals },\n targetAsset: { decimals: targetDecimals },\n}: {\n amountIn: bigint;\n sourceAsset: NativeAsset;\n targetAsset: NativeAsset;\n}): bigint {\n if (sourceDecimals < targetDecimals) {\n return amountIn * 10n ** BigInt(targetDecimals - sourceDecimals);\n }\n\n if (sourceDecimals > targetDecimals) {\n return amountIn / 10n ** BigInt(sourceDecimals - targetDecimals);\n }\n\n return amountIn;\n}\n\nexport function stripAddressPrefix<T extends string>(address: T): T {\n return address ? (address.replace(CHAIN_PREFIXES_REGEX, '') as T) : address;\n}\n\nexport function xpAddressMatchesNetwork(xpAddress: XpAddress, isTestnet: boolean): boolean {\n const prefix = isTestnet ? 'fuji' : 'avax';\n return stripAddressPrefix(xpAddress).startsWith(prefix);\n}\n\nexport function getChainAlias(chainId: Caip2ChainId, isTestnet: boolean): AvalancheBlockchainAlias {\n const chainIds = isTestnet ? AvalancheFujiBlockchainChainIds : AvalancheMainnetBlockchainChainIds;\n\n if (chainId === chainIds.C) {\n return 'C';\n }\n\n if (chainId === chainIds.P) {\n return 'P';\n }\n\n if (chainId === chainIds.X) {\n return 'X';\n }\n throw new InvalidParamsError(\n `Unsupported Avalanche chainId for ${isTestnet ? 'testnet' : 'mainnet'}: ${chainId}`,\n `Chain ID ${chainId} is not supported for ${\n isTestnet ? 'Fuji' : 'Mainnet'\n }. Supported chain IDs are: ${Object.values(chainIds).join(', ')}.`,\n );\n}\n\nexport function getNativeTokenForChainAlias(chainAlias: AvalancheBlockchainAlias): NativeAsset {\n if (chainAlias === 'C') {\n return AVALANCHE_C_CHAIN_NATIVE_ASSET;\n }\n\n return AVALANCHE_PX_CHAIN_NATIVE_ASSET;\n}\n\nexport function getAvalancheApiUrl(environment: Environment): string {\n switch (environment) {\n case Environment.TEST: {\n return AVALANCHE_API_URIS.fuji;\n }\n\n case Environment.PROD: {\n return AVALANCHE_API_URIS.mainnet;\n }\n\n default: {\n throw new SdkError('Unsupported environment for Avalanche CCT service.', ErrorCode.INVALID_PARAMS);\n }\n }\n}\n\nexport function convertNanoAvaxToWei(nanoAvaxAmount: bigint): bigint {\n return nanoAvaxAmount * WEI_PER_NANO_AVAX_BIGINT;\n}\n\nexport function convertWeiToNanoAvax(weiAmount: bigint): bigint {\n return weiAmount / WEI_PER_NANO_AVAX_BIGINT;\n}\n\nexport function getChainIdFromContext(chainAlias: AvalancheBlockchainAlias, context: Context.Context): string {\n switch (chainAlias) {\n case 'C': {\n return context.cBlockchainID;\n }\n case 'P': {\n return context.pBlockchainID;\n }\n case 'X': {\n return context.xBlockchainID;\n }\n default: {\n throw new InvalidParamsError(`Unsupported chain alias: ${chainAlias}`);\n }\n }\n}\n\nexport function sortUTXOsByAmount(utxos: Utxo[], isDescending: boolean): Utxo[] {\n const utxosWithInfo = utxos.map((utxo) => ({\n utxo,\n ...utils.getUtxoInfo(utxo),\n }));\n\n return orderBy(utxosWithInfo, ['amount'], [isDescending ? 'desc' : 'asc']).map(({ utxo }) => utxo);\n}\n\nexport function getAddressesAsBuffers(addresses: string[]): Uint8Array[] {\n return addresses.map((address) => utils.parse(address)[2]);\n}\n\nexport function getEnvironmentIsTestnet(environment: Environment): boolean {\n switch (environment) {\n case Environment.TEST: {\n return true;\n }\n\n case Environment.PROD: {\n return false;\n }\n\n default: {\n throw new SdkError('Unsupported environment for Avalanche CCT service.', ErrorCode.INVALID_PARAMS);\n }\n }\n}\n\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'C'): evm.EVMApi;\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'P'): pvm.PVMApi;\nexport function getAvalancheProvider(environment: Environment, chainAlias: 'X'): avm.AVMApi;\nexport function getAvalancheProvider(\n environment: Environment,\n chainAlias: AvalancheBlockchainAlias,\n): avm.AVMApi | pvm.PVMApi | evm.EVMApi {\n const baseUrl = getAvalancheApiUrl(environment);\n\n switch (chainAlias) {\n case 'C': {\n return new evm.EVMApi(baseUrl);\n }\n case 'P': {\n return new pvm.PVMApi(baseUrl);\n }\n case 'X': {\n return new avm.AVMApi(baseUrl);\n }\n default: {\n throw new InvalidParamsError(\n `Unsupported chain alias: ${chainAlias}`,\n 'Can not get Avalanche provider for unsupported chain alias.',\n );\n }\n }\n}\n"],"mappings":"kfAqBA,SAAgB,EAAc,EAAa,EAA+C,CACxF,GAAI,CACF,OAAO,GAAI,OACJ,EAAO,CACd,MAAM,EAAa,EAAM,EAuB7B,SAAgB,EAA+B,CAC7C,WACA,YAAa,CAAE,SAAU,GACzB,YAAa,CAAE,SAAU,IAKhB,CAST,OARI,EAAiB,EACZ,EAAW,KAAO,OAAO,EAAiB,EAAe,CAG9D,EAAiB,EACZ,EAAW,KAAO,OAAO,EAAiB,EAAe,CAG3D,EAGT,SAAgB,EAAqC,EAAe,CAClE,OAAO,GAAW,EAAQ,QAAQ,EAAsB,GAAG,CAG7D,SAAgB,EAAwB,EAAsB,EAA6B,CACzF,IAAM,EAAS,EAAY,OAAS,OACpC,OAAO,EAAmB,EAAU,CAAC,WAAW,EAAO,CAGzD,SAAgB,EAAc,EAAuB,EAA8C,CACjG,IAAM,EAAW,EAAY,EAAkC,EAE/D,GAAI,IAAY,EAAS,EACvB,MAAO,IAGT,GAAI,IAAY,EAAS,EACvB,MAAO,IAGT,GAAI,IAAY,EAAS,EACvB,MAAO,IAET,MAAM,IAAI,EACR,qCAAqC,EAAY,UAAY,UAAU,IAAI,IAC3E,YAAY,EAAQ,wBAClB,EAAY,OAAS,UACtB,6BAA6B,OAAO,OAAO,EAAS,CAAC,KAAK,KAAK,CAAC,GAClE,CAGH,SAAgB,EAA4B,EAAmD,CAK7F,OAJI,IAAe,IACV,EAGF,EAGT,SAAgB,EAAmB,EAAkC,CACnE,OAAQ,EAAR,CACE,KAAK,EAAY,KACf,OAAO,EAAmB,KAG5B,KAAK,EAAY,KACf,OAAO,EAAmB,QAG5B,QACE,MAAM,IAAI,EAAS,qDAAsD,EAAU,eAAe,EAKxG,SAAgB,EAAqB,EAAgC,CACnE,OAAO,EAAiB,EAO1B,SAAgB,EAAsB,EAAsC,EAAkC,CAC5G,OAAQ,EAAR,CACE,IAAK,IACH,OAAO,EAAQ,cAEjB,IAAK,IACH,OAAO,EAAQ,cAEjB,IAAK,IACH,OAAO,EAAQ,cAEjB,QACE,MAAM,IAAI,EAAmB,4BAA4B,IAAa,EAK5E,SAAgB,EAAkB,EAAe,EAA+B,CAM9E,OAAO,EALe,EAAM,IAAK,IAAU,CACzC,OACA,GAAG,EAAM,YAAY,EAAK,CAC3B,EAAE,CAE2B,CAAC,SAAS,CAAE,CAAC,EAAe,OAAS,MAAM,CAAC,CAAC,KAAK,CAAE,UAAW,EAAK,CAGpG,SAAgB,EAAsB,EAAmC,CACvE,OAAO,EAAU,IAAK,GAAY,EAAM,MAAM,EAAQ,CAAC,GAAG,CAG5D,SAAgB,EAAwB,EAAmC,CACzE,OAAQ,EAAR,CACE,KAAK,EAAY,KACf,MAAO,GAGT,KAAK,EAAY,KACf,MAAO,GAGT,QACE,MAAM,IAAI,EAAS,qDAAsD,EAAU,eAAe,EAQxG,SAAgB,EACd,EACA,EACsC,CACtC,IAAM,EAAU,EAAmB,EAAY,CAE/C,OAAQ,EAAR,CACE,IAAK,IACH,OAAO,IAAI,EAAI,OAAO,EAAQ,CAEhC,IAAK,IACH,OAAO,IAAI,EAAI,OAAO,EAAQ,CAEhC,IAAK,IACH,OAAO,IAAI,EAAI,OAAO,EAAQ,CAEhC,QACE,MAAM,IAAI,EACR,4BAA4B,IAC5B,8DACD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants.cjs`),t=require(`../../errors.cjs`),n=require(`./_handlers/analyze-support.cjs`),r=require(`./_handlers/get-bridgeable-assets.cjs`),i=require(`./_handlers/get-minimum-transfer-amount.cjs`),a=require(`./_handlers/get-supported-chains.cjs`),o=require(`./_utils.cjs`),s=require(`./_handlers/stream-quotes.cjs`),c=require(`./_handlers/transfer-asset.cjs`),l=require(`./_handlers/estimate-native-fee.cjs`),u=require(`./_handlers/track-transfer.cjs`);let d=require(`@avalabs/avalanchejs`);async function f({avalancheSendTx:f,environment:p,getCoreEthAddress:m,getAtomicUtxos:h,getUtxos:g,getWalletAddressesForChainAlias:_,getWalletChangeAddressForChainAlias:v}){let y,b;try{y=o.getAvalancheApiUrl(p),b=await d.Context.getContextFromURI(y)}catch(e){throw new t.ServiceInitializationError(`Failed to initialize Avalanche CCT context.`,void 0,e)}return{analyzeSupport:n.analyzeSupportFactory({environment:p}),estimateNativeFee:l.estimateNativeFeeFactory({ajsContext:b,environment:p,getAtomicUtxos:h,getUtxos:g}),getAssets:async()=>{throw new t.NotImplementedError},getBridgeableAssets:r.getBridgeableAssetsFactory({environment:p}),getMinimumTransferAmount:i.getMinimumTransferAmountFactory(),getSupportedChains:a.getSupportedChainsFactory({environment:p}),streamQuotes:s.streamQuotesFactory({environment:p,getAtomicUtxos:h}),trackTransfer:u.trackTransferFactory({environment:p}),transferAsset:c.transferAssetFactory({ajsContext:b,avalancheSendTx:f,environment:p,getCoreEthAddress:m,getAtomicUtxos:h,getUtxos:g,getWalletAddressesForChainAlias:_,getWalletChangeAddressForChainAlias:v}),type:e.ServiceType.AVALANCHE_CCT}}exports.createAvalancheCctService=f;
|
|
2
|
+
//# sourceMappingURL=avalanche-cct-service.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avalanche-cct-service.cjs","names":["getAvalancheApiUrl","Context","ServiceInitializationError","analyzeSupportFactory","estimateNativeFeeFactory","NotImplementedError","getBridgeableAssetsFactory","getMinimumTransferAmountFactory","getSupportedChainsFactory","streamQuotesFactory","trackTransferFactory","transferAssetFactory","ServiceType"],"sources":["../../../src/transfer-service/avalanche-cct/avalanche-cct-service.ts"],"sourcesContent":["import { Context } from '@avalabs/avalanchejs';\nimport { ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport { NotImplementedError, ServiceInitializationError } from '../../errors';\nimport type { AvalancheSendTxFunction, TransferService } from '../../types/service';\nimport { analyzeSupportFactory } from './_handlers/analyze-support';\nimport { getBridgeableAssetsFactory } from './_handlers/get-bridgeable-assets';\nimport { getMinimumTransferAmountFactory } from './_handlers/get-minimum-transfer-amount';\nimport { getSupportedChainsFactory } from './_handlers/get-supported-chains';\nimport { streamQuotesFactory } from './_handlers/stream-quotes';\nimport { transferAssetFactory } from './_handlers/transfer-asset';\nimport { estimateNativeFeeFactory } from './_handlers/estimate-native-fee';\nimport { trackTransferFactory } from './_handlers/track-transfer';\nimport type {\n GetAtomicUtxosCallback,\n GetCoreEthAddressCallback,\n GetUtxosCallback,\n GetWalletAddressesForChainAliasCallback,\n GetWalletChangeAddressForChainAliasCallback,\n} from './types';\nimport type { Fetch } from '../../types/utility-types';\nimport { getAvalancheApiUrl } from './_utils';\n\nexport interface AvalancheCctServiceOptions {\n avalancheSendTx: AvalancheSendTxFunction;\n environment: Environment;\n fetch?: Fetch;\n getCoreEthAddress: GetCoreEthAddressCallback;\n getAtomicUtxos: GetAtomicUtxosCallback;\n getUtxos: GetUtxosCallback;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n}\n\nexport async function createAvalancheCctService({\n avalancheSendTx,\n environment,\n getCoreEthAddress,\n getAtomicUtxos,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n}: AvalancheCctServiceOptions): Promise<TransferService> {\n let avaxApiUrl: string;\n let ajsContext: Context.Context;\n\n try {\n avaxApiUrl = getAvalancheApiUrl(environment);\n ajsContext = await Context.getContextFromURI(avaxApiUrl);\n } catch (error) {\n throw new ServiceInitializationError('Failed to initialize Avalanche CCT context.', undefined, error);\n }\n\n return {\n analyzeSupport: analyzeSupportFactory({ environment }),\n estimateNativeFee: estimateNativeFeeFactory({ ajsContext, environment, getAtomicUtxos, getUtxos }),\n getAssets: async () => {\n throw new NotImplementedError();\n },\n getBridgeableAssets: getBridgeableAssetsFactory({ environment }),\n getMinimumTransferAmount: getMinimumTransferAmountFactory(),\n getSupportedChains: getSupportedChainsFactory({ environment }),\n streamQuotes: streamQuotesFactory({ environment, getAtomicUtxos }),\n trackTransfer: trackTransferFactory({ environment }),\n transferAsset: transferAssetFactory({\n ajsContext,\n avalancheSendTx,\n environment,\n getCoreEthAddress,\n getAtomicUtxos,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n type: ServiceType.AVALANCHE_CCT,\n } satisfies TransferService;\n}\n"],"mappings":"ojBAkCA,eAAsB,EAA0B,CAC9C,kBACA,cACA,oBACA,iBACA,WACA,kCACA,uCACuD,CACvD,IAAI,EACA,EAEJ,GAAI,CACF,EAAaA,EAAAA,mBAAmB,EAAY,CAC5C,EAAa,MAAMC,EAAAA,QAAQ,kBAAkB,EAAW,OACjD,EAAO,CACd,MAAM,IAAIC,EAAAA,2BAA2B,8CAA+C,IAAA,GAAW,EAAM,CAGvG,MAAO,CACL,eAAgBC,EAAAA,sBAAsB,CAAE,cAAa,CAAC,CACtD,kBAAmBC,EAAAA,yBAAyB,CAAE,aAAY,cAAa,iBAAgB,WAAU,CAAC,CAClG,UAAW,SAAY,CACrB,MAAM,IAAIC,EAAAA,qBAEZ,oBAAqBC,EAAAA,2BAA2B,CAAE,cAAa,CAAC,CAChE,yBAA0BC,EAAAA,iCAAiC,CAC3D,mBAAoBC,EAAAA,0BAA0B,CAAE,cAAa,CAAC,CAC9D,aAAcC,EAAAA,oBAAoB,CAAE,cAAa,iBAAgB,CAAC,CAClE,cAAeC,EAAAA,qBAAqB,CAAE,cAAa,CAAC,CACpD,cAAeC,EAAAA,qBAAqB,CAClC,aACA,kBACA,cACA,oBACA,iBACA,WACA,kCACA,sCACD,CAAC,CACF,KAAMC,EAAAA,YAAY,cACnB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ServiceType as e}from"../../constants.js";import{NotImplementedError as t,ServiceInitializationError as n}from"../../errors.js";import{analyzeSupportFactory as r}from"./_handlers/analyze-support.js";import{getBridgeableAssetsFactory as i}from"./_handlers/get-bridgeable-assets.js";import{getMinimumTransferAmountFactory as a}from"./_handlers/get-minimum-transfer-amount.js";import{getSupportedChainsFactory as o}from"./_handlers/get-supported-chains.js";import{getAvalancheApiUrl as s}from"./_utils.js";import{streamQuotesFactory as c}from"./_handlers/stream-quotes.js";import{transferAssetFactory as l}from"./_handlers/transfer-asset.js";import{estimateNativeFeeFactory as u}from"./_handlers/estimate-native-fee.js";import{trackTransferFactory as d}from"./_handlers/track-transfer.js";import{Context as f}from"@avalabs/avalanchejs";async function p({avalancheSendTx:p,environment:m,getCoreEthAddress:h,getAtomicUtxos:g,getUtxos:_,getWalletAddressesForChainAlias:v,getWalletChangeAddressForChainAlias:y}){let b,x;try{b=s(m),x=await f.getContextFromURI(b)}catch(e){throw new n(`Failed to initialize Avalanche CCT context.`,void 0,e)}return{analyzeSupport:r({environment:m}),estimateNativeFee:u({ajsContext:x,environment:m,getAtomicUtxos:g,getUtxos:_}),getAssets:async()=>{throw new t},getBridgeableAssets:i({environment:m}),getMinimumTransferAmount:a(),getSupportedChains:o({environment:m}),streamQuotes:c({environment:m,getAtomicUtxos:g}),trackTransfer:d({environment:m}),transferAsset:l({ajsContext:x,avalancheSendTx:p,environment:m,getCoreEthAddress:h,getAtomicUtxos:g,getUtxos:_,getWalletAddressesForChainAlias:v,getWalletChangeAddressForChainAlias:y}),type:e.AVALANCHE_CCT}}export{p as createAvalancheCctService};
|
|
2
|
+
//# sourceMappingURL=avalanche-cct-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avalanche-cct-service.js","names":[],"sources":["../../../src/transfer-service/avalanche-cct/avalanche-cct-service.ts"],"sourcesContent":["import { Context } from '@avalabs/avalanchejs';\nimport { ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport { NotImplementedError, ServiceInitializationError } from '../../errors';\nimport type { AvalancheSendTxFunction, TransferService } from '../../types/service';\nimport { analyzeSupportFactory } from './_handlers/analyze-support';\nimport { getBridgeableAssetsFactory } from './_handlers/get-bridgeable-assets';\nimport { getMinimumTransferAmountFactory } from './_handlers/get-minimum-transfer-amount';\nimport { getSupportedChainsFactory } from './_handlers/get-supported-chains';\nimport { streamQuotesFactory } from './_handlers/stream-quotes';\nimport { transferAssetFactory } from './_handlers/transfer-asset';\nimport { estimateNativeFeeFactory } from './_handlers/estimate-native-fee';\nimport { trackTransferFactory } from './_handlers/track-transfer';\nimport type {\n GetAtomicUtxosCallback,\n GetCoreEthAddressCallback,\n GetUtxosCallback,\n GetWalletAddressesForChainAliasCallback,\n GetWalletChangeAddressForChainAliasCallback,\n} from './types';\nimport type { Fetch } from '../../types/utility-types';\nimport { getAvalancheApiUrl } from './_utils';\n\nexport interface AvalancheCctServiceOptions {\n avalancheSendTx: AvalancheSendTxFunction;\n environment: Environment;\n fetch?: Fetch;\n getCoreEthAddress: GetCoreEthAddressCallback;\n getAtomicUtxos: GetAtomicUtxosCallback;\n getUtxos: GetUtxosCallback;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n}\n\nexport async function createAvalancheCctService({\n avalancheSendTx,\n environment,\n getCoreEthAddress,\n getAtomicUtxos,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n}: AvalancheCctServiceOptions): Promise<TransferService> {\n let avaxApiUrl: string;\n let ajsContext: Context.Context;\n\n try {\n avaxApiUrl = getAvalancheApiUrl(environment);\n ajsContext = await Context.getContextFromURI(avaxApiUrl);\n } catch (error) {\n throw new ServiceInitializationError('Failed to initialize Avalanche CCT context.', undefined, error);\n }\n\n return {\n analyzeSupport: analyzeSupportFactory({ environment }),\n estimateNativeFee: estimateNativeFeeFactory({ ajsContext, environment, getAtomicUtxos, getUtxos }),\n getAssets: async () => {\n throw new NotImplementedError();\n },\n getBridgeableAssets: getBridgeableAssetsFactory({ environment }),\n getMinimumTransferAmount: getMinimumTransferAmountFactory(),\n getSupportedChains: getSupportedChainsFactory({ environment }),\n streamQuotes: streamQuotesFactory({ environment, getAtomicUtxos }),\n trackTransfer: trackTransferFactory({ environment }),\n transferAsset: transferAssetFactory({\n ajsContext,\n avalancheSendTx,\n environment,\n getCoreEthAddress,\n getAtomicUtxos,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n type: ServiceType.AVALANCHE_CCT,\n } satisfies TransferService;\n}\n"],"mappings":"w0BAkCA,eAAsB,EAA0B,CAC9C,kBACA,cACA,oBACA,iBACA,WACA,kCACA,uCACuD,CACvD,IAAI,EACA,EAEJ,GAAI,CACF,EAAa,EAAmB,EAAY,CAC5C,EAAa,MAAM,EAAQ,kBAAkB,EAAW,OACjD,EAAO,CACd,MAAM,IAAI,EAA2B,8CAA+C,IAAA,GAAW,EAAM,CAGvG,MAAO,CACL,eAAgB,EAAsB,CAAE,cAAa,CAAC,CACtD,kBAAmB,EAAyB,CAAE,aAAY,cAAa,iBAAgB,WAAU,CAAC,CAClG,UAAW,SAAY,CACrB,MAAM,IAAI,GAEZ,oBAAqB,EAA2B,CAAE,cAAa,CAAC,CAChE,yBAA0B,GAAiC,CAC3D,mBAAoB,EAA0B,CAAE,cAAa,CAAC,CAC9D,aAAc,EAAoB,CAAE,cAAa,iBAAgB,CAAC,CAClE,cAAe,EAAqB,CAAE,cAAa,CAAC,CACpD,cAAe,EAAqB,CAClC,aACA,kBACA,cACA,oBACA,iBACA,WACA,kCACA,sCACD,CAAC,CACF,KAAM,EAAY,cACnB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../../constants.cjs`),t={type:e.TokenType.NATIVE,decimals:18,name:`Avalanche`,symbol:`AVAX`},n={type:e.TokenType.NATIVE,decimals:9,name:`Avalanche`,symbol:`AVAX`},r=RegExp(`^(${[`C-`,`P-`,`X-`].join(`|`)})`,`i`),i={fuji:`https://api.avax-test.network`,mainnet:`https://api.avax.network`};exports.AVALANCHE_API_URIS=i,exports.AVALANCHE_C_CHAIN_NATIVE_ASSET=t,exports.AVALANCHE_PX_CHAIN_NATIVE_ASSET=n,exports.CHAIN_PREFIXES_REGEX=r,exports.WEI_PER_NANO_AVAX_BIGINT=1000000000n;
|
|
2
|
+
//# sourceMappingURL=constants.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.cjs","names":["TokenType"],"sources":["../../../src/transfer-service/avalanche-cct/constants.ts"],"sourcesContent":["import { TokenType, type AvalancheBlockchainAlias } from '../../constants';\nimport type { NativeAsset } from '../../types/asset';\n\nexport const AVALANCHE_C_CHAIN_NATIVE_ASSET: NativeAsset = {\n type: TokenType.NATIVE,\n decimals: 18,\n name: 'Avalanche',\n symbol: 'AVAX',\n};\n\nexport const AVALANCHE_PX_CHAIN_NATIVE_ASSET: NativeAsset = {\n type: TokenType.NATIVE,\n decimals: 9,\n name: 'Avalanche',\n symbol: 'AVAX',\n};\n\nexport type ChainPrefix = `${AvalancheBlockchainAlias}-`;\n\nexport const CHAIN_PREFIXES: readonly ChainPrefix[] = ['C-', 'P-', 'X-'] as const;\n\nexport const CHAIN_PREFIXES_REGEX: RegExp = new RegExp(`^(${CHAIN_PREFIXES.join('|')})`, 'i');\n\nexport const AVALANCHE_API_URIS = {\n fuji: 'https://api.avax-test.network',\n mainnet: 'https://api.avax.network',\n} as const;\n\nexport const WEI_PER_NANO_AVAX_BIGINT = 1_000_000_000n;\nexport const NANO_AVAX_DECIMALS = 9;\n"],"mappings":"uCAGa,EAA8C,CACzD,KAAMA,EAAAA,UAAU,OAChB,SAAU,GACV,KAAM,YACN,OAAQ,OACT,CAEY,EAA+C,CAC1D,KAAMA,EAAAA,UAAU,OAChB,SAAU,EACV,KAAM,YACN,OAAQ,OACT,CAMY,EAAmC,OAAO,KAFD,CAAC,KAAM,KAAM,KAAK,CAEG,KAAK,IAAI,CAAC,GAAI,IAAI,CAEhF,EAAqB,CAChC,KAAM,gCACN,QAAS,2BACV"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{TokenType as e}from"../../constants.js";const t={type:e.NATIVE,decimals:18,name:`Avalanche`,symbol:`AVAX`},n={type:e.NATIVE,decimals:9,name:`Avalanche`,symbol:`AVAX`},r=RegExp(`^(${[`C-`,`P-`,`X-`].join(`|`)})`,`i`),i={fuji:`https://api.avax-test.network`,mainnet:`https://api.avax.network`},a=1000000000n;export{i as AVALANCHE_API_URIS,t as AVALANCHE_C_CHAIN_NATIVE_ASSET,n as AVALANCHE_PX_CHAIN_NATIVE_ASSET,r as CHAIN_PREFIXES_REGEX,a as WEI_PER_NANO_AVAX_BIGINT};
|
|
2
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","names":[],"sources":["../../../src/transfer-service/avalanche-cct/constants.ts"],"sourcesContent":["import { TokenType, type AvalancheBlockchainAlias } from '../../constants';\nimport type { NativeAsset } from '../../types/asset';\n\nexport const AVALANCHE_C_CHAIN_NATIVE_ASSET: NativeAsset = {\n type: TokenType.NATIVE,\n decimals: 18,\n name: 'Avalanche',\n symbol: 'AVAX',\n};\n\nexport const AVALANCHE_PX_CHAIN_NATIVE_ASSET: NativeAsset = {\n type: TokenType.NATIVE,\n decimals: 9,\n name: 'Avalanche',\n symbol: 'AVAX',\n};\n\nexport type ChainPrefix = `${AvalancheBlockchainAlias}-`;\n\nexport const CHAIN_PREFIXES: readonly ChainPrefix[] = ['C-', 'P-', 'X-'] as const;\n\nexport const CHAIN_PREFIXES_REGEX: RegExp = new RegExp(`^(${CHAIN_PREFIXES.join('|')})`, 'i');\n\nexport const AVALANCHE_API_URIS = {\n fuji: 'https://api.avax-test.network',\n mainnet: 'https://api.avax.network',\n} as const;\n\nexport const WEI_PER_NANO_AVAX_BIGINT = 1_000_000_000n;\nexport const NANO_AVAX_DECIMALS = 9;\n"],"mappings":"+CAGA,MAAa,EAA8C,CACzD,KAAM,EAAU,OAChB,SAAU,GACV,KAAM,YACN,OAAQ,OACT,CAEY,EAA+C,CAC1D,KAAM,EAAU,OAChB,SAAU,EACV,KAAM,YACN,OAAQ,OACT,CAMY,EAAmC,OAAO,KAFD,CAAC,KAAM,KAAM,KAAK,CAEG,KAAK,IAAI,CAAC,GAAI,IAAI,CAEhF,EAAqB,CAChC,KAAM,gCACN,QAAS,2BACV,CAEY,EAA2B"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { AvalancheBlockchainAlias } from "../../constants.cjs";
|
|
2
|
+
import { Address } from "viem";
|
|
3
|
+
import { utils } from "@avalabs/avalanchejs";
|
|
4
|
+
|
|
5
|
+
//#region src/transfer-service/avalanche-cct/types.d.ts
|
|
6
|
+
type UtxoSet = utils.UtxoSet;
|
|
7
|
+
/**
|
|
8
|
+
* Returns a list of atomic UTXOs that have not been imported
|
|
9
|
+
* into the destination chain from the source chain yet.
|
|
10
|
+
*
|
|
11
|
+
* i.e. An export transaction occurred on the source chain, but a
|
|
12
|
+
* corresponding import transaction has not been executed on the destination chain yet.
|
|
13
|
+
*/
|
|
14
|
+
type GetAtomicUtxosCallback = (destinationChain: AvalancheBlockchainAlias, sourceChain: AvalancheBlockchainAlias) => Promise<UtxoSet>;
|
|
15
|
+
/**
|
|
16
|
+
* Returns a list of UTXOs that are available to be used for a transfer on the specified chain.
|
|
17
|
+
*/
|
|
18
|
+
type GetUtxosCallback = (chainAlias: Exclude<AvalancheBlockchainAlias, "C">) => Promise<UtxoSet>;
|
|
19
|
+
/**
|
|
20
|
+
* Given an EVM hex address, returns the corresponding Coreth bech32 address.
|
|
21
|
+
*/
|
|
22
|
+
type GetCoreEthAddressCallback = (evmAddress: Address) => Promise<string> | string;
|
|
23
|
+
/**
|
|
24
|
+
* Given a chain alias, returns a list of addresses that the connected wallet controls on that chain.
|
|
25
|
+
*/
|
|
26
|
+
type GetWalletAddressesForChainAliasCallback = (chainAlias: AvalancheBlockchainAlias) => Promise<string[]> | string[];
|
|
27
|
+
/**
|
|
28
|
+
* Get the address that will receive the "change" after transactions
|
|
29
|
+
*/
|
|
30
|
+
type GetWalletChangeAddressForChainAliasCallback = (chainAlias: AvalancheBlockchainAlias) => Promise<string> | string;
|
|
31
|
+
//#endregion
|
|
32
|
+
export { GetAtomicUtxosCallback, GetCoreEthAddressCallback, GetUtxosCallback, GetWalletAddressesForChainAliasCallback, GetWalletChangeAddressForChainAliasCallback };
|
|
33
|
+
//# sourceMappingURL=types.d.cts.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { AvalancheBlockchainAlias } from "../../constants.js";
|
|
2
|
+
import { Address } from "viem";
|
|
3
|
+
import { utils } from "@avalabs/avalanchejs";
|
|
4
|
+
|
|
5
|
+
//#region src/transfer-service/avalanche-cct/types.d.ts
|
|
6
|
+
type UtxoSet = utils.UtxoSet;
|
|
7
|
+
/**
|
|
8
|
+
* Returns a list of atomic UTXOs that have not been imported
|
|
9
|
+
* into the destination chain from the source chain yet.
|
|
10
|
+
*
|
|
11
|
+
* i.e. An export transaction occurred on the source chain, but a
|
|
12
|
+
* corresponding import transaction has not been executed on the destination chain yet.
|
|
13
|
+
*/
|
|
14
|
+
type GetAtomicUtxosCallback = (destinationChain: AvalancheBlockchainAlias, sourceChain: AvalancheBlockchainAlias) => Promise<UtxoSet>;
|
|
15
|
+
/**
|
|
16
|
+
* Returns a list of UTXOs that are available to be used for a transfer on the specified chain.
|
|
17
|
+
*/
|
|
18
|
+
type GetUtxosCallback = (chainAlias: Exclude<AvalancheBlockchainAlias, "C">) => Promise<UtxoSet>;
|
|
19
|
+
/**
|
|
20
|
+
* Given an EVM hex address, returns the corresponding Coreth bech32 address.
|
|
21
|
+
*/
|
|
22
|
+
type GetCoreEthAddressCallback = (evmAddress: Address) => Promise<string> | string;
|
|
23
|
+
/**
|
|
24
|
+
* Given a chain alias, returns a list of addresses that the connected wallet controls on that chain.
|
|
25
|
+
*/
|
|
26
|
+
type GetWalletAddressesForChainAliasCallback = (chainAlias: AvalancheBlockchainAlias) => Promise<string[]> | string[];
|
|
27
|
+
/**
|
|
28
|
+
* Get the address that will receive the "change" after transactions
|
|
29
|
+
*/
|
|
30
|
+
type GetWalletChangeAddressForChainAliasCallback = (chainAlias: AvalancheBlockchainAlias) => Promise<string> | string;
|
|
31
|
+
//#endregion
|
|
32
|
+
export { GetAtomicUtxosCallback, GetCoreEthAddressCallback, GetUtxosCallback, GetWalletAddressesForChainAliasCallback, GetWalletChangeAddressForChainAliasCallback };
|
|
33
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`../../../constants.cjs`),t=require(`../../../utils/asset-id.cjs`);function
|
|
1
|
+
const e=require(`../../../constants.cjs`),t=require(`../../../utils/asset-id.cjs`),n=({assets:e,limit:t,page:n})=>{let r=(n-1)*t,i=e.slice(r,r+t),a=r+i.length<e.length;return{assets:i,meta:{currentPage:n,hasMore:a,...a?{nextPage:n+1}:{}}}};function r({serviceAssets:r}){return async({sourceAsset:i,sourceChainId:a,targetChainId:o,limit:s,page:c})=>{let l=s??100,u=c??1,d=r[a];if(!d)return n({assets:[],limit:l,page:u});let f=t.getAssetId(a,i),p=d.find(e=>t.getAssetId(a,e)===f);if(!p)return n({assets:[],limit:l,page:u});let m=p.destinations[o];if(!m)return n({assets:[],limit:l,page:u});let h=r[o];if(!h)return n({assets:[],limit:l,page:u});let g=h.find(e=>`address`in e&&e.address.toLowerCase()===m.address.toLowerCase());if(!g)return n({assets:[],limit:l,page:u});let _;return _=g.type===`native`?{id:t.getAssetId(o,g),type:g.type,name:g.name,symbol:g.symbol,decimals:g.decimals,...g.logoUri!==void 0&&{logoUri:g.logoUri},bridgeProviders:[e.ServiceType.AVALANCHE_EVM]}:(g.type,{id:t.getAssetId(o,g),type:g.type,name:g.name,symbol:g.symbol,decimals:g.decimals,address:g.address,...g.logoUri!==void 0&&{logoUri:g.logoUri},bridgeProviders:[e.ServiceType.AVALANCHE_EVM]}),n({assets:[_],limit:l,page:u})}}exports.getBridgeableAssetsFactory=r;
|
|
2
2
|
//# sourceMappingURL=get-bridgeable-assets.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-bridgeable-assets.cjs","names":["getAssetId","ServiceType"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type { BridgeableUiAsset, ChainAssetMap } from '../../../types/asset';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../types/service';\nimport { getAssetId } from '../../../utils/asset-id';\n\nexport function getBridgeableAssetsFactory({\n serviceAssets,\n}: {\n serviceAssets: ChainAssetMap;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n }: GetBridgeableAssetsProps): Promise<
|
|
1
|
+
{"version":3,"file":"get-bridgeable-assets.cjs","names":["getAssetId","ServiceType"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type { BridgeableUiAsset, ChainAssetMap } from '../../../types/asset';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../types/service';\nimport { getAssetId } from '../../../utils/asset-id';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nconst paginateAssets = ({\n assets,\n limit,\n page,\n}: {\n assets: readonly BridgeableUiAsset[];\n limit: number;\n page: number;\n}): GetBridgeableAssetsResult => {\n const startIndex = (page - 1) * limit;\n const pageAssets = assets.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + pageAssets.length < assets.length;\n\n return {\n assets: pageAssets,\n meta: {\n currentPage: page,\n hasMore,\n ...(hasMore ? { nextPage: page + 1 } : {}),\n },\n };\n};\n\nexport function getBridgeableAssetsFactory({\n serviceAssets,\n}: {\n serviceAssets: ChainAssetMap;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const pageLimit = limit ?? DEFAULT_LIMIT;\n const currentPage = page ?? DEFAULT_PAGE;\n\n const sourceChainAssets = serviceAssets[sourceChainId];\n if (!sourceChainAssets) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n const sourceId = getAssetId(sourceChainId, sourceAsset);\n const found = sourceChainAssets.find((a) => getAssetId(sourceChainId, a) === sourceId);\n if (!found) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n const destination = found.destinations[targetChainId];\n if (!destination) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n const targetChainAssets = serviceAssets[targetChainId];\n if (!targetChainAssets) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n const target = targetChainAssets.find(\n (a) => 'address' in a && a.address.toLowerCase() === destination.address.toLowerCase(),\n );\n if (!target) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n let bridgeableAsset: BridgeableUiAsset;\n\n if (target.type === 'native') {\n bridgeableAsset = {\n id: getAssetId(targetChainId, target),\n type: target.type,\n name: target.name,\n symbol: target.symbol,\n decimals: target.decimals,\n ...(target.logoUri !== undefined && { logoUri: target.logoUri }),\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n };\n } else if (target.type === 'erc20') {\n bridgeableAsset = {\n id: getAssetId(targetChainId, target),\n type: target.type,\n name: target.name,\n symbol: target.symbol,\n decimals: target.decimals,\n address: target.address,\n ...(target.logoUri !== undefined && { logoUri: target.logoUri }),\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n };\n } else {\n bridgeableAsset = {\n id: getAssetId(targetChainId, target),\n type: target.type,\n name: target.name,\n symbol: target.symbol,\n decimals: target.decimals,\n address: target.address,\n ...(target.logoUri !== undefined && { logoUri: target.logoUri }),\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n };\n }\n\n return paginateAssets({ assets: [bridgeableAsset], limit: pageLimit, page: currentPage });\n };\n}\n"],"mappings":"mFAQM,GAAkB,CACtB,SACA,QACA,UAK+B,CAC/B,IAAM,GAAc,EAAO,GAAK,EAC1B,EAAa,EAAO,MAAM,EAAY,EAAa,EAAM,CACzD,EAAU,EAAa,EAAW,OAAS,EAAO,OAExD,MAAO,CACL,OAAQ,EACR,KAAM,CACJ,YAAa,EACb,UACA,GAAI,EAAU,CAAE,SAAU,EAAO,EAAG,CAAG,EAAE,CAC1C,CACF,EAGH,SAAgB,EAA2B,CACzC,iBAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,gBACA,QACA,UACkE,CAClE,IAAM,EAAY,GAAS,IACrB,EAAc,GAAQ,EAEtB,EAAoB,EAAc,GACxC,GAAI,CAAC,EAAmB,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAElG,IAAM,EAAWA,EAAAA,WAAW,EAAe,EAAY,CACjD,EAAQ,EAAkB,KAAM,GAAMA,EAAAA,WAAW,EAAe,EAAE,GAAK,EAAS,CACtF,GAAI,CAAC,EAAO,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAEtF,IAAM,EAAc,EAAM,aAAa,GACvC,GAAI,CAAC,EAAa,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAE5F,IAAM,EAAoB,EAAc,GACxC,GAAI,CAAC,EAAmB,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAElG,IAAM,EAAS,EAAkB,KAC9B,GAAM,YAAa,GAAK,EAAE,QAAQ,aAAa,GAAK,EAAY,QAAQ,aAAa,CACvF,CACD,GAAI,CAAC,EAAQ,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAEvF,IAAI,EAoCJ,MAlCA,CAsBE,EAtBE,EAAO,OAAS,SACA,CAChB,GAAIA,EAAAA,WAAW,EAAe,EAAO,CACrC,KAAM,EAAO,KACb,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,SAAU,EAAO,SACjB,GAAI,EAAO,UAAY,IAAA,IAAa,CAAE,QAAS,EAAO,QAAS,CAC/D,gBAAiB,CAACC,EAAAA,YAAY,cAAc,CAC7C,EACQ,EAAO,KACE,CAChB,GAAID,EAAAA,WAAW,EAAe,EAAO,CACrC,KAAM,EAAO,KACb,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,SAAU,EAAO,SACjB,QAAS,EAAO,QAChB,GAAI,EAAO,UAAY,IAAA,IAAa,CAAE,QAAS,EAAO,QAAS,CAC/D,gBAAiB,CAACC,EAAAA,YAAY,cAAc,CAC7C,EAcI,EAAe,CAAE,OAAQ,CAAC,EAAgB,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ServiceType as e}from"../../../constants.js";import{getAssetId as t}from"../../../utils/asset-id.js";
|
|
1
|
+
import{ServiceType as e}from"../../../constants.js";import{getAssetId as t}from"../../../utils/asset-id.js";const n=({assets:e,limit:t,page:n})=>{let r=(n-1)*t,i=e.slice(r,r+t),a=r+i.length<e.length;return{assets:i,meta:{currentPage:n,hasMore:a,...a?{nextPage:n+1}:{}}}};function r({serviceAssets:r}){return async({sourceAsset:i,sourceChainId:a,targetChainId:o,limit:s,page:c})=>{let l=s??100,u=c??1,d=r[a];if(!d)return n({assets:[],limit:l,page:u});let f=t(a,i),p=d.find(e=>t(a,e)===f);if(!p)return n({assets:[],limit:l,page:u});let m=p.destinations[o];if(!m)return n({assets:[],limit:l,page:u});let h=r[o];if(!h)return n({assets:[],limit:l,page:u});let g=h.find(e=>`address`in e&&e.address.toLowerCase()===m.address.toLowerCase());if(!g)return n({assets:[],limit:l,page:u});let _;return _=g.type===`native`?{id:t(o,g),type:g.type,name:g.name,symbol:g.symbol,decimals:g.decimals,...g.logoUri!==void 0&&{logoUri:g.logoUri},bridgeProviders:[e.AVALANCHE_EVM]}:(g.type,{id:t(o,g),type:g.type,name:g.name,symbol:g.symbol,decimals:g.decimals,address:g.address,...g.logoUri!==void 0&&{logoUri:g.logoUri},bridgeProviders:[e.AVALANCHE_EVM]}),n({assets:[_],limit:l,page:u})}}export{r as getBridgeableAssetsFactory};
|
|
2
2
|
//# sourceMappingURL=get-bridgeable-assets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type { BridgeableUiAsset, ChainAssetMap } from '../../../types/asset';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../types/service';\nimport { getAssetId } from '../../../utils/asset-id';\n\nexport function getBridgeableAssetsFactory({\n serviceAssets,\n}: {\n serviceAssets: ChainAssetMap;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n }: GetBridgeableAssetsProps): Promise<
|
|
1
|
+
{"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type { BridgeableUiAsset, ChainAssetMap } from '../../../types/asset';\nimport type { GetBridgeableAssetsProps, GetBridgeableAssetsResult, TransferService } from '../../../types/service';\nimport { getAssetId } from '../../../utils/asset-id';\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 100;\n\nconst paginateAssets = ({\n assets,\n limit,\n page,\n}: {\n assets: readonly BridgeableUiAsset[];\n limit: number;\n page: number;\n}): GetBridgeableAssetsResult => {\n const startIndex = (page - 1) * limit;\n const pageAssets = assets.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + pageAssets.length < assets.length;\n\n return {\n assets: pageAssets,\n meta: {\n currentPage: page,\n hasMore,\n ...(hasMore ? { nextPage: page + 1 } : {}),\n },\n };\n};\n\nexport function getBridgeableAssetsFactory({\n serviceAssets,\n}: {\n serviceAssets: ChainAssetMap;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit,\n page,\n }: GetBridgeableAssetsProps): Promise<GetBridgeableAssetsResult> => {\n const pageLimit = limit ?? DEFAULT_LIMIT;\n const currentPage = page ?? DEFAULT_PAGE;\n\n const sourceChainAssets = serviceAssets[sourceChainId];\n if (!sourceChainAssets) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n const sourceId = getAssetId(sourceChainId, sourceAsset);\n const found = sourceChainAssets.find((a) => getAssetId(sourceChainId, a) === sourceId);\n if (!found) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n const destination = found.destinations[targetChainId];\n if (!destination) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n const targetChainAssets = serviceAssets[targetChainId];\n if (!targetChainAssets) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n const target = targetChainAssets.find(\n (a) => 'address' in a && a.address.toLowerCase() === destination.address.toLowerCase(),\n );\n if (!target) return paginateAssets({ assets: [], limit: pageLimit, page: currentPage });\n\n let bridgeableAsset: BridgeableUiAsset;\n\n if (target.type === 'native') {\n bridgeableAsset = {\n id: getAssetId(targetChainId, target),\n type: target.type,\n name: target.name,\n symbol: target.symbol,\n decimals: target.decimals,\n ...(target.logoUri !== undefined && { logoUri: target.logoUri }),\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n };\n } else if (target.type === 'erc20') {\n bridgeableAsset = {\n id: getAssetId(targetChainId, target),\n type: target.type,\n name: target.name,\n symbol: target.symbol,\n decimals: target.decimals,\n address: target.address,\n ...(target.logoUri !== undefined && { logoUri: target.logoUri }),\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n };\n } else {\n bridgeableAsset = {\n id: getAssetId(targetChainId, target),\n type: target.type,\n name: target.name,\n symbol: target.symbol,\n decimals: target.decimals,\n address: target.address,\n ...(target.logoUri !== undefined && { logoUri: target.logoUri }),\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n };\n }\n\n return paginateAssets({ assets: [bridgeableAsset], limit: pageLimit, page: currentPage });\n };\n}\n"],"mappings":"4GAKA,MAGM,GAAkB,CACtB,SACA,QACA,UAK+B,CAC/B,IAAM,GAAc,EAAO,GAAK,EAC1B,EAAa,EAAO,MAAM,EAAY,EAAa,EAAM,CACzD,EAAU,EAAa,EAAW,OAAS,EAAO,OAExD,MAAO,CACL,OAAQ,EACR,KAAM,CACJ,YAAa,EACb,UACA,GAAI,EAAU,CAAE,SAAU,EAAO,EAAG,CAAG,EAAE,CAC1C,CACF,EAGH,SAAgB,EAA2B,CACzC,iBAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,gBACA,QACA,UACkE,CAClE,IAAM,EAAY,GAAS,IACrB,EAAc,GAAQ,EAEtB,EAAoB,EAAc,GACxC,GAAI,CAAC,EAAmB,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAElG,IAAM,EAAW,EAAW,EAAe,EAAY,CACjD,EAAQ,EAAkB,KAAM,GAAM,EAAW,EAAe,EAAE,GAAK,EAAS,CACtF,GAAI,CAAC,EAAO,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAEtF,IAAM,EAAc,EAAM,aAAa,GACvC,GAAI,CAAC,EAAa,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAE5F,IAAM,EAAoB,EAAc,GACxC,GAAI,CAAC,EAAmB,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAElG,IAAM,EAAS,EAAkB,KAC9B,GAAM,YAAa,GAAK,EAAE,QAAQ,aAAa,GAAK,EAAY,QAAQ,aAAa,CACvF,CACD,GAAI,CAAC,EAAQ,OAAO,EAAe,CAAE,OAAQ,EAAE,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC,CAEvF,IAAI,EAoCJ,MAlCA,CAsBE,EAtBE,EAAO,OAAS,SACA,CAChB,GAAI,EAAW,EAAe,EAAO,CACrC,KAAM,EAAO,KACb,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,SAAU,EAAO,SACjB,GAAI,EAAO,UAAY,IAAA,IAAa,CAAE,QAAS,EAAO,QAAS,CAC/D,gBAAiB,CAAC,EAAY,cAAc,CAC7C,EACQ,EAAO,KACE,CAChB,GAAI,EAAW,EAAe,EAAO,CACrC,KAAM,EAAO,KACb,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,SAAU,EAAO,SACjB,QAAS,EAAO,QAChB,GAAI,EAAO,UAAY,IAAA,IAAa,CAAE,QAAS,EAAO,QAAS,CAC/D,gBAAiB,CAAC,EAAY,cAAc,CAC7C,EAcI,EAAe,CAAE,OAAQ,CAAC,EAAgB,CAAE,MAAO,EAAW,KAAM,EAAa,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(
|
|
1
|
+
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../_utils.cjs`),r=require(`../../../_utils/chain.cjs`),i=require(`../_utils/validations.cjs`),a=require(`../_utils/transfer-data.cjs`),o=require(`./get-minimum-transfer-amount.cjs`),s=require(`../_utils/unwrap.cjs`),c=require(`../_utils/wrap.cjs`);let l=require(`viem`);function u({config:u,evmSigner:d,feeEstimationMultiplier:f}){return async({gasSettings:p,onStepChange:m,quote:h})=>{if(!(0,l.isAddress)(h.fromAddress)||!(0,l.isAddress)(h.toAddress))throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,"`fromAddress` and `toAddress` must be valid EVM addresses.");i.validateTransferAddressesOrThrow(h.fromAddress,h.toAddress),i.validateTransferAddressesNotBlockedOrThrow([h.fromAddress,h.toAddress],u.addressBlocklist),i.validateChainCombinationOrThrow(h.sourceChain.chainId,h.targetChain.chainId);let g=await o.getMinimumTransferAmountFactory({config:u,feeEstimationMultiplier:f})({sourceAsset:h.assetIn,sourceChainId:h.sourceChain.chainId,targetAsset:h.assetOut,targetChainId:h.targetChain.chainId});if(h.amountIn<g)throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${g.toString()}`);let{ethToAva:_,source:v}=a.getTransferData({assetIn:h.assetIn,sourceChainId:h.sourceChain.chainId,targetChainId:h.targetChain.chainId},u),y=Date.now(),b,x,S=n.getEvmClientForChain({chain:h.targetChain}),C;try{C=await S.getBlockNumber()}catch{}_?[b,x]=await c.transferAssetFromEthToAva({amountIn:h.amountIn,assetIn:h.assetIn,evmConfig:u,fromAddress:h.fromAddress,sign:d.sign,source:v,sourceChain:h.sourceChain,targetChain:h.targetChain,gasSettings:p,onStepChange:m,quote:h}):[b,x]=await s.transferAssetFromAvaToEth({amountIn:h.amountIn,fromAddress:h.fromAddress,sign:d.sign,source:v,sourceChain:h.sourceChain,gasSettings:p,onStepChange:m,quote:h});let w=r.isAvalancheChain(h.sourceChain)?u.minimumConfirmations.avalanche:u.minimumConfirmations.ethereum;return x.status===`reverted`?{amountIn:h.amountIn,amountOut:h.amountOut,environment:u.environment,errorCode:t.ErrorCode.TRANSACTION_REVERTED,failedAtMs:Date.now(),fees:h.fees,fromAddress:h.fromAddress,id:h.id,partnerFeeBps:h.partnerFeeBps,source:{confirmationCount:0,requiredConfirmationCount:w,startedAtMs:y,txHash:b},sourceAsset:h.assetIn,sourceChain:h.sourceChain,status:`failed`,targetAsset:h.assetOut,targetChain:h.targetChain,toAddress:h.toAddress,type:e.ServiceType.AVALANCHE_EVM}:{amountIn:h.amountIn,amountOut:h.amountOut,environment:u.environment,fees:h.fees,fromAddress:h.fromAddress,id:h.id,partnerFeeBps:h.partnerFeeBps,source:{confirmationCount:1,requiredConfirmationCount:w,startedAtMs:y,targetStartBlockNumber:C,txHash:b},sourceAsset:h.assetIn,sourceChain:h.sourceChain,status:`source-pending`,targetAsset:h.assetOut,targetChain:h.targetChain,toAddress:h.toAddress,type:e.ServiceType.AVALANCHE_EVM}}}exports.transferAssetFactory=u;
|
|
2
2
|
//# sourceMappingURL=transfer-asset.cjs.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ServiceType as e}from"../../../constants.js";import{ErrorCode as t,ErrorReason as n,InvalidParamsError as r}from"../../../errors.js";import{
|
|
1
|
+
import{ServiceType as e}from"../../../constants.js";import{ErrorCode as t,ErrorReason as n,InvalidParamsError as r}from"../../../errors.js";import{getEvmClientForChain as i}from"../../_utils.js";import{isAvalancheChain as a}from"../../../_utils/chain.js";import{validateChainCombinationOrThrow as o,validateTransferAddressesNotBlockedOrThrow as s,validateTransferAddressesOrThrow as c}from"../_utils/validations.js";import{getTransferData as l}from"../_utils/transfer-data.js";import{getMinimumTransferAmountFactory as u}from"./get-minimum-transfer-amount.js";import{transferAssetFromAvaToEth as d}from"../_utils/unwrap.js";import{transferAssetFromEthToAva as f}from"../_utils/wrap.js";import{isAddress as p}from"viem";function m({config:m,evmSigner:h,feeEstimationMultiplier:g}){return async({gasSettings:_,onStepChange:v,quote:y})=>{if(!p(y.fromAddress)||!p(y.toAddress))throw new r(n.INVALID_PARAMS,"`fromAddress` and `toAddress` must be valid EVM addresses.");c(y.fromAddress,y.toAddress),s([y.fromAddress,y.toAddress],m.addressBlocklist),o(y.sourceChain.chainId,y.targetChain.chainId);let b=await u({config:m,feeEstimationMultiplier:g})({sourceAsset:y.assetIn,sourceChainId:y.sourceChain.chainId,targetAsset:y.assetOut,targetChainId:y.targetChain.chainId});if(y.amountIn<b)throw new r(n.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${b.toString()}`);let{ethToAva:x,source:S}=l({assetIn:y.assetIn,sourceChainId:y.sourceChain.chainId,targetChainId:y.targetChain.chainId},m),C=Date.now(),w,T,E=i({chain:y.targetChain}),D;try{D=await E.getBlockNumber()}catch{}x?[w,T]=await f({amountIn:y.amountIn,assetIn:y.assetIn,evmConfig:m,fromAddress:y.fromAddress,sign:h.sign,source:S,sourceChain:y.sourceChain,targetChain:y.targetChain,gasSettings:_,onStepChange:v,quote:y}):[w,T]=await d({amountIn:y.amountIn,fromAddress:y.fromAddress,sign:h.sign,source:S,sourceChain:y.sourceChain,gasSettings:_,onStepChange:v,quote:y});let O=a(y.sourceChain)?m.minimumConfirmations.avalanche:m.minimumConfirmations.ethereum;return T.status===`reverted`?{amountIn:y.amountIn,amountOut:y.amountOut,environment:m.environment,errorCode:t.TRANSACTION_REVERTED,failedAtMs:Date.now(),fees:y.fees,fromAddress:y.fromAddress,id:y.id,partnerFeeBps:y.partnerFeeBps,source:{confirmationCount:0,requiredConfirmationCount:O,startedAtMs:C,txHash:w},sourceAsset:y.assetIn,sourceChain:y.sourceChain,status:`failed`,targetAsset:y.assetOut,targetChain:y.targetChain,toAddress:y.toAddress,type:e.AVALANCHE_EVM}:{amountIn:y.amountIn,amountOut:y.amountOut,environment:m.environment,fees:y.fees,fromAddress:y.fromAddress,id:y.id,partnerFeeBps:y.partnerFeeBps,source:{confirmationCount:1,requiredConfirmationCount:O,startedAtMs:C,targetStartBlockNumber:D,txHash:w},sourceAsset:y.assetIn,sourceChain:y.sourceChain,status:`source-pending`,targetAsset:y.assetOut,targetChain:y.targetChain,toAddress:y.toAddress,type:e.AVALANCHE_EVM}}}export{m as transferAssetFactory};
|
|
2
2
|
//# sourceMappingURL=transfer-asset.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../type-guards.cjs`),r=require(`../../../utils/caip.cjs`),i=require(
|
|
1
|
+
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../type-guards.cjs`),r=require(`../../../utils/caip.cjs`),i=require(`../../_utils.cjs`),a=require(`../../../_utils/chain.cjs`),o=require(`../../_abis.cjs`);let s=require(`viem`);async function c({amountIn:e,assetIn:t,evmConfig:r,fromAddress:i,gasSettings:a,onStepChange:o,quote:s,sign:c,source:u,sourceChain:d,targetChain:p}){return n.isNativeAsset(t)?f({amountIn:e,evmConfig:r,fromAddress:i,source:u,sourceChain:d,targetChain:p,quote:s,sign:c,onStepChange:o,gasSettings:a}):l({amountIn:e,evmConfig:r,source:u,sourceChain:d,quote:s,fromAddress:i,sign:c,onStepChange:o,gasSettings:a})}async function l({amountIn:t,evmConfig:n,fromAddress:a,gasSettings:o,onStepChange:c,quote:l,sign:u,source:d,sourceChain:f}){let p=n.walletAddresses.ethereum,m=i.getEvmClientForChain({chain:f}),h={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:l,requiredSignatures:1};c?.(h);let g=(0,s.encodeFunctionData)({abi:s.erc20Abi,functionName:`transfer`,args:[p,t]}),_=await u({chainId:r.caip2ToEip155HexChainId(f.chainId),data:g,from:a,to:d.token.address,...o?.maxFeePerGas===void 0?null:{maxFeePerGas:o.maxFeePerGas,maxPriorityFeePerGas:o.maxPriorityFeePerGas}},e=>m.sendRawTransaction({serializedTransaction:e}),h);return[_,await m.waitForTransactionReceipt({hash:_})]}const u={[e.Blockchain.ETHEREUM]:`0x6b7a87899490EcE95443e979cA9485CBE7E71522`,[e.Blockchain.AVALANCHE]:`0x9b17bAADf0f21F03e35249e0e59723F34994F806`};async function d({evmConfig:t,fromAddress:n,sourceChain:r,targetChain:o}){if(!(t.environment===e.Environment.PROD&&a.isMainnetChain(r)&&a.isMainnetChain(o)))return!1;let c=t.nativeTokenConfig.ethereumToken,l=t.nativeTokenConfig.avalancheToken;try{return await i.getEvmClientForChain({chain:r}).readContract({address:c.token.address,abi:s.erc20Abi,functionName:`allowance`,args:[n,u[e.Blockchain.ETHEREUM]]})>0n?!0:await i.getEvmClientForChain({chain:o}).readContract({address:l.token.address,abi:s.erc20Abi,functionName:`allowance`,args:[n,u[e.Blockchain.AVALANCHE]]})>0n}catch{return!1}}async function f({amountIn:n,evmConfig:c,fromAddress:l,gasSettings:u,onStepChange:f,quote:p,sign:m,source:h,sourceChain:g,targetChain:_}){let v=c.walletAddresses.ethereum,y=i.getEvmClientForChain({chain:g});if(!a.isAvalancheChain(_))throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid chain combinations for wrapping native asset`);if(await d({evmConfig:c,fromAddress:l,sourceChain:g,targetChain:_}))throw new t.InvalidParamsError(t.ErrorReason.VULNERABLE_TOKEN_APPROVAL_ADDRESS,`The fromAddress has token approvals for addresses involved in the multichain incident. Please revoke the approvals before proceeding with the transfer.`);let b={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.WrapToken,quote:p,requiredSignatures:2};f?.(b);let x=(0,s.encodeFunctionData)({abi:o.WETH_ABI,functionName:`deposit`}),S=await m({chainId:r.caip2ToEip155HexChainId(g.chainId),data:x,from:l,to:h.token.address,value:n,...u?.maxFeePerGas===void 0?null:{maxFeePerGas:u.maxFeePerGas,maxPriorityFeePerGas:u.maxPriorityFeePerGas}},e=>y.sendRawTransaction({serializedTransaction:e}),b),C=await y.waitForTransactionReceipt({hash:S});if(C.status===`reverted`)return[S,C];let w={currentSignature:2,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:p,requiredSignatures:2};f?.(w);let T=(0,s.encodeFunctionData)({abi:s.erc20Abi,functionName:`transfer`,args:[v,n]}),E=await m({chainId:r.caip2ToEip155HexChainId(g.chainId),data:T,from:l,to:h.token.address,...u?.maxFeePerGas===void 0?null:{maxFeePerGas:u.maxFeePerGas,maxPriorityFeePerGas:u.maxPriorityFeePerGas}},e=>y.sendRawTransaction({serializedTransaction:e}),w);return[E,await y.waitForTransactionReceipt({hash:E})]}exports.transferAssetFromEthToAva=c;
|
|
2
2
|
//# sourceMappingURL=wrap.cjs.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Blockchain as e,Environment as t,TransferSignatureReason as n}from"../../../constants.js";import{ErrorReason as r,InvalidParamsError as i}from"../../../errors.js";import{isNativeAsset as a}from"../../../type-guards.js";import{caip2ToEip155HexChainId as o}from"../../../utils/caip.js";import{
|
|
1
|
+
import{Blockchain as e,Environment as t,TransferSignatureReason as n}from"../../../constants.js";import{ErrorReason as r,InvalidParamsError as i}from"../../../errors.js";import{isNativeAsset as a}from"../../../type-guards.js";import{caip2ToEip155HexChainId as o}from"../../../utils/caip.js";import{getEvmClientForChain as s}from"../../_utils.js";import{isAvalancheChain as c,isMainnetChain as l}from"../../../_utils/chain.js";import{WETH_ABI as u}from"../../_abis.js";import{encodeFunctionData as d,erc20Abi as f}from"viem";async function p({amountIn:e,assetIn:t,evmConfig:n,fromAddress:r,gasSettings:i,onStepChange:o,quote:s,sign:c,source:l,sourceChain:u,targetChain:d}){return a(t)?_({amountIn:e,evmConfig:n,fromAddress:r,source:l,sourceChain:u,targetChain:d,quote:s,sign:c,onStepChange:o,gasSettings:i}):m({amountIn:e,evmConfig:n,source:l,sourceChain:u,quote:s,fromAddress:r,sign:c,onStepChange:o,gasSettings:i})}async function m({amountIn:e,evmConfig:t,fromAddress:r,gasSettings:i,onStepChange:a,quote:c,sign:l,source:u,sourceChain:p}){let m=t.walletAddresses.ethereum,h=s({chain:p}),g={currentSignature:1,currentSignatureReason:n.TokensTransfer,quote:c,requiredSignatures:1};a?.(g);let _=d({abi:f,functionName:`transfer`,args:[m,e]}),v=await l({chainId:o(p.chainId),data:_,from:r,to:u.token.address,...i?.maxFeePerGas===void 0?null:{maxFeePerGas:i.maxFeePerGas,maxPriorityFeePerGas:i.maxPriorityFeePerGas}},e=>h.sendRawTransaction({serializedTransaction:e}),g);return[v,await h.waitForTransactionReceipt({hash:v})]}const h={[e.ETHEREUM]:`0x6b7a87899490EcE95443e979cA9485CBE7E71522`,[e.AVALANCHE]:`0x9b17bAADf0f21F03e35249e0e59723F34994F806`};async function g({evmConfig:n,fromAddress:r,sourceChain:i,targetChain:a}){if(!(n.environment===t.PROD&&l(i)&&l(a)))return!1;let o=n.nativeTokenConfig.ethereumToken,c=n.nativeTokenConfig.avalancheToken;try{return await s({chain:i}).readContract({address:o.token.address,abi:f,functionName:`allowance`,args:[r,h[e.ETHEREUM]]})>0n?!0:await s({chain:a}).readContract({address:c.token.address,abi:f,functionName:`allowance`,args:[r,h[e.AVALANCHE]]})>0n}catch{return!1}}async function _({amountIn:e,evmConfig:t,fromAddress:a,gasSettings:l,onStepChange:p,quote:m,sign:h,source:_,sourceChain:v,targetChain:y}){let b=t.walletAddresses.ethereum,x=s({chain:v});if(!c(y))throw new i(r.INVALID_PARAMS,`Invalid chain combinations for wrapping native asset`);if(await g({evmConfig:t,fromAddress:a,sourceChain:v,targetChain:y}))throw new i(r.VULNERABLE_TOKEN_APPROVAL_ADDRESS,`The fromAddress has token approvals for addresses involved in the multichain incident. Please revoke the approvals before proceeding with the transfer.`);let S={currentSignature:1,currentSignatureReason:n.WrapToken,quote:m,requiredSignatures:2};p?.(S);let C=d({abi:u,functionName:`deposit`}),w=await h({chainId:o(v.chainId),data:C,from:a,to:_.token.address,value:e,...l?.maxFeePerGas===void 0?null:{maxFeePerGas:l.maxFeePerGas,maxPriorityFeePerGas:l.maxPriorityFeePerGas}},e=>x.sendRawTransaction({serializedTransaction:e}),S),T=await x.waitForTransactionReceipt({hash:w});if(T.status===`reverted`)return[w,T];let E={currentSignature:2,currentSignatureReason:n.TokensTransfer,quote:m,requiredSignatures:2};p?.(E);let D=d({abi:f,functionName:`transfer`,args:[b,e]}),O=await h({chainId:o(v.chainId),data:D,from:a,to:_.token.address,...l?.maxFeePerGas===void 0?null:{maxFeePerGas:l.maxFeePerGas,maxPriorityFeePerGas:l.maxPriorityFeePerGas}},e=>x.sendRawTransaction({serializedTransaction:e}),E);return[O,await x.waitForTransactionReceipt({hash:O})]}export{p as transferAssetFromEthToAva};
|
|
2
2
|
//# sourceMappingURL=wrap.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const e=require(`../errors.cjs`),t=[`GET`,`HEAD`,`OPTIONS`,`TRACE`];
|
|
1
|
+
const e=require(`../errors.cjs`),t=require(`./_utils.cjs`),n=[`GET`,`HEAD`,`OPTIONS`,`TRACE`];function r(e){if(!e)return null;let t=Number(e);if(!Number.isNaN(t)&&t>=0)return Math.floor(t)*1e3;let n=new Date(e).getTime()-Date.now();return Number.isFinite(n)&&n>0?n:null}function i(e,t={}){let n=Math.max(1,Math.floor(t.baseMs??200)),r=Math.max(n,Math.floor(t.maxMs??5e3)),i=Math.min(r,n*2**e);return Math.floor(Math.random()*i)}function a(t,n){let r=(t.init.method??`GET`).toUpperCase();if(!n.includes(r))return!1;if(t.error)return!(t.error instanceof e.AbortedError);let i=t.response?.status??0;return i===408||i===425||i===429||i>=500&&i<=599}function o(t,n){let r=new AbortController,i,a=!1,o=()=>{r.abort(t?.reason??new e.AbortedError)};return t&&(t.aborted?r.abort(t.reason??new e.AbortedError):t.addEventListener(`abort`,o)),n&&n>0&&(i=setTimeout(()=>{a=!0,r.abort(new e.TimeoutError)},n)),{cleanup:()=>{t&&t.removeEventListener(`abort`,o),i&&clearTimeout(i)},signal:r.signal,timedOut:()=>a}}function s(e,t,n,r){return n??(typeof r?.backoff==`function`?r.backoff(t):i(e,r?.backoff))}async function c(e){if((e.headers.get(`content-type`)??``).includes(`application/json`))try{return await e.clone().json()}catch{}try{return await e.clone().text()}catch{}}async function l(i,l={},u={}){let{fetch:d,retries:f=3,retryMethods:p=n,retryOn:m=e=>a(e,p)}=u,h=d??globalThis.fetch,g;for(let n=0;n<=f;n++){let{cleanup:a,signal:d,timedOut:p}=o(u.signal,u.timeoutMs);try{let o=await h(i,{...l,signal:d});if(o.ok)return a(),o;let p={attempt:n,init:l,input:i,response:o};if(!await m(p)||n===f){let t;try{t=await c(o)}catch{}throw a(),new e.HttpError(`HTTP ${o.status} ${o.statusText}`,o,t)}let g=r(o.headers.get(`retry-after`)),_=s(n,p,g,u);a(),await t.wait(_,u.signal);continue}catch(r){a(),g=r;let o=e.isAbortedError(r),c={attempt:n,error:r,init:l,input:i};if(!(!o&&await m(c))||n===f)throw p()?new e.TimeoutError:o?new e.AbortedError(r.message??`Aborted`):r;await t.wait(s(n,c,null,u),u.signal);continue}}throw g??Error(`Unknown fetch error.`)}function u(){let e=null;return t=>{if(t.trim()===``){if(e&&typeof e.data==`string`){let t={data:e.data,event:e.event,id:e.id,retry:e.retry};return e=null,t}return e=null,null}let n=t.indexOf(`:`),r=n>=0?t.slice(0,n):t,i=n>=0?t.slice(n+1):``;switch(i.startsWith(` `)&&(i=i.slice(1)),e??={},r){case`data`:e.data=(e.data?e.data+`
|
|
2
2
|
`:``)+i;break;case`event`:e.event=i;break;case`id`:e.id=i;break;case`retry`:{let t=Number(i);if(Number.isFinite(t)){e.retry=Math.floor(t);break}}}return null}}async function d(t,n={}){let r={Accept:n.accept??`application/json`,...n.headers??{}},i=n.body,a=i!=null,o=(n.method??(a?`POST`:`GET`)).toUpperCase();if(a){let e=n.contentType??`application/json`;r[`Content-Type`]||=e}let s=await l(t,{method:o,headers:r,body:i},n);if(!s.headers.get(`content-type`)?.includes(`application/json`))throw new e.HttpError(`Expected application/json response.`,s,await s.text());return await s.json()}function f(e,t){let n=e.pathname,r=n.endsWith(`/`)&&t.startsWith(`/`)?n+t.slice(1):!n.endsWith(`/`)&&!t.startsWith(`/`)?n+`/`+t:n+t;return new URL(r,e)}async function*p(t,n={}){let r={Accept:n.accept??(n.sse===!1?`*/*`:`text/event-stream`),...n.headers??{}},i=n.body,a=i!=null,o=(n.method??(a?`POST`:`GET`)).toUpperCase();if(a){let e=n.contentType??`application/json`;r[`Content-Type`]||=e}let s=await l(t,{body:i,headers:r,method:o},n);if(!s.body)throw new e.HttpError(`Response body is not a readable stream.`,s);let c=s.body.getReader(),d=new TextDecoder,f=u(),p=``;try{for(;;){let{done:e,value:t}=await c.read();if(e)break;p+=d.decode(t,{stream:!0});let r;for(;(r=p.indexOf(`
|
|
3
3
|
`))>=0;){let e=p.slice(0,r);if(p=p.slice(r+1),n.sse===!1)e.length&&(yield e);else{let t=f(e);t&&(yield t)}}}n.sse===!1&&p.length&&(yield p)}finally{try{c.releaseLock()}catch{}}}exports.combineUrlPathnames=f,exports.fetchEventStream=p,exports.fetchJson=d;
|
|
4
4
|
//# sourceMappingURL=fetch-utilities.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-utilities.cjs","names":["AbortedError","TimeoutError","HttpError","isAbortedError"],"sources":["../../src/transfer-service/fetch-utilities.ts"],"sourcesContent":["import { AbortedError, HttpError, isAbortedError, TimeoutError } from '../errors';\nimport type { Fetch } from '../types/utility-types';\n\nconst DEFAULT_BACKOFF_BASE_MS = 200;\nconst DEFAULT_BACKOFF_MAX_MS = 5_000;\nconst DEFAULT_RETRY_COUNT = 3;\n/**\n * Default HTTP methods to retry on.\n *\n * Only includes safe methods.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods#safe_idempotent_and_cacheable_request_methods\n */\nconst DEFAULT_RETRY_METHODS = ['GET', 'HEAD', 'OPTIONS', 'TRACE'];\n\nexport interface BackoffOptions {\n /** Base backoff in milliseconds */\n readonly baseMs?: number;\n /** Maximum backoff in milliseconds */\n readonly maxMs?: number;\n}\n\nexport interface RetryContext {\n /** Zero based attempt index */\n readonly attempt: number;\n /** Network or other thrown error */\n readonly error?: unknown;\n readonly init: RequestInit;\n readonly input: RequestInfo | URL;\n /** Failed response (non-2xx) */\n readonly response?: Response;\n}\n\nexport interface RetryOptions {\n readonly backoff?: BackoffOptions | ((ctx: RetryContext) => number);\n /**\n * Total number of retries to attempt.\n *\n * Default: {@link DEFAULT_RETRY_COUNT}\n */\n readonly retries?: number;\n /**\n * HTTP methods to retry on.\n *\n * Default: {@link DEFAULT_RETRY_METHODS}\n */\n readonly retryMethods?: string[];\n /**\n * Custom retry decider.\n */\n readonly retryOn?: (ctx: RetryContext) => boolean | Promise<boolean>;\n /**\n * Per attempt timeout in milliseconds.\n *\n * A `0` or `undefined` value means no timeout.\n */\n readonly timeoutMs?: number;\n}\n\nexport interface FetchWithRetryOptions extends RetryOptions {\n /**\n * Custom fetch implementation to use for the request.\n * @default globalThis.fetch\n */\n readonly fetch?: Fetch;\n /** Export abort. Applies to all attempts. */\n readonly signal?: AbortSignal;\n}\n\nexport async function _wait(delayMs: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (delayMs <= 0) {\n return resolve();\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, delayMs);\n\n const onAbort = () => {\n cleanup();\n reject(new AbortedError());\n };\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n\n if (signal) {\n signal.removeEventListener('abort', onAbort);\n }\n };\n\n if (signal) {\n if (signal.aborted) {\n cleanup();\n\n return reject(new AbortedError());\n }\n\n signal.addEventListener('abort', onAbort);\n }\n });\n}\n\n/**\n * @internal\n *\n * Parses a Retry-After header value.\n *\n * @param retryAfter - The value of the Retry-After header.\n * @returns The number of milliseconds to wait before retrying, or null if the header is not present or invalid.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After\n */\nexport function _parseRetryAfterHeader(retryAfter: string | null): number | null {\n if (!retryAfter) {\n return null;\n }\n\n const seconds = Number(retryAfter);\n\n if (!Number.isNaN(seconds) && seconds >= 0) {\n return Math.floor(seconds) * 1_000;\n }\n\n const date = new Date(retryAfter);\n\n const delta = date.getTime() - Date.now();\n\n return Number.isFinite(delta) && delta > 0 ? delta : null;\n}\n\nexport function _exponentialBackoff(attempt: number, options: BackoffOptions = {}): number {\n const base = Math.max(1, Math.floor(options.baseMs ?? DEFAULT_BACKOFF_BASE_MS));\n const max = Math.max(base, Math.floor(options.maxMs ?? DEFAULT_BACKOFF_MAX_MS));\n\n const raw = Math.min(max, base * 2 ** attempt);\n\n // Add some jitter.\n return Math.floor(Math.random() * raw);\n}\n\nexport function _shouldRetry(ctx: RetryContext, retryMethods: string[]): boolean {\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n if (!retryMethods.includes(method)) {\n return false;\n }\n\n if (ctx.error) {\n if (ctx.error instanceof AbortedError) {\n return false;\n }\n\n return true;\n }\n\n const status = ctx.response?.status ?? 0;\n\n if (status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599)) {\n return true;\n }\n\n return false;\n}\n\nexport function _composeAbortSignals(\n external?: AbortSignal,\n timeoutMs?: number,\n): { signal: AbortSignal; cleanup: () => void; timedOut: () => boolean } {\n const controller = new AbortController();\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let didTimeout = false;\n\n const onExternalAbort = () => {\n controller.abort(external?.reason ?? new AbortedError());\n };\n\n if (external) {\n if (external.aborted) {\n controller.abort(external.reason ?? new AbortedError());\n } else {\n external.addEventListener('abort', onExternalAbort);\n }\n }\n\n if (timeoutMs && timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n didTimeout = true;\n controller.abort(new TimeoutError());\n }, timeoutMs);\n }\n\n const cleanup = () => {\n if (external) {\n external.removeEventListener('abort', onExternalAbort);\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n\n return {\n cleanup,\n signal: controller.signal,\n timedOut: () => didTimeout,\n };\n}\n\nexport function _resolveBackoffDelay(\n attempt: number,\n ctx: RetryContext,\n retryAfterMs: number | null,\n options?: RetryOptions,\n): number {\n if (retryAfterMs != null) {\n return retryAfterMs;\n }\n\n if (typeof options?.backoff === 'function') {\n return options.backoff(ctx);\n }\n\n return _exponentialBackoff(attempt, options?.backoff);\n}\n\nasync function _safeParseResponse(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n\n if (contentType.includes('application/json')) {\n try {\n return await response.clone().json();\n } catch {\n // Ignore\n }\n }\n\n try {\n return await response.clone().text();\n } catch {\n // Ignore\n }\n\n return undefined;\n}\n\nexport async function _fetchWithRetry(\n input: RequestInfo | URL,\n init: RequestInit = {},\n options: FetchWithRetryOptions = {},\n): Promise<Response> {\n const {\n fetch: customFetch,\n retries = DEFAULT_RETRY_COUNT,\n retryMethods = DEFAULT_RETRY_METHODS,\n retryOn = (ctx: RetryContext) => _shouldRetry(ctx, retryMethods),\n } = options;\n\n const fetchImpl: Fetch = customFetch ?? globalThis.fetch;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n const { cleanup, signal, timedOut } = _composeAbortSignals(options.signal, options.timeoutMs);\n\n try {\n const response = await fetchImpl(input, { ...init, signal });\n\n if (response.ok) {\n cleanup();\n return response;\n }\n\n const ctx: RetryContext = {\n attempt,\n init,\n input,\n response,\n };\n\n const doRetry = await retryOn(ctx);\n\n if (!doRetry || attempt === retries) {\n // Try to extract error payload best-effort.\n // Do not throw if stream already consumed.\n let data: unknown;\n try {\n data = await _safeParseResponse(response);\n } catch {\n // Ignore\n }\n\n cleanup();\n\n throw new HttpError(`HTTP ${response.status} ${response.statusText}`, response, data);\n }\n\n const retryAfterMs = _parseRetryAfterHeader(response.headers.get('retry-after'));\n const delay = _resolveBackoffDelay(attempt, ctx, retryAfterMs, options);\n\n cleanup();\n\n await _wait(delay, options.signal);\n\n continue;\n } catch (error: unknown) {\n cleanup();\n\n lastError = error;\n\n const isAbortError = isAbortedError(error);\n\n const ctx: RetryContext = {\n attempt,\n error,\n init,\n input,\n };\n\n const doRetry = !isAbortError && (await retryOn(ctx));\n\n if (!doRetry || attempt === retries) {\n if (timedOut()) {\n throw new TimeoutError();\n }\n\n if (isAbortError) {\n throw new AbortedError(error.message ?? 'Aborted');\n }\n\n throw error;\n }\n\n const delay = _resolveBackoffDelay(attempt, ctx, null, options);\n\n await _wait(delay, options.signal);\n\n continue;\n }\n }\n\n // Should never reach here.\n throw lastError ?? new Error('Unknown fetch error.');\n}\n\nexport function _sseLineParser(): (line: string) => SseEvent | null {\n let currentEvent: Partial<SseEvent> | null = null;\n\n return (line: string): SseEvent | null => {\n // Blank line indicates dispatch.\n if (line.trim() === '') {\n if (currentEvent && typeof currentEvent.data === 'string') {\n const out: SseEvent = {\n data: currentEvent.data,\n event: currentEvent.event,\n id: currentEvent.id,\n retry: currentEvent.retry,\n };\n\n currentEvent = null;\n\n return out;\n }\n\n currentEvent = null;\n\n return null;\n }\n\n const colonIndex = line.indexOf(':');\n const field = colonIndex >= 0 ? line.slice(0, colonIndex) : line;\n let value = colonIndex >= 0 ? line.slice(colonIndex + 1) : '';\n\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n\n currentEvent = currentEvent ?? {};\n\n switch (field) {\n case 'data': {\n currentEvent.data = (currentEvent.data ? currentEvent.data + '\\n' : '') + value;\n break;\n }\n case 'event': {\n currentEvent.event = value;\n break;\n }\n case 'id': {\n currentEvent.id = value;\n break;\n }\n case 'retry': {\n const retry = Number(value);\n\n if (Number.isFinite(retry)) {\n currentEvent.retry = Math.floor(retry);\n break;\n }\n }\n }\n\n return null;\n };\n}\n\nexport interface JsonRequestOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n}\n\nexport async function fetchJson(input: RequestInfo | URL, options: JsonRequestOptions = {}): Promise<unknown> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? 'application/json',\n ...(options.headers ?? {}),\n };\n\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { method, headers, body }, options);\n\n if (!response.headers.get('content-type')?.includes('application/json')) {\n const text = await response.text();\n\n throw new HttpError('Expected application/json response.', response, text);\n }\n\n const data = (await response.json()) as unknown;\n\n return data;\n}\n\nexport function combineUrlPathnames(baseUrl: URL, pathname: string): URL {\n const baseUrlPathname = baseUrl.pathname;\n\n const newPath =\n baseUrlPathname.endsWith('/') && pathname.startsWith('/')\n ? baseUrlPathname + pathname.slice(1)\n : !baseUrlPathname.endsWith('/') && !pathname.startsWith('/')\n ? baseUrlPathname + '/' + pathname\n : baseUrlPathname + pathname;\n\n return new URL(newPath, baseUrl);\n}\n\nexport interface EventStreamOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n /**\n * When true, parse as SSE (Server-Sent Events);\n * otherwise, return newline-delimited chunks as strings.\n *\n * @default true\n */\n sse?: boolean;\n}\n\nexport interface SseEvent {\n data: string;\n event?: string;\n id?: string;\n retry?: number;\n}\n\n// Generic signature to narrow return type based on `sse` option\nexport function fetchEventStream<S extends boolean | undefined = true>(\n input: RequestInfo | URL,\n options?: Omit<EventStreamOptions, 'sse'> & { sse?: S },\n): S extends false ? AsyncGenerator<string> : AsyncGenerator<SseEvent>;\nexport async function* fetchEventStream(\n input: RequestInfo | URL,\n options: EventStreamOptions = {},\n): AsyncGenerator<SseEvent | string> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? (options.sse === false ? '*/*' : 'text/event-stream'),\n ...(options.headers ?? {}),\n };\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { body, headers, method }, options);\n\n if (!response.body) {\n throw new HttpError('Response body is not a readable stream.', response);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const parse = _sseLineParser();\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n let lineEndIndex: number;\n\n while ((lineEndIndex = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.slice(0, lineEndIndex);\n buffer = buffer.slice(lineEndIndex + 1);\n\n if (options.sse === false) {\n if (line.length) {\n yield line;\n }\n } else {\n const event = parse(line);\n\n if (event) {\n yield event;\n }\n }\n }\n }\n\n if (options.sse === false && buffer.length) {\n yield buffer;\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // Ignore\n }\n }\n}\n"],"mappings":"iCAYM,EAAwB,CAAC,MAAO,OAAQ,UAAW,QAAQ,CAwDjE,eAAsB,EAAM,EAAiB,EAAqC,CAChF,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC,GAAI,GAAW,EACb,OAAO,GAAS,CAGlB,IAAM,EAAY,eAAiB,CACjC,GAAS,CACT,GAAS,EACR,EAAQ,CAEL,MAAgB,CACpB,GAAS,CACT,EAAO,IAAIA,EAAAA,aAAe,EAGtB,MAAgB,CACpB,aAAa,EAAU,CAEnB,GACF,EAAO,oBAAoB,QAAS,EAAQ,EAIhD,GAAI,EAAQ,CACV,GAAI,EAAO,QAGT,OAFA,GAAS,CAEF,EAAO,IAAIA,EAAAA,aAAe,CAGnC,EAAO,iBAAiB,QAAS,EAAQ,GAE3C,CAaJ,SAAgB,EAAuB,EAA0C,CAC/E,GAAI,CAAC,EACH,OAAO,KAGT,IAAM,EAAU,OAAO,EAAW,CAElC,GAAI,CAAC,OAAO,MAAM,EAAQ,EAAI,GAAW,EACvC,OAAO,KAAK,MAAM,EAAQ,CAAG,IAK/B,IAAM,EAFO,IAAI,KAAK,EAAW,CAEd,SAAS,CAAG,KAAK,KAAK,CAEzC,OAAO,OAAO,SAAS,EAAM,EAAI,EAAQ,EAAI,EAAQ,KAGvD,SAAgB,EAAoB,EAAiB,EAA0B,EAAE,CAAU,CACzF,IAAM,EAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,QAAU,IAAwB,CAAC,CACzE,EAAM,KAAK,IAAI,EAAM,KAAK,MAAM,EAAQ,OAAS,IAAuB,CAAC,CAEzE,EAAM,KAAK,IAAI,EAAK,EAAO,GAAK,EAAQ,CAG9C,OAAO,KAAK,MAAM,KAAK,QAAQ,CAAG,EAAI,CAGxC,SAAgB,EAAa,EAAmB,EAAiC,CAC/E,IAAM,GAAU,EAAI,KAAK,QAAU,OAAO,aAAa,CAEvD,GAAI,CAAC,EAAa,SAAS,EAAO,CAChC,MAAO,GAGT,GAAI,EAAI,MAKN,MAJA,EAAI,EAAI,iBAAiBA,EAAAA,cAO3B,IAAM,EAAS,EAAI,UAAU,QAAU,EAMvC,OAJI,IAAW,KAAO,IAAW,KAAO,IAAW,KAAQ,GAAU,KAAO,GAAU,IAOxF,SAAgB,EACd,EACA,EACuE,CACvE,IAAM,EAAa,IAAI,gBAEnB,EACA,EAAa,GAEX,MAAwB,CAC5B,EAAW,MAAM,GAAU,QAAU,IAAIA,EAAAA,aAAe,EA4B1D,OAzBI,IACE,EAAS,QACX,EAAW,MAAM,EAAS,QAAU,IAAIA,EAAAA,aAAe,CAEvD,EAAS,iBAAiB,QAAS,EAAgB,EAInD,GAAa,EAAY,IAC3B,EAAY,eAAiB,CAC3B,EAAa,GACb,EAAW,MAAM,IAAIC,EAAAA,aAAe,EACnC,EAAU,EAaR,CACL,YAXoB,CAChB,GACF,EAAS,oBAAoB,QAAS,EAAgB,CAGpD,GACF,aAAa,EAAU,EAMzB,OAAQ,EAAW,OACnB,aAAgB,EACjB,CAGH,SAAgB,EACd,EACA,EACA,EACA,EACQ,CASR,OARI,IAIA,OAAO,GAAS,SAAY,WACvB,EAAQ,QAAQ,EAAI,CAGtB,EAAoB,EAAS,GAAS,QAAQ,EAGvD,eAAe,EAAmB,EAAsC,CAGtE,IAFoB,EAAS,QAAQ,IAAI,eAAe,EAAI,IAE5C,SAAS,mBAAmB,CAC1C,GAAI,CACF,OAAO,MAAM,EAAS,OAAO,CAAC,MAAM,MAC9B,EAKV,GAAI,CACF,OAAO,MAAM,EAAS,OAAO,CAAC,MAAM,MAC9B,GAOV,eAAsB,EACpB,EACA,EAAoB,EAAE,CACtB,EAAiC,EAAE,CAChB,CACnB,GAAM,CACJ,MAAO,EACP,UAAU,EACV,eAAe,EACf,UAAW,GAAsB,EAAa,EAAK,EAAa,EAC9D,EAEE,EAAmB,GAAe,WAAW,MAE/C,EAEJ,IAAK,IAAI,EAAU,EAAG,GAAW,EAAS,IAAW,CACnD,GAAM,CAAE,UAAS,SAAQ,YAAa,EAAqB,EAAQ,OAAQ,EAAQ,UAAU,CAE7F,GAAI,CACF,IAAM,EAAW,MAAM,EAAU,EAAO,CAAE,GAAG,EAAM,SAAQ,CAAC,CAE5D,GAAI,EAAS,GAEX,OADA,GAAS,CACF,EAGT,IAAM,EAAoB,CACxB,UACA,OACA,QACA,WACD,CAID,GAAI,CAFY,MAAM,EAAQ,EAAI,EAElB,IAAY,EAAS,CAGnC,IAAI,EACJ,GAAI,CACF,EAAO,MAAM,EAAmB,EAAS,MACnC,EAMR,MAFA,GAAS,CAEH,IAAIC,EAAAA,UAAU,QAAQ,EAAS,OAAO,GAAG,EAAS,aAAc,EAAU,EAAK,CAGvF,IAAM,EAAe,EAAuB,EAAS,QAAQ,IAAI,cAAc,CAAC,CAC1E,EAAQ,EAAqB,EAAS,EAAK,EAAc,EAAQ,CAEvE,GAAS,CAET,MAAM,EAAM,EAAO,EAAQ,OAAO,CAElC,eACO,EAAgB,CACvB,GAAS,CAET,EAAY,EAEZ,IAAM,EAAeC,EAAAA,eAAe,EAAM,CAEpC,EAAoB,CACxB,UACA,QACA,OACA,QACD,CAID,GAAI,EAFY,CAAC,GAAiB,MAAM,EAAQ,EAAI,GAEpC,IAAY,EAS1B,MARI,GAAU,CACN,IAAIF,EAAAA,aAGR,EACI,IAAID,EAAAA,aAAa,EAAM,SAAW,UAAU,CAG9C,EAKR,MAAM,EAFQ,EAAqB,EAAS,EAAK,KAAM,EAAQ,CAE5C,EAAQ,OAAO,CAElC,UAKJ,MAAM,GAAiB,MAAM,uBAAuB,CAGtD,SAAgB,GAAoD,CAClE,IAAI,EAAyC,KAE7C,MAAQ,IAAkC,CAExC,GAAI,EAAK,MAAM,GAAK,GAAI,CACtB,GAAI,GAAgB,OAAO,EAAa,MAAS,SAAU,CACzD,IAAM,EAAgB,CACpB,KAAM,EAAa,KACnB,MAAO,EAAa,MACpB,GAAI,EAAa,GACjB,MAAO,EAAa,MACrB,CAID,MAFA,GAAe,KAER,EAKT,MAFA,GAAe,KAER,KAGT,IAAM,EAAa,EAAK,QAAQ,IAAI,CAC9B,EAAQ,GAAc,EAAI,EAAK,MAAM,EAAG,EAAW,CAAG,EACxD,EAAQ,GAAc,EAAI,EAAK,MAAM,EAAa,EAAE,CAAG,GAQ3D,OANI,EAAM,WAAW,IAAI,GACvB,EAAQ,EAAM,MAAM,EAAE,EAGxB,IAA+B,EAAE,CAEzB,EAAR,CACE,IAAK,OACH,EAAa,MAAQ,EAAa,KAAO,EAAa,KAAO;EAAO,IAAM,EAC1E,MAEF,IAAK,QACH,EAAa,MAAQ,EACrB,MAEF,IAAK,KACH,EAAa,GAAK,EAClB,MAEF,IAAK,QAAS,CACZ,IAAM,EAAQ,OAAO,EAAM,CAE3B,GAAI,OAAO,SAAS,EAAM,CAAE,CAC1B,EAAa,MAAQ,KAAK,MAAM,EAAM,CACtC,QAKN,OAAO,MAYX,eAAsB,EAAU,EAA0B,EAA8B,EAAE,CAAoB,CAC5G,IAAM,EAAkC,CACtC,OAAQ,EAAQ,QAAU,mBAC1B,GAAI,EAAQ,SAAW,EAAE,CAC1B,CAEK,EAAO,EAAQ,KACf,EAAU,GAA+B,KACzC,GAAU,EAAQ,SAAW,EAAU,OAAS,QAAQ,aAAa,CAE3E,GAAI,EAAS,CACX,IAAM,EAAc,EAAQ,aAAe,mBAE3C,AACE,EAAQ,kBAAkB,EAI9B,IAAM,EAAW,MAAM,EAAgB,EAAO,CAAE,SAAQ,UAAS,OAAM,CAAE,EAAQ,CAEjF,GAAI,CAAC,EAAS,QAAQ,IAAI,eAAe,EAAE,SAAS,mBAAmB,CAGrE,MAAM,IAAIE,EAAAA,UAAU,sCAAuC,EAF9C,MAAM,EAAS,MAAM,CAEwC,CAK5E,OAFc,MAAM,EAAS,MAAM,CAKrC,SAAgB,EAAoB,EAAc,EAAuB,CACvE,IAAM,EAAkB,EAAQ,SAE1B,EACJ,EAAgB,SAAS,IAAI,EAAI,EAAS,WAAW,IAAI,CACrD,EAAkB,EAAS,MAAM,EAAE,CACnC,CAAC,EAAgB,SAAS,IAAI,EAAI,CAAC,EAAS,WAAW,IAAI,CAC3D,EAAkB,IAAM,EACxB,EAAkB,EAExB,OAAO,IAAI,IAAI,EAAS,EAAQ,CA8BlC,eAAuB,EACrB,EACA,EAA8B,EAAE,CACG,CACnC,IAAM,EAAkC,CACtC,OAAQ,EAAQ,SAAW,EAAQ,MAAQ,GAAQ,MAAQ,qBAC3D,GAAI,EAAQ,SAAW,EAAE,CAC1B,CACK,EAAO,EAAQ,KACf,EAAU,GAA+B,KACzC,GAAU,EAAQ,SAAW,EAAU,OAAS,QAAQ,aAAa,CAE3E,GAAI,EAAS,CACX,IAAM,EAAc,EAAQ,aAAe,mBAE3C,AACE,EAAQ,kBAAkB,EAI9B,IAAM,EAAW,MAAM,EAAgB,EAAO,CAAE,OAAM,UAAS,SAAQ,CAAE,EAAQ,CAEjF,GAAI,CAAC,EAAS,KACZ,MAAM,IAAIA,EAAAA,UAAU,0CAA2C,EAAS,CAG1E,IAAM,EAAS,EAAS,KAAK,WAAW,CAClC,EAAU,IAAI,YACd,EAAQ,GAAgB,CAE1B,EAAS,GAEb,GAAI,CACF,OAAa,CACX,GAAM,CAAE,OAAM,SAAU,MAAM,EAAO,MAAM,CAE3C,GAAI,EACF,MAGF,GAAU,EAAQ,OAAO,EAAO,CAAE,OAAQ,GAAM,CAAC,CAEjD,IAAI,EAEJ,MAAQ,EAAe,EAAO,QAAQ;EAAK,GAAK,GAAG,CACjD,IAAM,EAAO,EAAO,MAAM,EAAG,EAAa,CAG1C,GAFA,EAAS,EAAO,MAAM,EAAe,EAAE,CAEnC,EAAQ,MAAQ,GACd,EAAK,SACP,MAAM,OAEH,CACL,IAAM,EAAQ,EAAM,EAAK,CAErB,IACF,MAAM,KAMV,EAAQ,MAAQ,IAAS,EAAO,SAClC,MAAM,UAEA,CACR,GAAI,CACF,EAAO,aAAa,MACd"}
|
|
1
|
+
{"version":3,"file":"fetch-utilities.cjs","names":["AbortedError","TimeoutError","HttpError","wait","isAbortedError"],"sources":["../../src/transfer-service/fetch-utilities.ts"],"sourcesContent":["import { AbortedError, HttpError, isAbortedError, TimeoutError } from '../errors';\nimport type { Fetch } from '../types/utility-types';\nimport { wait } from './_utils';\n\nconst DEFAULT_BACKOFF_BASE_MS = 200;\nconst DEFAULT_BACKOFF_MAX_MS = 5_000;\nconst DEFAULT_RETRY_COUNT = 3;\n/**\n * Default HTTP methods to retry on.\n *\n * Only includes safe methods.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods#safe_idempotent_and_cacheable_request_methods\n */\nconst DEFAULT_RETRY_METHODS = ['GET', 'HEAD', 'OPTIONS', 'TRACE'];\n\nexport interface BackoffOptions {\n /** Base backoff in milliseconds */\n readonly baseMs?: number;\n /** Maximum backoff in milliseconds */\n readonly maxMs?: number;\n}\n\nexport interface RetryContext {\n /** Zero based attempt index */\n readonly attempt: number;\n /** Network or other thrown error */\n readonly error?: unknown;\n readonly init: RequestInit;\n readonly input: RequestInfo | URL;\n /** Failed response (non-2xx) */\n readonly response?: Response;\n}\n\nexport interface RetryOptions {\n readonly backoff?: BackoffOptions | ((ctx: RetryContext) => number);\n /**\n * Total number of retries to attempt.\n *\n * Default: {@link DEFAULT_RETRY_COUNT}\n */\n readonly retries?: number;\n /**\n * HTTP methods to retry on.\n *\n * Default: {@link DEFAULT_RETRY_METHODS}\n */\n readonly retryMethods?: string[];\n /**\n * Custom retry decider.\n */\n readonly retryOn?: (ctx: RetryContext) => boolean | Promise<boolean>;\n /**\n * Per attempt timeout in milliseconds.\n *\n * A `0` or `undefined` value means no timeout.\n */\n readonly timeoutMs?: number;\n}\n\nexport interface FetchWithRetryOptions extends RetryOptions {\n /**\n * Custom fetch implementation to use for the request.\n * @default globalThis.fetch\n */\n readonly fetch?: Fetch;\n /** Export abort. Applies to all attempts. */\n readonly signal?: AbortSignal;\n}\n\n/**\n * @internal\n *\n * Parses a Retry-After header value.\n *\n * @param retryAfter - The value of the Retry-After header.\n * @returns The number of milliseconds to wait before retrying, or null if the header is not present or invalid.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After\n */\nexport function _parseRetryAfterHeader(retryAfter: string | null): number | null {\n if (!retryAfter) {\n return null;\n }\n\n const seconds = Number(retryAfter);\n\n if (!Number.isNaN(seconds) && seconds >= 0) {\n return Math.floor(seconds) * 1_000;\n }\n\n const date = new Date(retryAfter);\n\n const delta = date.getTime() - Date.now();\n\n return Number.isFinite(delta) && delta > 0 ? delta : null;\n}\n\nexport function _exponentialBackoff(attempt: number, options: BackoffOptions = {}): number {\n const base = Math.max(1, Math.floor(options.baseMs ?? DEFAULT_BACKOFF_BASE_MS));\n const max = Math.max(base, Math.floor(options.maxMs ?? DEFAULT_BACKOFF_MAX_MS));\n\n const raw = Math.min(max, base * 2 ** attempt);\n\n // Add some jitter.\n return Math.floor(Math.random() * raw);\n}\n\nexport function _shouldRetry(ctx: RetryContext, retryMethods: string[]): boolean {\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n if (!retryMethods.includes(method)) {\n return false;\n }\n\n if (ctx.error) {\n if (ctx.error instanceof AbortedError) {\n return false;\n }\n\n return true;\n }\n\n const status = ctx.response?.status ?? 0;\n\n if (status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599)) {\n return true;\n }\n\n return false;\n}\n\nexport function _composeAbortSignals(\n external?: AbortSignal,\n timeoutMs?: number,\n): { signal: AbortSignal; cleanup: () => void; timedOut: () => boolean } {\n const controller = new AbortController();\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let didTimeout = false;\n\n const onExternalAbort = () => {\n controller.abort(external?.reason ?? new AbortedError());\n };\n\n if (external) {\n if (external.aborted) {\n controller.abort(external.reason ?? new AbortedError());\n } else {\n external.addEventListener('abort', onExternalAbort);\n }\n }\n\n if (timeoutMs && timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n didTimeout = true;\n controller.abort(new TimeoutError());\n }, timeoutMs);\n }\n\n const cleanup = () => {\n if (external) {\n external.removeEventListener('abort', onExternalAbort);\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n\n return {\n cleanup,\n signal: controller.signal,\n timedOut: () => didTimeout,\n };\n}\n\nexport function _resolveBackoffDelay(\n attempt: number,\n ctx: RetryContext,\n retryAfterMs: number | null,\n options?: RetryOptions,\n): number {\n if (retryAfterMs != null) {\n return retryAfterMs;\n }\n\n if (typeof options?.backoff === 'function') {\n return options.backoff(ctx);\n }\n\n return _exponentialBackoff(attempt, options?.backoff);\n}\n\nasync function _safeParseResponse(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n\n if (contentType.includes('application/json')) {\n try {\n return await response.clone().json();\n } catch {\n // Ignore\n }\n }\n\n try {\n return await response.clone().text();\n } catch {\n // Ignore\n }\n\n return undefined;\n}\n\nexport async function _fetchWithRetry(\n input: RequestInfo | URL,\n init: RequestInit = {},\n options: FetchWithRetryOptions = {},\n): Promise<Response> {\n const {\n fetch: customFetch,\n retries = DEFAULT_RETRY_COUNT,\n retryMethods = DEFAULT_RETRY_METHODS,\n retryOn = (ctx: RetryContext) => _shouldRetry(ctx, retryMethods),\n } = options;\n\n const fetchImpl: Fetch = customFetch ?? globalThis.fetch;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n const { cleanup, signal, timedOut } = _composeAbortSignals(options.signal, options.timeoutMs);\n\n try {\n const response = await fetchImpl(input, { ...init, signal });\n\n if (response.ok) {\n cleanup();\n return response;\n }\n\n const ctx: RetryContext = {\n attempt,\n init,\n input,\n response,\n };\n\n const doRetry = await retryOn(ctx);\n\n if (!doRetry || attempt === retries) {\n // Try to extract error payload best-effort.\n // Do not throw if stream already consumed.\n let data: unknown;\n try {\n data = await _safeParseResponse(response);\n } catch {\n // Ignore\n }\n\n cleanup();\n\n throw new HttpError(`HTTP ${response.status} ${response.statusText}`, response, data);\n }\n\n const retryAfterMs = _parseRetryAfterHeader(response.headers.get('retry-after'));\n const delay = _resolveBackoffDelay(attempt, ctx, retryAfterMs, options);\n\n cleanup();\n\n await wait(delay, options.signal);\n\n continue;\n } catch (error: unknown) {\n cleanup();\n\n lastError = error;\n\n const isAbortError = isAbortedError(error);\n\n const ctx: RetryContext = {\n attempt,\n error,\n init,\n input,\n };\n\n const doRetry = !isAbortError && (await retryOn(ctx));\n\n if (!doRetry || attempt === retries) {\n if (timedOut()) {\n throw new TimeoutError();\n }\n\n if (isAbortError) {\n throw new AbortedError(error.message ?? 'Aborted');\n }\n\n throw error;\n }\n\n const delay = _resolveBackoffDelay(attempt, ctx, null, options);\n\n await wait(delay, options.signal);\n\n continue;\n }\n }\n\n // Should never reach here.\n throw lastError ?? new Error('Unknown fetch error.');\n}\n\nexport function _sseLineParser(): (line: string) => SseEvent | null {\n let currentEvent: Partial<SseEvent> | null = null;\n\n return (line: string): SseEvent | null => {\n // Blank line indicates dispatch.\n if (line.trim() === '') {\n if (currentEvent && typeof currentEvent.data === 'string') {\n const out: SseEvent = {\n data: currentEvent.data,\n event: currentEvent.event,\n id: currentEvent.id,\n retry: currentEvent.retry,\n };\n\n currentEvent = null;\n\n return out;\n }\n\n currentEvent = null;\n\n return null;\n }\n\n const colonIndex = line.indexOf(':');\n const field = colonIndex >= 0 ? line.slice(0, colonIndex) : line;\n let value = colonIndex >= 0 ? line.slice(colonIndex + 1) : '';\n\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n\n currentEvent = currentEvent ?? {};\n\n switch (field) {\n case 'data': {\n currentEvent.data = (currentEvent.data ? currentEvent.data + '\\n' : '') + value;\n break;\n }\n case 'event': {\n currentEvent.event = value;\n break;\n }\n case 'id': {\n currentEvent.id = value;\n break;\n }\n case 'retry': {\n const retry = Number(value);\n\n if (Number.isFinite(retry)) {\n currentEvent.retry = Math.floor(retry);\n break;\n }\n }\n }\n\n return null;\n };\n}\n\nexport interface JsonRequestOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n}\n\nexport async function fetchJson(input: RequestInfo | URL, options: JsonRequestOptions = {}): Promise<unknown> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? 'application/json',\n ...(options.headers ?? {}),\n };\n\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { method, headers, body }, options);\n\n if (!response.headers.get('content-type')?.includes('application/json')) {\n const text = await response.text();\n\n throw new HttpError('Expected application/json response.', response, text);\n }\n\n const data = (await response.json()) as unknown;\n\n return data;\n}\n\nexport function combineUrlPathnames(baseUrl: URL, pathname: string): URL {\n const baseUrlPathname = baseUrl.pathname;\n\n const newPath =\n baseUrlPathname.endsWith('/') && pathname.startsWith('/')\n ? baseUrlPathname + pathname.slice(1)\n : !baseUrlPathname.endsWith('/') && !pathname.startsWith('/')\n ? baseUrlPathname + '/' + pathname\n : baseUrlPathname + pathname;\n\n return new URL(newPath, baseUrl);\n}\n\nexport interface EventStreamOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n /**\n * When true, parse as SSE (Server-Sent Events);\n * otherwise, return newline-delimited chunks as strings.\n *\n * @default true\n */\n sse?: boolean;\n}\n\nexport interface SseEvent {\n data: string;\n event?: string;\n id?: string;\n retry?: number;\n}\n\n// Generic signature to narrow return type based on `sse` option\nexport function fetchEventStream<S extends boolean | undefined = true>(\n input: RequestInfo | URL,\n options?: Omit<EventStreamOptions, 'sse'> & { sse?: S },\n): S extends false ? AsyncGenerator<string> : AsyncGenerator<SseEvent>;\nexport async function* fetchEventStream(\n input: RequestInfo | URL,\n options: EventStreamOptions = {},\n): AsyncGenerator<SseEvent | string> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? (options.sse === false ? '*/*' : 'text/event-stream'),\n ...(options.headers ?? {}),\n };\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { body, headers, method }, options);\n\n if (!response.body) {\n throw new HttpError('Response body is not a readable stream.', response);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const parse = _sseLineParser();\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n let lineEndIndex: number;\n\n while ((lineEndIndex = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.slice(0, lineEndIndex);\n buffer = buffer.slice(lineEndIndex + 1);\n\n if (options.sse === false) {\n if (line.length) {\n yield line;\n }\n } else {\n const event = parse(line);\n\n if (event) {\n yield event;\n }\n }\n }\n }\n\n if (options.sse === false && buffer.length) {\n yield buffer;\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // Ignore\n }\n }\n}\n"],"mappings":"2DAaM,EAAwB,CAAC,MAAO,OAAQ,UAAW,QAAQ,CAkEjE,SAAgB,EAAuB,EAA0C,CAC/E,GAAI,CAAC,EACH,OAAO,KAGT,IAAM,EAAU,OAAO,EAAW,CAElC,GAAI,CAAC,OAAO,MAAM,EAAQ,EAAI,GAAW,EACvC,OAAO,KAAK,MAAM,EAAQ,CAAG,IAK/B,IAAM,EAFO,IAAI,KAAK,EAAW,CAEd,SAAS,CAAG,KAAK,KAAK,CAEzC,OAAO,OAAO,SAAS,EAAM,EAAI,EAAQ,EAAI,EAAQ,KAGvD,SAAgB,EAAoB,EAAiB,EAA0B,EAAE,CAAU,CACzF,IAAM,EAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,QAAU,IAAwB,CAAC,CACzE,EAAM,KAAK,IAAI,EAAM,KAAK,MAAM,EAAQ,OAAS,IAAuB,CAAC,CAEzE,EAAM,KAAK,IAAI,EAAK,EAAO,GAAK,EAAQ,CAG9C,OAAO,KAAK,MAAM,KAAK,QAAQ,CAAG,EAAI,CAGxC,SAAgB,EAAa,EAAmB,EAAiC,CAC/E,IAAM,GAAU,EAAI,KAAK,QAAU,OAAO,aAAa,CAEvD,GAAI,CAAC,EAAa,SAAS,EAAO,CAChC,MAAO,GAGT,GAAI,EAAI,MAKN,MAJA,EAAI,EAAI,iBAAiBA,EAAAA,cAO3B,IAAM,EAAS,EAAI,UAAU,QAAU,EAMvC,OAJI,IAAW,KAAO,IAAW,KAAO,IAAW,KAAQ,GAAU,KAAO,GAAU,IAOxF,SAAgB,EACd,EACA,EACuE,CACvE,IAAM,EAAa,IAAI,gBAEnB,EACA,EAAa,GAEX,MAAwB,CAC5B,EAAW,MAAM,GAAU,QAAU,IAAIA,EAAAA,aAAe,EA4B1D,OAzBI,IACE,EAAS,QACX,EAAW,MAAM,EAAS,QAAU,IAAIA,EAAAA,aAAe,CAEvD,EAAS,iBAAiB,QAAS,EAAgB,EAInD,GAAa,EAAY,IAC3B,EAAY,eAAiB,CAC3B,EAAa,GACb,EAAW,MAAM,IAAIC,EAAAA,aAAe,EACnC,EAAU,EAaR,CACL,YAXoB,CAChB,GACF,EAAS,oBAAoB,QAAS,EAAgB,CAGpD,GACF,aAAa,EAAU,EAMzB,OAAQ,EAAW,OACnB,aAAgB,EACjB,CAGH,SAAgB,EACd,EACA,EACA,EACA,EACQ,CASR,OARI,IAIA,OAAO,GAAS,SAAY,WACvB,EAAQ,QAAQ,EAAI,CAGtB,EAAoB,EAAS,GAAS,QAAQ,EAGvD,eAAe,EAAmB,EAAsC,CAGtE,IAFoB,EAAS,QAAQ,IAAI,eAAe,EAAI,IAE5C,SAAS,mBAAmB,CAC1C,GAAI,CACF,OAAO,MAAM,EAAS,OAAO,CAAC,MAAM,MAC9B,EAKV,GAAI,CACF,OAAO,MAAM,EAAS,OAAO,CAAC,MAAM,MAC9B,GAOV,eAAsB,EACpB,EACA,EAAoB,EAAE,CACtB,EAAiC,EAAE,CAChB,CACnB,GAAM,CACJ,MAAO,EACP,UAAU,EACV,eAAe,EACf,UAAW,GAAsB,EAAa,EAAK,EAAa,EAC9D,EAEE,EAAmB,GAAe,WAAW,MAE/C,EAEJ,IAAK,IAAI,EAAU,EAAG,GAAW,EAAS,IAAW,CACnD,GAAM,CAAE,UAAS,SAAQ,YAAa,EAAqB,EAAQ,OAAQ,EAAQ,UAAU,CAE7F,GAAI,CACF,IAAM,EAAW,MAAM,EAAU,EAAO,CAAE,GAAG,EAAM,SAAQ,CAAC,CAE5D,GAAI,EAAS,GAEX,OADA,GAAS,CACF,EAGT,IAAM,EAAoB,CACxB,UACA,OACA,QACA,WACD,CAID,GAAI,CAFY,MAAM,EAAQ,EAAI,EAElB,IAAY,EAAS,CAGnC,IAAI,EACJ,GAAI,CACF,EAAO,MAAM,EAAmB,EAAS,MACnC,EAMR,MAFA,GAAS,CAEH,IAAIC,EAAAA,UAAU,QAAQ,EAAS,OAAO,GAAG,EAAS,aAAc,EAAU,EAAK,CAGvF,IAAM,EAAe,EAAuB,EAAS,QAAQ,IAAI,cAAc,CAAC,CAC1E,EAAQ,EAAqB,EAAS,EAAK,EAAc,EAAQ,CAEvE,GAAS,CAET,MAAMC,EAAAA,KAAK,EAAO,EAAQ,OAAO,CAEjC,eACO,EAAgB,CACvB,GAAS,CAET,EAAY,EAEZ,IAAM,EAAeC,EAAAA,eAAe,EAAM,CAEpC,EAAoB,CACxB,UACA,QACA,OACA,QACD,CAID,GAAI,EAFY,CAAC,GAAiB,MAAM,EAAQ,EAAI,GAEpC,IAAY,EAS1B,MARI,GAAU,CACN,IAAIH,EAAAA,aAGR,EACI,IAAID,EAAAA,aAAa,EAAM,SAAW,UAAU,CAG9C,EAKR,MAAMG,EAAAA,KAFQ,EAAqB,EAAS,EAAK,KAAM,EAAQ,CAE7C,EAAQ,OAAO,CAEjC,UAKJ,MAAM,GAAiB,MAAM,uBAAuB,CAGtD,SAAgB,GAAoD,CAClE,IAAI,EAAyC,KAE7C,MAAQ,IAAkC,CAExC,GAAI,EAAK,MAAM,GAAK,GAAI,CACtB,GAAI,GAAgB,OAAO,EAAa,MAAS,SAAU,CACzD,IAAM,EAAgB,CACpB,KAAM,EAAa,KACnB,MAAO,EAAa,MACpB,GAAI,EAAa,GACjB,MAAO,EAAa,MACrB,CAID,MAFA,GAAe,KAER,EAKT,MAFA,GAAe,KAER,KAGT,IAAM,EAAa,EAAK,QAAQ,IAAI,CAC9B,EAAQ,GAAc,EAAI,EAAK,MAAM,EAAG,EAAW,CAAG,EACxD,EAAQ,GAAc,EAAI,EAAK,MAAM,EAAa,EAAE,CAAG,GAQ3D,OANI,EAAM,WAAW,IAAI,GACvB,EAAQ,EAAM,MAAM,EAAE,EAGxB,IAA+B,EAAE,CAEzB,EAAR,CACE,IAAK,OACH,EAAa,MAAQ,EAAa,KAAO,EAAa,KAAO;EAAO,IAAM,EAC1E,MAEF,IAAK,QACH,EAAa,MAAQ,EACrB,MAEF,IAAK,KACH,EAAa,GAAK,EAClB,MAEF,IAAK,QAAS,CACZ,IAAM,EAAQ,OAAO,EAAM,CAE3B,GAAI,OAAO,SAAS,EAAM,CAAE,CAC1B,EAAa,MAAQ,KAAK,MAAM,EAAM,CACtC,QAKN,OAAO,MAYX,eAAsB,EAAU,EAA0B,EAA8B,EAAE,CAAoB,CAC5G,IAAM,EAAkC,CACtC,OAAQ,EAAQ,QAAU,mBAC1B,GAAI,EAAQ,SAAW,EAAE,CAC1B,CAEK,EAAO,EAAQ,KACf,EAAU,GAA+B,KACzC,GAAU,EAAQ,SAAW,EAAU,OAAS,QAAQ,aAAa,CAE3E,GAAI,EAAS,CACX,IAAM,EAAc,EAAQ,aAAe,mBAE3C,AACE,EAAQ,kBAAkB,EAI9B,IAAM,EAAW,MAAM,EAAgB,EAAO,CAAE,SAAQ,UAAS,OAAM,CAAE,EAAQ,CAEjF,GAAI,CAAC,EAAS,QAAQ,IAAI,eAAe,EAAE,SAAS,mBAAmB,CAGrE,MAAM,IAAID,EAAAA,UAAU,sCAAuC,EAF9C,MAAM,EAAS,MAAM,CAEwC,CAK5E,OAFc,MAAM,EAAS,MAAM,CAKrC,SAAgB,EAAoB,EAAc,EAAuB,CACvE,IAAM,EAAkB,EAAQ,SAE1B,EACJ,EAAgB,SAAS,IAAI,EAAI,EAAS,WAAW,IAAI,CACrD,EAAkB,EAAS,MAAM,EAAE,CACnC,CAAC,EAAgB,SAAS,IAAI,EAAI,CAAC,EAAS,WAAW,IAAI,CAC3D,EAAkB,IAAM,EACxB,EAAkB,EAExB,OAAO,IAAI,IAAI,EAAS,EAAQ,CA8BlC,eAAuB,EACrB,EACA,EAA8B,EAAE,CACG,CACnC,IAAM,EAAkC,CACtC,OAAQ,EAAQ,SAAW,EAAQ,MAAQ,GAAQ,MAAQ,qBAC3D,GAAI,EAAQ,SAAW,EAAE,CAC1B,CACK,EAAO,EAAQ,KACf,EAAU,GAA+B,KACzC,GAAU,EAAQ,SAAW,EAAU,OAAS,QAAQ,aAAa,CAE3E,GAAI,EAAS,CACX,IAAM,EAAc,EAAQ,aAAe,mBAE3C,AACE,EAAQ,kBAAkB,EAI9B,IAAM,EAAW,MAAM,EAAgB,EAAO,CAAE,OAAM,UAAS,SAAQ,CAAE,EAAQ,CAEjF,GAAI,CAAC,EAAS,KACZ,MAAM,IAAIA,EAAAA,UAAU,0CAA2C,EAAS,CAG1E,IAAM,EAAS,EAAS,KAAK,WAAW,CAClC,EAAU,IAAI,YACd,EAAQ,GAAgB,CAE1B,EAAS,GAEb,GAAI,CACF,OAAa,CACX,GAAM,CAAE,OAAM,SAAU,MAAM,EAAO,MAAM,CAE3C,GAAI,EACF,MAGF,GAAU,EAAQ,OAAO,EAAO,CAAE,OAAQ,GAAM,CAAC,CAEjD,IAAI,EAEJ,MAAQ,EAAe,EAAO,QAAQ;EAAK,GAAK,GAAG,CACjD,IAAM,EAAO,EAAO,MAAM,EAAG,EAAa,CAG1C,GAFA,EAAS,EAAO,MAAM,EAAe,EAAE,CAEnC,EAAQ,MAAQ,GACd,EAAK,SACP,MAAM,OAEH,CACL,IAAM,EAAQ,EAAM,EAAK,CAErB,IACF,MAAM,KAMV,EAAQ,MAAQ,IAAS,EAAO,SAClC,MAAM,UAEA,CACR,GAAI,CACF,EAAO,aAAa,MACd"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{AbortedError as e,HttpError as t,TimeoutError as n,isAbortedError as r}from"../errors.js";const
|
|
1
|
+
import{AbortedError as e,HttpError as t,TimeoutError as n,isAbortedError as r}from"../errors.js";import{wait as i}from"./_utils.js";const a=[`GET`,`HEAD`,`OPTIONS`,`TRACE`];function o(e){if(!e)return null;let t=Number(e);if(!Number.isNaN(t)&&t>=0)return Math.floor(t)*1e3;let n=new Date(e).getTime()-Date.now();return Number.isFinite(n)&&n>0?n:null}function s(e,t={}){let n=Math.max(1,Math.floor(t.baseMs??200)),r=Math.max(n,Math.floor(t.maxMs??5e3)),i=Math.min(r,n*2**e);return Math.floor(Math.random()*i)}function c(t,n){let r=(t.init.method??`GET`).toUpperCase();if(!n.includes(r))return!1;if(t.error)return!(t.error instanceof e);let i=t.response?.status??0;return i===408||i===425||i===429||i>=500&&i<=599}function l(t,r){let i=new AbortController,a,o=!1,s=()=>{i.abort(t?.reason??new e)};return t&&(t.aborted?i.abort(t.reason??new e):t.addEventListener(`abort`,s)),r&&r>0&&(a=setTimeout(()=>{o=!0,i.abort(new n)},r)),{cleanup:()=>{t&&t.removeEventListener(`abort`,s),a&&clearTimeout(a)},signal:i.signal,timedOut:()=>o}}function u(e,t,n,r){return n??(typeof r?.backoff==`function`?r.backoff(t):s(e,r?.backoff))}async function d(e){if((e.headers.get(`content-type`)??``).includes(`application/json`))try{return await e.clone().json()}catch{}try{return await e.clone().text()}catch{}}async function f(s,f={},p={}){let{fetch:m,retries:h=3,retryMethods:g=a,retryOn:_=e=>c(e,g)}=p,v=m??globalThis.fetch,y;for(let a=0;a<=h;a++){let{cleanup:c,signal:m,timedOut:g}=l(p.signal,p.timeoutMs);try{let e=await v(s,{...f,signal:m});if(e.ok)return c(),e;let n={attempt:a,init:f,input:s,response:e};if(!await _(n)||a===h){let n;try{n=await d(e)}catch{}throw c(),new t(`HTTP ${e.status} ${e.statusText}`,e,n)}let r=o(e.headers.get(`retry-after`)),l=u(a,n,r,p);c(),await i(l,p.signal);continue}catch(t){c(),y=t;let o=r(t),l={attempt:a,error:t,init:f,input:s};if(!(!o&&await _(l))||a===h)throw g()?new n:o?new e(t.message??`Aborted`):t;await i(u(a,l,null,p),p.signal);continue}}throw y??Error(`Unknown fetch error.`)}function p(){let e=null;return t=>{if(t.trim()===``){if(e&&typeof e.data==`string`){let t={data:e.data,event:e.event,id:e.id,retry:e.retry};return e=null,t}return e=null,null}let n=t.indexOf(`:`),r=n>=0?t.slice(0,n):t,i=n>=0?t.slice(n+1):``;switch(i.startsWith(` `)&&(i=i.slice(1)),e??={},r){case`data`:e.data=(e.data?e.data+`
|
|
2
2
|
`:``)+i;break;case`event`:e.event=i;break;case`id`:e.id=i;break;case`retry`:{let t=Number(i);if(Number.isFinite(t)){e.retry=Math.floor(t);break}}}return null}}async function m(e,n={}){let r={Accept:n.accept??`application/json`,...n.headers??{}},i=n.body,a=i!=null,o=(n.method??(a?`POST`:`GET`)).toUpperCase();if(a){let e=n.contentType??`application/json`;r[`Content-Type`]||=e}let s=await f(e,{method:o,headers:r,body:i},n);if(!s.headers.get(`content-type`)?.includes(`application/json`))throw new t(`Expected application/json response.`,s,await s.text());return await s.json()}function h(e,t){let n=e.pathname,r=n.endsWith(`/`)&&t.startsWith(`/`)?n+t.slice(1):!n.endsWith(`/`)&&!t.startsWith(`/`)?n+`/`+t:n+t;return new URL(r,e)}async function*g(e,n={}){let r={Accept:n.accept??(n.sse===!1?`*/*`:`text/event-stream`),...n.headers??{}},i=n.body,a=i!=null,o=(n.method??(a?`POST`:`GET`)).toUpperCase();if(a){let e=n.contentType??`application/json`;r[`Content-Type`]||=e}let s=await f(e,{body:i,headers:r,method:o},n);if(!s.body)throw new t(`Response body is not a readable stream.`,s);let c=s.body.getReader(),l=new TextDecoder,u=p(),d=``;try{for(;;){let{done:e,value:t}=await c.read();if(e)break;d+=l.decode(t,{stream:!0});let r;for(;(r=d.indexOf(`
|
|
3
3
|
`))>=0;){let e=d.slice(0,r);if(d=d.slice(r+1),n.sse===!1)e.length&&(yield e);else{let t=u(e);t&&(yield t)}}}n.sse===!1&&d.length&&(yield d)}finally{try{c.releaseLock()}catch{}}}export{h as combineUrlPathnames,g as fetchEventStream,m as fetchJson};
|
|
4
4
|
//# sourceMappingURL=fetch-utilities.js.map
|