refactor(WebWorker): Make WebWorker bootstrap synchronous
BREAKING CHANGE From the app thread, in both TypeScript and Dart, you bootstrap the app using `application` instead of `asyncApplication`. Before: ```TypeScript platform([WORKER_APP_PLATFORM]) .asyncApplication(setupWebWorker, optionalProviders?) .then((ref) => ref.bootstrap(RootComponent)); ``` Now: ```TypeScript platform([WORKER_APP_PLATFORM]) .application([WORKER_APP_APPLICATION]) .bootstrap(RootComponent); ``` closes #5857 Closes #5862
This commit is contained in:
@ -3,19 +3,31 @@ library angular2.src.platform.worker_app;
|
||||
import 'package:angular2/src/core/zone/ng_zone.dart';
|
||||
import 'package:angular2/src/platform/server/webworker_adapter.dart';
|
||||
import 'package:angular2/src/platform/worker_app_common.dart';
|
||||
import 'package:angular2/core.dart';
|
||||
import 'package:angular2/src/web_workers/shared/isolate_message_bus.dart';
|
||||
import 'package:angular2/src/web_workers/shared/message_bus.dart';
|
||||
import 'dart:isolate';
|
||||
|
||||
setupIsolate(SendPort replyTo) {
|
||||
return (NgZone zone) {
|
||||
WebWorkerDomAdapter.makeCurrent();
|
||||
const OpaqueToken RENDER_SEND_PORT = const OpaqueToken("RenderSendPort");
|
||||
|
||||
ReceivePort rPort = new ReceivePort();
|
||||
var sink = new WebWorkerMessageBusSink(replyTo, rPort);
|
||||
var source = new IsolateMessageBusSource(rPort);
|
||||
IsolateMessageBus bus = new IsolateMessageBus(sink, source);
|
||||
return genericWorkerAppProviders(bus, zone);
|
||||
};
|
||||
const List<dynamic> WORKER_APP_APPLICATION = const [
|
||||
WORKER_APP_APPLICATION_COMMON,
|
||||
const Provider(MessageBus,
|
||||
useFactory: createMessageBus, deps: const [NgZone, RENDER_SEND_PORT]),
|
||||
const Provider(APP_INITIALIZER, useValue: setupIsolate, multi: true)
|
||||
];
|
||||
|
||||
MessageBus createMessageBus(NgZone zone, SendPort replyTo) {
|
||||
ReceivePort rPort = new ReceivePort();
|
||||
var sink = new WebWorkerMessageBusSink(replyTo, rPort);
|
||||
var source = new IsolateMessageBusSource(rPort);
|
||||
var bus = new IsolateMessageBus(sink, source);
|
||||
bus.attachToZone(zone);
|
||||
return bus;
|
||||
}
|
||||
|
||||
setupIsolate() {
|
||||
WebWorkerDomAdapter.makeCurrent();
|
||||
}
|
||||
|
||||
class WebWorkerMessageBusSink extends IsolateMessageBusSink {
|
||||
|
@ -7,22 +7,31 @@ import {
|
||||
PostMessageBusSink,
|
||||
PostMessageBusSource
|
||||
} from 'angular2/src/web_workers/shared/post_message_bus';
|
||||
import {genericWorkerAppProviders} from './worker_app_common';
|
||||
import {WORKER_APP_APPLICATION_COMMON} from './worker_app_common';
|
||||
import {APP_INITIALIZER} from 'angular2/core';
|
||||
import {MessageBus} from 'angular2/src/web_workers/shared/message_bus';
|
||||
|
||||
// TODO(jteplitz602) remove this and compile with lib.webworker.d.ts (#3492)
|
||||
interface PostMessageInterface {
|
||||
(message: any, transferrables?:[ArrayBuffer]): void;
|
||||
}
|
||||
var _postMessage: PostMessageInterface = <any>postMessage;
|
||||
let _postMessage = {
|
||||
postMessage: (message: any, transferrables?:[ArrayBuffer]) => {
|
||||
(<any>postMessage)(message, transferrables);
|
||||
}
|
||||
};
|
||||
|
||||
export function setupWebWorker(zone: NgZone): Promise<Array<Type | Provider | any[]>> {
|
||||
export const WORKER_APP_APPLICATION: Array<any /*Type | Provider | any[]*/> = [
|
||||
WORKER_APP_APPLICATION_COMMON,
|
||||
new Provider(MessageBus, {useFactory: createMessageBus, deps: [NgZone]}),
|
||||
new Provider(APP_INITIALIZER, {useValue: setupWebWorker, multi: true})
|
||||
];
|
||||
|
||||
function createMessageBus(zone: NgZone): MessageBus {
|
||||
let sink = new PostMessageBusSink(_postMessage);
|
||||
let source = new PostMessageBusSource();
|
||||
let bus = new PostMessageBus(sink, source);
|
||||
bus.attachToZone(zone);
|
||||
return bus;
|
||||
}
|
||||
|
||||
function setupWebWorker(): void {
|
||||
Parse5DomAdapter.makeCurrent();
|
||||
var sink = new PostMessageBusSink({
|
||||
postMessage:
|
||||
(message: any, transferrables?:[ArrayBuffer]) => { _postMessage(message, transferrables); }
|
||||
});
|
||||
var source = new PostMessageBusSource();
|
||||
var bus = new PostMessageBus(sink, source);
|
||||
|
||||
return genericWorkerAppProviders(bus, zone);
|
||||
}
|
||||
|
@ -1,9 +1,7 @@
|
||||
import {XHR} from 'angular2/src/compiler/xhr';
|
||||
import {WebWorkerXHRImpl} from 'angular2/src/web_workers/worker/xhr_impl';
|
||||
import {ListWrapper} from 'angular2/src/facade/collection';
|
||||
import {WebWorkerRenderer} from 'angular2/src/web_workers/worker/renderer';
|
||||
import {print, Type, CONST_EXPR, isPresent} from 'angular2/src/facade/lang';
|
||||
import {MessageBus} from 'angular2/src/web_workers/shared/message_bus';
|
||||
import {Renderer} from 'angular2/src/core/render/api';
|
||||
import {
|
||||
PLATFORM_DIRECTIVES,
|
||||
@ -30,8 +28,6 @@ import {
|
||||
RenderViewWithFragmentsStore
|
||||
} from 'angular2/src/web_workers/shared/render_view_with_fragments_store';
|
||||
import {WebWorkerEventDispatcher} from 'angular2/src/web_workers/worker/event_dispatcher';
|
||||
import {NgZone} from 'angular2/src/core/zone/ng_zone';
|
||||
import {Promise, PromiseWrapper} from 'angular2/src/facade/async';
|
||||
|
||||
class PrintLogger {
|
||||
log = print;
|
||||
@ -43,7 +39,7 @@ class PrintLogger {
|
||||
export const WORKER_APP_PLATFORM: Array<any /*Type | Provider | any[]*/> =
|
||||
CONST_EXPR([PLATFORM_COMMON_PROVIDERS]);
|
||||
|
||||
export const WORKER_APP_COMMON_PROVIDERS: Array<any /*Type | Provider | any[]*/> = CONST_EXPR([
|
||||
export const WORKER_APP_APPLICATION_COMMON: Array<any /*Type | Provider | any[]*/> = CONST_EXPR([
|
||||
APPLICATION_COMMON_PROVIDERS,
|
||||
COMPILER_PROVIDERS,
|
||||
FORM_PROVIDERS,
|
||||
@ -66,17 +62,3 @@ export const WORKER_APP_COMMON_PROVIDERS: Array<any /*Type | Provider | any[]*/>
|
||||
function _exceptionHandler(): ExceptionHandler {
|
||||
return new ExceptionHandler(new PrintLogger());
|
||||
}
|
||||
|
||||
/**
|
||||
* Asynchronously returns a list of providers that can be used to initialize the
|
||||
* Application injector.
|
||||
* Also takes care of attaching the {@link MessageBus} to the given {@link NgZone}.
|
||||
*/
|
||||
export function genericWorkerAppProviders(bus: MessageBus,
|
||||
zone: NgZone): Promise<Array<Type | Provider | any[]>> {
|
||||
bus.attachToZone(zone);
|
||||
var bindings = ListWrapper.concat(WORKER_APP_COMMON_PROVIDERS, [
|
||||
new Provider(MessageBus, {useValue: bus}),
|
||||
]);
|
||||
return PromiseWrapper.resolve(bindings);
|
||||
}
|
||||
|
@ -84,7 +84,7 @@ class WebSocketWrapper {
|
||||
_socket.addStream(_sendStream.stream);
|
||||
}
|
||||
|
||||
void send (String data) {
|
||||
void send(String data) {
|
||||
_sendStream.add(data);
|
||||
}
|
||||
|
||||
|
@ -9,15 +9,12 @@ import 'package:angular2/src/facade/lang.dart';
|
||||
import 'package:angular2/src/facade/exceptions.dart';
|
||||
|
||||
class GenericMessageBus implements MessageBus {
|
||||
final MessageBusSink _sink;
|
||||
final MessageBusSource _source;
|
||||
|
||||
MessageBusSink get sink => _sink;
|
||||
MessageBusSource get source => _source;
|
||||
MessageBusSink sink;
|
||||
MessageBusSource source;
|
||||
|
||||
GenericMessageBus(MessageBusSink sink, MessageBusSource source)
|
||||
: _sink = sink,
|
||||
_source = source;
|
||||
: sink = sink,
|
||||
source = source;
|
||||
|
||||
void attachToZone(NgZone zone) {
|
||||
sink.attachToZone(zone);
|
||||
|
Reference in New Issue
Block a user