driftWorkerMain function

void driftWorkerMain(
  1. QueryExecutor openConnection(
      )
    )

    A suitable entrypoint for a web worker aiming to make a drift database available to other browsing contexts.

    This function will detect whether it is running in a shared or in a dedicated worker. In either case, the openConnection callback is invoked to start a DriftServer that will serve drift database requests to clients.

    When running in a shared worker, this function listens to SharedWorkerGlobalScope.onConnect events and establishes message channels with connecting clients to share a database. In a dedicated worker, a DedicatedWorkerGlobalScope.postMessage-construction is used to establish a communication channel with clients. To connect to this worker, the connectToDriftWorker function can be used.

    As an example, a worker file could live in web/database_worker.dart and have the following content:

    import 'dart:html';
    
    import 'package:drift/drift.dart';
    import 'package:drift/web.dart';
    import 'package:drift/web/worker.dart';
    
    void main() {
      // Load sql.js library in the worker
      WorkerGlobalScope.instance.importScripts('sql-wasm.js');
    
      driftWorkerMain(() {
        return WebDatabase.withStorage(DriftWebStorage.indexedDb('worker',
            migrateFromLocalStorage: false, inWebWorker: true));
      });
    }
    

    Depending on the build system you use, you can then compile this Dart web worker with dart compile js, build_web_compilers or other tools.

    The connectToDriftWorker method can be used in the main portion of your app to connect to a worker using driftWorkerMain.

    The documentation contains additional information and an example on how to use workers with Dart and Drift.

    Implementation

    void driftWorkerMain(QueryExecutor Function() openConnection) {
      final self = WorkerGlobalScope.instance;
      _RunningDriftWorker worker;
    
      if (self is SharedWorkerGlobalScope) {
        worker = _RunningDriftWorker(true, openConnection);
      } else if (self is DedicatedWorkerGlobalScope) {
        worker = _RunningDriftWorker(false, openConnection);
      } else {
        throw StateError('This worker is neither a shared nor a dedicated worker');
      }
    
      worker.start();
    }