Skip to content

Commit

Permalink
Merge branch 'feat/ioc'
Browse files Browse the repository at this point in the history
  • Loading branch information
YePpHa committed Mar 24, 2018
2 parents f292ef3 + 6774971 commit 290b9df
Show file tree
Hide file tree
Showing 101 changed files with 1,183 additions and 956 deletions.
6 changes: 2 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,6 @@
"@types/i18next": "^8.4.1",
"@types/immutable": "^3.8.7",
"@types/jasmine": "^2.8.6",
"@types/lodash.assignin": "^4.2.3",
"@types/lodash.merge": "^4.6.3",
"@types/sprintf-js": "^1.1.0",
"@types/uuid": "^3.4.1",
"archiver": "^2.1.0",
Expand Down Expand Up @@ -72,9 +70,9 @@
"i18next": "^10.0.0",
"i18next-resource-store-loader": "^0.1.2",
"immutable": "^3.8.1",
"lodash.assignin": "^4.2.0",
"lodash.merge": "^4.6.1",
"inversify": "^4.11.1",
"preact": "^8.2.5",
"reflect-metadata": "^0.1.12",
"sprintf-js": "^1.1.1",
"uuid": "^3.1.0",
"webextension-polyfill": "^0.2.1",
Expand Down
151 changes: 102 additions & 49 deletions src/app/App.ts
Original file line number Diff line number Diff line change
@@ -1,44 +1,46 @@
import { ElementComponent } from '../libs/ElementComponent';
import { Channel } from '../libs/messaging/Channel';
import { ServicePort } from '../libs/messaging/ServicePort';
import { EventHandler } from '../libs/events/EventHandler';
import { EventType } from '../libs/messaging/events/EventType';
import { PortEvent } from '../libs/messaging/events/PortEvent';
import { Component } from './libs/Component';
import { Channel } from './libs/messaging/Channel';
import { ServicePort } from './libs/messaging/ServicePort';
import { EventHandler } from './libs/events/EventHandler';
import { EventType } from './libs/messaging/events/EventType';
import { PortEvent } from './libs/messaging/events/PortEvent';
import { PlayerConfig, PlayerData } from './youtube/PlayerConfig';
import { EventType as YouTubeEventType } from './youtube/EventType';
import { IPlayer } from './player/IPlayer';
import { Player } from './player/Player';
import { QualityChangeEvent, RateChangeEvent, SizeChangeEvent, VolumeChangeEvent, CueRangeEvent, VideoDataChangeEvent } from './youtube/events';
import { Event } from '../libs/events/Event';
import { Logger } from '../libs/logging/Logger';
import { components } from '../components';
import { ComponentConstructor, Component, setStorage as setComponentStorage } from "../components/Component";
import { onPlayerConfig, onPlayerCreated, onPlayerData, onPageNavigationFinish, onPlayerBeforeCreated, onPlayerApiCall, onPlayerApiCallResponse, onPlayerReady } from "../components/IComponent";
import { Storage } from '../libs/storage/Storage';
import { BrowserEvent } from '../libs/events/BrowserEvent';
import { Event } from './libs/events/Event';
import { Logger } from './libs/logging/Logger';
import { onPlayerConfig, onPlayerCreated, onPlayerData, onPageNavigationFinish, onPlayerBeforeCreated, onPlayerApiCall, onPlayerApiCallResponse, onPlayerReady, onPlayerDispose } from "./components/IComponent";
import { Storage } from './libs/storage/Storage';
import { BrowserEvent } from './libs/events/BrowserEvent';
import { PageNavigationDetail } from './youtube/PageNavigationDetail';
import { spf } from './youtube/spf';
import container from '../config/inversify.config';
import { ComponentProvider } from '../config/components.provider';
import { ApiProvider } from '../config/apis.provider';
import { SettingsStorage } from './settings-storage/SettingsStorage';
import { Container } from 'inversify';

const logger = new Logger('App');

