Skip to content

Epic: Polyfill Flexibility #848

@Shaptic

Description

@Shaptic

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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Status

    Done

    Status

    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions