/*! * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import APLRenderer from '../APLRenderer'; import { EventType } from '../enums/EventType'; import { PropertyKey } from '../enums/PropertyKey'; import { ILogger } from '../logging/ILogger'; import { LoggerFactory } from '../logging/LoggerFactory'; const EVENT_TYPE_MAP = { [EventType.kEventTypeSendEvent]: 'SendEvent', [EventType.kEventTypeRequestLineBounds]: 'RequestLineBounds', [EventType.kEventTypeLineHighlight]: 'LineHighlight', [EventType.kEventTypeFinish]: 'Finish', [EventType.kEventTypeFocus]: 'Focus', [EventType.kEventTypeOpenURL]: 'OpenURL', [EventType.kEventTypeExtension]: 'Extension', [EventType.kEventTypeDataSourceFetchRequest]: 'DataSourceFetchRequest' }; export abstract class Event { /// Logger to be used for this component logs. protected type: string; protected logger: ILogger; protected isTerminated: boolean = false; constructor(protected event: APL.Event, protected renderer: APLRenderer) { this.type = EVENT_TYPE_MAP[event.getType()] || 'Event'; this.logger = LoggerFactory.getLogger(this.type); event.addTerminateCallback(() => { this.terminate(); }); } public abstract execute(); public terminate() { this.isTerminated = true; } protected resolve() { this.event.resolve(); } protected async waitForValidLayout(component: APL.Component): Promise { while (true) { const bounds = component.getCalculatedByKey(PropertyKey.kPropertyBounds); if (bounds.width > 0 && bounds.width < 1000000) { break; } await this.waitAFrame(); } } protected wait(duration: number): Promise { return new Promise((res) => { setTimeout(res, duration); }); } protected waitAFrame(): Promise { const time = Date.now(); return new Promise((res) => { requestAnimationFrame(() => { res(Date.now() - time); }); }); } protected destroy() { (this.renderer as any) = undefined; (this.event as any) = undefined; } }