@media-quest/engine 0.0.38 → 0.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,160 +1,155 @@
1
- import { SchemaDto } from "./SchemaDto";
2
- import { DPlayer } from "./dplayer";
3
- import { ScaleService } from "./scale";
4
- import { Page } from "../page/Page";
5
- import { TaskManager } from "../page/task-manager";
6
- import { PageResult } from "../page/page-result";
7
- import { SchemaResult } from "./SchemaResult";
8
- export interface EngineLogger {
9
- info(message: string): void;
10
- error(message: string): void;
11
- warn(message: string): void;
12
- }
13
-
14
- const voidLogger: EngineLogger = {
15
- info: (message: string) => {},
16
- error: (message: string) => {},
17
- warn: (message: string) => {},
18
- };
19
-
20
- export interface ISchemaEngine {
21
- onProgress(handler: (result: SchemaResult) => void): void;
22
- onFatalError(handler: (error: { message: string }) => void): void;
23
- setLogger(logger: EngineLogger): void;
24
- }
25
-
26
- export class SchemaEngine implements ISchemaEngine {
27
- private readonly TAG = "[ SCHEMA_ENGINE ] :";
28
- private readonly scale: ScaleService;
29
- private readonly hostElement: HTMLDivElement;
30
- private readonly taskManager: TaskManager;
31
- private logger: EngineLogger = voidLogger;
32
- private readonly uiLayer: HTMLDivElement = document.createElement("div");
33
- private readonly mediaLayer: HTMLDivElement = document.createElement("div");
34
- private player: DPlayer;
35
- private currentPage: Page | false = false;
36
- private readonly tickerRef: number | false = false;
37
- constructor(
38
- hostEl: HTMLDivElement,
39
- private readonly height: number,
40
- private readonly width: number,
41
- private readonly schema: SchemaDto,
42
- ) {
43
- this.tickerRef = window.setInterval(() => {
44
- if (this.currentPage) {
45
- this.currentPage.tick();
46
- }
47
- }, 100);
48
- this.hostElement = hostEl;
49
- this.hostElement.appendChild(this.mediaLayer);
50
- this.hostElement.appendChild(this.uiLayer);
51
- this.scale = new ScaleService({
52
- baseHeight: schema.baseHeight,
53
- baseWidth: schema.baseWidth,
54
- containerWidth: this.width,
55
- containerHeight: this.height,
56
- });
57
- this.logger.info(this.TAG + "Scale: " + JSON.stringify(this.scale));
58
- this.player = new DPlayer(this.schema);
59
- this.taskManager = new TaskManager(this.mediaLayer, this.scale, (error) => {
60
- console.log(error);
61
- });
62
-
63
- this.styleSelf();
64
- this.handlePageCompleted = this.handlePageCompleted.bind(this);
65
- this.nextPage();
66
- }
67
-
68
- private handlePageCompleted(result: PageResult) {
69
- // 1 Save data from last page
70
- this.player.saveHistory(result);
71
-
72
- // 2 Emit progress
73
- const currentResults = this.player.getResults();
74
- const a: SchemaResult = {
75
- schemaId: this.schema.id,
76
- pageResults: currentResults.pageResults,
77
- pagesLeft: currentResults.pagesLeft,
78
- predefinedFacts: currentResults.predefinedFacts,
79
- eventLog: currentResults.eventLog,
80
- answers: currentResults.answerFacts,
81
- };
82
- if (this._onProgress) {
83
- this._onProgress(a);
84
- }
85
-
86
- // 3. Next page
87
- this.nextPage();
88
- }
89
-
90
- private styleSelf() {
91
- this.hostElement.style.height = this.scale.pageHeight + "px";
92
- this.hostElement.style.width = this.scale.pageWidth + "px";
93
- this.hostElement.style.backgroundColor = this.schema.backgroundColor ?? "white";
94
- this.hostElement.style.position = "relative";
95
- // this.hostElement.style.overflow = "hidden";
96
- const makeStatic = (div: HTMLDivElement) => {
97
- div.style.height = "0px";
98
- div.style.width = "0px";
99
- div.style.position = "static";
100
- };
101
-
102
- makeStatic(this.uiLayer);
103
- this.uiLayer.style.zIndex = "10";
104
- this.mediaLayer.style.zIndex = "8";
105
- makeStatic(this.mediaLayer);
106
- }
107
-
108
- private nextPage() {
109
- const nextPage = this.player.getNextPage();
110
- if (this.currentPage) {
111
- this.currentPage.destroy();
112
- this.uiLayer.innerHTML = "";
113
- }
114
-
115
- // console.log(nextPage);
116
- if (nextPage && nextPage.videoPlayer && nextPage.videoPlayer.style) {
117
- this.taskManager.setVideoStyles(nextPage.videoPlayer.style);
118
- }
119
-
120
- if (!nextPage) {
121
- // TODO FIGURE OUT WHAQT TO DO AT END OF TEST!! Start over??
122
- this.player = new DPlayer(this.schema);
123
- if (this.player.pagesLeft > 0) {
124
- this.nextPage();
125
- }
126
- return false;
127
- }
128
-
129
- const newPage = new Page(nextPage, this.taskManager, this.scale, (result) => {
130
- this.handlePageCompleted(result);
131
- });
132
-
133
- this.currentPage = newPage;
134
- newPage.appendYourself(this.uiLayer);
135
- return true;
136
- }
137
-
138
- destroy() {
139
- if (this.currentPage) {
140
- this.currentPage.destroy();
141
- this.uiLayer.innerHTML = "";
142
- }
143
- if (this.tickerRef) {
144
- window.clearInterval(this.tickerRef);
145
- }
146
- }
147
-
148
- private _onProgress: ((result: SchemaResult) => void) | false = false;
149
- onProgress(handler: (result: SchemaResult) => void) {
150
- this._onProgress = handler;
151
- }
152
-
153
- private _onFatalError: ((error: { message: string }) => void) | false = false;
154
- onFatalError(handler: (error: { message: string }) => void): void {
155
- this._onFatalError = handler;
156
- }
157
- setLogger(logger: EngineLogger) {
158
- this.logger = logger;
159
- }
160
- }
1
+ import { SchemaDto } from "./SchemaDto";
2
+ import { DPlayer } from "./dplayer";
3
+ import { ScaleService } from "./scale";
4
+ import { Page } from "../page/Page";
5
+ import { TaskManager } from "../page/task-manager";
6
+ import { PageResult } from "../page/page-result";
7
+ import { SchemaResult } from "./SchemaResult";
8
+ export interface EngineLogger {
9
+ info(message: string): void;
10
+ error(message: string): void;
11
+ warn(message: string): void;
12
+ }
13
+
14
+ const voidLogger: EngineLogger = {
15
+ info: (message: string) => {},
16
+ error: (message: string) => {},
17
+ warn: (message: string) => {},
18
+ };
19
+
20
+ export interface ISchemaEngine {
21
+ onProgress(handler: (result: SchemaResult) => void): void;
22
+ onFatalError(handler: (error: { message: string }) => void): void;
23
+ setLogger(logger: EngineLogger): void;
24
+ }
25
+
26
+ export class SchemaEngine implements ISchemaEngine {
27
+ private readonly TAG = "[ SCHEMA_ENGINE ] :";
28
+ private readonly scale: ScaleService;
29
+ private readonly hostElement: HTMLDivElement;
30
+ private readonly taskManager: TaskManager;
31
+ private logger: EngineLogger = voidLogger;
32
+ private readonly uiLayer: HTMLDivElement = document.createElement("div");
33
+ private readonly mediaLayer: HTMLDivElement = document.createElement("div");
34
+ private player: DPlayer;
35
+ private currentPage: Page | false = false;
36
+ private readonly tickerRef: number | false = false;
37
+ constructor(
38
+ hostEl: HTMLDivElement,
39
+ private readonly height: number,
40
+ private readonly width: number,
41
+ private readonly schema: SchemaDto,
42
+ ) {
43
+ this.tickerRef = window.setInterval(() => {
44
+ if (this.currentPage) {
45
+ this.currentPage.tick();
46
+ }
47
+ }, 100);
48
+ this.hostElement = hostEl;
49
+ this.hostElement.appendChild(this.mediaLayer);
50
+ this.hostElement.appendChild(this.uiLayer);
51
+ this.scale = new ScaleService({
52
+ baseHeight: schema.baseHeight,
53
+ baseWidth: schema.baseWidth,
54
+ containerWidth: this.width,
55
+ containerHeight: this.height,
56
+ });
57
+ this.logger.info(this.TAG + "Scale: " + JSON.stringify(this.scale));
58
+ this.player = new DPlayer(this.schema);
59
+ this.taskManager = new TaskManager(this.mediaLayer, this.scale, (error) => {
60
+ console.log(error);
61
+ });
62
+
63
+ this.styleSelf();
64
+ this.handlePageCompleted = this.handlePageCompleted.bind(this);
65
+ this.nextPage();
66
+ }
67
+
68
+ private handlePageCompleted(result: PageResult) {
69
+ // 1 Save data from last page
70
+ this.player.saveHistory(result);
71
+
72
+ // 2 Emit progress
73
+ const currentResults = this.player.getResults();
74
+ const a: SchemaResult = {
75
+ schemaId: this.schema.id,
76
+ pagesLeft: currentResults.pagesLeft,
77
+ predefinedFacts: currentResults.predefinedFacts,
78
+ eventLog: currentResults.eventLog,
79
+ answers: currentResults.answerFacts,
80
+ };
81
+ if (this._onProgress) {
82
+ this._onProgress(a);
83
+ }
84
+
85
+ // 3. Next page
86
+ this.nextPage();
87
+ }
88
+
89
+ private styleSelf() {
90
+ this.hostElement.style.height = this.scale.pageHeight + "px";
91
+ this.hostElement.style.width = this.scale.pageWidth + "px";
92
+ this.hostElement.style.backgroundColor = this.schema.backgroundColor ?? "white";
93
+ this.hostElement.style.position = "relative";
94
+ // this.hostElement.style.overflow = "hidden";
95
+ const makeStatic = (div: HTMLDivElement) => {
96
+ div.style.height = "0px";
97
+ div.style.width = "0px";
98
+ div.style.position = "static";
99
+ };
100
+
101
+ makeStatic(this.uiLayer);
102
+ this.uiLayer.style.zIndex = "10";
103
+ this.mediaLayer.style.zIndex = "8";
104
+ makeStatic(this.mediaLayer);
105
+ }
106
+
107
+ private nextPage() {
108
+ const nextPage = this.player.getNextPage();
109
+ if (this.currentPage) {
110
+ this.currentPage.destroy();
111
+ this.uiLayer.innerHTML = "";
112
+ }
113
+
114
+ // console.log(nextPage);
115
+ if (nextPage && nextPage.videoPlayer && nextPage.videoPlayer.style) {
116
+ this.taskManager.setVideoStyles(nextPage.videoPlayer.style);
117
+ }
118
+
119
+ if (!nextPage) {
120
+ // TODO FIGURE OUT WHAQT TO DO AT END OF TEST!! Start over??
121
+ this.player = new DPlayer(this.schema);
122
+ if (this.player.pagesLeft > 0) {
123
+ this.nextPage();
124
+ }
125
+ return false;
126
+ }
127
+
128
+ const newPage = new Page(nextPage, this.taskManager, this.scale, (result) => {
129
+ this.handlePageCompleted(result);
130
+ });
131
+ this.currentPage = newPage;
132
+ newPage.appendYourself(this.uiLayer);
133
+ return true;
134
+ }
135
+
136
+ destroy() {
137
+ if (this.currentPage) {
138
+ this.currentPage.destroy();
139
+ this.uiLayer.innerHTML = "";
140
+ }
141
+ }
142
+
143
+ private _onProgress: ((result: SchemaResult) => void) | false = false;
144
+ onProgress(handler: (result: SchemaResult) => void) {
145
+ this._onProgress = handler;
146
+ }
147
+
148
+ private _onFatalError: ((error: { message: string }) => void) | false = false;
149
+ onFatalError(handler: (error: { message: string }) => void): void {
150
+ this._onFatalError = handler;
151
+ }
152
+ setLogger(logger: EngineLogger) {
153
+ this.logger = logger;
154
+ }
155
+ }
@@ -1,12 +1,10 @@
1
- import { Fact } from "../rules/fact";
2
- import { MqEvent } from "../events/mq-events";
3
- import { PageResult } from "../page/page-result";
4
-
5
- export interface SchemaResult {
6
- readonly schemaId: string;
7
- readonly pagesLeft: number;
8
- readonly predefinedFacts: ReadonlyArray<Fact>;
9
- readonly eventLog: ReadonlyArray<MqEvent>;
10
- readonly answers: ReadonlyArray<Fact>;
11
- readonly pageResults?: ReadonlyArray<PageResult>;
12
- }
1
+ import { Fact } from "../rules/fact";
2
+ import { MqEvent } from "../events/mq-events";
3
+
4
+ export interface SchemaResult {
5
+ readonly schemaId: string;
6
+ readonly pagesLeft: number;
7
+ readonly predefinedFacts: ReadonlyArray<Fact>;
8
+ readonly eventLog: ReadonlyArray<MqEvent>;
9
+ readonly answers: ReadonlyArray<Fact>;
10
+ }
@@ -1,92 +1,91 @@
1
- import { DPlayer, DPlayerData } from "./dplayer";
2
- import { PageSequenceDto } from "./SchemaDto";
3
- import { Rule } from "../rules/rule";
4
- import { DTimestamp } from "../common/DTimestamp";
5
- import { RuleActionPageQue } from "./page-que-ruleengine-action";
6
- import { PageDto } from "../page/Page";
7
- import { PageResult } from "../page/page-result";
8
-
9
- const page = (id: number): PageDto => {
10
- return PageDto.createDummy(id);
11
- // return { id: PageID.create(), elements: [] };
12
- };
13
- const p1 = page(1);
14
- const p2 = page(2);
15
- const p3 = page(3);
16
- const p4 = page(4);
17
- const p5 = page(5);
18
- const p6 = page(6);
19
- const all = [p1, p2, p3, p4, p5, p6];
20
- const Seq1 = {
21
- p10: page(10),
22
- p11: page(11),
23
- p12: page(12),
24
- };
25
-
26
- const seq1: PageSequenceDto = {
27
- id: "s1",
28
- pages: [Seq1.p10, Seq1.p11, Seq1.p12],
29
- rules: [],
30
- };
31
- const data = (
32
- pages: PageDto[],
33
- pageSequences: PageSequenceDto[] = [],
34
- rules: Rule<RuleActionPageQue, never>[] = [],
35
- ): DPlayerData => ({ pages: pages, pageSequences, rules });
36
- // const seq = (pages: PageDto[], rules: Rule[]) => {};
37
- beforeEach(() => {
38
- // data = { pages: [], rules: [], pageSequences: [] };
39
- });
40
-
41
- describe("DPlayer", () => {
42
- it("should create an instance", () => {
43
- const player = new DPlayer(data([p1, p1]));
44
- expect(player).toBeTruthy();
45
- });
46
-
47
- it("can app pages, and get next", () => {
48
- const player = new DPlayer(data([p1, p2]));
49
-
50
- expect(player.getNextPage()).toBe(p1);
51
- expect(player.getNextPage()).toBe(p2);
52
- expect(player.getNextPage()).toBe(false);
53
- });
54
-
55
- it("Can insert a sequence", () => {
56
- const player = new DPlayer(data(all, [seq1]));
57
-
58
- expect(player.getNextPage()).toBe(p1);
59
- expect(player.getNextPage()).toBe(p2);
60
- player.insertSequence(seq1.id);
61
- expect(player.getNextPage()).toBe(Seq1.p10);
62
- expect(player.getNextPage()).toBe(Seq1.p11);
63
- expect(player.getNextPage()).toBe(Seq1.p12);
64
- expect(player.getNextPage()).toBe(p3);
65
- });
66
-
67
- it("Save history", () => {
68
- const player = new DPlayer(data(all));
69
-
70
- const curr = player.getNextPage() as PageDto;
71
-
72
- const result: PageResult = {
73
- pageId: curr.id,
74
- pagePrefix: curr.id,
75
- pageNumber: 1,
76
- eventLog: [],
77
- pageTime: DTimestamp.diff(DTimestamp.now(), DTimestamp.now()),
78
- collectedFacts: [
79
- {
80
- referenceId: "as",
81
- referenceLabel: "as-label",
82
- kind: "numeric-fact",
83
- label: "litt",
84
- value: 2,
85
- },
86
- ],
87
- };
88
- player.saveHistory(result);
89
- expect(player.getNextPage()).toBe(p2);
90
- expect(player.getResults().answerFacts.length).toBe(1);
91
- });
92
- });
1
+ import { DPlayer, DPlayerData } from "./dplayer";
2
+ import { PageSequenceDto } from "./SchemaDto";
3
+ import { Rule } from "../rules/rule";
4
+ import { DTimestamp } from "../common/DTimestamp";
5
+ import { RuleActionPageQue } from "./page-que-ruleengine-action";
6
+ import { PageDto } from "../page/Page";
7
+ import { PageResult } from "../page/page-result";
8
+
9
+ const page = (id: number): PageDto => {
10
+ return PageDto.createDummy(id);
11
+ // return { id: PageID.create(), elements: [] };
12
+ };
13
+ const p1 = page(1);
14
+ const p2 = page(2);
15
+ const p3 = page(3);
16
+ const p4 = page(4);
17
+ const p5 = page(5);
18
+ const p6 = page(6);
19
+ const all = [p1, p2, p3, p4, p5, p6];
20
+ const Seq1 = {
21
+ p10: page(10),
22
+ p11: page(11),
23
+ p12: page(12),
24
+ };
25
+
26
+ const seq1: PageSequenceDto = {
27
+ id: "s1",
28
+ pages: [Seq1.p10, Seq1.p11, Seq1.p12],
29
+ rules: [],
30
+ };
31
+ const data = (
32
+ pages: PageDto[],
33
+ pageSequences: PageSequenceDto[] = [],
34
+ rules: Rule<RuleActionPageQue, never>[] = [],
35
+ ): DPlayerData => ({ pages: pages, pageSequences, rules });
36
+ // const seq = (pages: PageDto[], rules: Rule[]) => {};
37
+ beforeEach(() => {
38
+ // data = { pages: [], rules: [], pageSequences: [] };
39
+ });
40
+
41
+ describe("DPlayer", () => {
42
+ it("should create an instance", () => {
43
+ const player = new DPlayer(data([p1, p1]));
44
+ expect(player).toBeTruthy();
45
+ });
46
+
47
+ it("can app pages, and get next", () => {
48
+ const player = new DPlayer(data([p1, p2]));
49
+
50
+ expect(player.getNextPage()).toBe(p1);
51
+ expect(player.getNextPage()).toBe(p2);
52
+ expect(player.getNextPage()).toBe(false);
53
+ });
54
+
55
+ it("Can insert a sequence", () => {
56
+ const player = new DPlayer(data(all, [seq1]));
57
+
58
+ expect(player.getNextPage()).toBe(p1);
59
+ expect(player.getNextPage()).toBe(p2);
60
+ player.insertSequence(seq1.id);
61
+ expect(player.getNextPage()).toBe(Seq1.p10);
62
+ expect(player.getNextPage()).toBe(Seq1.p11);
63
+ expect(player.getNextPage()).toBe(Seq1.p12);
64
+ expect(player.getNextPage()).toBe(p3);
65
+ });
66
+
67
+ it("Save history", () => {
68
+ const player = new DPlayer(data(all));
69
+
70
+ const curr = player.getNextPage() as PageDto;
71
+
72
+ const result: PageResult = {
73
+ pageId: curr.id,
74
+ pagePrefix: curr.id,
75
+ eventLog: [],
76
+ pageTime: DTimestamp.diff(DTimestamp.now(), DTimestamp.now()),
77
+ collectedFacts: [
78
+ {
79
+ referenceId: "as",
80
+ referenceLabel: "as-label",
81
+ kind: "numeric-fact",
82
+ label: "litt",
83
+ value: 2,
84
+ },
85
+ ],
86
+ };
87
+ player.saveHistory(result);
88
+ expect(player.getNextPage()).toBe(p2);
89
+ expect(player.getResults().answerFacts.length).toBe(1);
90
+ });
91
+ });