diff --git a/src/base.ts b/src/base.ts deleted file mode 100644 index d9f7769..0000000 --- a/src/base.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Events } from 'events'; - -export class DPBase extends Events { - constructor() { - super(); - } - - init() { - console.log('init'); - } - - start() { - console.log('start'); - } -} diff --git a/src/base/base.ts b/src/base/base.ts new file mode 100644 index 0000000..68d8346 --- /dev/null +++ b/src/base/base.ts @@ -0,0 +1,118 @@ +import { DPEvent } from './event'; + +type DPStarterEvents = { + over: () => DPTask; + exit: () => void; +}; + +export abstract class DPStarter extends DPEvent { + private _tasks: DPTask[] = []; + + get tasks() { + return this._tasks; + } + + init() { + console.log('init'); + this.doInit(); + } + + abstract doInit(): void; + + start() { + console.log('start'); + this.on('over', (task: DPTask) => { + const index = this._tasks.indexOf(task); + if (index < this._tasks.length - 1) { + this._tasks[index + 1].start(); + } + + if (index === this._tasks.length - 1) { + this.emit('exit'); + } + + task.removeAllListeners(); + this.removeTask(task); + }); + } + + addTask(task: DPTask) { + this._tasks.push(task); + } + + removeTask(task: DPTask) { + const index = this._tasks.indexOf(task); + if (index >= 0) { + this._tasks.splice(index, 1); + } + } + + clearTasks() { + this._tasks = []; + } +} + +export enum TaskStatus { + Init = 'init', + Running = 'running', + Paused = 'paused', + Stopped = 'stopped', + Finished = 'finished' +} + +export class DPTask extends DPEvent { + // 任务状态 + private _status: TaskStatus = TaskStatus.Init; + + private owner: DPStarter; + + get status() { + return this._status; + } + + set status(status: TaskStatus) { + this._status = status; + (status === TaskStatus.Finished || status === TaskStatus.Stopped) && this.owner.emit('over', this); + } + + // 任务名称 + private _name = ''; + + get name() { + return this._name; + } + + set name(name: string) { + this._name = name; + } + + constructor(owner: DPStarter) { + super(); + this.owner = owner; + } + + init() { + console.log('init'); + this.status = TaskStatus.Init; + } + + start() { + console.log('start'); + this.status = TaskStatus.Running; + } + + pause() { + console.log('pause'); + this.status = TaskStatus.Paused; + } + + stop() { + console.log('stop'); + this.status = TaskStatus.Stopped; + } + + restart() { + console.log('restart'); + this.status = TaskStatus.Running; + } +} diff --git a/src/base/event.ts b/src/base/event.ts new file mode 100644 index 0000000..c7606d6 --- /dev/null +++ b/src/base/event.ts @@ -0,0 +1,26 @@ +import { EventEmitter, Events } from 'events'; +type DPEventsDefinition = { [event: string]: (...args: any[]) => void }; +type DPAny = { + [key: string]: T; +}; +type DPValueType = T extends DPAny ? U : never; +type DPUnionToIntersection = (Union extends any ? (argument: Union) => void : never) extends (argument: infer Intersection) => void + ? Intersection + : never; +type DPEventsWithoutAny void }> = { + on: DPUnionToIntersection any }>>; + emit: DPUnionToIntersection) => boolean }>>; +}; + +type DPEvents = DPEventsWithoutAny & { + on(event: string, listener: (...args: any[]) => void): any; + emit(event: string, ...args: any[]): any; +}; +export abstract class DPEvent extends EventEmitter { + declare on: DPEvents['on']; + declare off: DPEvents['on']; + declare once: DPEvents['on']; + declare addListener: DPEvents['on']; + declare removeListener: DPEvents['on']; + declare emit: DPEvents['emit']; +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index f31db35..8d0fb14 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,9 +1,10 @@ -import { DPBase } from './base'; +import { DPStarter, DPTask } from './base/base'; -class Hongguo extends DPBase { - constructor() { - super(); +class Hongguo extends DPStarter { + doInit() { + launchApp('com.hongguo.app'); } } -const hongguo = new Hongguo().start(); +const hongguo = new Hongguo(); +hongguo.start();