
BREAKING CHANGE WORKER_RENDER_APP is now deprecated. Use WORKER_RENDER_APPLICATION instead WORKER_RENDER_APP_COMMON has been replaced by WORKER_RENDER_APPLICATION_COMMON closes #6184 Closes #6378
77 lines
2.4 KiB
TypeScript
77 lines
2.4 KiB
TypeScript
import {
|
|
PostMessageBus,
|
|
PostMessageBusSink,
|
|
PostMessageBusSource
|
|
} from 'angular2/src/web_workers/shared/post_message_bus';
|
|
import {MessageBus} from 'angular2/src/web_workers/shared/message_bus';
|
|
import {APP_INITIALIZER} from 'angular2/core';
|
|
import {Injector, Injectable, Provider} from 'angular2/src/core/di';
|
|
import {MessageBasedRenderer} from 'angular2/src/web_workers/ui/renderer';
|
|
import {MessageBasedXHRImpl} from 'angular2/src/web_workers/ui/xhr_impl';
|
|
import {
|
|
WORKER_RENDER_APPLICATION_COMMON,
|
|
WORKER_RENDER_MESSAGING_PROVIDERS,
|
|
WORKER_SCRIPT,
|
|
initializeGenericWorkerRenderer
|
|
} from 'angular2/src/platform/worker_render_common';
|
|
import {BaseException} from 'angular2/src/facade/exceptions';
|
|
import {CONST_EXPR} from 'angular2/src/facade/lang';
|
|
|
|
/**
|
|
* Wrapper class that exposes the Worker
|
|
* and underlying {@link MessageBus} for lower level message passing.
|
|
*/
|
|
@Injectable()
|
|
export class WebWorkerInstance {
|
|
public worker: Worker;
|
|
public bus: MessageBus;
|
|
|
|
/** @internal */
|
|
public init(worker: Worker, bus: MessageBus) {
|
|
this.worker = worker;
|
|
this.bus = bus;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* An array of providers that should be passed into `application()` when initializing a new Worker.
|
|
*/
|
|
export const WORKER_RENDER_APPLICATION: Array<any /*Type | Provider | any[]*/> = CONST_EXPR([
|
|
WORKER_RENDER_APPLICATION_COMMON,
|
|
WebWorkerInstance,
|
|
new Provider(APP_INITIALIZER,
|
|
{
|
|
useFactory: (injector) => () => initWebWorkerApplication(injector),
|
|
multi: true,
|
|
deps: [Injector]
|
|
}),
|
|
new Provider(MessageBus, {useFactory: (instance) => instance.bus, deps: [WebWorkerInstance]})
|
|
]);
|
|
|
|
function initWebWorkerApplication(injector: Injector): void {
|
|
var scriptUri: string;
|
|
try {
|
|
scriptUri = injector.get(WORKER_SCRIPT);
|
|
} catch (e) {
|
|
throw new BaseException(
|
|
"You must provide your WebWorker's initialization script with the WORKER_SCRIPT token");
|
|
}
|
|
|
|
let instance = injector.get(WebWorkerInstance);
|
|
spawnWebWorker(scriptUri, instance);
|
|
|
|
initializeGenericWorkerRenderer(injector);
|
|
}
|
|
|
|
/**
|
|
* Spawns a new class and initializes the WebWorkerInstance
|
|
*/
|
|
function spawnWebWorker(uri: string, instance: WebWorkerInstance): void {
|
|
var webWorker: Worker = new Worker(uri);
|
|
var sink = new PostMessageBusSink(webWorker);
|
|
var source = new PostMessageBusSource(webWorker);
|
|
var bus = new PostMessageBus(sink, source);
|
|
|
|
instance.init(webWorker, bus);
|
|
}
|