refactor(platform-webworker): cleanup
This commit is contained in:
parent
3517f28609
commit
cdf99cf68b
|
@ -13,16 +13,13 @@ import {WORKER_SCRIPT, platformWorkerUi} from './worker_render';
|
||||||
export {VERSION} from './version';
|
export {VERSION} from './version';
|
||||||
export {ClientMessageBroker, ClientMessageBrokerFactory, FnArg, UiArguments} from './web_workers/shared/client_message_broker';
|
export {ClientMessageBroker, ClientMessageBrokerFactory, FnArg, UiArguments} from './web_workers/shared/client_message_broker';
|
||||||
export {MessageBus, MessageBusSink, MessageBusSource} from './web_workers/shared/message_bus';
|
export {MessageBus, MessageBusSink, MessageBusSource} from './web_workers/shared/message_bus';
|
||||||
export {SerializerTypes} from './web_workers/shared/serialized_types';
|
export {PRIMITIVE, SerializerTypes} from './web_workers/shared/serializer';
|
||||||
export {PRIMITIVE} from './web_workers/shared/serializer';
|
|
||||||
export {ReceivedMessage, ServiceMessageBroker, ServiceMessageBrokerFactory} from './web_workers/shared/service_message_broker';
|
export {ReceivedMessage, ServiceMessageBroker, ServiceMessageBrokerFactory} from './web_workers/shared/service_message_broker';
|
||||||
export {WORKER_UI_LOCATION_PROVIDERS} from './web_workers/ui/location_providers';
|
export {WORKER_UI_LOCATION_PROVIDERS} from './web_workers/ui/location_providers';
|
||||||
export {WORKER_APP_LOCATION_PROVIDERS} from './web_workers/worker/location_providers';
|
export {WORKER_APP_LOCATION_PROVIDERS} from './web_workers/worker/location_providers';
|
||||||
export {WorkerAppModule, platformWorkerApp} from './worker_app';
|
export {WorkerAppModule, platformWorkerApp} from './worker_app';
|
||||||
export {platformWorkerUi} from './worker_render';
|
export {platformWorkerUi} from './worker_render';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bootstraps the worker ui.
|
* Bootstraps the worker ui.
|
||||||
*
|
*
|
||||||
|
|
|
@ -12,8 +12,7 @@ import {EventEmitter} from '../../facade/async';
|
||||||
import {stringify} from '../../facade/lang';
|
import {stringify} from '../../facade/lang';
|
||||||
|
|
||||||
import {MessageBus} from './message_bus';
|
import {MessageBus} from './message_bus';
|
||||||
import {SerializerTypes} from './serialized_types';
|
import {Serializer, SerializerTypes} from './serializer';
|
||||||
import {Serializer} from './serializer';
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -48,7 +47,7 @@ export class ClientMessageBrokerFactory_ extends ClientMessageBrokerFactory {
|
||||||
* @experimental WebWorker support in Angular is experimental.
|
* @experimental WebWorker support in Angular is experimental.
|
||||||
*/
|
*/
|
||||||
export abstract class ClientMessageBroker {
|
export abstract class ClientMessageBroker {
|
||||||
abstract runOnService(args: UiArguments, returnType: Type<any>): Promise<any>;
|
abstract runOnService(args: UiArguments, returnType: Type<any>|SerializerTypes): Promise<any>;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface PromiseCompleter {
|
interface PromiseCompleter {
|
||||||
|
@ -68,7 +67,7 @@ export class ClientMessageBroker_ extends ClientMessageBroker {
|
||||||
this._serializer = _serializer;
|
this._serializer = _serializer;
|
||||||
const source = messageBus.from(channel);
|
const source = messageBus.from(channel);
|
||||||
|
|
||||||
source.subscribe({next: (message: {[key: string]: any}) => this._handleMessage(message)});
|
source.subscribe({next: (message: MessageData) => this._handleMessage(message)});
|
||||||
}
|
}
|
||||||
|
|
||||||
private _generateMessageId(name: string): string {
|
private _generateMessageId(name: string): string {
|
||||||
|
@ -82,7 +81,7 @@ export class ClientMessageBroker_ extends ClientMessageBroker {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
runOnService(args: UiArguments, returnType: Type<any>): Promise<any> {
|
runOnService(args: UiArguments, returnType: Type<any>|SerializerTypes): Promise<any> {
|
||||||
const fnArgs: any[] = [];
|
const fnArgs: any[] = [];
|
||||||
if (args.args) {
|
if (args.args) {
|
||||||
args.args.forEach(argument => {
|
args.args.forEach(argument => {
|
||||||
|
@ -127,15 +126,14 @@ export class ClientMessageBroker_ extends ClientMessageBroker {
|
||||||
return promise;
|
return promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _handleMessage(message: {[key: string]: any}): void {
|
private _handleMessage(message: MessageData): void {
|
||||||
const data = new MessageData(message);
|
if (message.type === 'result' || message.type === 'error') {
|
||||||
if (data.type === 'result' || data.type === 'error') {
|
const id = message.id;
|
||||||
const id = data.id;
|
|
||||||
if (this._pending.has(id)) {
|
if (this._pending.has(id)) {
|
||||||
if (data.type === 'result') {
|
if (message.type === 'result') {
|
||||||
this._pending.get(id).resolve(data.value);
|
this._pending.get(id).resolve(message.value);
|
||||||
} else {
|
} else {
|
||||||
this._pending.get(id).reject(data.value);
|
this._pending.get(id).reject(message.value);
|
||||||
}
|
}
|
||||||
this._pending.delete(id);
|
this._pending.delete(id);
|
||||||
}
|
}
|
||||||
|
@ -143,31 +141,18 @@ export class ClientMessageBroker_ extends ClientMessageBroker {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class MessageData {
|
interface MessageData {
|
||||||
type: string;
|
type: 'result'|'error';
|
||||||
value: any;
|
value?: any;
|
||||||
id: string;
|
id?: string;
|
||||||
|
|
||||||
constructor(data: {[key: string]: any}) {
|
|
||||||
this.type = data['type'];
|
|
||||||
this.id = this._getValueIfPresent(data, 'id');
|
|
||||||
this.value = this._getValueIfPresent(data, 'value');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the value if present, otherwise returns null
|
|
||||||
* @internal
|
|
||||||
*/
|
|
||||||
_getValueIfPresent(data: {[key: string]: any}, key: string) {
|
|
||||||
return data.hasOwnProperty(key) ? data[key] : null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @experimental WebWorker support in Angular is experimental.
|
* @experimental WebWorker support in Angular is experimental.
|
||||||
*/
|
*/
|
||||||
export class FnArg {
|
export class FnArg {
|
||||||
constructor(public value: any, public type: Type<any>|SerializerTypes = null) {}
|
constructor(
|
||||||
|
public value: any, public type: Type<any>|SerializerTypes = SerializerTypes.PRIMITIVE) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
/**
|
|
||||||
* @license
|
|
||||||
* Copyright Google Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by an MIT-style license that can be
|
|
||||||
* found in the LICENSE file at https://angular.io/license
|
|
||||||
*/
|
|
||||||
|
|
||||||
// This file contains interface versions of browser types that can be serialized to Plain Old
|
|
||||||
// JavaScript Objects
|
|
||||||
export class LocationType {
|
|
||||||
constructor(
|
|
||||||
public href: string, public protocol: string, public host: string, public hostname: string,
|
|
||||||
public port: string, public pathname: string, public search: string, public hash: string,
|
|
||||||
public origin: string) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @experimental WebWorker support in Angular is currently experimental.
|
|
||||||
*/
|
|
||||||
export const enum SerializerTypes {
|
|
||||||
// RendererTypeV2
|
|
||||||
RENDERER_TYPE_V2,
|
|
||||||
}
|
|
|
@ -6,36 +6,52 @@
|
||||||
* found in the LICENSE file at https://angular.io/license
|
* found in the LICENSE file at https://angular.io/license
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {Injectable, RenderComponentType, RendererTypeV2, Type, ViewEncapsulation} from '@angular/core';
|
import {Injectable, RenderComponentType, RendererTypeV2, Type} from '@angular/core';
|
||||||
|
|
||||||
import {stringify} from '../../facade/lang';
|
import {stringify} from '../../facade/lang';
|
||||||
|
|
||||||
import {RenderStore} from './render_store';
|
import {RenderStore} from './render_store';
|
||||||
import {LocationType, SerializerTypes} from './serialized_types';
|
|
||||||
|
|
||||||
|
|
||||||
// PRIMITIVE is any type that does not need to be serialized (string, number, boolean)
|
/**
|
||||||
// We set it to String so that it is considered a Type.
|
* Any type that does not need to be serialized (string, number, boolean)
|
||||||
|
*
|
||||||
|
* @experimental WebWorker support in Angular is currently experimental.
|
||||||
|
* @deprecated in v4. Use SerializerTypes.PRIMITIVE instead
|
||||||
|
*/
|
||||||
|
export const PRIMITIVE: Type<any> = String;
|
||||||
|
|
||||||
|
export class LocationType {
|
||||||
|
constructor(
|
||||||
|
public href: string, public protocol: string, public host: string, public hostname: string,
|
||||||
|
public port: string, public pathname: string, public search: string, public hash: string,
|
||||||
|
public origin: string) {}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @experimental WebWorker support in Angular is currently experimental.
|
* @experimental WebWorker support in Angular is currently experimental.
|
||||||
*/
|
*/
|
||||||
export const PRIMITIVE: Type<any> = String;
|
export const enum SerializerTypes {
|
||||||
|
// RendererTypeV2
|
||||||
|
RENDERER_TYPE_V2,
|
||||||
|
// Primitive types
|
||||||
|
PRIMITIVE,
|
||||||
|
// An object stored in a RenderStore
|
||||||
|
RENDER_STORE_OBJECT,
|
||||||
|
}
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class Serializer {
|
export class Serializer {
|
||||||
constructor(private _renderStore: RenderStore) {}
|
constructor(private _renderStore: RenderStore) {}
|
||||||
|
|
||||||
serialize(obj: any, type: any): Object {
|
serialize(obj: any, type: Type<any>|SerializerTypes = SerializerTypes.PRIMITIVE): Object {
|
||||||
if (obj == null) {
|
if (obj == null || type === PRIMITIVE || type === SerializerTypes.PRIMITIVE) {
|
||||||
return null;
|
return obj;
|
||||||
}
|
}
|
||||||
if (Array.isArray(obj)) {
|
if (Array.isArray(obj)) {
|
||||||
return obj.map(v => this.serialize(v, type));
|
return obj.map(v => this.serialize(v, type));
|
||||||
}
|
}
|
||||||
if (type == PRIMITIVE) {
|
if (type === SerializerTypes.RENDER_STORE_OBJECT) {
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
if (type == RenderStoreObject) {
|
|
||||||
return this._renderStore.serialize(obj);
|
return this._renderStore.serialize(obj);
|
||||||
}
|
}
|
||||||
if (type === RenderComponentType) {
|
if (type === RenderComponentType) {
|
||||||
|
@ -44,26 +60,21 @@ export class Serializer {
|
||||||
if (type === SerializerTypes.RENDERER_TYPE_V2) {
|
if (type === SerializerTypes.RENDERER_TYPE_V2) {
|
||||||
return this._serializeRendererTypeV2(obj);
|
return this._serializeRendererTypeV2(obj);
|
||||||
}
|
}
|
||||||
if (type === ViewEncapsulation) {
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
if (type === LocationType) {
|
if (type === LocationType) {
|
||||||
return this._serializeLocation(obj);
|
return this._serializeLocation(obj);
|
||||||
}
|
}
|
||||||
throw new Error(`No serializer for type ${stringify(type)}`);
|
throw new Error(`No serializer for type ${stringify(type)}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
deserialize(map: any, type: any, data?: any): any {
|
deserialize(map: any, type: Type<any>|SerializerTypes = SerializerTypes.PRIMITIVE, data?: any):
|
||||||
if (map == null) {
|
any {
|
||||||
return null;
|
if (map == null || type === PRIMITIVE || type === SerializerTypes.PRIMITIVE) {
|
||||||
|
return map;
|
||||||
}
|
}
|
||||||
if (Array.isArray(map)) {
|
if (Array.isArray(map)) {
|
||||||
return map.map(val => this.deserialize(val, type, data));
|
return map.map(val => this.deserialize(val, type, data));
|
||||||
}
|
}
|
||||||
if (type === PRIMITIVE) {
|
if (type === SerializerTypes.RENDER_STORE_OBJECT) {
|
||||||
return map;
|
|
||||||
}
|
|
||||||
if (type === RenderStoreObject) {
|
|
||||||
return this._renderStore.deserialize(map);
|
return this._renderStore.deserialize(map);
|
||||||
}
|
}
|
||||||
if (type === RenderComponentType) {
|
if (type === RenderComponentType) {
|
||||||
|
@ -72,9 +83,6 @@ export class Serializer {
|
||||||
if (type === SerializerTypes.RENDERER_TYPE_V2) {
|
if (type === SerializerTypes.RENDERER_TYPE_V2) {
|
||||||
return this._deserializeRendererTypeV2(map);
|
return this._deserializeRendererTypeV2(map);
|
||||||
}
|
}
|
||||||
if (type === ViewEncapsulation) {
|
|
||||||
return map as ViewEncapsulation;
|
|
||||||
}
|
|
||||||
if (type === LocationType) {
|
if (type === LocationType) {
|
||||||
return this._deserializeLocation(map);
|
return this._deserializeLocation(map);
|
||||||
}
|
}
|
||||||
|
@ -106,24 +114,23 @@ export class Serializer {
|
||||||
'id': type.id,
|
'id': type.id,
|
||||||
'templateUrl': type.templateUrl,
|
'templateUrl': type.templateUrl,
|
||||||
'slotCount': type.slotCount,
|
'slotCount': type.slotCount,
|
||||||
'encapsulation': this.serialize(type.encapsulation, ViewEncapsulation),
|
'encapsulation': this.serialize(type.encapsulation),
|
||||||
'styles': this.serialize(type.styles, PRIMITIVE),
|
'styles': this.serialize(type.styles),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private _deserializeRenderComponentType(props: {[key: string]: any}): RenderComponentType {
|
private _deserializeRenderComponentType(props: {[key: string]: any}): RenderComponentType {
|
||||||
return new RenderComponentType(
|
return new RenderComponentType(
|
||||||
props['id'], props['templateUrl'], props['slotCount'],
|
props['id'], props['templateUrl'], props['slotCount'],
|
||||||
this.deserialize(props['encapsulation'], ViewEncapsulation),
|
this.deserialize(props['encapsulation']), this.deserialize(props['styles']), {});
|
||||||
this.deserialize(props['styles'], PRIMITIVE), {});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private _serializeRendererTypeV2(type: RendererTypeV2): {[key: string]: any} {
|
private _serializeRendererTypeV2(type: RendererTypeV2): {[key: string]: any} {
|
||||||
return {
|
return {
|
||||||
'id': type.id,
|
'id': type.id,
|
||||||
'encapsulation': this.serialize(type.encapsulation, ViewEncapsulation),
|
'encapsulation': this.serialize(type.encapsulation),
|
||||||
'styles': this.serialize(type.styles, PRIMITIVE),
|
'styles': this.serialize(type.styles),
|
||||||
'data': this.serialize(type.data, PRIMITIVE),
|
'data': this.serialize(type.data),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,12 +138,10 @@ export class Serializer {
|
||||||
return {
|
return {
|
||||||
id: props['id'],
|
id: props['id'],
|
||||||
encapsulation: props['encapsulation'],
|
encapsulation: props['encapsulation'],
|
||||||
styles: this.deserialize(props['styles'], PRIMITIVE),
|
styles: this.deserialize(props['styles']),
|
||||||
data: this.deserialize(props['data'], PRIMITIVE)
|
data: this.deserialize(props['data'])
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ANIMATION_WORKER_PLAYER_PREFIX = 'AnimationPlayer.';
|
export const ANIMATION_WORKER_PLAYER_PREFIX = 'AnimationPlayer.';
|
||||||
|
|
||||||
export class RenderStoreObject {}
|
|
||||||
|
|
|
@ -9,9 +9,8 @@
|
||||||
import {Injectable, Type} from '@angular/core';
|
import {Injectable, Type} from '@angular/core';
|
||||||
|
|
||||||
import {EventEmitter} from '../../facade/async';
|
import {EventEmitter} from '../../facade/async';
|
||||||
import {isPresent} from '../../facade/lang';
|
|
||||||
import {MessageBus} from '../shared/message_bus';
|
import {MessageBus} from '../shared/message_bus';
|
||||||
import {Serializer} from '../shared/serializer';
|
import {Serializer, SerializerTypes} from '../shared/serializer';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @experimental WebWorker support in Angular is currently experimental.
|
* @experimental WebWorker support in Angular is currently experimental.
|
||||||
|
@ -49,12 +48,13 @@ export class ServiceMessageBrokerFactory_ extends ServiceMessageBrokerFactory {
|
||||||
*/
|
*/
|
||||||
export abstract class ServiceMessageBroker {
|
export abstract class ServiceMessageBroker {
|
||||||
abstract registerMethod(
|
abstract registerMethod(
|
||||||
methodName: string, signature: Type<any>[], method: Function, returnType?: Type<any>): void;
|
methodName: string, signature: Array<Type<any>|SerializerTypes>, method: Function,
|
||||||
|
returnType?: Type<any>|SerializerTypes): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ServiceMessageBroker_ extends ServiceMessageBroker {
|
export class ServiceMessageBroker_ extends ServiceMessageBroker {
|
||||||
private _sink: EventEmitter<any>;
|
private _sink: EventEmitter<any>;
|
||||||
private _methods: Map<string, Function> = new Map<string, Function>();
|
private _methods = new Map<string, Function>();
|
||||||
|
|
||||||
constructor(messageBus: MessageBus, private _serializer: Serializer, public channel: string) {
|
constructor(messageBus: MessageBus, private _serializer: Serializer, public channel: string) {
|
||||||
super();
|
super();
|
||||||
|
@ -64,11 +64,11 @@ export class ServiceMessageBroker_ extends ServiceMessageBroker {
|
||||||
}
|
}
|
||||||
|
|
||||||
registerMethod(
|
registerMethod(
|
||||||
methodName: string, signature: Type<any>[], method: (..._: any[]) => Promise<any>| void,
|
methodName: string, signature: Array<Type<any>|SerializerTypes>,
|
||||||
returnType?: Type<any>): void {
|
method: (..._: any[]) => Promise<any>| void, returnType?: Type<any>|SerializerTypes): void {
|
||||||
this._methods.set(methodName, (message: ReceivedMessage) => {
|
this._methods.set(methodName, (message: ReceivedMessage) => {
|
||||||
const serializedArgs = message.args;
|
const serializedArgs = message.args;
|
||||||
const numArgs = signature === null ? 0 : signature.length;
|
const numArgs = signature ? signature.length : 0;
|
||||||
const deserializedArgs = new Array(numArgs);
|
const deserializedArgs = new Array(numArgs);
|
||||||
for (let i = 0; i < numArgs; i++) {
|
for (let i = 0; i < numArgs; i++) {
|
||||||
const serializedArg = serializedArgs[i];
|
const serializedArg = serializedArgs[i];
|
||||||
|
@ -82,14 +82,14 @@ export class ServiceMessageBroker_ extends ServiceMessageBroker {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private _handleMessage(map: {[key: string]: any}): void {
|
private _handleMessage(message: ReceivedMessage): void {
|
||||||
const message = new ReceivedMessage(map);
|
|
||||||
if (this._methods.has(message.method)) {
|
if (this._methods.has(message.method)) {
|
||||||
this._methods.get(message.method)(message);
|
this._methods.get(message.method)(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private _wrapWebWorkerPromise(id: string, promise: Promise<any>, type: Type<any>): void {
|
private _wrapWebWorkerPromise(id: string, promise: Promise<any>, type: Type<any>|SerializerTypes):
|
||||||
|
void {
|
||||||
promise.then((result: any) => {
|
promise.then((result: any) => {
|
||||||
this._sink.emit({
|
this._sink.emit({
|
||||||
'type': 'result',
|
'type': 'result',
|
||||||
|
@ -103,16 +103,9 @@ export class ServiceMessageBroker_ extends ServiceMessageBroker {
|
||||||
/**
|
/**
|
||||||
* @experimental WebWorker support in Angular is currently experimental.
|
* @experimental WebWorker support in Angular is currently experimental.
|
||||||
*/
|
*/
|
||||||
export class ReceivedMessage {
|
export interface ReceivedMessage {
|
||||||
method: string;
|
method: string;
|
||||||
args: any[];
|
args: any[];
|
||||||
id: string;
|
id: string;
|
||||||
type: string;
|
type: string;
|
||||||
|
|
||||||
constructor(data: {[key: string]: any}) {
|
|
||||||
this.method = data['method'];
|
|
||||||
this.args = data['args'];
|
|
||||||
this.id = data['id'];
|
|
||||||
this.type = data['type'];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
* found in the LICENSE file at https://angular.io/license
|
* found in the LICENSE file at https://angular.io/license
|
||||||
*/
|
*/
|
||||||
import {EventEmitter} from '../../facade/async';
|
import {EventEmitter} from '../../facade/async';
|
||||||
import {RenderStoreObject, Serializer} from '../shared/serializer';
|
import {Serializer, SerializerTypes} from '../shared/serializer';
|
||||||
|
|
||||||
import {serializeEventWithTarget, serializeGenericEvent, serializeKeyboardEvent, serializeMouseEvent, serializeTransitionEvent} from './event_serializer';
|
import {serializeEventWithTarget, serializeGenericEvent, serializeKeyboardEvent, serializeMouseEvent, serializeTransitionEvent} from './event_serializer';
|
||||||
|
|
||||||
|
@ -15,8 +15,8 @@ export class EventDispatcher {
|
||||||
|
|
||||||
dispatchAnimationEvent(player: any, phaseName: string, element: any): boolean {
|
dispatchAnimationEvent(player: any, phaseName: string, element: any): boolean {
|
||||||
this._sink.emit({
|
this._sink.emit({
|
||||||
'element': this._serializer.serialize(element, RenderStoreObject),
|
'element': this._serializer.serialize(element, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
'animationPlayer': this._serializer.serialize(player, RenderStoreObject),
|
'animationPlayer': this._serializer.serialize(player, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
'phaseName': phaseName,
|
'phaseName': phaseName,
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
|
@ -107,7 +107,7 @@ export class EventDispatcher {
|
||||||
}
|
}
|
||||||
|
|
||||||
this._sink.emit({
|
this._sink.emit({
|
||||||
'element': this._serializer.serialize(element, RenderStoreObject),
|
'element': this._serializer.serialize(element, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
'eventName': eventName,
|
'eventName': eventName,
|
||||||
'eventTarget': eventTarget,
|
'eventTarget': eventTarget,
|
||||||
'event': serializedEvent,
|
'event': serializedEvent,
|
||||||
|
|
|
@ -13,8 +13,7 @@ import {EventEmitter} from '../../facade/async';
|
||||||
import {BrowserPlatformLocation} from '../../private_import_platform-browser';
|
import {BrowserPlatformLocation} from '../../private_import_platform-browser';
|
||||||
import {MessageBus} from '../shared/message_bus';
|
import {MessageBus} from '../shared/message_bus';
|
||||||
import {ROUTER_CHANNEL} from '../shared/messaging_api';
|
import {ROUTER_CHANNEL} from '../shared/messaging_api';
|
||||||
import {LocationType} from '../shared/serialized_types';
|
import {LocationType, Serializer, SerializerTypes} from '../shared/serializer';
|
||||||
import {PRIMITIVE, Serializer} from '../shared/serializer';
|
|
||||||
import {ServiceMessageBroker, ServiceMessageBrokerFactory} from '../shared/service_message_broker';
|
import {ServiceMessageBroker, ServiceMessageBrokerFactory} from '../shared/service_message_broker';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
@ -34,13 +33,14 @@ export class MessageBasedPlatformLocation {
|
||||||
}
|
}
|
||||||
|
|
||||||
start(): void {
|
start(): void {
|
||||||
|
const P = SerializerTypes.PRIMITIVE;
|
||||||
|
|
||||||
this._broker.registerMethod('getLocation', null, this._getLocation.bind(this), LocationType);
|
this._broker.registerMethod('getLocation', null, this._getLocation.bind(this), LocationType);
|
||||||
this._broker.registerMethod('setPathname', [PRIMITIVE], this._setPathname.bind(this));
|
this._broker.registerMethod('setPathname', [P], this._setPathname.bind(this));
|
||||||
this._broker.registerMethod(
|
this._broker.registerMethod(
|
||||||
'pushState', [PRIMITIVE, PRIMITIVE, PRIMITIVE],
|
'pushState', [P, P, P], this._platformLocation.pushState.bind(this._platformLocation));
|
||||||
this._platformLocation.pushState.bind(this._platformLocation));
|
|
||||||
this._broker.registerMethod(
|
this._broker.registerMethod(
|
||||||
'replaceState', [PRIMITIVE, PRIMITIVE, PRIMITIVE],
|
'replaceState', [P, P, P],
|
||||||
this._platformLocation.replaceState.bind(this._platformLocation));
|
this._platformLocation.replaceState.bind(this._platformLocation));
|
||||||
this._broker.registerMethod(
|
this._broker.registerMethod(
|
||||||
'forward', null, this._platformLocation.forward.bind(this._platformLocation));
|
'forward', null, this._platformLocation.forward.bind(this._platformLocation));
|
||||||
|
@ -52,11 +52,11 @@ export class MessageBasedPlatformLocation {
|
||||||
return Promise.resolve(this._platformLocation.location);
|
return Promise.resolve(this._platformLocation.location);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private _sendUrlChangeEvent(e: Event): void {
|
private _sendUrlChangeEvent(e: Event): void {
|
||||||
const loc = this._serializer.serialize(this._platformLocation.location, LocationType);
|
this._channelSink.emit({
|
||||||
const serializedEvent = {'type': e.type};
|
'event': {'type': e.type},
|
||||||
this._channelSink.emit({'event': serializedEvent, 'location': loc});
|
'location': this._serializer.serialize(this._platformLocation.location, LocationType),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private _setPathname(pathname: string): void { this._platformLocation.pathname = pathname; }
|
private _setPathname(pathname: string): void { this._platformLocation.pathname = pathname; }
|
||||||
|
|
|
@ -11,8 +11,7 @@ import {AnimationPlayer, Injectable, RenderComponentType, Renderer, RendererFact
|
||||||
import {MessageBus} from '../shared/message_bus';
|
import {MessageBus} from '../shared/message_bus';
|
||||||
import {EVENT_CHANNEL, EVENT_V2_CHANNEL, RENDERER_CHANNEL, RENDERER_V2_CHANNEL} from '../shared/messaging_api';
|
import {EVENT_CHANNEL, EVENT_V2_CHANNEL, RENDERER_CHANNEL, RENDERER_V2_CHANNEL} from '../shared/messaging_api';
|
||||||
import {RenderStore} from '../shared/render_store';
|
import {RenderStore} from '../shared/render_store';
|
||||||
import {SerializerTypes} from '../shared/serialized_types';
|
import {ANIMATION_WORKER_PLAYER_PREFIX, Serializer, SerializerTypes} from '../shared/serializer';
|
||||||
import {ANIMATION_WORKER_PLAYER_PREFIX, PRIMITIVE, RenderStoreObject, Serializer} from '../shared/serializer';
|
|
||||||
import {ServiceMessageBroker, ServiceMessageBrokerFactory} from '../shared/service_message_broker';
|
import {ServiceMessageBroker, ServiceMessageBrokerFactory} from '../shared/service_message_broker';
|
||||||
import {EventDispatcher} from '../ui/event_dispatcher';
|
import {EventDispatcher} from '../ui/event_dispatcher';
|
||||||
|
|
||||||
|
@ -31,7 +30,11 @@ export class MessageBasedRenderer {
|
||||||
this._bus.initChannel(EVENT_CHANNEL);
|
this._bus.initChannel(EVENT_CHANNEL);
|
||||||
this._eventDispatcher = new EventDispatcher(this._bus.to(EVENT_CHANNEL), this._serializer);
|
this._eventDispatcher = new EventDispatcher(this._bus.to(EVENT_CHANNEL), this._serializer);
|
||||||
|
|
||||||
const [RCT, RSO, P] = [RenderComponentType, RenderStoreObject, PRIMITIVE];
|
const [RCT, RSO, P] = [
|
||||||
|
RenderComponentType,
|
||||||
|
SerializerTypes.RENDER_STORE_OBJECT,
|
||||||
|
SerializerTypes.PRIMITIVE,
|
||||||
|
];
|
||||||
|
|
||||||
const methods: any[][] = [
|
const methods: any[][] = [
|
||||||
['renderComponent', this._renderComponent, RCT, P],
|
['renderComponent', this._renderComponent, RCT, P],
|
||||||
|
@ -65,52 +68,51 @@ export class MessageBasedRenderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
private _bindAnimationPlayerMethods(broker: ServiceMessageBroker) {
|
private _bindAnimationPlayerMethods(broker: ServiceMessageBroker) {
|
||||||
|
const [P, RSO] = [SerializerTypes.PRIMITIVE, SerializerTypes.RENDER_STORE_OBJECT];
|
||||||
|
|
||||||
broker.registerMethod(
|
broker.registerMethod(
|
||||||
ANIMATION_WORKER_PLAYER_PREFIX + 'play', [RenderStoreObject, RenderStoreObject],
|
ANIMATION_WORKER_PLAYER_PREFIX + 'play', [RSO, RSO],
|
||||||
(player: AnimationPlayer, element: any) => player.play());
|
(player: AnimationPlayer, element: any) => player.play());
|
||||||
|
|
||||||
broker.registerMethod(
|
broker.registerMethod(
|
||||||
ANIMATION_WORKER_PLAYER_PREFIX + 'pause', [RenderStoreObject, RenderStoreObject],
|
ANIMATION_WORKER_PLAYER_PREFIX + 'pause', [RSO, RSO],
|
||||||
(player: AnimationPlayer, element: any) => player.pause());
|
(player: AnimationPlayer, element: any) => player.pause());
|
||||||
|
|
||||||
broker.registerMethod(
|
broker.registerMethod(
|
||||||
ANIMATION_WORKER_PLAYER_PREFIX + 'init', [RenderStoreObject, RenderStoreObject],
|
ANIMATION_WORKER_PLAYER_PREFIX + 'init', [RSO, RSO],
|
||||||
(player: AnimationPlayer, element: any) => player.init());
|
(player: AnimationPlayer, element: any) => player.init());
|
||||||
|
|
||||||
broker.registerMethod(
|
broker.registerMethod(
|
||||||
ANIMATION_WORKER_PLAYER_PREFIX + 'restart', [RenderStoreObject, RenderStoreObject],
|
ANIMATION_WORKER_PLAYER_PREFIX + 'restart', [RSO, RSO],
|
||||||
(player: AnimationPlayer, element: any) => player.restart());
|
(player: AnimationPlayer, element: any) => player.restart());
|
||||||
|
|
||||||
broker.registerMethod(
|
broker.registerMethod(
|
||||||
ANIMATION_WORKER_PLAYER_PREFIX + 'destroy', [RenderStoreObject, RenderStoreObject],
|
ANIMATION_WORKER_PLAYER_PREFIX + 'destroy', [RSO, RSO],
|
||||||
(player: AnimationPlayer, element: any) => {
|
(player: AnimationPlayer, element: any) => {
|
||||||
player.destroy();
|
player.destroy();
|
||||||
this._renderStore.remove(player);
|
this._renderStore.remove(player);
|
||||||
});
|
});
|
||||||
|
|
||||||
broker.registerMethod(
|
broker.registerMethod(
|
||||||
ANIMATION_WORKER_PLAYER_PREFIX + 'finish', [RenderStoreObject, RenderStoreObject],
|
ANIMATION_WORKER_PLAYER_PREFIX + 'finish', [RSO, RSO],
|
||||||
(player: AnimationPlayer, element: any) => player.finish());
|
(player: AnimationPlayer, element: any) => player.finish());
|
||||||
|
|
||||||
broker.registerMethod(
|
broker.registerMethod(
|
||||||
ANIMATION_WORKER_PLAYER_PREFIX + 'getPosition', [RenderStoreObject, RenderStoreObject],
|
ANIMATION_WORKER_PLAYER_PREFIX + 'getPosition', [RSO, RSO],
|
||||||
(player: AnimationPlayer, element: any) => player.getPosition());
|
(player: AnimationPlayer, element: any) => player.getPosition());
|
||||||
|
|
||||||
broker.registerMethod(
|
broker.registerMethod(
|
||||||
ANIMATION_WORKER_PLAYER_PREFIX + 'onStart',
|
ANIMATION_WORKER_PLAYER_PREFIX + 'onStart', [RSO, RSO, P],
|
||||||
[RenderStoreObject, RenderStoreObject, PRIMITIVE],
|
|
||||||
(player: AnimationPlayer, element: any) =>
|
(player: AnimationPlayer, element: any) =>
|
||||||
this._listenOnAnimationPlayer(player, element, 'onStart'));
|
this._listenOnAnimationPlayer(player, element, 'onStart'));
|
||||||
|
|
||||||
broker.registerMethod(
|
broker.registerMethod(
|
||||||
ANIMATION_WORKER_PLAYER_PREFIX + 'onDone',
|
ANIMATION_WORKER_PLAYER_PREFIX + 'onDone', [RSO, RSO, P],
|
||||||
[RenderStoreObject, RenderStoreObject, PRIMITIVE],
|
|
||||||
(player: AnimationPlayer, element: any) =>
|
(player: AnimationPlayer, element: any) =>
|
||||||
this._listenOnAnimationPlayer(player, element, 'onDone'));
|
this._listenOnAnimationPlayer(player, element, 'onDone'));
|
||||||
|
|
||||||
broker.registerMethod(
|
broker.registerMethod(
|
||||||
ANIMATION_WORKER_PLAYER_PREFIX + 'setPosition',
|
ANIMATION_WORKER_PLAYER_PREFIX + 'setPosition', [RSO, RSO, P],
|
||||||
[RenderStoreObject, RenderStoreObject, PRIMITIVE],
|
|
||||||
(player: AnimationPlayer, element: any, position: number) => player.setPosition(position));
|
(player: AnimationPlayer, element: any, position: number) => player.setPosition(position));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,7 +256,11 @@ export class MessageBasedRendererV2 {
|
||||||
this._bus.initChannel(EVENT_V2_CHANNEL);
|
this._bus.initChannel(EVENT_V2_CHANNEL);
|
||||||
this._eventDispatcher = new EventDispatcher(this._bus.to(EVENT_V2_CHANNEL), this._serializer);
|
this._eventDispatcher = new EventDispatcher(this._bus.to(EVENT_V2_CHANNEL), this._serializer);
|
||||||
|
|
||||||
const [RSO, P, CRT] = [RenderStoreObject, PRIMITIVE, SerializerTypes.RENDERER_TYPE_V2];
|
const [RSO, P, CRT] = [
|
||||||
|
SerializerTypes.RENDER_STORE_OBJECT,
|
||||||
|
SerializerTypes.PRIMITIVE,
|
||||||
|
SerializerTypes.RENDERER_TYPE_V2,
|
||||||
|
];
|
||||||
|
|
||||||
const methods: any[][] = [
|
const methods: any[][] = [
|
||||||
['createRenderer', this.createRenderer, RSO, CRT, P],
|
['createRenderer', this.createRenderer, RSO, CRT, P],
|
||||||
|
|
|
@ -13,8 +13,7 @@ import {EventEmitter} from '../../facade/async';
|
||||||
import {ClientMessageBroker, ClientMessageBrokerFactory, FnArg, UiArguments} from '../shared/client_message_broker';
|
import {ClientMessageBroker, ClientMessageBrokerFactory, FnArg, UiArguments} from '../shared/client_message_broker';
|
||||||
import {MessageBus} from '../shared/message_bus';
|
import {MessageBus} from '../shared/message_bus';
|
||||||
import {ROUTER_CHANNEL} from '../shared/messaging_api';
|
import {ROUTER_CHANNEL} from '../shared/messaging_api';
|
||||||
import {LocationType} from '../shared/serialized_types';
|
import {LocationType, Serializer, SerializerTypes} from '../shared/serializer';
|
||||||
import {PRIMITIVE, Serializer} from '../shared/serializer';
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class WebWorkerPlatformLocation extends PlatformLocation {
|
export class WebWorkerPlatformLocation extends PlatformLocation {
|
||||||
|
@ -28,8 +27,8 @@ export class WebWorkerPlatformLocation extends PlatformLocation {
|
||||||
brokerFactory: ClientMessageBrokerFactory, bus: MessageBus, private _serializer: Serializer) {
|
brokerFactory: ClientMessageBrokerFactory, bus: MessageBus, private _serializer: Serializer) {
|
||||||
super();
|
super();
|
||||||
this._broker = brokerFactory.createMessageBroker(ROUTER_CHANNEL);
|
this._broker = brokerFactory.createMessageBroker(ROUTER_CHANNEL);
|
||||||
|
|
||||||
this._channelSource = bus.from(ROUTER_CHANNEL);
|
this._channelSource = bus.from(ROUTER_CHANNEL);
|
||||||
|
|
||||||
this._channelSource.subscribe({
|
this._channelSource.subscribe({
|
||||||
next: (msg: {[key: string]: any}) => {
|
next: (msg: {[key: string]: any}) => {
|
||||||
let listeners: Array<Function> = null;
|
let listeners: Array<Function> = null;
|
||||||
|
@ -86,21 +85,27 @@ export class WebWorkerPlatformLocation extends PlatformLocation {
|
||||||
|
|
||||||
this._location.pathname = newPath;
|
this._location.pathname = newPath;
|
||||||
|
|
||||||
const fnArgs = [new FnArg(newPath, PRIMITIVE)];
|
const fnArgs = [new FnArg(newPath, SerializerTypes.PRIMITIVE)];
|
||||||
const args = new UiArguments('setPathname', fnArgs);
|
const args = new UiArguments('setPathname', fnArgs);
|
||||||
this._broker.runOnService(args, null);
|
this._broker.runOnService(args, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
pushState(state: any, title: string, url: string): void {
|
pushState(state: any, title: string, url: string): void {
|
||||||
const fnArgs =
|
const fnArgs = [
|
||||||
[new FnArg(state, PRIMITIVE), new FnArg(title, PRIMITIVE), new FnArg(url, PRIMITIVE)];
|
new FnArg(state, SerializerTypes.PRIMITIVE),
|
||||||
|
new FnArg(title, SerializerTypes.PRIMITIVE),
|
||||||
|
new FnArg(url, SerializerTypes.PRIMITIVE),
|
||||||
|
];
|
||||||
const args = new UiArguments('pushState', fnArgs);
|
const args = new UiArguments('pushState', fnArgs);
|
||||||
this._broker.runOnService(args, null);
|
this._broker.runOnService(args, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
replaceState(state: any, title: string, url: string): void {
|
replaceState(state: any, title: string, url: string): void {
|
||||||
const fnArgs =
|
const fnArgs = [
|
||||||
[new FnArg(state, PRIMITIVE), new FnArg(title, PRIMITIVE), new FnArg(url, PRIMITIVE)];
|
new FnArg(state, SerializerTypes.PRIMITIVE),
|
||||||
|
new FnArg(title, SerializerTypes.PRIMITIVE),
|
||||||
|
new FnArg(url, SerializerTypes.PRIMITIVE),
|
||||||
|
];
|
||||||
const args = new UiArguments('replaceState', fnArgs);
|
const args = new UiArguments('replaceState', fnArgs);
|
||||||
this._broker.runOnService(args, null);
|
this._broker.runOnService(args, null);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,19 +8,50 @@
|
||||||
|
|
||||||
import {Injectable, RenderComponentType, Renderer, RendererFactoryV2, RendererTypeV2, RendererV2, RootRenderer, ViewEncapsulation} from '@angular/core';
|
import {Injectable, RenderComponentType, Renderer, RendererFactoryV2, RendererTypeV2, RendererV2, RootRenderer, ViewEncapsulation} from '@angular/core';
|
||||||
|
|
||||||
import {ListWrapper} from '../../facade/collection';
|
|
||||||
import {AnimationKeyframe, AnimationPlayer, AnimationStyles, RenderDebugInfo} from '../../private_import_core';
|
import {AnimationKeyframe, AnimationPlayer, AnimationStyles, RenderDebugInfo} from '../../private_import_core';
|
||||||
import {ClientMessageBroker, ClientMessageBrokerFactory, FnArg, UiArguments} from '../shared/client_message_broker';
|
import {ClientMessageBroker, ClientMessageBrokerFactory, FnArg, UiArguments} from '../shared/client_message_broker';
|
||||||
import {MessageBus} from '../shared/message_bus';
|
import {MessageBus} from '../shared/message_bus';
|
||||||
import {EVENT_CHANNEL, EVENT_V2_CHANNEL, RENDERER_CHANNEL, RENDERER_V2_CHANNEL} from '../shared/messaging_api';
|
import {EVENT_CHANNEL, EVENT_V2_CHANNEL, RENDERER_CHANNEL, RENDERER_V2_CHANNEL} from '../shared/messaging_api';
|
||||||
import {RenderStore} from '../shared/render_store';
|
import {RenderStore} from '../shared/render_store';
|
||||||
import {SerializerTypes} from '../shared/serialized_types';
|
import {ANIMATION_WORKER_PLAYER_PREFIX, Serializer, SerializerTypes} from '../shared/serializer';
|
||||||
import {ANIMATION_WORKER_PLAYER_PREFIX, RenderStoreObject, Serializer} from '../shared/serializer';
|
|
||||||
|
export class NamedEventEmitter {
|
||||||
|
private _listeners: Map<string, Function[]>;
|
||||||
|
|
||||||
|
listen(eventName: string, callback: Function) { this._getListeners(eventName).push(callback); }
|
||||||
|
|
||||||
|
unlisten(eventName: string, listener: Function) {
|
||||||
|
const listeners = this._getListeners(eventName);
|
||||||
|
const index = listeners.indexOf(listener);
|
||||||
|
if (index > -1) {
|
||||||
|
listeners.splice(index, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatchEvent(eventName: string, event: any) {
|
||||||
|
const listeners = this._getListeners(eventName);
|
||||||
|
for (let i = 0; i < listeners.length; i++) {
|
||||||
|
listeners[i](event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _getListeners(eventName: string): Function[] {
|
||||||
|
if (!this._listeners) {
|
||||||
|
this._listeners = new Map<string, Function[]>();
|
||||||
|
}
|
||||||
|
let listeners = this._listeners.get(eventName);
|
||||||
|
if (!listeners) {
|
||||||
|
listeners = [];
|
||||||
|
this._listeners.set(eventName, listeners);
|
||||||
|
}
|
||||||
|
return listeners;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const globalEvents = new NamedEventEmitter();
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class WebWorkerRootRenderer implements RootRenderer {
|
export class WebWorkerRootRenderer implements RootRenderer {
|
||||||
globalEvents = new NamedEventEmitter();
|
|
||||||
|
|
||||||
private _messageBroker: ClientMessageBroker;
|
private _messageBroker: ClientMessageBroker;
|
||||||
private _componentRenderers = new Map<string, WebWorkerRenderer>();
|
private _componentRenderers = new Map<string, WebWorkerRenderer>();
|
||||||
|
|
||||||
|
@ -34,20 +65,21 @@ export class WebWorkerRootRenderer implements RootRenderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
private _dispatchEvent(message: {[key: string]: any}): void {
|
private _dispatchEvent(message: {[key: string]: any}): void {
|
||||||
const element =
|
const element: WebWorkerRenderNode =
|
||||||
<WebWorkerRenderNode>this._serializer.deserialize(message['element'], RenderStoreObject);
|
this._serializer.deserialize(message['element'], SerializerTypes.RENDER_STORE_OBJECT);
|
||||||
const playerData = message['animationPlayer'];
|
const playerData = message['animationPlayer'];
|
||||||
|
|
||||||
if (playerData) {
|
if (playerData) {
|
||||||
const phaseName = message['phaseName'];
|
const phaseName = message['phaseName'];
|
||||||
const player = <AnimationPlayer>this._serializer.deserialize(playerData, RenderStoreObject);
|
const player: AnimationPlayer =
|
||||||
|
this._serializer.deserialize(playerData, SerializerTypes.RENDER_STORE_OBJECT);
|
||||||
element.animationPlayerEvents.dispatchEvent(player, phaseName);
|
element.animationPlayerEvents.dispatchEvent(player, phaseName);
|
||||||
} else {
|
} else {
|
||||||
const eventName = message['eventName'];
|
const eventName = message['eventName'];
|
||||||
const target = message['eventTarget'];
|
const target = message['eventTarget'];
|
||||||
const event = message['event'];
|
const event = message['event'];
|
||||||
if (target) {
|
if (target) {
|
||||||
this.globalEvents.dispatchEvent(eventNameWithTarget(target, eventName), event);
|
globalEvents.dispatchEvent(eventNameWithTarget(target, eventName), event);
|
||||||
} else {
|
} else {
|
||||||
element.events.dispatchEvent(eventName, event);
|
element.events.dispatchEvent(eventName, event);
|
||||||
}
|
}
|
||||||
|
@ -63,7 +95,7 @@ export class WebWorkerRootRenderer implements RootRenderer {
|
||||||
this.renderStore.store(result, id);
|
this.renderStore.store(result, id);
|
||||||
this.runOnService('renderComponent', [
|
this.runOnService('renderComponent', [
|
||||||
new FnArg(componentType, RenderComponentType),
|
new FnArg(componentType, RenderComponentType),
|
||||||
new FnArg(result, RenderStoreObject),
|
new FnArg(result, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@ -90,27 +122,30 @@ export class WebWorkerRootRenderer implements RootRenderer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class WebWorkerRenderer implements Renderer, RenderStoreObject {
|
export class WebWorkerRenderer implements Renderer {
|
||||||
constructor(
|
constructor(
|
||||||
private _rootRenderer: WebWorkerRootRenderer, private _componentType: RenderComponentType) {}
|
private _rootRenderer: WebWorkerRootRenderer, private _componentType: RenderComponentType) {}
|
||||||
|
|
||||||
private _runOnService(fnName: string, fnArgs: FnArg[]) {
|
private _runOnService(fnName: string, fnArgs: FnArg[]) {
|
||||||
const fnArgsWithRenderer = [new FnArg(this, RenderStoreObject)].concat(fnArgs);
|
const fnArgsWithRenderer = [new FnArg(this, SerializerTypes.RENDER_STORE_OBJECT), ...fnArgs];
|
||||||
this._rootRenderer.runOnService(fnName, fnArgsWithRenderer);
|
this._rootRenderer.runOnService(fnName, fnArgsWithRenderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
selectRootElement(selectorOrNode: string, debugInfo?: RenderDebugInfo): any {
|
selectRootElement(selectorOrNode: string, debugInfo?: RenderDebugInfo): any {
|
||||||
const node = this._rootRenderer.allocateNode();
|
const node = this._rootRenderer.allocateNode();
|
||||||
this._runOnService(
|
this._runOnService('selectRootElement', [
|
||||||
'selectRootElement', [new FnArg(selectorOrNode, null), new FnArg(node, RenderStoreObject)]);
|
new FnArg(selectorOrNode),
|
||||||
|
new FnArg(node, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
|
]);
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
createElement(parentElement: any, name: string, debugInfo?: RenderDebugInfo): any {
|
createElement(parentElement: any, name: string, debugInfo?: RenderDebugInfo): any {
|
||||||
const node = this._rootRenderer.allocateNode();
|
const node = this._rootRenderer.allocateNode();
|
||||||
this._runOnService('createElement', [
|
this._runOnService('createElement', [
|
||||||
new FnArg(parentElement, RenderStoreObject), new FnArg(name, null),
|
new FnArg(parentElement, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(node, RenderStoreObject)
|
new FnArg(name),
|
||||||
|
new FnArg(node, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
]);
|
]);
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
@ -119,121 +154,139 @@ export class WebWorkerRenderer implements Renderer, RenderStoreObject {
|
||||||
const viewRoot = this._componentType.encapsulation === ViewEncapsulation.Native ?
|
const viewRoot = this._componentType.encapsulation === ViewEncapsulation.Native ?
|
||||||
this._rootRenderer.allocateNode() :
|
this._rootRenderer.allocateNode() :
|
||||||
hostElement;
|
hostElement;
|
||||||
this._runOnService(
|
this._runOnService('createViewRoot', [
|
||||||
'createViewRoot',
|
new FnArg(hostElement, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
[new FnArg(hostElement, RenderStoreObject), new FnArg(viewRoot, RenderStoreObject)]);
|
new FnArg(viewRoot, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
|
]);
|
||||||
return viewRoot;
|
return viewRoot;
|
||||||
}
|
}
|
||||||
|
|
||||||
createTemplateAnchor(parentElement: any, debugInfo?: RenderDebugInfo): any {
|
createTemplateAnchor(parentElement: any, debugInfo?: RenderDebugInfo): any {
|
||||||
const node = this._rootRenderer.allocateNode();
|
const node = this._rootRenderer.allocateNode();
|
||||||
this._runOnService(
|
this._runOnService('createTemplateAnchor', [
|
||||||
'createTemplateAnchor',
|
new FnArg(parentElement, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
[new FnArg(parentElement, RenderStoreObject), new FnArg(node, RenderStoreObject)]);
|
new FnArg(node, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
|
]);
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
createText(parentElement: any, value: string, debugInfo?: RenderDebugInfo): any {
|
createText(parentElement: any, value: string, debugInfo?: RenderDebugInfo): any {
|
||||||
const node = this._rootRenderer.allocateNode();
|
const node = this._rootRenderer.allocateNode();
|
||||||
this._runOnService('createText', [
|
this._runOnService('createText', [
|
||||||
new FnArg(parentElement, RenderStoreObject), new FnArg(value, null),
|
new FnArg(parentElement, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(node, RenderStoreObject)
|
new FnArg(value),
|
||||||
|
new FnArg(node, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
]);
|
]);
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
projectNodes(parentElement: any, nodes: any[]) {
|
projectNodes(parentElement: any, nodes: any[]) {
|
||||||
this._runOnService(
|
this._runOnService('projectNodes', [
|
||||||
'projectNodes',
|
new FnArg(parentElement, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
[new FnArg(parentElement, RenderStoreObject), new FnArg(nodes, RenderStoreObject)]);
|
new FnArg(nodes, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
attachViewAfter(node: any, viewRootNodes: any[]) {
|
attachViewAfter(node: any, viewRootNodes: any[]) {
|
||||||
this._runOnService(
|
this._runOnService('attachViewAfter', [
|
||||||
'attachViewAfter',
|
new FnArg(node, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
[new FnArg(node, RenderStoreObject), new FnArg(viewRootNodes, RenderStoreObject)]);
|
new FnArg(viewRootNodes, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
detachView(viewRootNodes: any[]) {
|
detachView(viewRootNodes: any[]) {
|
||||||
this._runOnService('detachView', [new FnArg(viewRootNodes, RenderStoreObject)]);
|
this._runOnService(
|
||||||
|
'detachView', [new FnArg(viewRootNodes, SerializerTypes.RENDER_STORE_OBJECT)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
destroyView(hostElement: any, viewAllNodes: any[]) {
|
destroyView(hostElement: any, viewAllNodes: any[]) {
|
||||||
this._runOnService(
|
this._runOnService('destroyView', [
|
||||||
'destroyView',
|
new FnArg(hostElement, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
[new FnArg(hostElement, RenderStoreObject), new FnArg(viewAllNodes, RenderStoreObject)]);
|
new FnArg(viewAllNodes, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
|
]);
|
||||||
this._rootRenderer.destroyNodes(viewAllNodes);
|
this._rootRenderer.destroyNodes(viewAllNodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
setElementProperty(renderElement: any, propertyName: string, propertyValue: any) {
|
setElementProperty(renderElement: any, propertyName: string, propertyValue: any) {
|
||||||
this._runOnService('setElementProperty', [
|
this._runOnService('setElementProperty', [
|
||||||
new FnArg(renderElement, RenderStoreObject), new FnArg(propertyName, null),
|
new FnArg(renderElement, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(propertyValue, null)
|
new FnArg(propertyName),
|
||||||
|
new FnArg(propertyValue),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
setElementAttribute(renderElement: any, attributeName: string, attributeValue: string) {
|
setElementAttribute(renderElement: any, attributeName: string, attributeValue: string) {
|
||||||
this._runOnService('setElementAttribute', [
|
this._runOnService('setElementAttribute', [
|
||||||
new FnArg(renderElement, RenderStoreObject), new FnArg(attributeName, null),
|
new FnArg(renderElement, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(attributeValue, null)
|
new FnArg(attributeName),
|
||||||
|
new FnArg(attributeValue),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
setBindingDebugInfo(renderElement: any, propertyName: string, propertyValue: string) {
|
setBindingDebugInfo(renderElement: any, propertyName: string, propertyValue: string) {
|
||||||
this._runOnService('setBindingDebugInfo', [
|
this._runOnService('setBindingDebugInfo', [
|
||||||
new FnArg(renderElement, RenderStoreObject), new FnArg(propertyName, null),
|
new FnArg(renderElement, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(propertyValue, null)
|
new FnArg(propertyName),
|
||||||
|
new FnArg(propertyValue),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
setElementClass(renderElement: any, className: string, isAdd: boolean) {
|
setElementClass(renderElement: any, className: string, isAdd: boolean) {
|
||||||
this._runOnService('setElementClass', [
|
this._runOnService('setElementClass', [
|
||||||
new FnArg(renderElement, RenderStoreObject), new FnArg(className, null),
|
new FnArg(renderElement, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(isAdd, null)
|
new FnArg(className),
|
||||||
|
new FnArg(isAdd),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
setElementStyle(renderElement: any, styleName: string, styleValue: string) {
|
setElementStyle(renderElement: any, styleName: string, styleValue: string) {
|
||||||
this._runOnService('setElementStyle', [
|
this._runOnService('setElementStyle', [
|
||||||
new FnArg(renderElement, RenderStoreObject), new FnArg(styleName, null),
|
new FnArg(renderElement, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(styleValue, null)
|
new FnArg(styleName),
|
||||||
|
new FnArg(styleValue),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
invokeElementMethod(renderElement: any, methodName: string, args?: any[]) {
|
invokeElementMethod(renderElement: any, methodName: string, args?: any[]) {
|
||||||
this._runOnService('invokeElementMethod', [
|
this._runOnService('invokeElementMethod', [
|
||||||
new FnArg(renderElement, RenderStoreObject), new FnArg(methodName, null),
|
new FnArg(renderElement, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(args, null)
|
new FnArg(methodName),
|
||||||
|
new FnArg(args),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
setText(renderNode: any, text: string) {
|
setText(renderNode: any, text: string) {
|
||||||
this._runOnService(
|
this._runOnService('setText', [
|
||||||
'setText', [new FnArg(renderNode, RenderStoreObject), new FnArg(text, null)]);
|
new FnArg(renderNode, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
|
new FnArg(text),
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
listen(renderElement: WebWorkerRenderNode, name: string, callback: Function): Function {
|
listen(renderElement: WebWorkerRenderNode, name: string, callback: Function): Function {
|
||||||
renderElement.events.listen(name, callback);
|
renderElement.events.listen(name, callback);
|
||||||
const unlistenCallbackId = this._rootRenderer.allocateId();
|
const unlistenCallbackId = this._rootRenderer.allocateId();
|
||||||
this._runOnService('listen', [
|
this._runOnService('listen', [
|
||||||
new FnArg(renderElement, RenderStoreObject), new FnArg(name, null),
|
new FnArg(renderElement, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(unlistenCallbackId, null)
|
new FnArg(name),
|
||||||
|
new FnArg(unlistenCallbackId),
|
||||||
]);
|
]);
|
||||||
return () => {
|
return () => {
|
||||||
renderElement.events.unlisten(name, callback);
|
renderElement.events.unlisten(name, callback);
|
||||||
this._runOnService('listenDone', [new FnArg(unlistenCallbackId, null)]);
|
this._runOnService('listenDone', [new FnArg(unlistenCallbackId)]);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
listenGlobal(target: string, name: string, callback: Function): Function {
|
listenGlobal(target: string, name: string, callback: Function): Function {
|
||||||
this._rootRenderer.globalEvents.listen(eventNameWithTarget(target, name), callback);
|
globalEvents.listen(eventNameWithTarget(target, name), callback);
|
||||||
const unlistenCallbackId = this._rootRenderer.allocateId();
|
const unlistenCallbackId = this._rootRenderer.allocateId();
|
||||||
this._runOnService(
|
this._runOnService('listenGlobal', [
|
||||||
'listenGlobal',
|
new FnArg(target),
|
||||||
[new FnArg(target, null), new FnArg(name, null), new FnArg(unlistenCallbackId, null)]);
|
new FnArg(name, null),
|
||||||
|
new FnArg(unlistenCallbackId),
|
||||||
|
]);
|
||||||
return () => {
|
return () => {
|
||||||
this._rootRenderer.globalEvents.unlisten(eventNameWithTarget(target, name), callback);
|
globalEvents.unlisten(eventNameWithTarget(target, name), callback);
|
||||||
this._runOnService('listenDone', [new FnArg(unlistenCallbackId, null)]);
|
this._runOnService('listenDone', [new FnArg(unlistenCallbackId)]);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,9 +299,14 @@ export class WebWorkerRenderer implements Renderer, RenderStoreObject {
|
||||||
previousPlayers.map(player => this._rootRenderer.renderStore.serialize(player));
|
previousPlayers.map(player => this._rootRenderer.renderStore.serialize(player));
|
||||||
|
|
||||||
this._runOnService('animate', [
|
this._runOnService('animate', [
|
||||||
new FnArg(renderElement, RenderStoreObject), new FnArg(startingStyles, null),
|
new FnArg(renderElement, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(keyframes, null), new FnArg(duration, null), new FnArg(delay, null),
|
new FnArg(startingStyles),
|
||||||
new FnArg(easing, null), new FnArg(previousPlayerIds, null), new FnArg(playerId, null)
|
new FnArg(keyframes),
|
||||||
|
new FnArg(duration),
|
||||||
|
new FnArg(delay),
|
||||||
|
new FnArg(easing),
|
||||||
|
new FnArg(previousPlayerIds),
|
||||||
|
new FnArg(playerId),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const player = new _AnimationWorkerRendererPlayer(this._rootRenderer, renderElement);
|
const player = new _AnimationWorkerRendererPlayer(this._rootRenderer, renderElement);
|
||||||
|
@ -262,37 +320,6 @@ function eventNameWithTarget(target: string, eventName: string): string {
|
||||||
return `${target}:${eventName}`;
|
return `${target}:${eventName}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class NamedEventEmitter {
|
|
||||||
private _listeners: Map<string, Function[]>;
|
|
||||||
|
|
||||||
listen(eventName: string, callback: Function) { this._getListeners(eventName).push(callback); }
|
|
||||||
|
|
||||||
unlisten(eventName: string, callback: Function) {
|
|
||||||
ListWrapper.remove(this._getListeners(eventName), callback);
|
|
||||||
}
|
|
||||||
|
|
||||||
dispatchEvent(eventName: string, event: any) {
|
|
||||||
const listeners = this._getListeners(eventName);
|
|
||||||
for (let i = 0; i < listeners.length; i++) {
|
|
||||||
listeners[i](event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private _getListeners(eventName: string): Function[] {
|
|
||||||
if (!this._listeners) {
|
|
||||||
this._listeners = new Map<string, Function[]>();
|
|
||||||
}
|
|
||||||
let listeners = this._listeners.get(eventName);
|
|
||||||
if (!listeners) {
|
|
||||||
listeners = [];
|
|
||||||
this._listeners.set(eventName, listeners);
|
|
||||||
}
|
|
||||||
return listeners;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const globalEvents = new NamedEventEmitter();
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class WebWorkerRendererFactoryV2 implements RendererFactoryV2 {
|
export class WebWorkerRendererFactoryV2 implements RendererFactoryV2 {
|
||||||
private _messageBroker: ClientMessageBroker;
|
private _messageBroker: ClientMessageBroker;
|
||||||
|
@ -312,9 +339,9 @@ export class WebWorkerRendererFactoryV2 implements RendererFactoryV2 {
|
||||||
const id = this.renderStore.allocateId();
|
const id = this.renderStore.allocateId();
|
||||||
this.renderStore.store(renderer, id);
|
this.renderStore.store(renderer, id);
|
||||||
this.callUI('createRenderer', [
|
this.callUI('createRenderer', [
|
||||||
new FnArg(element, RenderStoreObject),
|
new FnArg(element, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(type, SerializerTypes.RENDERER_TYPE_V2),
|
new FnArg(type, SerializerTypes.RENDERER_TYPE_V2),
|
||||||
new FnArg(renderer, RenderStoreObject),
|
new FnArg(renderer, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return renderer;
|
return renderer;
|
||||||
|
@ -336,7 +363,7 @@ export class WebWorkerRendererFactoryV2 implements RendererFactoryV2 {
|
||||||
|
|
||||||
private _dispatchEvent(message: {[key: string]: any}): void {
|
private _dispatchEvent(message: {[key: string]: any}): void {
|
||||||
const element: WebWorkerRenderNode =
|
const element: WebWorkerRenderNode =
|
||||||
this._serializer.deserialize(message['element'], RenderStoreObject);
|
this._serializer.deserialize(message['element'], SerializerTypes.RENDER_STORE_OBJECT);
|
||||||
|
|
||||||
const eventName = message['eventName'];
|
const eventName = message['eventName'];
|
||||||
const target = message['eventTarget'];
|
const target = message['eventTarget'];
|
||||||
|
@ -355,7 +382,7 @@ export class WebWorkerRendererV2 implements RendererV2 {
|
||||||
constructor(private _rendererFactory: WebWorkerRendererFactoryV2) {}
|
constructor(private _rendererFactory: WebWorkerRendererFactoryV2) {}
|
||||||
destroyNode: (node: any) => void | null = null;
|
destroyNode: (node: any) => void | null = null;
|
||||||
|
|
||||||
private asFnArg = new FnArg(this, RenderStoreObject);
|
private asFnArg = new FnArg(this, SerializerTypes.RENDER_STORE_OBJECT);
|
||||||
|
|
||||||
// TODO(vicb): destroy the allocated nodes
|
// TODO(vicb): destroy the allocated nodes
|
||||||
destroy(): void { this.callUIWithRenderer('destroy'); }
|
destroy(): void { this.callUIWithRenderer('destroy'); }
|
||||||
|
@ -365,7 +392,7 @@ export class WebWorkerRendererV2 implements RendererV2 {
|
||||||
this.callUIWithRenderer('createElement', [
|
this.callUIWithRenderer('createElement', [
|
||||||
new FnArg(name),
|
new FnArg(name),
|
||||||
new FnArg(namespace),
|
new FnArg(namespace),
|
||||||
new FnArg(node, RenderStoreObject),
|
new FnArg(node, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
]);
|
]);
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
@ -374,7 +401,7 @@ export class WebWorkerRendererV2 implements RendererV2 {
|
||||||
const node = this._rendererFactory.allocateNode();
|
const node = this._rendererFactory.allocateNode();
|
||||||
this.callUIWithRenderer('createComment', [
|
this.callUIWithRenderer('createComment', [
|
||||||
new FnArg(value),
|
new FnArg(value),
|
||||||
new FnArg(node, RenderStoreObject),
|
new FnArg(node, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
]);
|
]);
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
@ -383,15 +410,15 @@ export class WebWorkerRendererV2 implements RendererV2 {
|
||||||
const node = this._rendererFactory.allocateNode();
|
const node = this._rendererFactory.allocateNode();
|
||||||
this.callUIWithRenderer('createText', [
|
this.callUIWithRenderer('createText', [
|
||||||
new FnArg(value),
|
new FnArg(value),
|
||||||
new FnArg(node, RenderStoreObject),
|
new FnArg(node, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
]);
|
]);
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
appendChild(parent: any, newChild: any): void {
|
appendChild(parent: any, newChild: any): void {
|
||||||
this.callUIWithRenderer('appendChild', [
|
this.callUIWithRenderer('appendChild', [
|
||||||
new FnArg(parent, RenderStoreObject),
|
new FnArg(parent, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(newChild, RenderStoreObject),
|
new FnArg(newChild, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -401,16 +428,16 @@ export class WebWorkerRendererV2 implements RendererV2 {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.callUIWithRenderer('insertBefore', [
|
this.callUIWithRenderer('insertBefore', [
|
||||||
new FnArg(parent, RenderStoreObject),
|
new FnArg(parent, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(newChild, RenderStoreObject),
|
new FnArg(newChild, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(refChild, RenderStoreObject),
|
new FnArg(refChild, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
removeChild(parent: any, oldChild: any): void {
|
removeChild(parent: any, oldChild: any): void {
|
||||||
this.callUIWithRenderer('removeChild', [
|
this.callUIWithRenderer('removeChild', [
|
||||||
new FnArg(parent, RenderStoreObject),
|
new FnArg(parent, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(oldChild, RenderStoreObject),
|
new FnArg(oldChild, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -418,7 +445,7 @@ export class WebWorkerRendererV2 implements RendererV2 {
|
||||||
const node = this._rendererFactory.allocateNode();
|
const node = this._rendererFactory.allocateNode();
|
||||||
this.callUIWithRenderer('selectRootElement', [
|
this.callUIWithRenderer('selectRootElement', [
|
||||||
new FnArg(selectorOrNode),
|
new FnArg(selectorOrNode),
|
||||||
new FnArg(node, RenderStoreObject),
|
new FnArg(node, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
]);
|
]);
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
@ -426,8 +453,8 @@ export class WebWorkerRendererV2 implements RendererV2 {
|
||||||
parentNode(node: any): any {
|
parentNode(node: any): any {
|
||||||
const res = this._rendererFactory.allocateNode();
|
const res = this._rendererFactory.allocateNode();
|
||||||
this.callUIWithRenderer('parentNode', [
|
this.callUIWithRenderer('parentNode', [
|
||||||
new FnArg(node, RenderStoreObject),
|
new FnArg(node, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(res, RenderStoreObject),
|
new FnArg(res, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
]);
|
]);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -435,15 +462,15 @@ export class WebWorkerRendererV2 implements RendererV2 {
|
||||||
nextSibling(node: any): any {
|
nextSibling(node: any): any {
|
||||||
const res = this._rendererFactory.allocateNode();
|
const res = this._rendererFactory.allocateNode();
|
||||||
this.callUIWithRenderer('nextSibling', [
|
this.callUIWithRenderer('nextSibling', [
|
||||||
new FnArg(node, RenderStoreObject),
|
new FnArg(node, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(res, RenderStoreObject),
|
new FnArg(res, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
]);
|
]);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
setAttribute(el: any, name: string, value: string, namespace?: string): void {
|
setAttribute(el: any, name: string, value: string, namespace?: string): void {
|
||||||
this.callUIWithRenderer('setAttribute', [
|
this.callUIWithRenderer('setAttribute', [
|
||||||
new FnArg(el, RenderStoreObject),
|
new FnArg(el, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(name),
|
new FnArg(name),
|
||||||
new FnArg(value),
|
new FnArg(value),
|
||||||
new FnArg(namespace),
|
new FnArg(namespace),
|
||||||
|
@ -452,7 +479,7 @@ export class WebWorkerRendererV2 implements RendererV2 {
|
||||||
|
|
||||||
removeAttribute(el: any, name: string, namespace?: string): void {
|
removeAttribute(el: any, name: string, namespace?: string): void {
|
||||||
this.callUIWithRenderer('removeAttribute', [
|
this.callUIWithRenderer('removeAttribute', [
|
||||||
new FnArg(el, RenderStoreObject),
|
new FnArg(el, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(name),
|
new FnArg(name),
|
||||||
new FnArg(namespace),
|
new FnArg(namespace),
|
||||||
]);
|
]);
|
||||||
|
@ -460,14 +487,14 @@ export class WebWorkerRendererV2 implements RendererV2 {
|
||||||
|
|
||||||
addClass(el: any, name: string): void {
|
addClass(el: any, name: string): void {
|
||||||
this.callUIWithRenderer('addClass', [
|
this.callUIWithRenderer('addClass', [
|
||||||
new FnArg(el, RenderStoreObject),
|
new FnArg(el, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(name),
|
new FnArg(name),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
removeClass(el: any, name: string): void {
|
removeClass(el: any, name: string): void {
|
||||||
this.callUIWithRenderer('removeClass', [
|
this.callUIWithRenderer('removeClass', [
|
||||||
new FnArg(el, RenderStoreObject),
|
new FnArg(el, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(name),
|
new FnArg(name),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
@ -475,7 +502,7 @@ export class WebWorkerRendererV2 implements RendererV2 {
|
||||||
setStyle(el: any, style: string, value: any, hasVendorPrefix: boolean, hasImportant: boolean):
|
setStyle(el: any, style: string, value: any, hasVendorPrefix: boolean, hasImportant: boolean):
|
||||||
void {
|
void {
|
||||||
this.callUIWithRenderer('setStyle', [
|
this.callUIWithRenderer('setStyle', [
|
||||||
new FnArg(el, RenderStoreObject),
|
new FnArg(el, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(style),
|
new FnArg(style),
|
||||||
new FnArg(value),
|
new FnArg(value),
|
||||||
new FnArg(hasVendorPrefix),
|
new FnArg(hasVendorPrefix),
|
||||||
|
@ -485,7 +512,7 @@ export class WebWorkerRendererV2 implements RendererV2 {
|
||||||
|
|
||||||
removeStyle(el: any, style: string, hasVendorPrefix: boolean): void {
|
removeStyle(el: any, style: string, hasVendorPrefix: boolean): void {
|
||||||
this.callUIWithRenderer('removeStyle', [
|
this.callUIWithRenderer('removeStyle', [
|
||||||
new FnArg(el, RenderStoreObject),
|
new FnArg(el, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(style),
|
new FnArg(style),
|
||||||
new FnArg(hasVendorPrefix),
|
new FnArg(hasVendorPrefix),
|
||||||
]);
|
]);
|
||||||
|
@ -493,7 +520,7 @@ export class WebWorkerRendererV2 implements RendererV2 {
|
||||||
|
|
||||||
setProperty(el: any, name: string, value: any): void {
|
setProperty(el: any, name: string, value: any): void {
|
||||||
this.callUIWithRenderer('setProperty', [
|
this.callUIWithRenderer('setProperty', [
|
||||||
new FnArg(el, RenderStoreObject),
|
new FnArg(el, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(name),
|
new FnArg(name),
|
||||||
new FnArg(value),
|
new FnArg(value),
|
||||||
]);
|
]);
|
||||||
|
@ -501,7 +528,7 @@ export class WebWorkerRendererV2 implements RendererV2 {
|
||||||
|
|
||||||
setValue(node: any, value: string): void {
|
setValue(node: any, value: string): void {
|
||||||
this.callUIWithRenderer('setValue', [
|
this.callUIWithRenderer('setValue', [
|
||||||
new FnArg(node, RenderStoreObject),
|
new FnArg(node, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(value),
|
new FnArg(value),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
@ -522,7 +549,7 @@ export class WebWorkerRendererV2 implements RendererV2 {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.callUIWithRenderer('listen', [
|
this.callUIWithRenderer('listen', [
|
||||||
new FnArg(targetEl, RenderStoreObject),
|
new FnArg(targetEl, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
new FnArg(targetName),
|
new FnArg(targetName),
|
||||||
new FnArg(eventName),
|
new FnArg(eventName),
|
||||||
new FnArg(unlistenId),
|
new FnArg(unlistenId),
|
||||||
|
@ -581,7 +608,7 @@ export class WebWorkerRenderNode {
|
||||||
animationPlayerEvents = new AnimationPlayerEmitter();
|
animationPlayerEvents = new AnimationPlayerEmitter();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _AnimationWorkerRendererPlayer implements RenderStoreObject {
|
class _AnimationWorkerRendererPlayer {
|
||||||
public parentPlayer: AnimationPlayer = null;
|
public parentPlayer: AnimationPlayer = null;
|
||||||
|
|
||||||
private _destroyed: boolean = false;
|
private _destroyed: boolean = false;
|
||||||
|
@ -592,8 +619,9 @@ class _AnimationWorkerRendererPlayer implements RenderStoreObject {
|
||||||
private _runOnService(fnName: string, fnArgs: FnArg[]) {
|
private _runOnService(fnName: string, fnArgs: FnArg[]) {
|
||||||
if (!this._destroyed) {
|
if (!this._destroyed) {
|
||||||
const fnArgsWithRenderer = [
|
const fnArgsWithRenderer = [
|
||||||
new FnArg(this, RenderStoreObject), new FnArg(this._renderElement, RenderStoreObject)
|
new FnArg(this, SerializerTypes.RENDER_STORE_OBJECT),
|
||||||
].concat(fnArgs);
|
new FnArg(this._renderElement, SerializerTypes.RENDER_STORE_OBJECT), ...fnArgs
|
||||||
|
];
|
||||||
this._rootRenderer.runOnService(ANIMATION_WORKER_PLAYER_PREFIX + fnName, fnArgsWithRenderer);
|
this._rootRenderer.runOnService(ANIMATION_WORKER_PLAYER_PREFIX + fnName, fnArgsWithRenderer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -639,7 +667,7 @@ class _AnimationWorkerRendererPlayer implements RenderStoreObject {
|
||||||
|
|
||||||
reset(): void { this._runOnService('reset', []); }
|
reset(): void { this._runOnService('reset', []); }
|
||||||
|
|
||||||
setPosition(p: number): void { this._runOnService('setPosition', [new FnArg(p, null)]); }
|
setPosition(p: number): void { this._runOnService('setPosition', [new FnArg(p)]); }
|
||||||
|
|
||||||
getPosition(): number { return 0; }
|
getPosition(): number { return 0; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,10 +9,9 @@
|
||||||
import {beforeEach, beforeEachProviders, describe, expect, inject, it} from '@angular/core/testing/testing_internal';
|
import {beforeEach, beforeEachProviders, describe, expect, inject, it} from '@angular/core/testing/testing_internal';
|
||||||
import {ON_WEB_WORKER} from '@angular/platform-webworker/src/web_workers/shared/api';
|
import {ON_WEB_WORKER} from '@angular/platform-webworker/src/web_workers/shared/api';
|
||||||
import {RenderStore} from '@angular/platform-webworker/src/web_workers/shared/render_store';
|
import {RenderStore} from '@angular/platform-webworker/src/web_workers/shared/render_store';
|
||||||
import {PRIMITIVE, Serializer} from '@angular/platform-webworker/src/web_workers/shared/serializer';
|
import {Serializer, SerializerTypes} from '@angular/platform-webworker/src/web_workers/shared/serializer';
|
||||||
import {ServiceMessageBroker_} from '@angular/platform-webworker/src/web_workers/shared/service_message_broker';
|
import {ServiceMessageBroker_} from '@angular/platform-webworker/src/web_workers/shared/service_message_broker';
|
||||||
|
|
||||||
|
|
||||||
import {createPairedMessageBuses} from './web_worker_test_util';
|
import {createPairedMessageBuses} from './web_worker_test_util';
|
||||||
|
|
||||||
export function main() {
|
export function main() {
|
||||||
|
@ -36,17 +35,20 @@ export function main() {
|
||||||
it('should call registered method with correct arguments',
|
it('should call registered method with correct arguments',
|
||||||
inject([Serializer], (serializer: Serializer) => {
|
inject([Serializer], (serializer: Serializer) => {
|
||||||
const broker = new ServiceMessageBroker_(messageBuses.ui, serializer, CHANNEL);
|
const broker = new ServiceMessageBroker_(messageBuses.ui, serializer, CHANNEL);
|
||||||
broker.registerMethod(TEST_METHOD, [PRIMITIVE, PRIMITIVE], (arg1, arg2) => {
|
broker.registerMethod(
|
||||||
expect(arg1).toEqual(PASSED_ARG_1);
|
TEST_METHOD, [SerializerTypes.PRIMITIVE, SerializerTypes.PRIMITIVE], (arg1, arg2) => {
|
||||||
expect(arg2).toEqual(PASSED_ARG_2);
|
expect(arg1).toEqual(PASSED_ARG_1);
|
||||||
|
expect(arg2).toEqual(PASSED_ARG_2);
|
||||||
|
});
|
||||||
|
messageBuses.worker.to(CHANNEL).emit({
|
||||||
|
'method': TEST_METHOD,
|
||||||
|
'args': [PASSED_ARG_1, PASSED_ARG_2],
|
||||||
});
|
});
|
||||||
messageBuses.worker.to(CHANNEL).emit(
|
|
||||||
{'method': TEST_METHOD, 'args': [PASSED_ARG_1, PASSED_ARG_2]});
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
it('should return promises to the worker', inject([Serializer], (serializer: Serializer) => {
|
it('should return promises to the worker', inject([Serializer], (serializer: Serializer) => {
|
||||||
const broker = new ServiceMessageBroker_(messageBuses.ui, serializer, CHANNEL);
|
const broker = new ServiceMessageBroker_(messageBuses.ui, serializer, CHANNEL);
|
||||||
broker.registerMethod(TEST_METHOD, [PRIMITIVE], (arg1) => {
|
broker.registerMethod(TEST_METHOD, [SerializerTypes.PRIMITIVE], (arg1) => {
|
||||||
expect(arg1).toEqual(PASSED_ARG_1);
|
expect(arg1).toEqual(PASSED_ARG_1);
|
||||||
return new Promise((res, rej) => {
|
return new Promise((res, rej) => {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
import {Type} from '@angular/core';
|
import {Type} from '@angular/core';
|
||||||
import {UiArguments} from '@angular/platform-webworker/src/web_workers/shared/client_message_broker';
|
import {UiArguments} from '@angular/platform-webworker/src/web_workers/shared/client_message_broker';
|
||||||
import {MessageBus} from '@angular/platform-webworker/src/web_workers/shared/message_bus';
|
import {MessageBus} from '@angular/platform-webworker/src/web_workers/shared/message_bus';
|
||||||
import {LocationType} from '@angular/platform-webworker/src/web_workers/shared/serialized_types';
|
import {LocationType, SerializerTypes} from '@angular/platform-webworker/src/web_workers/shared/serializer';
|
||||||
import {WebWorkerPlatformLocation} from '@angular/platform-webworker/src/web_workers/worker/platform_location';
|
import {WebWorkerPlatformLocation} from '@angular/platform-webworker/src/web_workers/worker/platform_location';
|
||||||
|
|
||||||
import {MockMessageBrokerFactory, createPairedMessageBuses, expectBrokerCall} from '../shared/web_worker_test_util';
|
import {MockMessageBrokerFactory, createPairedMessageBuses, expectBrokerCall} from '../shared/web_worker_test_util';
|
||||||
|
@ -21,17 +21,19 @@ export function main() {
|
||||||
let uiBus: MessageBus = null;
|
let uiBus: MessageBus = null;
|
||||||
let workerBus: MessageBus = null;
|
let workerBus: MessageBus = null;
|
||||||
let broker: any = null;
|
let broker: any = null;
|
||||||
|
|
||||||
const TEST_LOCATION = new LocationType(
|
const TEST_LOCATION = new LocationType(
|
||||||
'http://www.example.com', 'http', 'example.com', 'example.com', '80', '/', '', '',
|
'http://www.example.com', 'http', 'example.com', 'example.com', '80', '/', '', '',
|
||||||
'http://www.example.com');
|
'http://www.example.com');
|
||||||
|
|
||||||
|
|
||||||
function createWebWorkerPlatformLocation(loc: LocationType): WebWorkerPlatformLocation {
|
function createWebWorkerPlatformLocation(loc: LocationType): WebWorkerPlatformLocation {
|
||||||
broker.spy('runOnService').and.callFake((args: UiArguments, returnType: Type<any>) => {
|
broker.spy('runOnService')
|
||||||
if (args.method === 'getLocation') {
|
.and.callFake((args: UiArguments, returnType: Type<any>| SerializerTypes) => {
|
||||||
return Promise.resolve(loc);
|
if (args.method === 'getLocation') {
|
||||||
}
|
return Promise.resolve(loc);
|
||||||
});
|
}
|
||||||
|
});
|
||||||
const factory = new MockMessageBrokerFactory(broker);
|
const factory = new MockMessageBrokerFactory(broker);
|
||||||
return new WebWorkerPlatformLocation(factory, workerBus, null);
|
return new WebWorkerPlatformLocation(factory, workerBus, null);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {PlatformRef} from '@angular/core';
|
import {PlatformRef} from '@angular/core';
|
||||||
import {ClientMessageBrokerFactory, FnArg, PRIMITIVE, UiArguments, bootstrapWorkerUi} from '@angular/platform-webworker';
|
import {ClientMessageBrokerFactory, FnArg, SerializerTypes, UiArguments, bootstrapWorkerUi} from '@angular/platform-webworker';
|
||||||
|
|
||||||
const ECHO_CHANNEL = 'ECHO';
|
const ECHO_CHANNEL = 'ECHO';
|
||||||
|
|
||||||
|
@ -23,14 +23,10 @@ function afterBootstrap(ref: PlatformRef) {
|
||||||
const val = (<HTMLInputElement>document.getElementById('echo_input')).value;
|
const val = (<HTMLInputElement>document.getElementById('echo_input')).value;
|
||||||
// TODO(jteplitz602): Replace default constructors with real constructors
|
// TODO(jteplitz602): Replace default constructors with real constructors
|
||||||
// once they're in the .d.ts file (#3926)
|
// once they're in the .d.ts file (#3926)
|
||||||
const args = new UiArguments('echo');
|
const fnArg = new FnArg(val);
|
||||||
args.method = 'echo';
|
const args = new UiArguments('echo', [fnArg]);
|
||||||
const fnArg = new FnArg(val, PRIMITIVE);
|
|
||||||
fnArg.value = val;
|
|
||||||
fnArg.type = PRIMITIVE;
|
|
||||||
args.args = [fnArg];
|
|
||||||
|
|
||||||
broker.runOnService(args, PRIMITIVE).then((echo_result: string) => {
|
broker.runOnService(args, SerializerTypes.PRIMITIVE).then((echo_result: string) => {
|
||||||
document.getElementById('echo_result').innerHTML =
|
document.getElementById('echo_result').innerHTML =
|
||||||
`<span class='response'>${echo_result}</span>`;
|
`<span class='response'>${echo_result}</span>`;
|
||||||
});
|
});
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {Component} from '@angular/core';
|
import {Component} from '@angular/core';
|
||||||
import {PRIMITIVE, ServiceMessageBrokerFactory} from '@angular/platform-webworker';
|
import {SerializerTypes, ServiceMessageBrokerFactory} from '@angular/platform-webworker';
|
||||||
|
|
||||||
const ECHO_CHANNEL = 'ECHO';
|
const ECHO_CHANNEL = 'ECHO';
|
||||||
|
|
||||||
|
@ -15,16 +15,9 @@ const ECHO_CHANNEL = 'ECHO';
|
||||||
export class App {
|
export class App {
|
||||||
constructor(private _serviceBrokerFactory: ServiceMessageBrokerFactory) {
|
constructor(private _serviceBrokerFactory: ServiceMessageBrokerFactory) {
|
||||||
const broker = _serviceBrokerFactory.createMessageBroker(ECHO_CHANNEL, false);
|
const broker = _serviceBrokerFactory.createMessageBroker(ECHO_CHANNEL, false);
|
||||||
broker.registerMethod('echo', [PRIMITIVE], this._echo, PRIMITIVE);
|
broker.registerMethod(
|
||||||
|
'echo', [SerializerTypes.PRIMITIVE], this._echo, SerializerTypes.PRIMITIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private _echo(val: string) {
|
private _echo(val: string) { return new Promise((res) => res(val)); }
|
||||||
return new Promise((res, rej) => {
|
|
||||||
try {
|
|
||||||
res(val);
|
|
||||||
} catch (e) {
|
|
||||||
rej(e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ export declare function bootstrapWorkerUi(workerScriptUri: string, customProvide
|
||||||
|
|
||||||
/** @experimental */
|
/** @experimental */
|
||||||
export declare abstract class ClientMessageBroker {
|
export declare abstract class ClientMessageBroker {
|
||||||
abstract runOnService(args: UiArguments, returnType: Type<any>): Promise<any>;
|
abstract runOnService(args: UiArguments, returnType: Type<any> | SerializerTypes): Promise<any>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @experimental */
|
||||||
|
@ -50,24 +50,23 @@ export declare const platformWorkerUi: (extraProviders?: Provider[]) => Platform
|
||||||
export declare const PRIMITIVE: Type<any>;
|
export declare const PRIMITIVE: Type<any>;
|
||||||
|
|
||||||
/** @experimental */
|
/** @experimental */
|
||||||
export declare class ReceivedMessage {
|
export interface ReceivedMessage {
|
||||||
args: any[];
|
args: any[];
|
||||||
id: string;
|
id: string;
|
||||||
method: string;
|
method: string;
|
||||||
type: string;
|
type: string;
|
||||||
constructor(data: {
|
|
||||||
[key: string]: any;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @experimental */
|
||||||
export declare const enum SerializerTypes {
|
export declare const enum SerializerTypes {
|
||||||
RENDERER_TYPE_V2 = 0,
|
RENDERER_TYPE_V2 = 0,
|
||||||
|
PRIMITIVE = 1,
|
||||||
|
RENDER_STORE_OBJECT = 2,
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @experimental */
|
||||||
export declare abstract class ServiceMessageBroker {
|
export declare abstract class ServiceMessageBroker {
|
||||||
abstract registerMethod(methodName: string, signature: Type<any>[], method: Function, returnType?: Type<any>): void;
|
abstract registerMethod(methodName: string, signature: Array<Type<any> | SerializerTypes>, method: Function, returnType?: Type<any> | SerializerTypes): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @experimental */
|
/** @experimental */
|
||||||
|
|
Loading…
Reference in New Issue