runSqliteWebWorker function

void runSqliteWebWorker()

Serves SQLite requests inside a dedicated Web worker.

Call once from a custom worker entrypoint. Normal applications use the verified worker bundled by the package instead of starting this directly.

Implementation

void runSqliteWebWorker() {
  final self = globalContext as web.DedicatedWorkerGlobalScope;
  final server = _WorkerDatabase();
  Future<void> tail = Future.value();
  self.onmessage = ((web.MessageEvent event) {
    tail = tail.then((_) async {
      final message = event.data! as JSArray<JSAny?>;
      final id = message[0];
      try {
        final result = await server.handle(
          (message[1]! as JSString).toDart,
          message[2],
        );
        self.postMessage([id, true.toJS, server.active?.toJS, result].toJS);
      } catch (error) {
        final JSArray<JSAny?> details;
        if (error is sqlite.SqliteException) {
          details = [
            'sqlite'.toJS,
            error.message.toJS,
            error.resultCode.toJS,
            error.extendedResultCode.toJS,
          ].toJS;
        } else {
          details = [
            (error is OrmException ? error.code : 'DRIVER.SQLITE').toJS,
            error.toString().toJS,
          ].toJS;
        }
        self.postMessage([id, false.toJS, server.active?.toJS, details].toJS);
      }
    });
  }).toJS;
}