blob: 472d4c1f49d11c93aabeda4cb4638aee868a4685 [file] [view] [edit]
# 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.