| # DartPad worker |
| |
| This package contains a worker intended to be compiled to wasm and run as a |
| _Web Worker_ in the browser by `package:dartpad`. This worker environment has |
| an in-memory file-system with DDC, LSP and pub client. |
| |
| This package is not intended to be published, instead the resulting binaries |
| and assets should be published (e.g., to a CDN). |
| |
| ## Architecture |
| A dartpad-like experience built with `package:dartpad` consists of 3 components: |
| * The _editor_, the main application, built using `package:dartpad`. This is |
| where the UI, code editor, file browser, etc lives. You may also think of |
| this as the main application that orchestrates everything else. |
| * The _worker_, a development environment that runs in a _Web Worker_, launched |
| using `package:dartpad`. This hosts an in-memory file-system, where you can |
| run a `pub get`, start a language server or compile dart files with DDC. You |
| can also think of this as your Dart SDK. |
| * The _sandbox_, a sandboxed iframe, where dart files compiled in the _worker_ |
| can be executed, with support for hot-reload, hot-restart and extraction of |
| `console.log` and unhandled exceptions. |
| |
| Communication between the components above is entirely async, and happens using |
| [JSON-RPC 2.0], though the APIs are encapsulated by `package:dartpad`, so users |
| do not have to manage RPC messages themselves. A user of `package:dartpad` gets |
| an convinient asynchronous API for talking to the worker and sandbox. But to |
| spawn a worker or sandbox, a user of `package:dartpad` must provide: |
| * `assetBaseUrl`, the location of binaries and assets created from |
| `pkg/dartpad_worker`. |
| * `sdkLocation`, the location of the _DartPad SDK_ to use, this includes |
| SDK files and runtime DDC modules to be used. |
| |
| The `assetBaseUrl` should point to a location hosting the files from |
| `out/ReleaseX64/dartpad/` built with |
| `./tools/build.py -m release -a x64 dartpad`. |
| This includes WASM compiled worker, auxiliary JS files for loading into a |
| _Web Worker_, DDC module loader, sandbox communication layer. |
| But from the perspective of a user of `package:dartpad`, the `assetBaseUrl` |
| should simply point to a collection of files built from the Dart SDK repository. |
| The Dart team will publish these files as part of the release process for the |
| Dart SDK. |
| |
| The `sdkLocation` should point to the location of a _DartPad SDK_. |
| A _DartPad SDK_ is a folder that contains the following entrypoints: |
| * `sdk.tar`, a bundle of files to be loaded into the in-memory filesystem of |
| the worker, and, |
| * `sdk.js`, a bundle of DDC modules to be loaded into the sandbox before we |
| attempt to run anything. |
| |
| A _DartPad SDK_ may contain additional assets and resources referenced from |
| `sdk.js` or loaded by the running application. |
| |
| As of the moment, `out/ReleaseX64/dartpad/` also contains a `dart/` folder that |
| works as _DartPad SDK_ (`sdkLocation`) for a Dart-only environment. |
| For a Flutter environment a _DartPad SDK_ can be built using |
| `pkg/dartpad_worker/setup_local_flutter.dart`. |
| |
| From the perspective of a user of `package:dartpad`, the `sdkLocation` should |
| simply point to a collection of files built from the Dart or Flutter SDK |
| repository. |
| Current thinking is that the Dart team will publish these files as part of the |
| release process for the Dart and Flutter SDKs. |
| |
| It may be possible that in the future, a default value for `assetBaseUrl` is |
| hardcoded into `package:dartpad`, along with `sdkLocation` default values for |
| Dart and Flutter SDKs. It's also possible that framework authors building on top |
| of the Dart or Flutter SDK, may want to publish their own _DartPad SDK_ with |
| pre-compiled DDC modules. Exactly, how to keep such an effort maintainable is |
| still TBD. |
| |
| [JSON-RPC 2.0]: https://www.jsonrpc.org/specification |
| |
| ## Testing |
| These tests require the assets be built. Build these locally with: |
| |
| ```sh |
| ./tools/build.py -m release -a x64 dartpad |
| ``` |
| |
| And run tests locally with `dart test`, see `dart_test.yaml` for details on the |
| configuration. |
| |
| To run Flutter specific tests you also run: |
| ```sh |
| dart pkg/dartpad_worker/setup_local_flutter.dart |
| ``` |
| |
| This will only work if your flutter installation has the same dill version as |
| your Dart SDK checkout. This is arguably not ideal, and these tests do not run |
| in CI. |
| |