Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Epic: Polyfill Flexibility #848

Open
8 of 27 tasks
Shaptic opened this issue Jul 17, 2023 · 1 comment
Open
8 of 27 tasks

Epic: Polyfill Flexibility #848

Shaptic opened this issue Jul 17, 2023 · 1 comment

Comments

@Shaptic
Copy link
Contributor

Shaptic commented Jul 17, 2023

Epic: Polyfill Flexibility

This is the master issue to track work necessary to tackle the inflexibility of the SDK in regards to dependencies and polyfills. It lives in this repo (stellar/js-stellar-sdk) but the work covers multiple repos.

First, the doc that put us on this path: link (see 2. Packaging).

Package Structure

We need our packages to be more modular:

  • Drop polyfills from all packages
    • js-xdr
    • stellar-base
    • stellar-sdk
  • Create a version of stellar-base with different crypto backends:
    • stellar-base will use sodium-native
    • stellar-base@unsalted will use tweetnacl
    • stellar-base@node will use Node's crypto (or a polyfill)
  • Create a bundled version of the main libraries with everything polyfilled, installable with the @full tag, e.g. yarn add stellar-base@full:
    • stellar-base
    • stellar-sdk
    • These will be "combine-able" with the crypto backends
  • Merge soroban-client and stellar-sdk into one library:
    • They will share the entire build pipeline except...
    • Soroban RPC code will live under a Soroban namespace
    • Horizon code will live under a Horizon namespace
    • XDR will continue to live under the xdr namespace
  • Move strkey (SEP-23) implementation to its own package: @stellar/strkey
  • Move SEP-10 utilities to their own package: @stellar/webauth

Problematic Dependencies

We need to eliminate the use of dependencies that are problematic (meaning: not available in every deployment environment, not cross-platform, not pleasant to use, etc.) or provide thorough instructions on what does or does not need to be polyfilled by the application developer.

The philosophy imbued here follows w3ctag/polyfills#6/comment. The libraries will make the best possible assumption about which library to use if some functionality is needed. For example, if dealing with bytes is commonplace in a library, it will rely on the existence of Buffer. However, as a library, it will not polyfill it on its own. Instead, it should detect the existence of the object at runtime and provide an appropriate error + instructions.

For example, if we started a project:

npm init -y && npm install stellar-sdk
echo 'const sdk = require("stellar-sdk");' > index.js
firefox index.js 

We would get an error in the console:

Error: 'Buffer' polyfill not detected. Configure your bundling pipeline to provide the Buffer class (e.g. https://github.com/feross/buffer).

The following dependencies need work:

In fact, many of the dependencies can be replaced.

@kalepail
Copy link
Contributor

fwiw I don't personally think this needs to get shipped before Testnet. That seems very ambitious and I don't think it will greatly affect the ability of developers to build and deploy dapps. Definitely important but not essential. Apologies if I gave that impression. It will be a tremendous quality of life improvement but as it's not really Soroban specific and touches more generally all of the Stellar JS experience I think this can get punted downstream a little if necessary.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: Backlog
Development

No branches or pull requests

5 participants
@Shaptic @mollykarcher @kalepail @tsachiherman and others