main function

void main()

Implementation

void main() {
  final controller = PowerSyncAsyncSqliteController();
  final connector = PowerSyncWorkerConnector(Uri.base);
  final messagesForDatabaseWorker = StreamController<MessageEvent>(sync: true);

  WebSqlite.workerEntrypoint(
    controller: controller,
    environment: _Environment(connector, messagesForDatabaseWorker.stream),
  );

  if (_isSharedWorker) {
    final syncWorker = SyncWorker();

    void handleMessage(MessageEvent event) {
      final message = event.data as SharedWorkerMessage;

      if (message.isForSyncWorker) {
        syncWorker.trackPort(message.message as MessagePort);
      } else {
        messagesForDatabaseWorker.add(
          MessageEvent(
            'message',
            MessageEventInit(data: message.message),
          ),
        );
      }
    }

    void handlePort(MessagePort port) {
      port.start();
      EventStreamProviders.messageEvent.forTarget(port).listen(handleMessage);
    }

    EventStreamProviders.connectEvent
        .forTarget(globalContext as SharedWorkerGlobalScope)
        .listen((event) {
      for (final port in (event as MessageEvent).ports.toDart) {
        handlePort(port);
      }
    });
  } else {
    EventStreamProviders.messageEvent
        .forTarget(globalContext as DedicatedWorkerGlobalScope)
        .listen(messagesForDatabaseWorker.add);
  }
}