Skip to content

Instantly share code, notes, and snippets.

@PlugFox
Created March 26, 2021 07:55
Show Gist options
  • Save PlugFox/7370db96ae5a730da3c0ad29e08e6722 to your computer and use it in GitHub Desktop.
Save PlugFox/7370db96ae5a730da3c0ad29e08e6722 to your computer and use it in GitHub Desktop.
dart web worker
import 'communicator.dart';
void main() {
final communicator = WorkerCommunicator('worker.dart.js')
..listen((event) {
print('Data from worker: "$event"');
});
communicator.add('Ping');
}
dev_dependencies:
js: ^0.6.3
// Worker не надо подключать в index.html
// dart2js -o web/worker.dart.js lib/src/worker.dart
@JS()
library sample;
import 'dart:html';
import 'package:js/js.dart';
@JS('self')
external DedicatedWorkerGlobalScope get self;
void main() {
self.onMessage.listen((e) {
print('Message received from main script');
var workerResult = 'Result: ${e.data}';
print('Posting message back to main script');
self.postMessage(workerResult, null);
});
}
import 'dart:async';
import 'dart:html' as html;
abstract class Communicator<S, R> extends Stream<R> implements StreamSink<S> {}
class WorkerCommunicator<S extends Object, R extends Object> extends Communicator<S, R> {
final html.Worker _worker;
WorkerCommunicator(String scriptUrl) : _worker = html.Worker(scriptUrl) {
if (!html.Worker.supported) {
// ignore: avoid_escaping_inner_quotes
throw UnsupportedError('Your browser doesn\'t support web workers.');
}
}
@override
void add(S event) => _worker.postMessage(event);
@override
void addError(Object error, [StackTrace? stackTrace]) => throw UnimplementedError();
@override
Future addStream(Stream<S> stream) => throw UnimplementedError();
@override
Future close() => throw UnimplementedError();
@override
Future get done => throw UnimplementedError();
@override
StreamSubscription<R> listen(
void Function(R event)? onData, {
Function? onError,
void Function()? onDone,
bool? cancelOnError,
}) =>
_worker.onMessage
.where((e) => e.data is R)
.map<R>((e) => e.data as R)
.listen(
onData,
onError: onError,
onDone: onDone,
cancelOnError: cancelOnError,
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment