rise-wallet 0.1.4-beta.1 → 0.2.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -34
- package/dist/cli/Dialog.d.ts +34 -0
- package/dist/cli/Dialog.js +60 -0
- package/dist/cli/Dialog.js.map +1 -0
- package/dist/cli/Messenger.d.ts +7 -0
- package/dist/cli/Messenger.js +123 -0
- package/dist/cli/Messenger.js.map +1 -0
- package/dist/cli/bin/commands-D7N5ucUu.js +50 -0
- package/dist/cli/bin/index.js +9 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +3 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/internal/http.d.ts +6 -0
- package/dist/cli/internal/http.js +17 -0
- package/dist/cli/internal/http.js.map +1 -0
- package/dist/cli/tsdown.config.d.ts +2 -0
- package/dist/cli/tsdown.config.js +28 -0
- package/dist/cli/tsdown.config.js.map +1 -0
- package/dist/core/Chains.d.ts +210 -0
- package/dist/core/Chains.js +20 -0
- package/dist/core/Chains.js.map +1 -0
- package/dist/core/Dialog.d.ts +307 -0
- package/dist/core/Dialog.js +809 -0
- package/dist/core/Dialog.js.map +1 -0
- package/dist/core/Messenger.d.ts +164 -0
- package/dist/core/Messenger.js +207 -0
- package/dist/core/Messenger.js.map +1 -0
- package/dist/core/Mode.d.ts +4 -0
- package/dist/core/Mode.js +5 -0
- package/dist/core/Mode.js.map +1 -0
- package/dist/core/Porto.d.ts +1608 -0
- package/dist/core/Porto.js +105 -0
- package/dist/core/Porto.js.map +1 -0
- package/dist/core/RpcSchema.d.ts +81 -0
- package/dist/core/RpcSchema.js +2 -0
- package/dist/core/RpcSchema.js.map +1 -0
- package/dist/core/Storage.d.ts +14 -0
- package/dist/core/Storage.js +109 -0
- package/dist/core/Storage.js.map +1 -0
- package/dist/core/Transport.d.ts +22 -0
- package/dist/core/Transport.js +37 -0
- package/dist/core/Transport.js.map +1 -0
- package/dist/core/internal/_generated/chains.d.ts +1 -0
- package/dist/core/internal/_generated/chains.js +3 -0
- package/dist/core/internal/_generated/chains.js.map +1 -0
- package/dist/core/internal/_generated/contracts/IthacaAccount.d.ts +1120 -0
- package/dist/core/internal/_generated/contracts/IthacaAccount.js +1453 -0
- package/dist/core/internal/_generated/contracts/IthacaAccount.js.map +1 -0
- package/dist/core/internal/call.d.ts +163 -0
- package/dist/core/internal/call.js +115 -0
- package/dist/core/internal/call.js.map +1 -0
- package/dist/core/internal/erc8010.d.ts +17 -0
- package/dist/core/internal/erc8010.js +29 -0
- package/dist/core/internal/erc8010.js.map +1 -0
- package/dist/core/internal/intersectionObserver.d.ts +1 -0
- package/dist/core/internal/intersectionObserver.js +5 -0
- package/dist/core/internal/intersectionObserver.js.map +1 -0
- package/dist/core/internal/logger.d.ts +21 -0
- package/dist/core/internal/logger.js +24 -0
- package/dist/core/internal/logger.js.map +1 -0
- package/dist/core/internal/mode.d.ts +344 -0
- package/dist/core/internal/mode.js +110 -0
- package/dist/core/internal/mode.js.map +1 -0
- package/dist/core/internal/modes/dialog.d.ts +799 -0
- package/dist/core/internal/modes/dialog.js +760 -0
- package/dist/core/internal/modes/dialog.js.map +1 -0
- package/dist/core/internal/modes/reactNative.d.ts +1401 -0
- package/dist/core/internal/modes/reactNative.js +19 -0
- package/dist/core/internal/modes/reactNative.js.map +1 -0
- package/dist/core/internal/modes/relay.d.ts +684 -0
- package/dist/core/internal/modes/relay.js +708 -0
- package/dist/core/internal/modes/relay.js.map +1 -0
- package/dist/core/internal/permissions.d.ts +59 -0
- package/dist/core/internal/permissions.js +30 -0
- package/dist/core/internal/permissions.js.map +1 -0
- package/dist/core/internal/permissionsRequest.d.ts +71 -0
- package/dist/core/internal/permissionsRequest.js +58 -0
- package/dist/core/internal/permissionsRequest.js.map +1 -0
- package/dist/core/internal/porto.d.ts +13 -0
- package/dist/core/internal/porto.js +2 -0
- package/dist/core/internal/porto.js.map +1 -0
- package/dist/core/internal/promise.d.ts +8 -0
- package/dist/core/internal/promise.js +11 -0
- package/dist/core/internal/promise.js.map +1 -0
- package/dist/core/internal/provider.d.ts +29 -0
- package/dist/core/internal/provider.js +941 -0
- package/dist/core/internal/provider.js.map +1 -0
- package/dist/core/internal/relay/rpcSchema.d.ts +75 -0
- package/dist/core/internal/relay/rpcSchema.js +7 -0
- package/dist/core/internal/relay/rpcSchema.js.map +1 -0
- package/dist/core/internal/relay/schema/capabilities.d.ts +164 -0
- package/dist/core/internal/relay/schema/capabilities.js +112 -0
- package/dist/core/internal/relay/schema/capabilities.js.map +1 -0
- package/dist/core/internal/relay/schema/intent.d.ts +167 -0
- package/dist/core/internal/relay/schema/intent.js +170 -0
- package/dist/core/internal/relay/schema/intent.js.map +1 -0
- package/dist/core/internal/relay/schema/key.d.ts +43 -0
- package/dist/core/internal/relay/schema/key.js +30 -0
- package/dist/core/internal/relay/schema/key.js.map +1 -0
- package/dist/core/internal/relay/schema/permission.d.ts +39 -0
- package/dist/core/internal/relay/schema/permission.js +29 -0
- package/dist/core/internal/relay/schema/permission.js.map +1 -0
- package/dist/core/internal/relay/schema/preCall.d.ts +62 -0
- package/dist/core/internal/relay/schema/preCall.js +36 -0
- package/dist/core/internal/relay/schema/preCall.js.map +1 -0
- package/dist/core/internal/relay/schema/quotes.d.ts +369 -0
- package/dist/core/internal/relay/schema/quotes.js +89 -0
- package/dist/core/internal/relay/schema/quotes.js.map +1 -0
- package/dist/core/internal/relay/schema/rpc.d.ts +1528 -0
- package/dist/core/internal/relay/schema/rpc.js +638 -0
- package/dist/core/internal/relay/schema/rpc.js.map +1 -0
- package/dist/core/internal/relay/schema/token.d.ts +13 -0
- package/dist/core/internal/relay/schema/token.js +13 -0
- package/dist/core/internal/relay/schema/token.js.map +1 -0
- package/dist/core/internal/requiredFunds.d.ts +18 -0
- package/dist/core/internal/requiredFunds.js +25 -0
- package/dist/core/internal/requiredFunds.js.map +1 -0
- package/dist/core/internal/schema/capabilities.d.ts +313 -0
- package/dist/core/internal/schema/capabilities.js +133 -0
- package/dist/core/internal/schema/capabilities.js.map +1 -0
- package/dist/core/internal/schema/key.d.ts +164 -0
- package/dist/core/internal/schema/key.js +75 -0
- package/dist/core/internal/schema/key.js.map +1 -0
- package/dist/core/internal/schema/permissions.d.ts +102 -0
- package/dist/core/internal/schema/permissions.js +28 -0
- package/dist/core/internal/schema/permissions.js.map +1 -0
- package/dist/core/internal/schema/request.d.ts +937 -0
- package/dist/core/internal/schema/request.js +57 -0
- package/dist/core/internal/schema/request.js.map +1 -0
- package/dist/core/internal/schema/rpc.d.ts +3314 -0
- package/dist/core/internal/schema/rpc.js +599 -0
- package/dist/core/internal/schema/rpc.js.map +1 -0
- package/dist/core/internal/schema/token.d.ts +1 -0
- package/dist/core/internal/schema/token.js +2 -0
- package/dist/core/internal/schema/token.js.map +1 -0
- package/dist/core/internal/schema/utils.d.ts +18 -0
- package/dist/core/internal/schema/utils.js +213 -0
- package/dist/core/internal/schema/utils.js.map +1 -0
- package/dist/core/internal/siwe.d.ts +32 -0
- package/dist/core/internal/siwe.js +92 -0
- package/dist/core/internal/siwe.js.map +1 -0
- package/dist/core/internal/store.d.ts +2 -0
- package/dist/core/internal/store.js +9 -0
- package/dist/core/internal/store.js.map +1 -0
- package/dist/core/internal/tokens.d.ts +57 -0
- package/dist/core/internal/tokens.js +69 -0
- package/dist/core/internal/tokens.js.map +1 -0
- package/dist/core/internal/types.d.ts +298 -0
- package/dist/core/internal/types.js +2 -0
- package/dist/core/internal/types.js.map +1 -0
- package/dist/core/internal/urlString.d.ts +1 -0
- package/dist/core/internal/urlString.js +8 -0
- package/dist/core/internal/urlString.js.map +1 -0
- package/dist/core/internal/userAgent.d.ts +10 -0
- package/dist/core/internal/userAgent.js +19 -0
- package/dist/core/internal/userAgent.js.map +1 -0
- package/dist/core/internal/utils.d.ts +24 -0
- package/dist/core/internal/utils.js +62 -0
- package/dist/core/internal/utils.js.map +1 -0
- package/dist/core/react-native/Porto.d.ts +1480 -0
- package/dist/core/react-native/Porto.js +17 -0
- package/dist/core/react-native/Porto.js.map +1 -0
- package/dist/core/react-native/configure.d.ts +9 -0
- package/dist/core/react-native/configure.js +24 -0
- package/dist/core/react-native/configure.js.map +1 -0
- package/dist/core/react-native/environment.d.ts +26 -0
- package/dist/core/react-native/environment.js +13 -0
- package/dist/core/react-native/environment.js.map +1 -0
- package/dist/core/react-native/index.d.ts +4 -0
- package/dist/core/react-native/index.js +5 -0
- package/dist/core/react-native/index.js.map +1 -0
- package/dist/core/react-native/utils.d.ts +1 -0
- package/dist/core/react-native/utils.js +12 -0
- package/dist/core/react-native/utils.js.map +1 -0
- package/dist/index.d.ts +16 -2
- package/dist/index.js +15 -2
- package/dist/index.js.map +1 -0
- package/dist/internal/index.d.ts +3 -0
- package/dist/internal/index.js +4 -0
- package/dist/internal/index.js.map +1 -0
- package/dist/react-native/crypto.d.ts +1 -0
- package/dist/react-native/crypto.js +12 -0
- package/dist/react-native/crypto.js.map +1 -0
- package/dist/react-native/index.d.ts +7 -0
- package/dist/react-native/index.js +12 -0
- package/dist/react-native/index.js.map +1 -0
- package/dist/react-native/register.d.ts +2 -0
- package/dist/react-native/register.js +15 -0
- package/dist/react-native/register.js.map +1 -0
- package/dist/register/index.d.ts +14 -0
- package/dist/register/index.js +2 -0
- package/dist/register/index.js.map +1 -0
- package/dist/remote/Actions.d.ts +33 -0
- package/dist/remote/Actions.js +76 -0
- package/dist/remote/Actions.js.map +1 -0
- package/dist/remote/Events.d.ts +46 -0
- package/dist/remote/Events.js +132 -0
- package/dist/remote/Events.js.map +1 -0
- package/dist/remote/Hooks.d.ts +3800 -0
- package/dist/remote/Hooks.js +106 -0
- package/dist/remote/Hooks.js.map +1 -0
- package/dist/remote/Porto.d.ts +857 -0
- package/dist/remote/Porto.js +66 -0
- package/dist/remote/Porto.js.map +1 -0
- package/dist/remote/index.d.ts +4 -0
- package/dist/remote/index.js +5 -0
- package/dist/remote/index.js.map +1 -0
- package/dist/remote/internal/methodPolicies.d.ts +96 -0
- package/dist/remote/internal/methodPolicies.js +102 -0
- package/dist/remote/internal/methodPolicies.js.map +1 -0
- package/dist/server/Route.d.ts +87 -0
- package/dist/server/Route.js +189 -0
- package/dist/server/Route.js.map +1 -0
- package/dist/server/Router.d.ts +23 -0
- package/dist/server/Router.js +29 -0
- package/dist/server/Router.js.map +1 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.js +3 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/internal/merchantSchema.d.ts +64 -0
- package/dist/server/internal/merchantSchema.js +7 -0
- package/dist/server/internal/merchantSchema.js.map +1 -0
- package/dist/server/internal/requestListener.d.ts +123 -0
- package/dist/server/internal/requestListener.js +172 -0
- package/dist/server/internal/requestListener.js.map +1 -0
- package/dist/theme/Theme.d.ts +121 -0
- package/dist/theme/Theme.js +18 -0
- package/dist/theme/Theme.js.map +1 -0
- package/dist/theme/index.d.ts +2 -0
- package/dist/theme/index.js +2 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/trusted-hosts.d.ts +1 -0
- package/dist/trusted-hosts.js +41 -0
- package/dist/trusted-hosts.js.map +1 -0
- package/dist/viem/Account.d.ts +110 -0
- package/dist/viem/Account.js +132 -0
- package/dist/viem/Account.js.map +1 -0
- package/dist/viem/AccountActions.d.ts +10 -0
- package/dist/viem/AccountActions.js +14 -0
- package/dist/viem/AccountActions.js.map +1 -0
- package/dist/viem/CapabilitiesSchema.d.ts +14 -0
- package/dist/viem/CapabilitiesSchema.js +2 -0
- package/dist/viem/CapabilitiesSchema.js.map +1 -0
- package/dist/viem/ContractActions.d.ts +208 -0
- package/dist/viem/ContractActions.js +350 -0
- package/dist/viem/ContractActions.js.map +1 -0
- package/dist/viem/Key.d.ts +1155 -0
- package/dist/viem/Key.js +924 -0
- package/dist/viem/Key.js.map +1 -0
- package/dist/viem/RelayActions.d.ts +435 -0
- package/dist/viem/RelayActions.js +385 -0
- package/dist/viem/RelayActions.js.map +1 -0
- package/dist/viem/RelayClient.d.ts +26 -0
- package/dist/viem/RelayClient.js +44 -0
- package/dist/viem/RelayClient.js.map +1 -0
- package/dist/viem/RpcSchema.d.ts +22 -0
- package/dist/viem/RpcSchema.js +2 -0
- package/dist/viem/RpcSchema.js.map +1 -0
- package/dist/viem/WalletActions.d.ts +86 -0
- package/dist/viem/WalletActions.js +220 -0
- package/dist/viem/WalletActions.js.map +1 -0
- package/dist/viem/WalletClient.d.ts +20 -0
- package/dist/viem/WalletClient.js +23 -0
- package/dist/viem/WalletClient.js.map +1 -0
- package/dist/viem/index.d.ts +13 -0
- package/dist/viem/index.js +12 -0
- package/dist/viem/index.js.map +1 -0
- package/dist/viem/internal/relayActions.d.ts +364 -0
- package/dist/viem/internal/relayActions.js +783 -0
- package/dist/viem/internal/relayActions.js.map +1 -0
- package/dist/viem/internal/utils.d.ts +15 -0
- package/dist/viem/internal/utils.js +2 -0
- package/dist/viem/internal/utils.js.map +1 -0
- package/dist/wagmi/Actions.d.ts +1 -0
- package/dist/wagmi/Actions.js +2 -0
- package/dist/wagmi/Actions.js.map +1 -0
- package/dist/wagmi/Connector.d.ts +26 -0
- package/dist/wagmi/Connector.js +238 -0
- package/dist/wagmi/Connector.js.map +1 -0
- package/dist/wagmi/Hooks.d.ts +1 -0
- package/dist/wagmi/Hooks.js +2 -0
- package/dist/wagmi/Hooks.js.map +1 -0
- package/dist/wagmi/Query.d.ts +1 -0
- package/dist/wagmi/Query.js +2 -0
- package/dist/wagmi/Query.js.map +1 -0
- package/dist/wagmi/index.d.ts +4 -0
- package/dist/wagmi/index.js +5 -0
- package/dist/wagmi/index.js.map +1 -0
- package/dist/wagmi/internal/core.d.ts +83 -0
- package/dist/wagmi/internal/core.js +229 -0
- package/dist/wagmi/internal/core.js.map +1 -0
- package/dist/wagmi/internal/query.d.ts +32 -0
- package/dist/wagmi/internal/query.js +23 -0
- package/dist/wagmi/internal/query.js.map +1 -0
- package/dist/wagmi/internal/react.d.ts +90 -0
- package/dist/wagmi/internal/react.js +256 -0
- package/dist/wagmi/internal/react.js.map +1 -0
- package/dist/wagmi/internal/types.d.ts +10 -0
- package/dist/wagmi/internal/types.js +2 -0
- package/dist/wagmi/internal/types.js.map +1 -0
- package/dist/wagmi/internal/utils.d.ts +1 -0
- package/dist/wagmi/internal/utils.js +18 -0
- package/dist/wagmi/internal/utils.js.map +1 -0
- package/package.json +286 -34
- package/src/cli/Dialog.ts +75 -0
- package/src/cli/Messenger.ts +148 -0
- package/src/cli/bin/index.ts +37 -0
- package/src/cli/bin/tsconfig.json +8 -0
- package/src/cli/index.ts +2 -0
- package/src/cli/internal/commands.ts +212 -0
- package/src/cli/internal/context.ts +56 -0
- package/src/cli/internal/http.ts +28 -0
- package/src/cli/internal/utils.ts +28 -0
- package/src/cli/tsdown.config.ts +37 -0
- package/src/core/Chains.ts +25 -0
- package/src/core/Dialog.ts +1059 -0
- package/src/core/Messenger.ts +394 -0
- package/src/core/Mode.ts +4 -0
- package/src/core/Porto.ts +287 -0
- package/src/core/RpcSchema.ts +124 -0
- package/src/core/Storage.ts +122 -0
- package/src/core/Transport.ts +45 -0
- package/src/core/internal/_generated/chains.ts +2 -0
- package/src/core/internal/_generated/contracts/EIP7702Proxy.ts +25 -0
- package/src/core/internal/_generated/contracts/Escrow.ts +330 -0
- package/src/core/internal/_generated/contracts/ExperimentERC20.ts +569 -0
- package/src/core/internal/_generated/contracts/ExperimentERC721.ts +588 -0
- package/src/core/internal/_generated/contracts/GuardedExecutor.ts +623 -0
- package/src/core/internal/_generated/contracts/ICallChecker.ts +34 -0
- package/src/core/internal/_generated/contracts/ICommon.ts +4 -0
- package/src/core/internal/_generated/contracts/IEscrow.ts +114 -0
- package/src/core/internal/_generated/contracts/IFunder.ts +80 -0
- package/src/core/internal/_generated/contracts/IFunderV4.ts +45 -0
- package/src/core/internal/_generated/contracts/IIthacaAccount.ts +107 -0
- package/src/core/internal/_generated/contracts/IOAppCore.ts +142 -0
- package/src/core/internal/_generated/contracts/IOAppMsgInspector.ts +45 -0
- package/src/core/internal/_generated/contracts/IOAppReceiver.ts +161 -0
- package/src/core/internal/_generated/contracts/IOrchestrator.ts +95 -0
- package/src/core/internal/_generated/contracts/ISettler.ts +52 -0
- package/src/core/internal/_generated/contracts/ISigner.ts +34 -0
- package/src/core/internal/_generated/contracts/IthacaAccount.ts +1454 -0
- package/src/core/internal/_generated/contracts/IthacaAccountNew.ts +1454 -0
- package/src/core/internal/_generated/contracts/IthacaAccountOld.ts +1454 -0
- package/src/core/internal/_generated/contracts/LayerZeroSettler.ts +811 -0
- package/src/core/internal/_generated/contracts/LibNonce.ts +15 -0
- package/src/core/internal/_generated/contracts/LibTStack.ts +4 -0
- package/src/core/internal/_generated/contracts/MultiSigSigner.ts +203 -0
- package/src/core/internal/_generated/contracts/OApp.ts +412 -0
- package/src/core/internal/_generated/contracts/OAppCore.ts +229 -0
- package/src/core/internal/_generated/contracts/OAppReceiver.ts +396 -0
- package/src/core/internal/_generated/contracts/OAppSender.ts +245 -0
- package/src/core/internal/_generated/contracts/Orchestrator.ts +390 -0
- package/src/core/internal/_generated/contracts/SimpleFunder.ts +534 -0
- package/src/core/internal/_generated/contracts/SimpleSettler.ts +360 -0
- package/src/core/internal/_generated/contracts/Simulator.ts +170 -0
- package/src/core/internal/_generated/contracts/TokenTransferLib.ts +4 -0
- package/src/core/internal/_snapshots/provider.browser.test.ts.snap +119 -0
- package/src/core/internal/_snapshots/provider.test.ts.snap +1103 -0
- package/src/core/internal/call.test.ts +116 -0
- package/src/core/internal/call.ts +245 -0
- package/src/core/internal/erc8010.test.ts +74 -0
- package/src/core/internal/erc8010.ts +44 -0
- package/src/core/internal/intersectionObserver.ts +5 -0
- package/src/core/internal/logger.ts +42 -0
- package/src/core/internal/mode.ts +498 -0
- package/src/core/internal/modes/dialog.ts +1051 -0
- package/src/core/internal/modes/reactNative.ts +29 -0
- package/src/core/internal/modes/relay.ts +893 -0
- package/src/core/internal/permissions.ts +43 -0
- package/src/core/internal/permissionsRequest.ts +88 -0
- package/src/core/internal/porto.ts +16 -0
- package/src/core/internal/promise.ts +19 -0
- package/src/core/internal/provider.browser.test.ts +311 -0
- package/src/core/internal/provider.test.ts +3552 -0
- package/src/core/internal/provider.ts +1277 -0
- package/src/core/internal/relay/rpcSchema.ts +101 -0
- package/src/core/internal/relay/schema/capabilities.test.ts +663 -0
- package/src/core/internal/relay/schema/capabilities.ts +156 -0
- package/src/core/internal/relay/schema/intent.test.ts +433 -0
- package/src/core/internal/relay/schema/intent.ts +174 -0
- package/src/core/internal/relay/schema/key.test.ts +424 -0
- package/src/core/internal/relay/schema/key.ts +34 -0
- package/src/core/internal/relay/schema/permission.test.ts +499 -0
- package/src/core/internal/relay/schema/permission.ts +34 -0
- package/src/core/internal/relay/schema/preCall.ts +39 -0
- package/src/core/internal/relay/schema/quotes.test.ts +901 -0
- package/src/core/internal/relay/schema/quotes.ts +98 -0
- package/src/core/internal/relay/schema/rpc.ts +822 -0
- package/src/core/internal/relay/schema/token.ts +16 -0
- package/src/core/internal/requiredFunds.test.ts +141 -0
- package/src/core/internal/requiredFunds.ts +45 -0
- package/src/core/internal/schema/capabilities.test.ts +1334 -0
- package/src/core/internal/schema/capabilities.ts +162 -0
- package/src/core/internal/schema/key.test.ts +570 -0
- package/src/core/internal/schema/key.ts +98 -0
- package/src/core/internal/schema/permissions.test.ts +948 -0
- package/src/core/internal/schema/permissions.ts +31 -0
- package/src/core/internal/schema/request.bench.ts +35 -0
- package/src/core/internal/schema/request.ts +90 -0
- package/src/core/internal/schema/rpc.ts +821 -0
- package/src/core/internal/schema/token.ts +1 -0
- package/src/core/internal/schema/utils.test.ts +572 -0
- package/src/core/internal/schema/utils.ts +236 -0
- package/src/core/internal/siwe.test.ts +473 -0
- package/src/core/internal/siwe.ts +144 -0
- package/src/core/internal/store.ts +9 -0
- package/src/core/internal/tokens.test.ts +317 -0
- package/src/core/internal/tokens.ts +125 -0
- package/src/core/internal/types.ts +448 -0
- package/src/core/internal/urlString.ts +5 -0
- package/src/core/internal/userAgent.ts +35 -0
- package/src/core/internal/utils.test.ts +35 -0
- package/src/core/internal/utils.ts +67 -0
- package/src/core/react-native/Porto.ts +22 -0
- package/src/core/react-native/configure.ts +31 -0
- package/src/core/react-native/environment.ts +43 -0
- package/src/core/react-native/index.ts +4 -0
- package/src/core/react-native/utils.ts +18 -0
- package/src/index.ts +17 -0
- package/src/internal/index.ts +3 -0
- package/src/react-native/crypto.ts +19 -0
- package/src/react-native/index.ts +15 -0
- package/src/react-native/register.ts +24 -0
- package/src/register/index.ts +17 -0
- package/src/remote/Actions.ts +115 -0
- package/src/remote/Events.ts +193 -0
- package/src/remote/Hooks.ts +194 -0
- package/src/remote/Porto.ts +144 -0
- package/src/remote/index.ts +4 -0
- package/src/remote/internal/methodPolicies.ts +124 -0
- package/src/server/Route.test.ts +347 -0
- package/src/server/Route.ts +259 -0
- package/src/server/Router.test.ts +32 -0
- package/src/server/Router.ts +59 -0
- package/src/server/index.ts +2 -0
- package/src/server/internal/merchantSchema.ts +11 -0
- package/src/server/internal/requestListener.ts +284 -0
- package/src/theme/Theme.ts +163 -0
- package/src/theme/index.ts +2 -0
- package/src/trusted-hosts.ts +40 -0
- package/src/tsconfig.build.tsbuildinfo +1 -0
- package/src/tsconfig.json +15 -0
- package/src/viem/Account.test.ts +270 -0
- package/src/viem/Account.ts +278 -0
- package/src/viem/AccountActions.test.ts +3 -0
- package/src/viem/AccountActions.ts +30 -0
- package/src/viem/CapabilitiesSchema.ts +18 -0
- package/src/viem/ContractActions.test.ts +980 -0
- package/src/viem/ContractActions.ts +624 -0
- package/src/viem/Key.test.ts +1420 -0
- package/src/viem/Key.ts +1318 -0
- package/src/viem/RelayActions.test.ts +1730 -0
- package/src/viem/RelayActions.ts +1082 -0
- package/src/viem/RelayClient.test.ts +127 -0
- package/src/viem/RelayClient.ts +87 -0
- package/src/viem/RpcSchema.ts +27 -0
- package/src/viem/WalletActions.test.ts +646 -0
- package/src/viem/WalletActions.ts +476 -0
- package/src/viem/WalletClient.test.ts +36 -0
- package/src/viem/WalletClient.ts +74 -0
- package/src/viem/index.ts +13 -0
- package/src/viem/internal/relayActions.test.ts +1296 -0
- package/src/viem/internal/relayActions.ts +1222 -0
- package/src/viem/internal/utils.ts +27 -0
- package/src/wagmi/Actions.ts +13 -0
- package/src/wagmi/Connector.ts +304 -0
- package/src/wagmi/Hooks.ts +14 -0
- package/src/wagmi/Query.ts +5 -0
- package/src/wagmi/index.ts +4 -0
- package/src/wagmi/internal/core.test.ts +12 -0
- package/src/wagmi/internal/core.ts +468 -0
- package/src/wagmi/internal/query.ts +52 -0
- package/src/wagmi/internal/react.test.ts +12 -0
- package/src/wagmi/internal/react.ts +705 -0
- package/src/wagmi/internal/types.ts +21 -0
- package/src/wagmi/internal/utils.ts +25 -0
- package/dist/chain.cjs +0 -17
- package/dist/chain.d.cts +0 -41
- package/dist/chain.d.ts +0 -41
- package/dist/chain.js +0 -13
- package/dist/config.cjs +0 -19
- package/dist/config.d.cts +0 -3
- package/dist/config.d.ts +0 -3
- package/dist/config.js +0 -16
- package/dist/index.cjs +0 -18
- package/dist/index.d.cts +0 -2
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { type Env, type ExecutionContext, Hono } from 'hono'
|
|
2
|
+
import { cors } from 'hono/cors'
|
|
3
|
+
import { poweredBy } from 'hono/powered-by'
|
|
4
|
+
import type { BlankEnv, BlankSchema, Schema as hono_Schema } from 'hono/types'
|
|
5
|
+
import type * as Address from 'ox/Address'
|
|
6
|
+
import type * as Hex from 'ox/Hex'
|
|
7
|
+
import * as RpcResponse from 'ox/RpcResponse'
|
|
8
|
+
import { createClient, rpcSchema } from 'viem'
|
|
9
|
+
import * as z from 'zod/mini'
|
|
10
|
+
import type * as RpcSchema_relay from '../core/internal/relay/rpcSchema.js'
|
|
11
|
+
import type { MaybePromise, OneOf } from '../core/internal/types.js'
|
|
12
|
+
import * as Porto from '../core/Porto.js'
|
|
13
|
+
import * as Key from '../viem/Key.js'
|
|
14
|
+
import * as MerchantSchema from './internal/merchantSchema.js'
|
|
15
|
+
import * as RequestListener from './internal/requestListener.js'
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Creates a new Route.
|
|
19
|
+
*
|
|
20
|
+
* @param options - constructor options
|
|
21
|
+
* @returns Route instance
|
|
22
|
+
*/
|
|
23
|
+
export function from<
|
|
24
|
+
env extends Env = BlankEnv,
|
|
25
|
+
schema extends hono_Schema = BlankSchema,
|
|
26
|
+
basePath extends string = '/',
|
|
27
|
+
>(options: from.Options<basePath> = {}) {
|
|
28
|
+
return new from.Inner<env, schema, basePath>(options)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export namespace from {
|
|
32
|
+
export type Options<basePath extends string = '/'> =
|
|
33
|
+
Inner.ConstructorOptions<basePath>
|
|
34
|
+
|
|
35
|
+
export class Inner<
|
|
36
|
+
env extends Env = BlankEnv,
|
|
37
|
+
schema extends hono_Schema = BlankSchema,
|
|
38
|
+
basePath extends string = '/',
|
|
39
|
+
> {
|
|
40
|
+
hono: Hono<env, schema, basePath>
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Creates a new Handler instance.
|
|
44
|
+
*
|
|
45
|
+
* @param options - constructor options
|
|
46
|
+
*/
|
|
47
|
+
constructor(options: Inner.ConstructorOptions<basePath> = {}) {
|
|
48
|
+
const hono = new Hono<env, schema, basePath>().basePath(
|
|
49
|
+
options.basePath ?? '/',
|
|
50
|
+
)
|
|
51
|
+
hono.use('*', cors(options.cors))
|
|
52
|
+
hono.use('*', poweredBy({ serverName: 'Porto' }))
|
|
53
|
+
|
|
54
|
+
this.hono = hono
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Returns a Fetch API compatible handler, used to serve requests.
|
|
59
|
+
*
|
|
60
|
+
* @param request - request object
|
|
61
|
+
* @param env - env object
|
|
62
|
+
* @param executionCtx - context of execution
|
|
63
|
+
* @returns response object
|
|
64
|
+
*
|
|
65
|
+
*/
|
|
66
|
+
fetch = (
|
|
67
|
+
request: Request,
|
|
68
|
+
env?: env['Bindings'] | {} | undefined,
|
|
69
|
+
executionCtx?: ExecutionContext | undefined,
|
|
70
|
+
) => {
|
|
71
|
+
return this.hono.fetch(request, env, executionCtx)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Wraps a fetch handler in a Node.js request listener that can be used with:
|
|
76
|
+
*
|
|
77
|
+
* - [`http.createServer()`](https://nodejs.org/api/http.html#httpcreateserveroptions-requestlistener)
|
|
78
|
+
* - [`https.createServer()`](https://nodejs.org/api/https.html#httpscreateserveroptions-requestlistener)
|
|
79
|
+
* - [`http2.createServer()`](https://nodejs.org/api/http2.html#http2createserveroptions-onrequesthandler)
|
|
80
|
+
* - [`http2.createSecureServer()`](https://nodejs.org/api/http2.html#http2createsecureserveroptions-onrequesthandler)
|
|
81
|
+
*
|
|
82
|
+
* @returns A Node.js request listener function.
|
|
83
|
+
*/
|
|
84
|
+
get listener() {
|
|
85
|
+
return RequestListener.fromFetchHandler(this.fetch)
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export declare namespace Inner {
|
|
90
|
+
type ConstructorOptions<basePath extends string = '/'> = {
|
|
91
|
+
/**
|
|
92
|
+
* Base path of the request handler.
|
|
93
|
+
*/
|
|
94
|
+
basePath?: basePath | string | undefined
|
|
95
|
+
/**
|
|
96
|
+
* CORS configuration.
|
|
97
|
+
*/
|
|
98
|
+
cors?: Parameters<typeof cors>[0] | undefined
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Defines a Merchant RPC request handler. This will return a function that
|
|
105
|
+
* accepts a [Fetch API `Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request)
|
|
106
|
+
* instance and returns a [Fetch API `Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)
|
|
107
|
+
* instance.
|
|
108
|
+
*
|
|
109
|
+
* @param options - Options.
|
|
110
|
+
* @returns Request handler.
|
|
111
|
+
*/
|
|
112
|
+
export function merchant(options: merchant.Options) {
|
|
113
|
+
const { address, basePath, relay = Porto.defaultConfig.relay } = options
|
|
114
|
+
|
|
115
|
+
const client = createClient({
|
|
116
|
+
rpcSchema: rpcSchema<RpcSchema_relay.Viem>(),
|
|
117
|
+
transport: relay,
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
const fromKey = (() => {
|
|
121
|
+
if (typeof options.key === 'string') return undefined
|
|
122
|
+
if (options.key.type === 'secp256k1') return Key.fromSecp256k1
|
|
123
|
+
if (options.key.type === 'p256') return Key.fromP256
|
|
124
|
+
throw new Error('unsupported key type')
|
|
125
|
+
})()
|
|
126
|
+
const key = fromKey
|
|
127
|
+
? fromKey(options.key as never)
|
|
128
|
+
: Key.fromSecp256k1({
|
|
129
|
+
privateKey: options.key as Hex.Hex,
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
const router = from({ basePath })
|
|
133
|
+
|
|
134
|
+
router.hono.get('/', (c) => c.text('ok'))
|
|
135
|
+
|
|
136
|
+
router.hono.post('/', async (c) => {
|
|
137
|
+
let request: MerchantSchema.JsonRpcRequest = await c.req.json()
|
|
138
|
+
try {
|
|
139
|
+
request = MerchantSchema.validate(MerchantSchema.JsonRpcRequest, request)
|
|
140
|
+
} catch (e) {
|
|
141
|
+
const error = e as RpcResponse.ErrorObject
|
|
142
|
+
return c.json(
|
|
143
|
+
RpcResponse.from(
|
|
144
|
+
{
|
|
145
|
+
error: {
|
|
146
|
+
code: error.code,
|
|
147
|
+
message: error.message,
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
{ request },
|
|
151
|
+
),
|
|
152
|
+
)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
switch (request.method) {
|
|
156
|
+
case 'wallet_prepareCalls': {
|
|
157
|
+
const sponsor = (() => {
|
|
158
|
+
if (typeof options.sponsor === 'function')
|
|
159
|
+
return options.sponsor(request.params[0]! as never)
|
|
160
|
+
if (typeof options.sponsor === 'boolean') return options.sponsor
|
|
161
|
+
return true
|
|
162
|
+
})()
|
|
163
|
+
|
|
164
|
+
try {
|
|
165
|
+
const result = await client.request({
|
|
166
|
+
...request,
|
|
167
|
+
params: [
|
|
168
|
+
{
|
|
169
|
+
...request.params[0]!,
|
|
170
|
+
capabilities: {
|
|
171
|
+
...request.params[0]!.capabilities,
|
|
172
|
+
meta: {
|
|
173
|
+
...request.params[0]!.capabilities.meta,
|
|
174
|
+
...(sponsor
|
|
175
|
+
? {
|
|
176
|
+
feePayer: address,
|
|
177
|
+
}
|
|
178
|
+
: {}),
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
],
|
|
183
|
+
})
|
|
184
|
+
const { capabilities } = z.decode(
|
|
185
|
+
MerchantSchema.wallet_prepareCalls.Response,
|
|
186
|
+
result,
|
|
187
|
+
)
|
|
188
|
+
const { feePayerDigest } = capabilities
|
|
189
|
+
if (!feePayerDigest) throw new Error('`feePayerDigest` is required')
|
|
190
|
+
|
|
191
|
+
const signature = sponsor
|
|
192
|
+
? await Key.sign(key, {
|
|
193
|
+
address: null,
|
|
194
|
+
payload: feePayerDigest,
|
|
195
|
+
})
|
|
196
|
+
: undefined
|
|
197
|
+
|
|
198
|
+
const response = RpcResponse.from(
|
|
199
|
+
{
|
|
200
|
+
result: {
|
|
201
|
+
...result,
|
|
202
|
+
capabilities: {
|
|
203
|
+
...result.capabilities,
|
|
204
|
+
...(sponsor
|
|
205
|
+
? {
|
|
206
|
+
feeSignature: signature,
|
|
207
|
+
}
|
|
208
|
+
: {}),
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
{ request },
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
return c.json(response)
|
|
216
|
+
} catch (e) {
|
|
217
|
+
const error = (() => {
|
|
218
|
+
const error = RpcResponse.parseError(e as Error)
|
|
219
|
+
if (error.cause && 'code' in error.cause && error.cause.code === 3)
|
|
220
|
+
return error.cause as any
|
|
221
|
+
return error
|
|
222
|
+
})()
|
|
223
|
+
return c.json(RpcResponse.from({ error }, { request }))
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
default: {
|
|
228
|
+
const error = new RpcResponse.MethodNotSupportedError()
|
|
229
|
+
return c.json(RpcResponse.from({ error }, { request }))
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
return router
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export declare namespace merchant {
|
|
238
|
+
export type Options = {
|
|
239
|
+
/** Address of the Merchant Account. */
|
|
240
|
+
address: Address.Address
|
|
241
|
+
/** Base path of the request handler. */
|
|
242
|
+
basePath?: string | undefined
|
|
243
|
+
/** An Admin Key of the Merchant Account to use for signing. */
|
|
244
|
+
key:
|
|
245
|
+
| Hex.Hex
|
|
246
|
+
| (Pick<OneOf<Key.Secp256k1Key | Key.P256Key>, 'type'> & {
|
|
247
|
+
privateKey: Hex.Hex
|
|
248
|
+
})
|
|
249
|
+
/** Whether to sponsor calls or not, and the condition to do so. */
|
|
250
|
+
sponsor?:
|
|
251
|
+
| boolean
|
|
252
|
+
| ((
|
|
253
|
+
request: MerchantSchema.wallet_prepareCalls.Parameters,
|
|
254
|
+
) => MaybePromise<boolean>)
|
|
255
|
+
| undefined
|
|
256
|
+
/** Relay transport override. */
|
|
257
|
+
relay?: Porto.Config['relay'] | undefined
|
|
258
|
+
}
|
|
259
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { expect, test } from 'vitest'
|
|
2
|
+
import * as Key from '../viem/Key.js'
|
|
3
|
+
import * as Route from './Route.js'
|
|
4
|
+
import { Router } from './Router.js'
|
|
5
|
+
|
|
6
|
+
test('default', async () => {
|
|
7
|
+
const router = Router()
|
|
8
|
+
const response = await router.hono.request('http://localhost')
|
|
9
|
+
|
|
10
|
+
expect(response.status).toBe(200)
|
|
11
|
+
expect(response.headers.get('access-control-allow-origin')).toBe('*')
|
|
12
|
+
expect(await response.text()).toMatchInlineSnapshot(`
|
|
13
|
+
"
|
|
14
|
+
█▀█ █▀█ █▀█ ▀█▀ █▀█
|
|
15
|
+
█▀▀ █▄█ █▀▄ █ █▄█
|
|
16
|
+
"
|
|
17
|
+
`)
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
test('behavior: route', async () => {
|
|
21
|
+
const key = Key.createSecp256k1()
|
|
22
|
+
const router = Router().route(
|
|
23
|
+
'/merchant',
|
|
24
|
+
Route.merchant({
|
|
25
|
+
address: '0x0000000000000000000000000000000000000000',
|
|
26
|
+
key: key.privateKey!(),
|
|
27
|
+
}),
|
|
28
|
+
)
|
|
29
|
+
const response = await router.hono.request('http://localhost/merchant')
|
|
30
|
+
expect(response.status).toBe(200)
|
|
31
|
+
expect(await response.text()).toMatchInlineSnapshot(`"ok"`)
|
|
32
|
+
})
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { Env } from 'hono'
|
|
2
|
+
import type { BlankEnv, BlankSchema, Schema } from 'hono/types'
|
|
3
|
+
import * as Route from './Route.js'
|
|
4
|
+
|
|
5
|
+
export function Router<
|
|
6
|
+
env extends Env = BlankEnv,
|
|
7
|
+
schema extends Schema = BlankSchema,
|
|
8
|
+
basePath extends string = '/',
|
|
9
|
+
>(options: Router.Options<basePath> = {}) {
|
|
10
|
+
const handler = new Router.Inner<env, schema, basePath>(options)
|
|
11
|
+
handler.hono.get('/', (c) =>
|
|
12
|
+
c.text(`
|
|
13
|
+
█▀█ █▀█ █▀█ ▀█▀ █▀█
|
|
14
|
+
█▀▀ █▄█ █▀▄ █ █▄█
|
|
15
|
+
`),
|
|
16
|
+
)
|
|
17
|
+
return handler
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export namespace Router {
|
|
21
|
+
export type Options<basePath extends string = '/'> = Omit<
|
|
22
|
+
Inner.ConstructorOptions<basePath>,
|
|
23
|
+
'defaultPath'
|
|
24
|
+
>
|
|
25
|
+
|
|
26
|
+
export class Inner<
|
|
27
|
+
env extends Env = BlankEnv,
|
|
28
|
+
schema extends Schema = BlankSchema,
|
|
29
|
+
basePath extends string = '/',
|
|
30
|
+
> extends Route.from.Inner<env, schema, basePath> {
|
|
31
|
+
/**
|
|
32
|
+
* `.route()` allows grouping other Porto handlers in routes.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* TODO
|
|
36
|
+
*
|
|
37
|
+
* @param path - base Path
|
|
38
|
+
* @param app - other Porto handler
|
|
39
|
+
* @returns routed Porto handler
|
|
40
|
+
*/
|
|
41
|
+
route<
|
|
42
|
+
path extends string,
|
|
43
|
+
env extends Env,
|
|
44
|
+
schema extends Schema,
|
|
45
|
+
subBasePath extends string,
|
|
46
|
+
>(
|
|
47
|
+
path: path,
|
|
48
|
+
app: Route.from.Inner<env, schema, subBasePath>,
|
|
49
|
+
): Inner<env, schema, subBasePath> {
|
|
50
|
+
this.hono.route(path, app.hono)
|
|
51
|
+
return this as never
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export declare namespace Inner {
|
|
56
|
+
type ConstructorOptions<basePath extends string = '/'> =
|
|
57
|
+
Route.from.Inner.ConstructorOptions<basePath>
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as z from 'zod/mini'
|
|
2
|
+
import * as Rpc_relay from '../../core/internal/relay/schema/rpc.js'
|
|
3
|
+
import * as RpcRequest from '../../core/internal/schema/request.js'
|
|
4
|
+
|
|
5
|
+
export { wallet_prepareCalls } from '../../core/internal/relay/schema/rpc.js'
|
|
6
|
+
export { validate } from '../../core/internal/schema/request.js'
|
|
7
|
+
|
|
8
|
+
export const JsonRpcRequest = RpcRequest.schemaWithJsonRpc(
|
|
9
|
+
z.discriminatedUnion('method', [Rpc_relay.wallet_prepareCalls.Request]),
|
|
10
|
+
)
|
|
11
|
+
export type JsonRpcRequest = RpcRequest.WithDecoded<typeof JsonRpcRequest>
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
// Credit: https://github.com/mjackson/remix-the-web/blob/main/packages/node-fetch-server/src/lib/request-listener.ts
|
|
2
|
+
|
|
3
|
+
import type * as http from 'node:http'
|
|
4
|
+
import type * as http2 from 'node:http2'
|
|
5
|
+
|
|
6
|
+
export interface RequestListenerOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Overrides the host portion of the incoming request URL. By default the request URL host is
|
|
9
|
+
* derived from the HTTP `Host` header.
|
|
10
|
+
*
|
|
11
|
+
* For example, if you have a `$HOST` environment variable that contains the hostname of your
|
|
12
|
+
* server, you can use it to set the host of all incoming request URLs like so:
|
|
13
|
+
*
|
|
14
|
+
* ```ts
|
|
15
|
+
* createRequestListener(handler, { host: process.env.HOST })
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
host?: string
|
|
19
|
+
/**
|
|
20
|
+
* An error handler that determines the response when the request handler throws an error. By
|
|
21
|
+
* default a 500 Internal Server Error response will be sent.
|
|
22
|
+
*/
|
|
23
|
+
onError?: ErrorHandler
|
|
24
|
+
/**
|
|
25
|
+
* Overrides the protocol of the incoming request URL. By default the request URL protocol is
|
|
26
|
+
* derived from the connection protocol. So e.g. when serving over HTTPS (using
|
|
27
|
+
* `https.createServer()`), the request URL will begin with `https:`.
|
|
28
|
+
*/
|
|
29
|
+
protocol?: string
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Wraps a fetch handler in a Node.js request listener that can be used with:
|
|
34
|
+
*
|
|
35
|
+
* - [`http.createServer()`](https://nodejs.org/api/http.html#httpcreateserveroptions-requestlistener)
|
|
36
|
+
* - [`https.createServer()`](https://nodejs.org/api/https.html#httpscreateserveroptions-requestlistener)
|
|
37
|
+
* - [`http2.createServer()`](https://nodejs.org/api/http2.html#http2createserveroptions-onrequesthandler)
|
|
38
|
+
* - [`http2.createSecureServer()`](https://nodejs.org/api/http2.html#http2createsecureserveroptions-onrequesthandler)
|
|
39
|
+
*
|
|
40
|
+
* Example:
|
|
41
|
+
*
|
|
42
|
+
* ```ts
|
|
43
|
+
* import * as http from 'node:http';
|
|
44
|
+
* import { createRequestListener } from '@mjackson/node-fetch-server';
|
|
45
|
+
*
|
|
46
|
+
* async function handler(request) {
|
|
47
|
+
* return new Response('Hello, world!');
|
|
48
|
+
* }
|
|
49
|
+
*
|
|
50
|
+
* let server = http.createServer(
|
|
51
|
+
* createRequestListener(handler)
|
|
52
|
+
* );
|
|
53
|
+
*
|
|
54
|
+
* server.listen(3000);
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @param handler The fetch handler to use for processing incoming requests.
|
|
58
|
+
* @param options Request listener options.
|
|
59
|
+
* @returns A Node.js request listener function.
|
|
60
|
+
*/
|
|
61
|
+
export function fromFetchHandler(
|
|
62
|
+
handler: FetchHandler,
|
|
63
|
+
options?: RequestListenerOptions,
|
|
64
|
+
): http.RequestListener {
|
|
65
|
+
const onError = options?.onError ?? defaultErrorHandler
|
|
66
|
+
|
|
67
|
+
return async (req, res) => {
|
|
68
|
+
const request = createRequest(req, res, options)
|
|
69
|
+
const client = {
|
|
70
|
+
address: req.socket.remoteAddress!,
|
|
71
|
+
family: req.socket.remoteFamily! as ClientAddress['family'],
|
|
72
|
+
port: req.socket.remotePort!,
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
let response: Response
|
|
76
|
+
try {
|
|
77
|
+
response = await handler(request, client)
|
|
78
|
+
} catch (error) {
|
|
79
|
+
try {
|
|
80
|
+
response = (await onError(error)) ?? internalServerError()
|
|
81
|
+
} catch (error) {
|
|
82
|
+
console.error(`There was an error in the error handler: ${error}`)
|
|
83
|
+
response = internalServerError()
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
await sendResponse(res, response)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function defaultErrorHandler(error: unknown): Response {
|
|
92
|
+
console.error(error)
|
|
93
|
+
return internalServerError()
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function internalServerError(): Response {
|
|
97
|
+
return new Response(
|
|
98
|
+
// "Internal Server Error"
|
|
99
|
+
new Uint8Array([
|
|
100
|
+
73, 110, 116, 101, 114, 110, 97, 108, 32, 83, 101, 114, 118, 101, 114, 32,
|
|
101
|
+
69, 114, 114, 111, 114,
|
|
102
|
+
]),
|
|
103
|
+
{
|
|
104
|
+
headers: {
|
|
105
|
+
'Content-Type': 'text/plain',
|
|
106
|
+
},
|
|
107
|
+
status: 500,
|
|
108
|
+
},
|
|
109
|
+
)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export type RequestOptions = Omit<RequestListenerOptions, 'onError'>
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Creates a [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) object from
|
|
116
|
+
*
|
|
117
|
+
* - a [`http.IncomingMessage`](https://nodejs.org/api/http.html#class-httpincomingmessage)/[`http.ServerResponse`](https://nodejs.org/api/http.html#class-httpserverresponse) pair
|
|
118
|
+
* - a [`http2.Http2ServerRequest`](https://nodejs.org/api/http2.html#class-http2http2serverrequest)/[`http2.Http2ServerResponse`](https://nodejs.org/api/http2.html#class-http2http2serverresponse) pair
|
|
119
|
+
*
|
|
120
|
+
* @param req The incoming request object.
|
|
121
|
+
* @param res The server response object.
|
|
122
|
+
* @param options
|
|
123
|
+
* @returns A request object.
|
|
124
|
+
*/
|
|
125
|
+
export function createRequest(
|
|
126
|
+
req: http.IncomingMessage | http2.Http2ServerRequest,
|
|
127
|
+
res: http.ServerResponse | http2.Http2ServerResponse,
|
|
128
|
+
options?: RequestOptions,
|
|
129
|
+
): Request {
|
|
130
|
+
const controller = new AbortController()
|
|
131
|
+
res.on('close', () => {
|
|
132
|
+
controller.abort()
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
const method = req.method ?? 'GET'
|
|
136
|
+
const headers = createHeaders(req)
|
|
137
|
+
|
|
138
|
+
const protocol =
|
|
139
|
+
options?.protocol ??
|
|
140
|
+
('encrypted' in req.socket && req.socket.encrypted ? 'https:' : 'http:')
|
|
141
|
+
const host = options?.host ?? headers.get('Host') ?? 'localhost'
|
|
142
|
+
const url = new URL(req.url!, `${protocol}//${host}`)
|
|
143
|
+
|
|
144
|
+
const init: RequestInit = { headers, method, signal: controller.signal }
|
|
145
|
+
|
|
146
|
+
if (method !== 'GET' && method !== 'HEAD') {
|
|
147
|
+
init.body = new ReadableStream({
|
|
148
|
+
start(controller) {
|
|
149
|
+
req.on('data', (chunk) => {
|
|
150
|
+
controller.enqueue(
|
|
151
|
+
new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength),
|
|
152
|
+
)
|
|
153
|
+
})
|
|
154
|
+
req.on('end', () => {
|
|
155
|
+
controller.close()
|
|
156
|
+
})
|
|
157
|
+
},
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
// init.duplex = 'half' must be set when body is a ReadableStream, and Node follows the spec.
|
|
161
|
+
// However, this property is not defined in the TypeScript types for RequestInit, so we have
|
|
162
|
+
// to cast it here in order to set it without a type error.
|
|
163
|
+
// See https://fetch.spec.whatwg.org/#dom-requestinit-duplex
|
|
164
|
+
;(init as { duplex: 'half' }).duplex = 'half'
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return new Request(url, init)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Creates a [`Headers`](https://developer.mozilla.org/en-US/docs/Web/API/Headers) object from the headers in a Node.js
|
|
172
|
+
* [`http.IncomingMessage`](https://nodejs.org/api/http.html#class-httpincomingmessage)/[`http2.Http2ServerRequest`](https://nodejs.org/api/http2.html#class-http2http2serverrequest).
|
|
173
|
+
*
|
|
174
|
+
* @param req The incoming request object.
|
|
175
|
+
* @returns A headers object.
|
|
176
|
+
*/
|
|
177
|
+
export function createHeaders(
|
|
178
|
+
req: http.IncomingMessage | http2.Http2ServerRequest,
|
|
179
|
+
): Headers {
|
|
180
|
+
const headers = new Headers()
|
|
181
|
+
|
|
182
|
+
const rawHeaders = req.rawHeaders
|
|
183
|
+
for (let i = 0; i < rawHeaders.length; i += 2) {
|
|
184
|
+
if (rawHeaders[i]?.startsWith(':')) continue
|
|
185
|
+
headers.append(rawHeaders[i]!, rawHeaders[i + 1]!)
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return headers
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Sends a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) to the client using a Node.js
|
|
193
|
+
* [`http.ServerResponse`](https://nodejs.org/api/http.html#class-httpserverresponse)/[`http2.Http2ServerResponse`](https://nodejs.org/api/http2.html#class-http2http2serverresponse)
|
|
194
|
+
* object.
|
|
195
|
+
*
|
|
196
|
+
* @param res The server response object.
|
|
197
|
+
* @param response The response to send.
|
|
198
|
+
*/
|
|
199
|
+
export async function sendResponse(
|
|
200
|
+
res: http.ServerResponse | http2.Http2ServerResponse,
|
|
201
|
+
response: Response,
|
|
202
|
+
): Promise<void> {
|
|
203
|
+
// Iterate over response.headers so we are sure to send multiple Set-Cookie headers correctly.
|
|
204
|
+
// These would incorrectly be merged into a single header if we tried to use
|
|
205
|
+
// `Object.fromEntries(response.headers.entries())`.
|
|
206
|
+
const headers: Record<string, string | string[]> = {}
|
|
207
|
+
for (const [key, value] of response.headers as any) {
|
|
208
|
+
if (key in headers) {
|
|
209
|
+
if (Array.isArray(headers[key])) {
|
|
210
|
+
headers[key].push(value)
|
|
211
|
+
} else {
|
|
212
|
+
headers[key] = [headers[key] as string, value]
|
|
213
|
+
}
|
|
214
|
+
} else {
|
|
215
|
+
headers[key] = value
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
res.writeHead(response.status, headers)
|
|
220
|
+
|
|
221
|
+
if (response.body != null && res.req.method !== 'HEAD') {
|
|
222
|
+
for await (const chunk of readStream(response.body)) {
|
|
223
|
+
// @ts-expect-error - Node typings for http2 require a 2nd parameter to write but it's optional
|
|
224
|
+
res.write(chunk)
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
res.end()
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export async function* readStream(
|
|
232
|
+
stream: ReadableStream<Uint8Array>,
|
|
233
|
+
): AsyncIterable<Uint8Array> {
|
|
234
|
+
const reader = stream.getReader()
|
|
235
|
+
|
|
236
|
+
while (true) {
|
|
237
|
+
const { done, value } = await reader.read()
|
|
238
|
+
if (done) break
|
|
239
|
+
yield value
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export interface ClientAddress {
|
|
244
|
+
/**
|
|
245
|
+
* The IP address of the client that sent the request.
|
|
246
|
+
*
|
|
247
|
+
* [Node.js Reference](https://nodejs.org/api/net.html#socketremoteaddress)
|
|
248
|
+
*/
|
|
249
|
+
address: string
|
|
250
|
+
/**
|
|
251
|
+
* The family of the client IP address.
|
|
252
|
+
*
|
|
253
|
+
* [Node.js Reference](https://nodejs.org/api/net.html#socketremotefamily)
|
|
254
|
+
*/
|
|
255
|
+
family: 'IPv4' | 'IPv6'
|
|
256
|
+
/**
|
|
257
|
+
* The remote port of the client that sent the request.
|
|
258
|
+
*
|
|
259
|
+
* [Node.js Reference](https://nodejs.org/api/net.html#socketremoteport)
|
|
260
|
+
*/
|
|
261
|
+
port: number
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* A function that handles an error that occurred during request handling. May return a response to
|
|
266
|
+
* send to the client, or `undefined` to allow the server to send a default error response.
|
|
267
|
+
*
|
|
268
|
+
* [MDN `Response` Reference](https://developer.mozilla.org/en-US/docs/Web/API/Response)
|
|
269
|
+
*/
|
|
270
|
+
export type ErrorHandler = (
|
|
271
|
+
error: unknown,
|
|
272
|
+
) => undefined | Response | Promise<undefined | Response>
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* A function that handles an incoming request and returns a response.
|
|
276
|
+
*
|
|
277
|
+
* [MDN `Request` Reference](https://developer.mozilla.org/en-US/docs/Web/API/Request)
|
|
278
|
+
*
|
|
279
|
+
* [MDN `Response` Reference](https://developer.mozilla.org/en-US/docs/Web/API/Response)
|
|
280
|
+
*/
|
|
281
|
+
export type FetchHandler = (
|
|
282
|
+
request: Request,
|
|
283
|
+
client: ClientAddress,
|
|
284
|
+
) => Response | Promise<Response>
|