connectToDriftWorker function

Future<DatabaseConnection> connectToDriftWorker(
  1. String workerJsUri,
  2. {DriftWorkerMode mode = DriftWorkerMode.dedicated}

Spawn or connect to a web worker written with driftWorkerMain.

Depending on the mode option, this method creates either a regular Worker or attaches itself to an SharedWorker in the current browsing context. For more details on the different modes, see DriftWorkerMode. By default, a dedicated worker will be used (DriftWorkerMode.dedicated).

The workerJsUri describes the path to the worker (e.g. /database_worker.dart.js if the original Dart file defining the worker is in web/database_worker.dart).

When using a shared worker, the database (including stream queries!) are shared across multiple tabs in realtime.


Future<DatabaseConnection> connectToDriftWorker(String workerJsUri,
    {DriftWorkerMode mode = DriftWorkerMode.dedicated}) {
  StreamChannel<Object?> channel;

  if (mode == DriftWorkerMode.dedicated) {
    final worker = Worker(workerJsUri);
    final webChannel = MessageChannel();

    // Transfer first port to the channel, we'll use the second port on this side.
    worker.postMessage(webChannel.port1, [webChannel.port1]);
    channel =;
  } else {
    final worker = SharedWorker(workerJsUri, 'drift database');
    final port = worker.port!;

    var didGetInitializationResponse = false;
    channel =
      handleData: (data, sink) {
        if (didGetInitializationResponse) {
        } else {
          didGetInitializationResponse = true;

          final response = data as bool;
          if (response) {
            // Initialization ok, all good!
          } else {
                  'Shared worker disagrees with desired mode $mode, is there '
                  'another tab using `connectToDriftWorker()` in a different '

  return connectToRemoteAndInitialize(channel);