Last active
January 8, 2025 17:33
-
-
Save PlugFox/7370db96ae5a730da3c0ad29e08e6722 to your computer and use it in GitHub Desktop.
dart web worker, webworker, woker
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'communicator.dart'; | |
void main() { | |
final communicator = WorkerCommunicator('worker.dart.js') | |
..listen((event) { | |
print('Data from worker: "$event"'); | |
}); | |
communicator.add('Ping'); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
dev_dependencies: | |
js: ^0.6.3 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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); | |
}); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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