export class App extends ElementComponent {
export class App extends Component {
private _channel: Channel = new Channel('background');
private _ports: ServicePort[] = [];
private _players: {[key: string]: Player} = {};
private _components: Component[] = [];
private _components: any[] = [];

private _storageLoaded: boolean = false;
private _storageLoadedListeners: Function[] = [];
private _settingsStorages: SettingsStorage[];

constructor(storage: Storage) {
constructor(
container: Container
) {
super();

setComponentStorage(storage);

for (let i = 0; i < components.length; i++) {
let m = new components[i]();
this._components.push(m);
}
this._components = container.getAll(ComponentProvider);
this._settingsStorages = container.getAll(SettingsStorage);
}

isStorageLoaded(): boolean {
Expand All @@ -47,10 +49,12 @@ export class App extends ElementComponent {

async loadStorage(): Promise<void> {
this._storageLoaded = false;
for (let i = 0; i < this._components.length; i++) {
logger.debug("Loading storage for " + this._components[i].getApi().getNamespace() + "...");
await this._components[i].getApi().updateCache();

for (let i = 0; i < this._settingsStorages.length; i++) {
logger.debug("Loading storage for " + this._settingsStorages[i].getName() + "...");
await this._settingsStorages[i].updateCache();
}

this._storageLoaded = true;

let fn;
Expand All @@ -59,16 +63,12 @@ export class App extends ElementComponent {
}
}

getComponents(): Component[] {
return this._components;
}

enterDocument() {
super.enterDocument();
this._channel.enterDocument();

this.getHandler()
.listen(this._channel, EventType.CONNECT, this._handleChannelConnect, false)
.listen(this._channel, EventType.Connect, this._handleChannelConnect, false)
.listen(document.documentElement, "yt-navigate-finish", this._handleNavigateFinish, false)
.listen(window, "spfdone", this._handleSPFDone, false);
}
Expand Down Expand Up @@ -115,7 +115,11 @@ export class App extends ElementComponent {
this._components.forEach(m => {
const instance = (m as any) as onPageNavigationFinish;
if (typeof instance.onPageNavigationFinish === 'function') {
instance.onPageNavigationFinish(pageDetail);
try {
instance.onPageNavigationFinish(pageDetail);
} catch (e) {
logger.error(e);
}
}
});
}
Expand All @@ -133,7 +137,11 @@ export class App extends ElementComponent {
this._components.forEach(m => {
const instance = (m as any) as onPageNavigationFinish;
if (typeof instance.onPageNavigationFinish === 'function') {
instance.onPageNavigationFinish(pageDetail);
try {
instance.onPageNavigationFinish(pageDetail);
} catch (e) {
logger.error(e);
}
}
});
}
Expand All @@ -145,7 +153,11 @@ export class App extends ElementComponent {
this._components.forEach(m => {
const instance = (m as any) as onPlayerBeforeCreated;
if (typeof instance.onPlayerBeforeCreated === 'function') {
instance.onPlayerBeforeCreated(this._players[id]);
try {
instance.onPlayerBeforeCreated(this._players[id]);
} catch (e) {
logger.error(e);
}
}
});
}
Expand All @@ -160,7 +172,11 @@ export class App extends ElementComponent {
this._components.forEach(m => {
const instance = (m as any) as onPlayerCreated;
if (typeof instance.onPlayerCreated === 'function') {
instance.onPlayerCreated(this._players[id]);
try {
instance.onPlayerCreated(this._players[id]);
} catch (e) {
logger.error(e);
}
}
});

Expand All @@ -171,7 +187,11 @@ export class App extends ElementComponent {
this._components.forEach(m => {
const instance = (m as any) as onPlayerReady;
if (typeof instance.onPlayerReady === 'function') {
instance.onPlayerReady(player);
try {
instance.onPlayerReady(player);
} catch (e) {
logger.error(e);
}
}
});
}
Expand All @@ -183,10 +203,18 @@ export class App extends ElementComponent {
const instanceData = (m as any) as onPlayerData;

if (typeof instanceConfig.onPlayerConfig === 'function') {
config = instanceConfig.onPlayerConfig(player, config);
try {
config = instanceConfig.onPlayerConfig(player, config);
} catch (e) {
logger.error(e);
}
}
if (typeof instanceData.onPlayerData === 'function') {
config.args = instanceData.onPlayerData(player, config.args);
try {
config.args = instanceData.onPlayerData(player, config.args);
} catch (e) {
logger.error(e);
}
}
player.setData(config.args);
});
Expand All @@ -199,26 +227,47 @@ export class App extends ElementComponent {
this._components.forEach(m => {
const instance = (m as any) as onPlayerData;
if (typeof instance.onPlayerData === 'function') {
data = instance.onPlayerData(player, data);
player.setData(data);
try {
data = instance.onPlayerData(player, data);
player.setData(data);
} catch (e) {
logger.error(e);
}
}
});

return data;
}

private _handlePlayerApiCall(player: Player, name: string, ...args: any[]) {
private _handlePlayerApiCall(player: Player, name: string, ...args: any[]): onPlayerApiCallResponse|undefined {
for (let i = 0; i < this._components.length; i++) {
const instance = (this._components[i] as any) as onPlayerApiCall;
if (typeof instance.onPlayerApiCall === 'function') {
let response = instance.onPlayerApiCall(player, name, ...args) as onPlayerApiCallResponse|undefined;
if (response) return response;
try {
let response = instance.onPlayerApiCall(player, name, ...args) as onPlayerApiCallResponse|undefined;
if (response) return response;
} catch (e) {
logger.error(e);
}
}
}

return undefined;
}

private _handlePlayerDispose(player: Player): void {
for (let i = 0; i < this._components.length; i++) {
const instance = (this._components[i] as any) as onPlayerDispose;
if (typeof instance.onPlayerDispose === 'function') {
try {
instance.onPlayerDispose(player);
} catch (e) {
logger.error(e);
}
}
}
}

/**
* Attempts to handle new connections from YouTube.
* @param e the port event with the connected port.
Expand Down Expand Up @@ -292,23 +341,23 @@ export class App extends ElementComponent {

let evt: Event;
switch (type) {
case YouTubeEventType.QUALITY_CHANGE:
case YouTubeEventType.QualityChange:
evt = new QualityChangeEvent(args[0], player);
break;
case YouTubeEventType.RATE_CHANGE:
case YouTubeEventType.RateChange:
evt = new RateChangeEvent(args[0], player);
break;
case YouTubeEventType.SIZE_CHANGE:
case YouTubeEventType.SizeChange:
evt = new SizeChangeEvent(args[0], player);
break;
case YouTubeEventType.VOLUME_CHANGE:
case YouTubeEventType.VolumeChange:
evt = new VolumeChangeEvent(args[0], args[1], player);
break;
case YouTubeEventType.CUE_RANGE_ENTER:
case YouTubeEventType.CUE_RANGE_EXIT:
case YouTubeEventType.CueRangeEnter:
case YouTubeEventType.CueRangeExit:
evt = new CueRangeEvent(args[0], type, player);
break;
case YouTubeEventType.VIDEO_DATA_CHANGE:
case YouTubeEventType.VideoDataChange:
evt = new VideoDataChangeEvent(args[0], args[1], player);
break;
default:
Expand All @@ -317,6 +366,10 @@ export class App extends ElementComponent {

player.dispatchEvent(evt);

if (type === "destroy") {
this._handlePlayerDispose(player);
}

return evt.defaultPrevented;
});
}
Expand Down
13 changes: 7 additions & 6 deletions src/app/bootstrap.inject.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { wrapFunction } from '../libs/property/observer';
import { ChannelPort } from '../libs/messaging/ChannelPort';
import { ServicePort } from '../libs/messaging/ServicePort';
import { wrapFunction } from './libs/property/observer';
import { ChannelPort } from './libs/messaging/ChannelPort';
import { ServicePort } from './libs/messaging/ServicePort';
import { PlayerFactory } from './youtube/PlayerFactory';
import { Player } from './youtube/Player';
import { PlayerConfig, PlayerData, PlayerType } from './youtube/PlayerConfig';
Expand Down Expand Up @@ -48,8 +48,8 @@ const handlePlayerUpdate = (playerConfig: PlayerConfig): PlayerConfig => {
let elementId = playerConfig.attrs.id;
if (players[elementId]) {
let playerId = players[elementId].getId();
playerConfig = servicePort.callSync("player#update", playerId,
playerConfig) as PlayerConfig || playerConfig;
playerConfig = (servicePort.callSync("player#update", playerId,
playerConfig) as PlayerConfig) || playerConfig;
}

return playerConfig;
Expand Down Expand Up @@ -190,6 +190,7 @@ const handlePlayerCreate = async (playerFactory: PlayerFactory, playerConfig: Pl
let elementId = playerConfig.attrs.id;
let playerId = uuidv4();

// Wait for any blockers e.g. loading of settings.
await servicePort.call("settings#ensureLoaded");

// Send a beforecreate event to the core.
Expand All @@ -199,7 +200,7 @@ const handlePlayerCreate = async (playerFactory: PlayerFactory, playerConfig: Pl

// Apply auto-play patch
if (playerConfig.args.hasOwnProperty("autoplay")) {
if (playerConfig.args.el === PlayerType.DETAIL_PAGE || !playerConfig.args.el) {
if (playerConfig.args.el === PlayerType.DetailPage || !playerConfig.args.el) {
applyAutoPlayPatch();
}
}
Expand Down
29 changes: 16 additions & 13 deletions src/app/bootstrap.userscript.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import { injectJS } from '../libs/script';
import "reflect-metadata";
import { injectJS } from './libs/script';
import { App } from './App';
//import * as i18n from 'i18next';
import { Storage } from '../libs/storage/Storage';
import { GreaseMonkeyMechanism } from '../libs/storage/mechanism/GreaseMonkeyMechanism';
import { LocalStorageMechanism } from '../libs/storage/mechanism/LocalStorageMechanism';
import { EventHandler } from '../libs/events/EventHandler';
import { render as renderSettings } from './settings';
import { Mechanism } from '../libs/storage/mechanism/Mechanism';
import { Logger } from '../libs/logging/Logger';
import { GreaseMonkey4Mechanism } from '../libs/storage/mechanism/GreaseMonkey4Mechanism';
import { Storage } from './libs/storage/Storage';
import { GreaseMonkeyMechanism } from './libs/storage/mechanism/GreaseMonkeyMechanism';
import { LocalStorageMechanism } from './libs/storage/mechanism/LocalStorageMechanism';
import { EventHandler } from './libs/events/EventHandler';
import { Mechanism } from './libs/storage/mechanism/Mechanism';
import { Logger } from './libs/logging/Logger';
import { GreaseMonkey4Mechanism } from './libs/storage/mechanism/GreaseMonkey4Mechanism';
import container from '../config/inversify.config';
import { Settings } from "./settings";
const logger = new Logger("Bootstrap");

/*i18n.init({
Expand All @@ -35,9 +37,9 @@ const run = async () => {
}

if (mechanism) {
const storage = new Storage(mechanism);
const app = new App(storage);
container.bind<Storage>(Storage).toConstantValue(new Storage(mechanism));

const app = new App(container);
app.loadStorage();
app.enterDocument();

Expand All @@ -52,7 +54,8 @@ const run = async () => {
handler.dispose();
document.body.innerHTML = "";
document.head.innerHTML = "";
renderSettings(app.getComponents());
const settings = container.get<Settings>(Settings);
settings.render();
break;
}
});
Expand Down
Loading

0 comments on commit 290b9df

Please sign in to comment.