@media-quest/engine 0.0.34 → 0.0.36
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.
- package/dist/public-api.d.ts +21 -3
- package/dist/public-api.js +25 -14
- package/dist/public-api.js.map +1 -1
- package/package.json +1 -1
- package/src/engine/SchemaEngine.ts +5 -0
- package/src/engine/SchemaResult.ts +12 -10
- package/src/engine/dplayer.spec.ts +92 -91
- package/src/engine/dplayer.ts +6 -4
- package/src/engine/history-que.spec.ts +4 -2
- package/src/engine/history-que.ts +21 -17
- package/src/engine/next-que.spec.ts +1 -0
- package/src/engine/next-que.ts +101 -101
- package/src/events/mq-events.ts +76 -63
- package/src/page/Page.ts +11 -20
- package/src/page/page-result.ts +12 -11
package/dist/public-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/public-api.ts","../src/engine/history-que.ts","../src/utils/DUtil.ts","../src/rules/condition.ts","../src/rules/rule.ts","../src/rules/rule-engine.ts","../src/engine/next-que.ts","../src/engine/dplayer.ts","../src/engine/scale.ts","../src/Delement/css.ts","../src/Delement/DStyle.ts","../src/common/DTimestamp.ts","../src/page/task-state.ts","../src/Delement/DElement.ts","../src/Delement/Ddiv.ts","../src/Delement/DImg.ts","../src/Delement/DText.ts","../src/Delement/DButton.ts","../src/Delement/element-factory.ts","../src/Delement/button-click-action.ts","../src/events/mq-events.ts","../src/page/Page.ts","../src/page/task.ts","../src/page/task-manager.ts","../src/engine/SchemaEngine.ts"],"sourcesContent":["export * from \"./engine/SchemaResult\";\nexport * from \"./engine/SchemaEngine\";\nexport * from \"./engine/SchemaDto\";\nexport * from \"./engine/page-que-ruleengine-action\";\nexport * from \"./rules/rule\";\nexport * from \"./rules/fact\";\nexport * from \"./rules/rule-engine\";\nexport * from \"./rules/condition\";\nexport * from \"./utils/DUtil\";\n// export * from \"./utils/ID\";\n\nexport * from \"./events/mq-events\";\n\n// ELEMENTS\nexport * from \"./Delement/css\";\nexport * from \"./Delement/DStyle\";\nexport * from \"./Delement/DImg\";\nexport * from \"./Delement/DText\";\nexport * from \"./Delement/DButton\";\nexport * from \"./Delement/Ddiv\";\nexport * from \"./Delement/button-click-action\";\nexport * from \"./Delement/DElement\";\nexport * from \"./Delement/DElement.dto\";\nexport { PageDto } from \"./page/Page\";\nexport * from \"./page/task\";\n","import { Fact } from \"../rules/fact\";\r\nimport { PageResult } from \"../page/page-result\";\r\n\r\nexport class HistoryQue {\r\n private history: PageResult[] = [];\r\n\r\n getFacts(): Array<Fact> {\r\n const answers = this.history.map((h) => h.collectedFacts).flat(1);\r\n // const facts = answers.map((a) => a.fact);\r\n // TODO FIND LATEST FACT (answer) if have multiple.\r\n return answers;\r\n }\r\n\r\n addToHistory(result: PageResult) {\r\n this.history.push(result);\r\n }\r\n}\r\n","// export type RandomObjectId = string & { randomObjectId: true };\r\nexport namespace DUtil {\r\n export const randomString = (length: number): string => {\r\n const letters = \"abcdefghijklmnopqrstuvxyz\";\r\n const uppercase = letters.toUpperCase();\r\n const all = letters + uppercase;\r\n const abs = Math.abs(length);\r\n let result = \"\";\r\n\r\n for (let i = 0; i < abs; i++) {\r\n const char = all.charAt(Math.floor(Math.random() * all.length));\r\n result += char;\r\n }\r\n return result;\r\n };\r\n\r\n export const randomObjectId = () => randomString(32);\r\n\r\n export const deleteProp = <Obj, Key extends keyof Obj>(obj: Obj, key: Key): Omit<Obj, Key> => {\r\n delete obj[key];\r\n return obj;\r\n };\r\n\r\n export const isInRange = (min: number, max: number) => {\r\n return (value: number) => value >= min && value <= max;\r\n };\r\n export const isInfinity = (number: number) => {\r\n return (\r\n number === Number.POSITIVE_INFINITY ||\r\n number === Number.NEGATIVE_INFINITY ||\r\n number === Infinity\r\n );\r\n };\r\n export type NonEmptyArray<T> = [T, ...T[]];\r\n export const isNonEmptyArray = <T>(array: Array<T>): array is NonEmptyArray<T> => {\r\n return array.length > 0;\r\n };\r\n\r\n export const neverCheck = (args: never) => {\r\n console.log(\"OOPS: This value slipped through the never-check\", args);\r\n };\r\n\r\n export const isString = (str: unknown): str is string => typeof str === \"string\";\r\n\r\n export const hasKey = <T extends string>(\r\n obj: unknown,\r\n key: T,\r\n ): obj is Record<typeof key, unknown> => {\r\n if (!isRecord(obj)) {\r\n return false;\r\n }\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n };\r\n\r\n export const isRecord = (obj: unknown): obj is Record<string, unknown> => {\r\n if (!obj) {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return false;\r\n }\r\n\r\n if (typeof obj !== \"object\") {\r\n return false;\r\n }\r\n\r\n if (obj === null) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n export const isBool = (obj?: boolean): obj is boolean => typeof obj === \"boolean\";\r\n\r\n export const isTrue = (bool?: boolean): bool is true => bool === true;\r\n\r\n export const isFalse = (bool?: boolean): bool is false => bool === false;\r\n\r\n export const isDefined = (obj: unknown): boolean => {\r\n const notNull = obj !== null;\r\n const notUndefined = obj !== undefined;\r\n return notNull && notUndefined;\r\n };\r\n\r\n export const hasKind = (obj: unknown): obj is { readonly kind: string } => {\r\n if (!hasKey(obj, \"kind\")) {\r\n return false;\r\n }\r\n if (typeof obj.kind !== \"string\") {\r\n return false;\r\n }\r\n return obj.kind.length > 0;\r\n };\r\n\r\n export const hasValue = (obj: unknown): obj is { value: unknown } => {\r\n return hasKey(obj, \"value\");\r\n };\r\n export const isNumber = (value?: number): value is number => {\r\n const isNumber = typeof value === \"number\";\r\n const notNaN = !Number.isNaN(value);\r\n return isNumber && notNaN;\r\n };\r\n\r\n export const maxFn = (upperLimit: number) => {\r\n return (value: number) => {\r\n return Math.min(value, upperLimit);\r\n };\r\n };\r\n\r\n export const minFn = (lowerLimit: number) => {\r\n return (value: number) => {\r\n return Math.min(value, lowerLimit);\r\n };\r\n };\r\n}\r\n","import { Fact } from \"./fact\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\nexport type Condition = Condition.String | Condition.Numeric | Condition.Complex;\r\n\r\nexport namespace Condition {\r\n export type StringOperator = \"eq\" | \"not-eq\" | \"longer-then\" | \"shorter-then\";\r\n\r\n export type NumericOperator =\r\n | \"eq\"\r\n | \"not-eq\"\r\n | \"greater-then\"\r\n | \"less-then\"\r\n | \"greater-then-inclusive\"\r\n | \"less-then-inclusive\";\r\n\r\n export interface Numeric {\r\n readonly referenceId: string;\r\n readonly referenceLabel: string;\r\n readonly valueLabel: string;\r\n readonly kind: \"numeric-condition\";\r\n readonly operator: NumericOperator;\r\n readonly value: number;\r\n }\r\n export interface String {\r\n readonly referenceId: string;\r\n readonly referenceLabel: string;\r\n readonly valueLabel: string;\r\n readonly kind: \"string-condition\";\r\n readonly operator: StringOperator;\r\n readonly value: string;\r\n }\r\n\r\n export interface Complex {\r\n readonly kind: \"complex-condition\";\r\n readonly name: string;\r\n readonly all: ReadonlyArray<Condition.Simple>;\r\n readonly some: ReadonlyArray<Condition.Simple>;\r\n }\r\n\r\n export type Simple = Condition.String | Condition.Numeric;\r\n\r\n /**\r\n * An empty condition will evaluate to false,\r\n * @param condition: Condition.Any\r\n * @param facts\r\n */\r\n export const evaluate = (condition: Condition, facts: ReadonlyArray<Fact>) => {\r\n let result: boolean = false;\r\n switch (condition.kind) {\r\n case \"string-condition\":\r\n result = evaluateSimple(condition, facts);\r\n break;\r\n case \"numeric-condition\":\r\n result = evaluateSimple(condition, facts);\r\n break;\r\n case \"complex-condition\":\r\n result = evaluateComplex(condition, facts);\r\n break;\r\n default:\r\n const check: never = condition;\r\n }\r\n return result;\r\n };\r\n\r\n const evaluateComplex = (condition: Condition.Complex, facts: ReadonlyArray<Fact>): boolean => {\r\n if (condition.some.length === 0 && condition.all.length === 0) {\r\n return false;\r\n }\r\n const allSolved = condition.all.map((condition) => {\r\n return evaluateSimple(condition, facts);\r\n });\r\n\r\n const someEvaluated = condition.some.map((condition) => {\r\n return evaluateSimple(condition, facts);\r\n });\r\n const allResult = allSolved.every(DUtil.isTrue);\r\n const someResult = someEvaluated.length === 0 || someEvaluated.some(DUtil.isTrue);\r\n return someResult && allResult;\r\n };\r\n\r\n const evaluateSimple = (condition: Condition.Simple, facts: ReadonlyArray<Fact>): boolean => {\r\n const fact = facts.find((f) => f.referenceId === condition.referenceId);\r\n if (!fact) {\r\n return false;\r\n }\r\n let res = false;\r\n switch (condition.kind) {\r\n case \"numeric-condition\":\r\n if (fact.kind === \"numeric-fact\") {\r\n res = evaluateNumeric(condition, fact.value);\r\n }\r\n break;\r\n case \"string-condition\":\r\n if (fact.kind === \"string-fact\") {\r\n res = evaluateString(condition, fact.value);\r\n }\r\n break;\r\n default:\r\n const check: never = condition;\r\n }\r\n return res;\r\n };\r\n\r\n export const isEmpty = (complex: Complex) => {\r\n return complex.all.length === 0 && complex.some.length === 0;\r\n };\r\n\r\n const evaluateString = (condition: Readonly<Condition.String>, value: string): boolean => {\r\n const operator = condition.operator;\r\n let result = false;\r\n switch (operator) {\r\n case \"eq\":\r\n result = condition.value === value;\r\n break;\r\n case \"not-eq\":\r\n result = condition.value !== value;\r\n break;\r\n case \"shorter-then\":\r\n result = condition.value !== value;\r\n break;\r\n case \"longer-then\":\r\n result = condition.value !== value;\r\n break;\r\n default:\r\n const check: never = operator;\r\n }\r\n return result;\r\n };\r\n\r\n const evaluateNumeric = (condition: Numeric, value: number): boolean => {\r\n const op = condition.operator;\r\n const conditionValue = condition.value;\r\n let result = false;\r\n switch (op) {\r\n case \"eq\":\r\n result = value === conditionValue;\r\n break;\r\n case \"not-eq\":\r\n result = value !== conditionValue;\r\n break;\r\n case \"greater-then\":\r\n result = value > conditionValue;\r\n break;\r\n case \"greater-then-inclusive\":\r\n result = value >= conditionValue;\r\n break;\r\n case \"less-then\":\r\n result = value < conditionValue;\r\n break;\r\n case \"less-then-inclusive\":\r\n result = value <= conditionValue;\r\n break;\r\n default:\r\n const check: never = op;\r\n }\r\n return result;\r\n };\r\n\r\n const _getAllSimple = (condition: Condition): ReadonlyArray<Condition.Simple> => {\r\n const simple: Array<Condition.Simple> = [];\r\n switch (condition.kind) {\r\n case \"complex-condition\":\r\n simple.push(...condition.all);\r\n simple.push(...condition.some);\r\n break;\r\n case \"numeric-condition\":\r\n simple.push(condition);\r\n break;\r\n case \"string-condition\":\r\n simple.push(condition);\r\n break;\r\n default:\r\n DUtil.neverCheck(condition);\r\n }\r\n return simple;\r\n };\r\n\r\n export const getAllSimpleConditions = (\r\n condition: Condition | Array<Condition>\r\n ): ReadonlyArray<Condition.Simple> => {\r\n const simple: Array<Condition.Simple> = [];\r\n if (Array.isArray(condition)) {\r\n condition.forEach((c) => {\r\n simple.push(..._getAllSimple(c));\r\n });\r\n } else {\r\n simple.push(..._getAllSimple(condition));\r\n }\r\n return simple;\r\n };\r\n}\r\n","import { Condition } from \"./condition\";\r\nimport { Fact } from \"./fact\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\n\r\nexport interface Rule<OnSuccessAction, OnFailureAction> {\r\n readonly id?: string;\r\n readonly description: string;\r\n readonly all: ReadonlyArray<Condition>;\r\n readonly some: ReadonlyArray<Condition>;\r\n readonly onSuccess: ReadonlyArray<OnSuccessAction>;\r\n readonly onFailure: ReadonlyArray<OnFailureAction>;\r\n}\r\n\r\nexport namespace Rule {\r\n /**\r\n * Validates that the rule is valid.\r\n * @param rule\r\n */\r\n\r\n export const isEmpty = (rule: Rule<any, any>): boolean => {\r\n const emptyConditions = rule.all.length === 0 && rule.some.length === 0;\r\n const emptyActions = rule.onSuccess.length === 0 && rule.onFailure.length === 0;\r\n return emptyConditions || emptyActions;\r\n };\r\n\r\n export const solve = (rule: Rule<any, any>, facts: ReadonlyArray<Fact>): boolean => {\r\n if (rule.some.length === 0 && rule.all.length === 0) {\r\n // TODO RETURN WARNING? OR LOGGING ?\r\n return false;\r\n }\r\n\r\n const someSolved = rule.some.map((condition) => Condition.evaluate(condition, facts));\r\n\r\n const someResult = someSolved.length === 0 || someSolved.some(DUtil.isTrue);\r\n\r\n const allSolved = rule.all.map((condition) => Condition.evaluate(condition, facts)).every(DUtil.isTrue);\r\n\r\n return allSolved && someResult;\r\n };\r\n}\r\n","import { Fact } from \"./fact\";\r\nimport { Rule } from \"./rule\";\r\n\r\nexport interface SolveResult<S, F> {\r\n matching: ReadonlyArray<Match<S, F>>;\r\n errors: ReadonlyArray<RuleEngineError>;\r\n}\r\n\r\nexport interface Match<S, F> {\r\n readonly matchingRuleId: string;\r\n readonly ruleDescription: string;\r\n readonly actionList: ReadonlyArray<S> | ReadonlyArray<F>;\r\n}\r\n\r\nexport interface RuleEngineError {\r\n readonly kind?: string;\r\n readonly message: string;\r\n}\r\n\r\nexport class RuleEngine<S, F> {\r\n constructor() {}\r\n\r\n solveAll(rules: Rule<S, F>[], facts: Fact[]): SolveResult<S, F> {\r\n const errors: RuleEngineError[] = [];\r\n const matching: Match<S, F>[] = [];\r\n rules.forEach((rule) => {\r\n if (Rule.isEmpty(rule)) {\r\n errors.push({ message: \"Empty rule: \" + rule.id });\r\n } else if (Rule.solve(rule, facts)) {\r\n const match: Match<S, F> = {\r\n ruleDescription: rule.description,\r\n matchingRuleId: rule.id ?? \"no-id-given\",\r\n actionList: [...rule.onSuccess],\r\n };\r\n matching.push(match);\r\n }\r\n });\r\n return { matching, errors };\r\n }\r\n\r\n solve(rule: Rule<S, F>, facts: Fact[]): boolean {\r\n // TODO Validate, and Return result\r\n return Rule.solve(rule, facts);\r\n }\r\n}\r\n","import { PageDto } from \"../page/Page\";\r\n\r\nexport class NextQue {\r\n private originalOrder: ReadonlyArray<string> = [];\r\n private allPages: PageDto[] = [];\r\n private excludedTags = new Set<string>();\r\n private excludedByPageId = new Set<string>();\r\n private remaining: PageDto[] = [];\r\n constructor(pages: PageDto[] = []) {\r\n this.resetQue(pages);\r\n }\r\n\r\n /**\r\n * Will reset que with the new pages.\r\n * @param pages\r\n */\r\n resetQue(pages: PageDto[]) {\r\n this.allPages = [...pages];\r\n this.remaining = [...pages];\r\n this.excludedTags = new Set();\r\n this.excludedByPageId = new Set();\r\n this.originalOrder = this.allPages.map((p) => p.id);\r\n }\r\n\r\n pop(): PageDto | false {\r\n const next = this.remaining.shift();\r\n // TODO CLONE??\r\n return next ?? false;\r\n }\r\n\r\n peek(): PageDto | false {\r\n const next = this.remaining[0];\r\n return next ?? false;\r\n }\r\n\r\n jumpToPageById(pageId: string): boolean {\r\n const index = this.remaining.findIndex((p) => p.id === pageId);\r\n if (index < 0) {\r\n return false;\r\n }\r\n this.remaining = this.remaining.slice(index);\r\n return true;\r\n }\r\n\r\n removeByTag(tag: string | string[]) {\r\n if (Array.isArray(tag)) {\r\n tag.forEach((tag) => {\r\n this.excludedTags.add(tag);\r\n });\r\n } else {\r\n this.excludedTags.add(tag);\r\n }\r\n this.filterRemaining();\r\n }\r\n\r\n /**\r\n * Will not be included\r\n * @param pages\r\n */\r\n insertAsNextByForce(pages: PageDto[]) {\r\n this.remaining.unshift(...pages);\r\n }\r\n\r\n removeByPageId(pageId: string | string[]) {\r\n if (Array.isArray(pageId)) {\r\n pageId.forEach((id) => {\r\n this.excludedByPageId.add(id);\r\n });\r\n } else {\r\n this.excludedByPageId.add(pageId);\r\n }\r\n this.filterRemaining();\r\n // this.excludedByPageId.add(pageId);\r\n }\r\n\r\n private filterRemaining() {\r\n this.remaining = this.remaining.filter((p) => {\r\n const tags = p.tags ?? [];\r\n const isIncluededByTag = !tags.some((tag) => this.excludedTags.has(tag));\r\n const isIncludedByPageId = !this.excludedByPageId.has(p.id);\r\n return isIncludedByPageId && isIncluededByTag;\r\n });\r\n }\r\n get isEmpty(): boolean {\r\n return this.remaining.length === 0;\r\n }\r\n\r\n /**\r\n * Total number of pages left in que\r\n */\r\n get size(): number {\r\n return this.remaining.length;\r\n }\r\n\r\n /**\r\n * Total number of pages in test\r\n */\r\n get pageCount(): number {\r\n return this.originalOrder.length;\r\n }\r\n}\r\n","import { HistoryQue } from \"./history-que\";\nimport { RuleEngine } from \"../rules/rule-engine\";\nimport { NextQue } from \"./next-que\";\nimport { SchemaDto } from \"./SchemaDto\";\nimport { RuleActionPageQue } from \"./page-que-ruleengine-action\";\nimport { PageDto } from \"../page/Page\";\nimport { PageResult } from \"../page/page-result\";\nimport { Fact } from \"../rules/fact\";\nimport { MqEvent } from \"../events/mq-events\";\n\nexport type DPlayerData = Pick<SchemaDto, \"pages\" | \"pageSequences\" | \"rules\" | \"predefinedFacts\">;\nexport class DPlayer {\n private readonly eventLog: Array<MqEvent> = [];\n private history = new HistoryQue();\n private ruleEngine = new RuleEngine<RuleActionPageQue, never>();\n private nextQue = new NextQue();\n private data: DPlayerData;\n private readonly predefinedFacts: ReadonlyArray<Fact>;\n\n constructor(data: DPlayerData) {\n this.data = data;\n const pages = data.pages ?? [];\n this.predefinedFacts = data.predefinedFacts ? [...data.predefinedFacts] : [];\n this.nextQue.resetQue(pages);\n }\n\n saveEvent(event: MqEvent) {\n this.eventLog.push(event);\n }\n\n saveHistory(pageHistory: PageResult) {\n // console.log(\"SAVE HISTORY\", pageHistory);\n this.history.addToHistory(pageHistory);\n this.eventLog.push(...pageHistory.eventLog);\n // Evaluate rules\n const userGeneratedFact = this.history.getFacts();\n const predefinedFacts = this.predefinedFacts;\n const facts = [...userGeneratedFact, ...predefinedFacts];\n const result = this.ruleEngine.solveAll(this.data.rules, facts);\n\n const matchingRules = result.matching;\n const actions = matchingRules.map((r) => r.actionList).flat(1);\n // Execute actions\n actions.forEach((a) => {\n // console.log(a.payload);\n switch (a.kind) {\n case \"jumpToPage\":\n this.nextQue.jumpToPageById(a.pageId);\n break;\n case \"excludeByPageId\":\n this.nextQue.removeByPageId(a.pageIds);\n break;\n case \"excludeByTag\":\n this.nextQue.removeByTag(a.tagIds);\n break;\n default:\n console.log(\"UNKNOWN ACTION\", a);\n const check: never = a;\n }\n });\n }\n\n getResults() {\n const pagesLeft = this.nextQue.size;\n const answerFacts = this.history.getFacts();\n const predefinedFacts = this.predefinedFacts;\n const eventLog = [...this.eventLog];\n // console.log(answerFacts);\n return { answerFacts, predefinedFacts, eventLog, pagesLeft };\n }\n\n insertSequence(sequenceId: string) {\n this.insertSequenceById(sequenceId);\n }\n\n getNextPage(): PageDto | false {\n const next = this.nextQue.pop();\n return next ?? false;\n }\n\n private insertSequenceById(id: string) {\n const seq = this.data.pageSequences?.find((s) => s.id === id);\n if (seq) {\n this.nextQue.insertAsNextByForce([...seq.pages]);\n } else {\n // HOW TO HANDLE INVALID ID_REFS?? LOGGER??\n // LOG INVALID COMMAND.\n }\n }\n\n /**\n * Total number of pages left in que\n */\n get pagesLeft(): number {\n return this.nextQue.pageCount;\n }\n\n /**\n * Total number of pages in test\n */\n get totalPageCount(): number {\n return this.data.pages.length;\n }\n}\n","export class ScaleService {\r\n private readonly baseHeight;\r\n private readonly baseWidth;\r\n private containerHeight = 1300;\r\n private containerWidth = 1300;\r\n\r\n get scale() {\r\n return this._scale;\r\n }\r\n\r\n get pageHeight() {\r\n return this.baseHeight * this.scale;\r\n }\r\n get pageWidth() {\r\n return this.baseWidth * this._scale;\r\n }\r\n\r\n private _scale = 1;\r\n\r\n private readonly subscribers = new Set<(scale: number) => void>();\r\n\r\n constructor(config: { baseHeight: number; baseWidth: number; containerHeight: number; containerWidth: number }) {\r\n this.baseHeight = config.baseHeight;\r\n this.baseWidth = config.baseWidth;\r\n this.containerHeight = config.containerHeight;\r\n this.containerWidth = config.containerWidth;\r\n this.updateScale();\r\n }\r\n\r\n setContainerBounds(bounds: { height: number; width: number }) {\r\n this.containerWidth = bounds.width;\r\n this.containerHeight = bounds.height;\r\n this.updateScale();\r\n }\r\n private updateScale() {\r\n const scaleFn = Scale.calc(this.baseHeight, this.baseWidth);\r\n const scale = scaleFn({ height: this.containerHeight, width: this.containerWidth });\r\n const hasChanged = this.scale !== scale;\r\n this._scale = scale;\r\n if (hasChanged) {\r\n this.subscribers.forEach((fn) => {\r\n fn(this._scale);\r\n });\r\n }\r\n }\r\n\r\n onChange(scaleChangeHandler: (scale: number) => void, subscriberId: string) {\r\n // console.log(subscriberId);\r\n this.subscribers.add(scaleChangeHandler);\r\n scaleChangeHandler(this._scale);\r\n return () => {\r\n this.subscribers.delete(scaleChangeHandler);\r\n };\r\n }\r\n}\r\nexport namespace Scale {\r\n export const calc = (baseHeight: number, baseWidth: number) => {\r\n return (container: { height: number; width: number }) => {\r\n const heightRatio = container.height / baseHeight;\r\n const widthRatio = container.width / baseWidth;\r\n return Math.min(heightRatio, widthRatio);\r\n };\r\n };\r\n\r\n type ScalePosInput = { x: number; y: number; h: number; w: number };\r\n\r\n export const scaleFunctionCreator = (scale: number) => {\r\n return (value: number) => value * scale;\r\n };\r\n}\r\n","import { DUtil } from \"../utils/DUtil\";\n\nexport namespace DCss {\n export interface Px {\n readonly _unit: \"px\";\n readonly value: number;\n }\n\n export type LengthString = `${number}px` | `${number}%`;\n export interface Percent {\n readonly _unit: \"percent\";\n readonly value: number;\n }\n\n export type LengthUnit = Px | Percent | number;\n\n /**\n * Will scale to 3% of baseScale\n * @param unit\n * @param scale\n */\n export const toString = (unit: Readonly<LengthUnit>, scale: number): LengthString => {\n const _mapped: Percent | Px =\n typeof unit === \"number\" ? { _unit: \"percent\", value: unit } : unit;\n return _toString(_mapped, scale);\n };\n const _toString = (unit: Readonly<Percent | Px>, scale: number): LengthString => {\n const clampedScale = Math.max(scale, 0.03);\n if (unit._unit === \"px\") {\n if (unit.value < 0.1) {\n return \"0px\";\n }\n\n const rounded = Math.round(unit.value * clampedScale);\n const clamped = Math.max(rounded, 1);\n return (clamped + \"px\") as LengthString;\n }\n return (unit.value + \"%\") as LengthString;\n };\n\n export const isLengthUnit = (unit?: LengthUnit): unit is LengthUnit => {\n if (typeof unit === \"number\") {\n return true;\n }\n\n if (!unit) {\n return false;\n }\n\n const unitKey: keyof DCss.Px = \"_unit\";\n const valueKey: keyof DCss.Px = \"value\";\n const hasUnitKey = DUtil.hasKey(unit, unitKey);\n const hasValueKey = DUtil.hasKey(unit, valueKey);\n return hasUnitKey && hasValueKey;\n };\n}\n","import { DCss } from \"./css\";\nimport { DUtil } from \"../utils/DUtil\";\n\nexport type PStyle = Partial<DStyle>;\nexport interface DStyle {\n opacity: number;\n backgroundColor: string;\n visibility: \"visible\" | \"hidden\";\n cursor:\n | \"pointer\"\n | \"help\"\n | \"copy\"\n | \"wait\"\n | \"not-allowed\"\n | \"context-menu\"\n | \"move\"\n | \"grabbing\"\n | \"grab\"\n | \"zoom-in\"\n | \"zoom-out\"\n | \"none\"\n | \"auto\"\n | \"default\";\n\n zIndex: number;\n // POSITION\n h: number;\n w: number;\n x: number;\n y: number;\n height: DCss.LengthUnit;\n maxHeight: DCss.LengthUnit;\n minHeight: DCss.LengthUnit;\n width: DCss.LengthUnit;\n maxWidth: DCss.LengthUnit;\n minWidth: DCss.LengthUnit;\n bottom: DCss.LengthUnit;\n top: DCss.LengthUnit;\n left: DCss.LengthUnit;\n right: DCss.LengthUnit;\n boxShadow: string;\n\n // BORDERS\n borderStyle: \"solid\" | \"none\" | \"dotted\" | \"dashed\";\n borderRadius: DCss.Px | DCss.Percent;\n borderWidth: DCss.Px;\n borderColor: string;\n\n margin: DCss.Px | DCss.Percent;\n padding: DCss.Px | DCss.Percent;\n paddingLeft: DCss.Px | DCss.Percent;\n paddingRight: DCss.Px | DCss.Percent;\n paddingTop: DCss.Px | DCss.Percent;\n paddingBottom: DCss.Px | DCss.Percent;\n\n // Translate\n transform: string;\n translate: string;\n\n // TEXT\n fontSize: DCss.Px;\n textColor: string;\n fontWeight: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n textAlign: \"right\" | \"left\" | \"center\";\n letterSpacing: DCss.Px;\n lineHeight: number;\n\n // LAYOUT & POSITIONING OVERRIDE\n position: \"absolute\" | \"relative\";\n flex: string;\n display: \"flex\" | \"block\";\n flexDirection: \"row\" | \"colum\";\n flexWrap: \"nowrap\" | \"wrap\";\n justifyContent:\n | \"flex-start\"\n | \"flex-end\"\n | \"center\"\n | \"space-around\"\n | \"space-evenly\"\n | \"space-between\";\n alignItems: \"stretch\" | \"baseline\" | \"center\" | \"flex-start\" | \"flex-end\";\n gap: DCss.Px;\n alignContent:\n | \"stretch\"\n | \"center\"\n | \"flex-start\"\n | \"flex-end\"\n | \"space-around\"\n | \"space-evenly\"\n | \"space-between\";\n}\n\nexport namespace DStyle {\n // import isNumber = DUtil.isNumber;\n import isLengthUnit = DCss.isLengthUnit;\n export const normalize = <T extends HTMLElement>(el: T): T => {\n const s = el.style;\n s.position = \"absolute\";\n s.boxSizing = \"border-box\";\n s.padding = \"0px\";\n s.margin = \"0px\";\n\n s.height = \"\";\n s.width = \"fit-content\";\n\n s.bottom = \"\";\n s.top = \"\";\n s.left = \"\";\n s.right = \"\";\n s.flex = \"none\";\n\n s.boxShadow = \"\";\n s.fontSize = \"12px\";\n s.lineHeight = \"1\";\n s.textAlign = \"center\";\n s.textDecoration = \"none\";\n s.boxShadow = \"\";\n s.boxSizing = \"border-box\";\n s.fontWeight = \"500\";\n s.borderStyle = \"\";\n s.borderRadius = \"\";\n s.borderWidth = \"\";\n s.borderWidth = \"0px\";\n s.borderColor = \"black\";\n s.backgroundColor = \"\";\n s.border = \"\";\n s.borderStyle = \"none\";\n s.outline = \"\";\n s.wordSpacing = \"\";\n s.userSelect = \"none\";\n s.textShadow = \"\";\n return el;\n };\n\n export const applyStyles = <T extends HTMLElement>(\n el: T,\n style: Partial<DStyle>,\n scale: number,\n ): T => {\n const { isNumber, isString } = DUtil;\n // const scalePx = DCss.toStringCre(this.scale);\n const {\n x,\n y,\n left,\n right,\n top,\n bottom,\n backgroundColor,\n borderColor,\n borderWidth,\n borderRadius,\n borderStyle,\n w,\n opacity,\n cursor,\n fontSize,\n fontWeight,\n lineHeight,\n textColor,\n textAlign,\n translate,\n flex,\n margin,\n padding,\n letterSpacing,\n h,\n height,\n width,\n transform,\n visibility,\n justifyContent,\n alignContent,\n flexWrap,\n display,\n flexDirection,\n alignItems,\n position,\n paddingLeft,\n paddingTop,\n paddingRight,\n paddingBottom,\n gap,\n\n zIndex,\n //\n boxShadow,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n } = style;\n\n if (isNumber(zIndex)) {\n el.style.zIndex = \"\" + zIndex;\n }\n if (isString(flex)) {\n el.style.flex = flex;\n }\n\n if (DCss.isLengthUnit(minWidth)) {\n el.style.minWidth = DCss.toString(minWidth, scale);\n }\n\n if (DCss.isLengthUnit(maxWidth)) {\n el.style.maxWidth = DCss.toString(maxWidth, scale);\n }\n\n if (typeof lineHeight === \"number\") {\n el.style.lineHeight = \"\" + lineHeight;\n }\n\n if (DCss.isLengthUnit(minHeight)) {\n el.style.minHeight = DCss.toString(minHeight, scale);\n }\n\n if (DCss.isLengthUnit(maxHeight)) {\n el.style.maxHeight = DCss.toString(maxHeight, scale);\n }\n\n if (boxShadow) {\n el.style.boxShadow = boxShadow;\n }\n\n if (gap) {\n el.style.gap = DCss.toString(gap, scale);\n }\n\n if (paddingLeft) {\n el.style.paddingLeft = DCss.toString(paddingLeft, scale);\n }\n\n if (paddingRight) {\n el.style.paddingRight = DCss.toString(paddingRight, scale);\n }\n\n if (paddingTop) {\n el.style.paddingTop = DCss.toString(paddingTop, scale);\n }\n\n if (paddingBottom) {\n el.style.paddingBottom = DCss.toString(paddingBottom, scale);\n }\n\n if (position) {\n el.style.position = position;\n }\n if (justifyContent) {\n el.style.justifyContent = justifyContent;\n }\n\n if (alignContent) {\n el.style.alignContent = alignContent;\n }\n if (flexWrap) {\n el.style.flexWrap = flexWrap;\n }\n if (display) {\n el.style.display = display;\n }\n if (flexDirection) {\n el.style.flexDirection = flexDirection;\n }\n if (alignItems) {\n el.style.alignItems = alignItems;\n }\n\n // this.el.style.fontWeight = '900';\n if (backgroundColor) {\n el.style.backgroundColor = backgroundColor;\n }\n\n if (cursor) {\n el.style.cursor = cursor;\n }\n\n if (transform) {\n el.style.transform = transform;\n }\n\n if (textColor) {\n el.style.color = textColor;\n }\n if (textAlign) {\n el.style.textAlign = textAlign;\n }\n\n if (borderColor) {\n el.style.borderColor = borderColor;\n }\n\n if (borderWidth) {\n el.style.borderWidth = DCss.toString(borderWidth, scale);\n }\n\n if (fontWeight) {\n el.style.fontWeight = fontWeight + \"\";\n }\n\n if (borderStyle) {\n el.style.borderStyle = borderStyle;\n }\n\n if (fontSize) {\n el.style.fontSize = DCss.toString(fontSize, scale);\n }\n\n if (DUtil.isNumber(x)) {\n el.style.left = x + \"%\";\n }\n\n if (DUtil.isNumber(y)) {\n el.style.bottom = y + \"%\";\n }\n\n if (DCss.isLengthUnit(height)) {\n el.style.height = DCss.toString(height, scale);\n }\n\n if (DCss.isLengthUnit(width)) {\n el.style.width = DCss.toString(width, scale);\n }\n\n if (DCss.isLengthUnit(left)) {\n el.style.left = DCss.toString(left, scale);\n }\n\n if (DCss.isLengthUnit(right)) {\n el.style.right = DCss.toString(right, scale);\n }\n\n if (DCss.isLengthUnit(bottom)) {\n el.style.bottom = DCss.toString(bottom, scale);\n }\n\n if (DCss.isLengthUnit(top)) {\n el.style.top = DCss.toString(top, scale);\n }\n\n if (DUtil.isNumber(h)) {\n el.style.height = DCss.toString(h, scale);\n }\n\n if (isNumber(w)) {\n el.style.width = DCss.toString(w, scale);\n }\n\n if (DCss.isLengthUnit(borderRadius)) {\n el.style.borderRadius = DCss.toString(borderRadius, scale);\n }\n\n if (letterSpacing) {\n el.style.letterSpacing = DCss.toString(letterSpacing, scale);\n }\n\n if (margin) {\n el.style.margin = DCss.toString(margin, scale);\n }\n\n if (padding) {\n el.style.padding = DCss.toString(padding, scale);\n }\n\n if (isNumber(opacity)) {\n el.style.opacity = opacity + \"\";\n }\n\n if (visibility) {\n el.style.visibility = visibility;\n }\n return el;\n };\n\n // const propNames = new Set(...ElementKeyNames);\n // export const validKey = (keyName: string) => propNames.has(keyName);\n}\n","export type DTimestamp = number & { __timestamp__: true };\r\nexport namespace DTimestamp {\r\n export const now = () => Date.now() as DTimestamp;\r\n export type Diff = number & { __diff__: true };\r\n\r\n export const addMills = (t: DTimestamp, ms: number): DTimestamp => {\r\n const res = t + Math.abs(ms);\r\n return res as DTimestamp;\r\n };\r\n\r\n export const diff = (t1: DTimestamp, t2: DTimestamp): Diff => {\r\n const t1Abs = Math.abs(t1);\r\n const t2Abs = Math.abs(t2);\r\n return Math.abs(t1Abs - t2Abs) as Diff;\r\n };\r\n\r\n export const diffNow = (t: DTimestamp): Diff => {\r\n return diff(t, now());\r\n };\r\n}\r\n","import { DTimestamp } from \"../common/DTimestamp\";\nimport diff = DTimestamp.diff;\n\nexport type TaskState = {\n audioIsPlaying: boolean;\n isGifMode: boolean;\n videoPlayState:\n | \"playing\"\n | \"paused\"\n | \"ended\"\n | \"playing-and-muted\"\n | \"paused-and-muted\"\n | \"ended-and-muted\";\n blockFormInput: boolean;\n blockResponseButton: boolean;\n blockAudio: boolean;\n blockVideo: boolean;\n};\n\nexport type TaskStateDiff = Partial<TaskState> & { __diffed__: true };\nexport const TaskState = {\n eq: (a: TaskState, b: TaskState) => {\n return (\n a.audioIsPlaying === b.audioIsPlaying &&\n a.isGifMode === b.isGifMode &&\n a.videoPlayState === b.videoPlayState &&\n a.blockFormInput === b.blockFormInput &&\n a.blockResponseButton === b.blockResponseButton &&\n a.blockAudio === b.blockAudio &&\n a.blockVideo === b.blockVideo\n );\n },\n\n getDiff: (curr: TaskState, prev: TaskState | false): TaskStateDiff => {\n if (prev === false) {\n return curr as TaskStateDiff;\n }\n\n const diff = {} as TaskStateDiff;\n\n if (curr.audioIsPlaying !== prev.audioIsPlaying) {\n diff.audioIsPlaying = curr.audioIsPlaying;\n }\n if (curr.isGifMode !== prev.isGifMode) {\n diff.isGifMode = curr.isGifMode;\n }\n if (curr.videoPlayState !== prev.videoPlayState) {\n diff.videoPlayState = curr.videoPlayState;\n }\n\n if (curr.blockFormInput !== prev.blockFormInput) {\n diff.blockFormInput = curr.blockFormInput;\n }\n if (curr.blockResponseButton !== prev.blockResponseButton) {\n diff.blockResponseButton = curr.blockResponseButton;\n }\n if (curr.blockAudio !== prev.blockAudio) {\n diff.blockAudio = curr.blockAudio;\n }\n if (curr.blockVideo !== prev.blockVideo) {\n diff.blockVideo = curr.blockVideo;\n }\n return diff;\n },\n};\n","import { DStyle, PStyle } from \"./DStyle\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\nimport { TaskState, TaskStateDiff } from \"../page/task-state\";\n\nexport interface DElementBaseDto {\n readonly style: PStyle;\n readonly onMouseEnter?: PStyle;\n readonly onMouseLeave?: PStyle;\n readonly onMouseDown?: PStyle;\n readonly onMouseUp?: PStyle;\n readonly innerText?: string;\n\n // ACTIONS HANDLERS\n readonly onClick?: ButtonClickAction;\n\n // VIDEO STATED\n readonly whenVideoPaused?: PStyle;\n readonly whenVideoPausedAndMuted?: PStyle;\n readonly whenVideoEnded?: PStyle;\n readonly whenVideoEndedAndMuted?: PStyle;\n readonly whenVideoPlaying?: PStyle;\n readonly whenVideoPlayingAndMuted?: PStyle;\n\n readonly whenAudioPlaying?: PStyle;\n readonly whenAudioPaused?: PStyle;\n readonly whenAudioBlocked?: PStyle;\n readonly whenVideoBlocked?: PStyle;\n readonly whenAudioUnblocked?: PStyle;\n readonly whenVideoUnblocked?: PStyle;\n readonly whenResponseBlocked?: PStyle;\n readonly whenResponseUnblocked?: PStyle;\n readonly whenFormInputBlocked?: PStyle;\n readonly whenFormInputUnblocked?: PStyle;\n}\n\nconst isFalse = (bool?: boolean): bool is false => bool === false;\nconst isTrue = (bool?: boolean): bool is true => bool === true;\n\nexport abstract class DElement<T extends HTMLElement> {\n private prevState: TaskState | false = false;\n\n protected currStyle: Partial<DStyle> = {\n fontSize: { _unit: \"px\", value: 100 },\n fontWeight: 500,\n textColor: \"black\",\n opacity: 1,\n };\n\n protected constructor(\n protected readonly el: T,\n protected readonly dto: DElementBaseDto,\n protected readonly scale: ScaleService,\n ) {\n if (dto.innerText) {\n this.el.innerText = dto.innerText;\n }\n this.setStyle = this.setStyle.bind(this);\n // this.normalize = this.normalize.bind(this);\n this.appendYourself = this.appendYourself.bind(this);\n this.updateStyles = this.updateStyles.bind(this);\n const { onMouseEnter, onMouseLeave } = dto;\n\n if (onMouseEnter) {\n this.el.onmouseenter = () => {\n this.setStyle(onMouseEnter);\n };\n }\n if (onMouseLeave) {\n this.el.onmouseleave = () => {\n this.setStyle(onMouseLeave);\n };\n }\n\n DStyle.normalize(this.el);\n\n if (dto) {\n this.updateStyles(dto?.style);\n }\n }\n\n /**\n * This method is called when the element is clicked.\n * This method shall be overridden by the pageClass.\n * @param style\n */\n setStyle(style: PStyle) {\n this.updateStyles(style);\n }\n\n getElementByDangerousReference() {\n return this.el;\n }\n\n appendYourself(parent: { append: (el: HTMLElement) => void }) {\n parent.append(this.el);\n // console.log(parent);\n }\n\n updateState(state: TaskStateDiff) {\n this.handleStateChanges(state);\n }\n\n setState(state: TaskState) {\n const prev = this.prevState;\n const diff = TaskState.getDiff(state, prev);\n this.prevState = state;\n if (Object.keys(diff).length > 0) {\n this.handleStateChanges(diff);\n }\n }\n\n private handleStateChanges(diff: TaskStateDiff) {\n const {\n audioIsPlaying,\n videoPlayState,\n blockAudio,\n blockVideo,\n blockResponseButton,\n blockFormInput,\n isGifMode,\n } = diff;\n const {\n whenAudioPaused,\n whenVideoPaused,\n whenAudioPlaying,\n whenFormInputBlocked,\n whenResponseBlocked,\n\n whenVideoPlaying,\n whenVideoEnded,\n\n whenAudioBlocked,\n whenVideoBlocked,\n whenAudioUnblocked,\n whenVideoUnblocked,\n whenResponseUnblocked,\n whenFormInputUnblocked,\n whenVideoPausedAndMuted,\n whenVideoEndedAndMuted,\n whenVideoPlayingAndMuted,\n } = this.dto;\n\n if (isTrue(audioIsPlaying) && whenAudioPlaying) {\n this.setStyle(whenAudioPlaying);\n }\n\n if (isFalse(audioIsPlaying) && whenAudioPaused) {\n this.setStyle(whenAudioPaused);\n }\n\n if (videoPlayState === \"playing\" && whenVideoPlaying) {\n this.setStyle(whenVideoPlaying);\n }\n\n if (videoPlayState === \"paused\" && whenVideoPaused) {\n this.setStyle(whenVideoPaused);\n }\n\n if (videoPlayState === \"ended\" && whenVideoEnded) {\n this.setStyle(whenVideoEnded);\n }\n if (videoPlayState === \"playing-and-muted\" && whenVideoPlayingAndMuted) {\n this.setStyle(whenVideoPlayingAndMuted);\n }\n\n if (videoPlayState === \"paused-and-muted\" && whenVideoPausedAndMuted) {\n this.setStyle(whenVideoPausedAndMuted);\n }\n\n if (videoPlayState === \"ended-and-muted\" && whenVideoEndedAndMuted) {\n this.setStyle(whenVideoEndedAndMuted);\n }\n }\n\n // private normalize() {\n // this.el.style.padding = \"0\";\n // this.el.style.margin = \"0\";\n // this.el.style.position = \"absolute\";\n // this.el.style.boxSizing = \"border-box\";\n // }\n\n abstract registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void;\n\n protected updateStyles(style: Partial<DStyle>) {\n this.currStyle = Object.assign(this.currStyle, style);\n DStyle.applyStyles(this.el, this.currStyle, this.scale.scale);\n window.getComputedStyle(this.el);\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { DText, DTextDto } from \"./DText\";\nimport { DImg, DImgDto } from \"./DImg\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DButton, DButtonDto } from \"./DButton\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DDivDto extends DElementBaseDto {\n readonly _tag: \"div\";\n readonly children: Array<DTextDto | DImgDto | DButtonDto>;\n}\n\nexport class DDiv extends DElement<HTMLDivElement> {\n private readonly TAG = \"[ DDiv ]: \";\n protected readonly defaultStyle = { x: 22, y: 4 };\n private children: Array<DText | DImg | DButton> = [];\n\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n this.children.forEach((child) => {\n child.registerClickHandler(clickHandler);\n });\n }\n\n constructor(dto: DDivDto, scale: ScaleService, children: Array<DText | DImg | DButton>) {\n const d = document.createElement(\"div\");\n super(d, dto, scale);\n this.children = children;\n\n this.children.forEach((child) => {\n child.appendYourself(this.el);\n });\n }\n protected whenConstructed() {\n this.children.forEach((child) => {\n console.log(child);\n });\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DTimestamp } from \"../common/DTimestamp\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DImgDto extends DElementBaseDto {\n readonly _tag: \"img\";\n // readonly id: string;\n readonly url: string;\n}\n\nexport class DImg extends DElement<HTMLImageElement> {\n private static IMAGE_COUNT = 0;\n private readonly imageCount: number;\n readonly TAG: string;\n readonly TIMING_TAG: string;\n private readonly loadStart: DTimestamp;\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n }\n\n constructor(\n protected readonly dto: DImgDto,\n readonly scaleService: ScaleService,\n ) {\n super(document.createElement(\"img\"), dto, scaleService);\n DImg.IMAGE_COUNT += 1;\n this.imageCount = DImg.IMAGE_COUNT;\n this.TAG = \"[D_IMG \" + DImg.IMAGE_COUNT + \" ]: \";\n this.TIMING_TAG = \"load-time (\" + DImg.IMAGE_COUNT + \") \";\n this.el.loading = \"eager\";\n this.el.style.position = \"absolute\";\n this.setStyle(dto.style);\n\n this.loadStart = DTimestamp.now();\n this.el.onload = () => {};\n this.el.onerror = () => {};\n this.el.src = dto.url;\n console.time(this.TIMING_TAG);\n }\n\n log(): void {}\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DTextDto extends DElementBaseDto {\n readonly _tag: \"p\";\n readonly innerText: string;\n}\n\nexport class DText extends DElement<HTMLParagraphElement> {\n constructor(dto: DTextDto, scale: ScaleService) {\n super(document.createElement(\"p\"), dto, scale);\n }\n\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const onClick = this.dto.onClick;\n if (onClick) {\n clickHandler(onClick);\n }\n };\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DButtonDto extends DElementBaseDto {\n readonly _tag: \"button\";\n}\n\nexport class DButton extends DElement<HTMLButtonElement> {\n private readonly TAG = \"[ DDiv ]: \";\n protected readonly defaultStyle = { x: 40, y: 40 };\n\n constructor(dto: DButtonDto, scale: ScaleService) {\n const d = document.createElement(\"button\");\n super(d, dto, scale);\n }\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n }\n}\n","import { DElement } from \"./DElement\";\nimport { DDiv, DDivDto } from \"./Ddiv\";\nimport { DImg } from \"./DImg\";\nimport { DText } from \"./DText\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DElementDto } from \"./DElement.dto\";\nimport { DButton } from \"./DButton\";\n\nexport const createDElement = (dto: DElementDto, scale: ScaleService): DElement<any> => {\n switch (dto._tag) {\n case \"div\":\n const childEls = createChildrenForDiv(dto, scale);\n return new DDiv(dto, scale, childEls);\n case \"img\":\n return new DImg(dto, scale);\n case \"p\":\n return new DText(dto, scale);\n case \"button\":\n return new DButton(dto, scale);\n default:\n const check: never = dto;\n throw new Error(\"Unknown dto given to the createDElement function.\");\n // TODO LOGGING or create any HTML-ELEMENT??\n }\n};\n\nconst createChildrenForDiv = (dto: DDivDto, scale: ScaleService): DDiv[\"children\"] => {\n const childDto = dto.children;\n const childEls: Array<DImg | DText | DButton> = [];\n childDto.forEach((dto) => {\n switch (dto._tag) {\n case \"p\":\n const newText = new DText(dto, scale);\n childEls.push(newText);\n break;\n case \"img\":\n const newImage = new DImg(dto, scale);\n childEls.push(newImage);\n break;\n case \"button\":\n const newButton = new DButton(dto, scale);\n childEls.push(newButton);\n break;\n default:\n const check: never = dto;\n }\n });\n return childEls;\n};\n","import { PlayAudioTask, PlayVideoTask } from \"../page/task\";\nimport { Fact } from \"../rules/fact\";\n\nexport type ButtonClickAction =\n | { kind: \"play-audio\"; task: PlayAudioTask; vibrateMs?: number }\n | { kind: \"pause-audio\"; vibrateMs?: number }\n | { kind: \"play-video\"; task: PlayVideoTask; vibrateMs?: number }\n | { kind: \"mute-video\"; vibrateMs?: number }\n | { kind: \"un-mute-video\"; vibrateMs?: number }\n | { kind: \"pause-video\"; vibrateMs?: number }\n | { kind: \"submit-fact\"; fact: Fact; vibrateMs?: number }\n | { kind: \"next-page\"; vibrateMs?: number }\n | { kind: \"submit-form\"; vibrateMs?: number };\n\n// export type ButtonClickAction = _ButtonClickAction & ;\nexport const ButtonClickAction = {\n describe: (a: ButtonClickAction): string => {\n switch (a.kind) {\n case \"next-page\":\n return \"go to next page\";\n case \"play-video\":\n return \"VideoId = \" + a.task.videoId;\n case \"play-audio\":\n return \"AudioId = \" + a.task.audioId;\n case \"pause-video\":\n return \"\";\n case \"pause-audio\":\n return \"\";\n case \"submit-fact\":\n return a.fact.label + \" = \" + a.fact.value;\n case \"submit-form\":\n return \"\";\n case \"mute-video\":\n return \"mute-video\";\n case \"un-mute-video\":\n return \"un-mute-video\";\n default:\n const _exhaustiveCheck: never = a;\n return \"\";\n }\n },\n};\n","import { DTimestamp } from \"../common/DTimestamp\";\r\n\r\ninterface _MqEvent<K extends string, P extends object> {\r\n readonly kind: K;\r\n readonly timestamp: DTimestamp;\r\n readonly payload: P;\r\n}\r\n\r\nexport type MqEventEngineStart = _MqEvent<\r\n \"engine-start\",\r\n {\r\n readonly schemaId: string;\r\n readonly schemaPrefix: string;\r\n }\r\n>;\r\nexport interface MqEventPageEnter\r\n extends _MqEvent<\"page-enter\", { readonly pageId: string; readonly pagePrefix: string }> {}\r\nexport interface MqEventPageLeave\r\n extends _MqEvent<\"page-leave\", { readonly pageId: string; readonly pagePrefix: string }> {}\r\n\r\nexport type MqEventUserClicked = _MqEvent<\r\n \"user-clicked\",\r\n { readonly pageId: string; pagePrefix: string; action: string; descriptions: string }\r\n>;\r\n\r\nexport type MqEvent = MqEventPageEnter | MqEventPageLeave | MqEventEngineStart | MqEventUserClicked;\r\n\r\nexport const MqEvent = {\r\n engineStart(schemaId: string, schemaPrefix: string): MqEventEngineStart {\r\n return {\r\n kind: \"engine-start\",\r\n timestamp: DTimestamp.now(),\r\n payload: { schemaId, schemaPrefix },\r\n };\r\n },\r\n pageEnter(pageId: string, pagePrefix: string): MqEventPageEnter {\r\n return {\r\n kind: \"page-enter\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix },\r\n };\r\n },\r\n pageLeave(pageId: string, pagePrefix: string): MqEventPageLeave {\r\n return {\r\n kind: \"page-leave\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix },\r\n };\r\n },\r\n userClicked(data: {\r\n pageId: string;\r\n pagePrefix: string;\r\n action: string;\r\n descriptions: string;\r\n }): MqEventUserClicked {\r\n const { pageId, pagePrefix, action, descriptions } = data;\r\n return {\r\n kind: \"user-clicked\",\r\n timestamp: DTimestamp.now(),\r\n payload: { pageId, pagePrefix, action, descriptions },\r\n };\r\n },\r\n} as const;\r\n","import { DElement } from \"../Delement/DElement\";\nimport { TaskManager } from \"./task-manager\";\nimport { createDElement } from \"../Delement/element-factory\";\nimport { ScaleService } from \"../engine/scale\";\nimport { Task } from \"./task\";\nimport { PStyle } from \"../Delement/DStyle\";\nimport { ButtonClickAction } from \"../Delement/button-click-action\";\nimport { DElementDto } from \"../Delement/DElement.dto\";\nimport { Fact } from \"../rules/fact\";\nimport { DTimestamp } from \"../common/DTimestamp\";\nimport { PageResult } from \"./page-result\";\nimport { TaskState } from \"./task-state\";\nimport { MqEvent } from \"../events/mq-events\";\n\nexport interface VideoPlayerDto {\n playUrl: string;\n style?: PStyle;\n}\n\nexport interface PageDto {\n readonly id: string;\n readonly prefix: string;\n readonly tags: string[];\n background: string;\n elements: Array<DElementDto>;\n videoPlayer?: VideoPlayerDto;\n initialTasks: Array<Task>;\n}\n\nexport const PageDto = {\n createDummy: (id: number): PageDto => {\n return {\n id: \"id\" + id,\n prefix: \"prefix\" + id,\n tags: [],\n background: \"white\",\n elements: [\n {\n _tag: \"div\",\n style: { x: 10, y: 0, w: 40, h: 20, backgroundColor: \"red\" },\n children: [],\n innerText: \"Next btn \" + id,\n },\n ],\n\n initialTasks: [],\n };\n },\n};\n\nexport class Page {\n private readonly TAG = \"[ DPage ]: \";\n private elements: DElement<HTMLElement>[] = [];\n // private elements: PageComponent[] = [];\n // private layoutComponents: PageLayoutComponent[] = [];\n private pageEntered: DTimestamp = DTimestamp.now();\n private previousState: TaskState | false = false;\n private eventLog = new Array<MqEvent>();\n\n constructor(\n private readonly dto: PageDto,\n private readonly taskManager: TaskManager,\n private readonly scaleService: ScaleService,\n private readonly onCompleted: (result: PageResult) => void,\n ) {\n dto.elements.forEach((el) => {\n const element = createDElement(el, scaleService);\n // if (element instanceof DDiv) {\n // }\n element.registerClickHandler((action) => {\n this.handleButtonAction(action);\n });\n\n this.elements.push(element);\n\n // if(element.)\n // element= (action) => {\n // console.log(\"TODO ONCLICK \");\n // this.handleButtonAction(action);\n // };\n // this.elements.push(element);\n });\n\n if (dto.videoPlayer) {\n this.taskManager.loadVideo(dto.videoPlayer.playUrl);\n if (dto.videoPlayer.style) {\n this.taskManager.setVideoStyles(dto.videoPlayer.style);\n }\n }\n\n if (dto.initialTasks.length) {\n this.taskManager.autoPlaySequence(dto.initialTasks);\n }\n }\n\n private createPageResult(facts: Fact[]): PageResult {\n const pageExited = DTimestamp.now();\n const pageTime = DTimestamp.diff(this.pageEntered, pageExited);\n const pageExit = MqEvent.pageLeave(this.dto.id, this.dto.prefix);\n this.eventLog.push(pageExit);\n const eventLog = [...this.eventLog];\n return {\n pagePrefix: this.dto.prefix,\n pageId: this.dto.id,\n eventLog,\n pageTime,\n collectedFacts: facts,\n };\n }\n private handleButtonAction(a: ButtonClickAction) {\n const event = MqEvent.userClicked({\n pageId: this.dto.id,\n pagePrefix: this.dto.prefix,\n action: a.kind,\n descriptions: ButtonClickAction.describe(a),\n });\n this.eventLog.push(event);\n navigator.vibrate(200);\n const { vibrateMs } = a;\n if (vibrateMs) {\n navigator.vibrate(vibrateMs);\n }\n\n switch (a.kind) {\n case \"next-page\":\n const nextPageResult = this.createPageResult([]);\n this.onCompleted(nextPageResult);\n break;\n case \"play-video\":\n this.taskManager.execute(a.task);\n break;\n case \"play-audio\":\n this.taskManager.execute(a.task);\n break;\n case \"pause-video\":\n this.taskManager.pauseVideo();\n break;\n case \"pause-audio\":\n this.taskManager.pauseAudio();\n break;\n case \"mute-video\":\n this.taskManager.muteVideo();\n break;\n case \"un-mute-video\":\n this.taskManager.unMuteVideo();\n break;\n case \"submit-fact\":\n const submitFactResult = this.createPageResult([a.fact]);\n this.onCompleted(submitFactResult);\n break;\n case \"submit-form\":\n // TODO IMPLEMENT Collection of form-data // LOOP OVER ALL INPUTS\n const submitFormResult = this.createPageResult([]);\n this.onCompleted(submitFormResult);\n break;\n default:\n const _exhaustiveCheck: never = a;\n console.log(_exhaustiveCheck);\n }\n }\n\n appendYourself(parent: HTMLElement) {\n const pageEnterEvent = MqEvent.pageEnter(this.dto.id, this.dto.prefix);\n this.pageEntered = DTimestamp.now();\n this.eventLog.push(pageEnterEvent);\n this.elements.forEach((el) => {\n el.appendYourself(parent);\n });\n\n // this.components.forEach((comp) => {\n // comp.appendToParent(parent);\n // });\n // this.layoutComponents.forEach((comp) => {\n // comp.appendToParent(parent);\n // });\n }\n\n destroy() {\n this.taskManager.clear();\n }\n\n tick() {\n const prev = this.previousState;\n const curr = this.taskManager.getState();\n const diff = TaskState.getDiff(curr, prev);\n this.elements.forEach((element) => {\n element.updateState(diff);\n });\n }\n}\n","type BaseTask = {\r\n readonly blockAudio: boolean;\r\n readonly blockVideo: boolean;\r\n readonly blockResponseButton: boolean;\r\n readonly blockFormInput: boolean;\r\n readonly priority:\r\n | \"run-if-idle\"\r\n | \"follow-queue\"\r\n | \"replace-all\"\r\n | \"replace-current\"\r\n | \"replace-queue\"\r\n | \"prepend-to-queue\"\r\n | \"append-to-queue\";\r\n};\r\nexport type DelayTask = BaseTask & {\r\n readonly kind: \"delay-task\";\r\n readonly duration: number;\r\n};\r\n\r\nexport type PlayAudioTask = BaseTask & {\r\n readonly kind: \"play-audio-task\";\r\n readonly url: string;\r\n readonly audioId: string;\r\n};\r\n\r\nexport type PlayVideoTask = BaseTask & {\r\n readonly kind: \"play-video-task\";\r\n readonly url: string;\r\n readonly videoId: string;\r\n readonly loop?: boolean;\r\n readonly startAt?: number;\r\n readonly stopAt?: \"end\" | \"start\" | number;\r\n readonly volume?: number;\r\n};\r\nconst eq = (a: Task, b: Task) => {\r\n if (!b) {\r\n return false;\r\n }\r\n if (a.kind !== b.kind) {\r\n return false;\r\n }\r\n if (a.kind === \"delay-task\" && b.kind === \"delay-task\") {\r\n return a.duration === b.duration;\r\n }\r\n\r\n if (a.kind === \"play-audio-task\" && b.kind === \"play-audio-task\") {\r\n return a.url === b.url && a.audioId === b.audioId;\r\n }\r\n if (a.kind === \"play-video-task\" && b.kind === \"play-video-task\") {\r\n return (\r\n a.url === b.url &&\r\n a.videoId === b.videoId &&\r\n a.startAt === b.startAt &&\r\n a.stopAt === b.stopAt &&\r\n a.volume === b.volume\r\n );\r\n }\r\n return false;\r\n};\r\nconst deleteTaskList = (task: Task) => {\r\n return task.priority === \"replace-all\" || task.priority === \"replace-queue\";\r\n};\r\n\r\nconst shallRemoveCurrent = (task: Task) => {\r\n return task.priority === \"replace-current\" || task.priority === \"replace-all\";\r\n};\r\n\r\nconst notEq = (a: Task, b: Task) => !eq(a, b);\r\n\r\nconst is = (task: Task | undefined | false | null | {}): task is Task => {\r\n if (!task) {\r\n return false;\r\n }\r\n if (typeof task !== \"object\") {\r\n return false;\r\n }\r\n if (Array.isArray(task)) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const Task = {\r\n eq,\r\n is,\r\n notEq,\r\n deleteTaskList,\r\n shallRemoveCurrent,\r\n};\r\nexport type Task = PlayVideoTask | PlayAudioTask | DelayTask;\r\n","import { DTimestamp } from \"../common/DTimestamp\";\nimport { Task } from \"./task\";\nimport { DStyle, PStyle } from \"../Delement/DStyle\";\nimport { ScaleService } from \"../engine/scale\";\nimport { TaskState } from \"./task-state\";\n\nexport class TaskManager {\n private readonly TAG = \"[TaskManager]: \";\n private readonly videoElement = document.createElement(\"video\");\n private readonly audioElement = document.createElement(\"audio\");\n private readonly showConsoleLogs = false;\n private readonly defaultVideoStyles: PStyle = {\n height: 50,\n width: 100,\n top: 0,\n left: 0,\n };\n private videoStyles: PStyle;\n private runningTask: { task: Task; startedAt: DTimestamp } | false = false;\n private taskList: Array<Task> = [];\n private delayRef: number | false = false;\n\n clear() {\n if (this.showConsoleLogs) console.log(this.TAG + \"CLEAR\");\n if (typeof this.delayRef === \"number\") {\n window.clearTimeout(this.delayRef);\n }\n\n this.pauseVideo();\n this.pauseAudio();\n this.videoElement.removeAttribute(\"src\");\n this.videoElement.load();\n this.audioElement.removeAttribute(\"src\");\n this.audioElement.load();\n this.taskList = [];\n this.runningTask = false;\n this.hideVideo();\n }\n\n getState(): TaskState {\n const c = this.runningTask;\n const isGifMode = this.videoElement.loop;\n const audioIsPlaying = c && c.task.kind === \"play-audio-task\" && !this.audioElement.paused;\n const videoIsPlaying = c && c.task.kind === \"play-video-task\" && !this.videoElement.paused;\n const blockResponseButton = c && c.task.blockResponseButton;\n const blockAudio = c && c.task.blockAudio;\n const blockVideo = c && c.task.blockVideo;\n const blockFormInput = c && c.task.blockFormInput;\n const videoIsMuted = this.videoElement.muted;\n\n const videoIsAtTheEnd = this.videoElement.ended;\n let videoPlayState: TaskState[\"videoPlayState\"] = videoIsMuted ? \"paused-and-muted\" : \"paused\";\n\n if (videoIsPlaying) {\n videoPlayState = videoIsMuted ? \"playing-and-muted\" : \"playing\";\n }\n if (videoIsAtTheEnd) {\n videoPlayState = videoIsMuted ? \"ended-and-muted\" : \"ended\";\n }\n\n return {\n audioIsPlaying,\n videoPlayState,\n isGifMode,\n blockFormInput,\n blockResponseButton,\n blockAudio,\n blockVideo,\n };\n }\n\n constructor(\n private readonly mediaLayer: HTMLDivElement,\n private readonly scale: ScaleService,\n private readonly onError: (error: string) => void,\n ) {\n this.hideVideo();\n this.mediaLayer.appendChild(this.videoElement);\n this.mediaLayer.appendChild(this.audioElement);\n this.videoStyles = this.defaultVideoStyles;\n DStyle.normalize(this.videoElement);\n DStyle.applyStyles(this.videoElement, this.videoStyles, this.scale.scale);\n\n this.videoElement.onended = () => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n };\n this.videoElement.onerror = (e) => {\n if (this.videoElement.src !== \"\") {\n onError(\"Error playing video: \" + this.videoElement.src);\n }\n };\n\n this.audioElement.onended = () => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n };\n }\n\n execute(task: Task): boolean {\n // console.log(\"EXECUTE TASK\" + task.kind);\n const curr = this.runningTask;\n // TODO Background-task should be handeled as its own kind or something.\n let isBackgroundTask = false;\n\n // Check if we should remove the current task.\n if (curr && Task.shallRemoveCurrent(task) && Task.notEq(curr.task, task)) {\n this.pauseAudio();\n this.pauseVideo();\n this.runningTask = false;\n }\n\n if (!curr) {\n this.runningTask = { startedAt: DTimestamp.now(), task: task };\n } else if (Task.notEq(curr.task, task)) {\n this.runningTask = { startedAt: DTimestamp.now(), task: task };\n }\n\n if (task.priority === \"replace-all\" || task.priority === \"replace-queue\") {\n this.taskList = [];\n }\n\n // STARTING PLAY VIDEO\n if (task.kind === \"play-video-task\") {\n this.showVideo();\n // this.pauseAudio()\n this.loadVideo(task.url);\n if (task.loop) {\n this.videoElement.loop = true;\n isBackgroundTask = true;\n } else {\n this.videoElement.loop = false;\n }\n\n try {\n this.videoElement.play();\n } catch (e) {\n console.error(e);\n }\n }\n\n // STARTING PLAY AUDIO\n if (task.kind === \"play-audio-task\") {\n if (!this.videoElement.loop) {\n this.pauseVideo();\n }\n if (task.url !== this.audioElement.src) {\n this.audioElement.src = task.url;\n }\n this.audioElement.play();\n }\n\n if (task.kind === \"delay-task\") {\n if (typeof this.delayRef === \"number\") {\n window.clearTimeout(this.delayRef);\n }\n this.delayRef = window.setTimeout(() => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n }, task.duration);\n }\n\n if (isBackgroundTask) {\n const startNextTask = this.getNextTask();\n if (startNextTask) {\n this.execute(startNextTask);\n }\n }\n\n return true;\n }\n\n setVideoStyles(styles: PStyle) {\n this.videoStyles = { ...styles };\n DStyle.applyStyles(this.videoElement, this.videoStyles, this.scale.scale);\n }\n\n autoPlaySequence(tasks: Task[]) {\n this.taskList = [...tasks];\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n if (next.kind === \"play-video-task\" && next.loop) {\n this.videoElement.loop = true;\n }\n }\n }\n\n loadVideo(url: string) {\n // console.log(\"LOAD VIDEO \" + !!url + \" \");\n if (this.videoElement.src !== url) {\n this.videoElement.src = url;\n }\n this.showVideo();\n }\n\n private playVideoElement() {\n this.videoElement\n .play()\n .then(() => {})\n .catch((e) => {\n console.log(e);\n this.onError(\"Error playing video.\");\n });\n }\n\n private showVideo() {\n this.videoElement.style.display = \"block\";\n }\n\n private hideVideo() {\n this.videoElement.style.display = \"none\";\n }\n\n pauseVideo() {\n try {\n if (!this.videoElement.loop) {\n this.videoElement.pause();\n }\n } catch (e) {\n console.log(e);\n this.onError(\"Error pausing video.\");\n }\n }\n\n pauseAudio() {\n try {\n if (!this.audioElement.loop) {\n this.audioElement.pause();\n }\n } catch (e) {\n console.log(e);\n this.onError(\"Error pausing audio.\");\n }\n }\n\n private getNextTask(): Task | false {\n // console.log(\"Getting next task.\");\n // console.log(this.taskList);\n const first = this.taskList.shift();\n return first ?? false;\n }\n\n muteVideo() {\n this.videoElement.muted = true;\n }\n\n unMuteVideo() {\n this.videoElement.muted = false;\n }\n}\n","import { SchemaDto } from \"./SchemaDto\";\nimport { DPlayer } from \"./dplayer\";\nimport { ScaleService } from \"./scale\";\nimport { Page } from \"../page/Page\";\nimport { TaskManager } from \"../page/task-manager\";\nimport { PageResult } from \"../page/page-result\";\nimport { SchemaResult } from \"./SchemaResult\";\nexport interface EngineLogger {\n info(message: string): void;\n error(message: string): void;\n warn(message: string): void;\n}\n\nconst voidLogger: EngineLogger = {\n info: (message: string) => {},\n error: (message: string) => {},\n warn: (message: string) => {},\n};\n\nexport interface ISchemaEngine {\n onProgress(handler: (result: SchemaResult) => void): void;\n onFatalError(handler: (error: { message: string }) => void): void;\n setLogger(logger: EngineLogger): void;\n}\n\nexport class SchemaEngine implements ISchemaEngine {\n private readonly TAG = \"[ SCHEMA_ENGINE ] :\";\n private readonly scale: ScaleService;\n private readonly hostElement: HTMLDivElement;\n private readonly taskManager: TaskManager;\n private logger: EngineLogger = voidLogger;\n private readonly uiLayer: HTMLDivElement = document.createElement(\"div\");\n private readonly mediaLayer: HTMLDivElement = document.createElement(\"div\");\n private player: DPlayer;\n private currentPage: Page | false = false;\n private readonly tickerRef: number | false = false;\n constructor(\n hostEl: HTMLDivElement,\n private readonly height: number,\n private readonly width: number,\n private readonly schema: SchemaDto,\n ) {\n this.tickerRef = window.setInterval(() => {\n if (this.currentPage) {\n this.currentPage.tick();\n }\n }, 100);\n this.hostElement = hostEl;\n this.hostElement.appendChild(this.mediaLayer);\n this.hostElement.appendChild(this.uiLayer);\n this.scale = new ScaleService({\n baseHeight: schema.baseHeight,\n baseWidth: schema.baseWidth,\n containerWidth: this.width,\n containerHeight: this.height,\n });\n this.logger.info(this.TAG + \"Scale: \" + JSON.stringify(this.scale));\n this.player = new DPlayer(this.schema);\n this.taskManager = new TaskManager(this.mediaLayer, this.scale, (error) => {\n console.log(error);\n });\n\n this.styleSelf();\n this.handlePageCompleted = this.handlePageCompleted.bind(this);\n this.nextPage();\n }\n\n private handlePageCompleted(result: PageResult) {\n // 1 Save data from last page\n this.player.saveHistory(result);\n\n // 2 Emit progress\n const currentResults = this.player.getResults();\n const a: SchemaResult = {\n schemaId: this.schema.id,\n pagesLeft: currentResults.pagesLeft,\n predefinedFacts: currentResults.predefinedFacts,\n eventLog: currentResults.eventLog,\n answers: currentResults.answerFacts,\n };\n if (this._onProgress) {\n this._onProgress(a);\n }\n\n // 3. Next page\n this.nextPage();\n }\n\n private styleSelf() {\n this.hostElement.style.height = this.scale.pageHeight + \"px\";\n this.hostElement.style.width = this.scale.pageWidth + \"px\";\n this.hostElement.style.backgroundColor = this.schema.backgroundColor ?? \"white\";\n this.hostElement.style.position = \"relative\";\n // this.hostElement.style.overflow = \"hidden\";\n const makeStatic = (div: HTMLDivElement) => {\n div.style.height = \"0px\";\n div.style.width = \"0px\";\n div.style.position = \"static\";\n };\n\n makeStatic(this.uiLayer);\n this.uiLayer.style.zIndex = \"10\";\n this.mediaLayer.style.zIndex = \"8\";\n makeStatic(this.mediaLayer);\n }\n\n private nextPage() {\n const nextPage = this.player.getNextPage();\n if (this.currentPage) {\n this.currentPage.destroy();\n this.uiLayer.innerHTML = \"\";\n }\n\n // console.log(nextPage);\n if (nextPage && nextPage.videoPlayer && nextPage.videoPlayer.style) {\n this.taskManager.setVideoStyles(nextPage.videoPlayer.style);\n }\n\n if (!nextPage) {\n // TODO FIGURE OUT WHAQT TO DO AT END OF TEST!! Start over??\n this.player = new DPlayer(this.schema);\n if (this.player.pagesLeft > 0) {\n this.nextPage();\n }\n return false;\n }\n\n const newPage = new Page(nextPage, this.taskManager, this.scale, (result) => {\n this.handlePageCompleted(result);\n });\n this.currentPage = newPage;\n newPage.appendYourself(this.uiLayer);\n return true;\n }\n\n destroy() {\n if (this.currentPage) {\n this.currentPage.destroy();\n this.uiLayer.innerHTML = \"\";\n }\n }\n\n private _onProgress: ((result: SchemaResult) => void) | false = false;\n onProgress(handler: (result: SchemaResult) => void) {\n this._onProgress = handler;\n }\n\n private _onFatalError: ((error: { message: string }) => void) | false = false;\n onFatalError(handler: (error: { message: string }) => void): void {\n this._onFatalError = handler;\n }\n setLogger(logger: EngineLogger) {\n this.logger = logger;\n }\n}\n"],"mappings":"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","names":["DUtil","isNumber","Condition","condition","Rule","tag","Scale","DCss","DStyle","DTimestamp","dto"]}
|
|
1
|
+
{"version":3,"sources":["../src/public-api.ts","../src/engine/history-que.ts","../src/utils/DUtil.ts","../src/rules/condition.ts","../src/rules/rule.ts","../src/rules/rule-engine.ts","../src/engine/next-que.ts","../src/engine/dplayer.ts","../src/engine/scale.ts","../src/Delement/css.ts","../src/Delement/DStyle.ts","../src/common/DTimestamp.ts","../src/page/task-state.ts","../src/Delement/DElement.ts","../src/Delement/Ddiv.ts","../src/Delement/DImg.ts","../src/Delement/DText.ts","../src/Delement/DButton.ts","../src/Delement/element-factory.ts","../src/Delement/button-click-action.ts","../src/events/mq-events.ts","../src/page/Page.ts","../src/page/task.ts","../src/page/task-manager.ts","../src/engine/SchemaEngine.ts"],"sourcesContent":["export * from \"./engine/SchemaResult\";\nexport * from \"./engine/SchemaEngine\";\nexport * from \"./engine/SchemaDto\";\nexport * from \"./engine/page-que-ruleengine-action\";\nexport * from \"./rules/rule\";\nexport * from \"./rules/fact\";\nexport * from \"./rules/rule-engine\";\nexport * from \"./rules/condition\";\nexport * from \"./utils/DUtil\";\n// export * from \"./utils/ID\";\n\nexport * from \"./events/mq-events\";\n\n// ELEMENTS\nexport * from \"./Delement/css\";\nexport * from \"./Delement/DStyle\";\nexport * from \"./Delement/DImg\";\nexport * from \"./Delement/DText\";\nexport * from \"./Delement/DButton\";\nexport * from \"./Delement/Ddiv\";\nexport * from \"./Delement/button-click-action\";\nexport * from \"./Delement/DElement\";\nexport * from \"./Delement/DElement.dto\";\nexport { PageDto } from \"./page/Page\";\nexport * from \"./page/task\";\n","import { Fact } from \"../rules/fact\";\nimport { PageResult } from \"../page/page-result\";\n\nexport class HistoryQue {\n private history: PageResult[] = [];\n\n getFacts(): Array<Fact> {\n const answers = this.history.map((h) => h.collectedFacts).flat(1);\n // const facts = answers.map((a) => a.fact);\n // TODO FIND LATEST FACT (answer) if have multiple.\n return answers;\n }\n\n getPageResults(): PageResult[] {\n return [...this.history];\n }\n\n addToHistory(result: PageResult) {\n this.history.push(result);\n }\n}\n","// export type RandomObjectId = string & { randomObjectId: true };\r\nexport namespace DUtil {\r\n export const randomString = (length: number): string => {\r\n const letters = \"abcdefghijklmnopqrstuvxyz\";\r\n const uppercase = letters.toUpperCase();\r\n const all = letters + uppercase;\r\n const abs = Math.abs(length);\r\n let result = \"\";\r\n\r\n for (let i = 0; i < abs; i++) {\r\n const char = all.charAt(Math.floor(Math.random() * all.length));\r\n result += char;\r\n }\r\n return result;\r\n };\r\n\r\n export const randomObjectId = () => randomString(32);\r\n\r\n export const deleteProp = <Obj, Key extends keyof Obj>(obj: Obj, key: Key): Omit<Obj, Key> => {\r\n delete obj[key];\r\n return obj;\r\n };\r\n\r\n export const isInRange = (min: number, max: number) => {\r\n return (value: number) => value >= min && value <= max;\r\n };\r\n export const isInfinity = (number: number) => {\r\n return (\r\n number === Number.POSITIVE_INFINITY ||\r\n number === Number.NEGATIVE_INFINITY ||\r\n number === Infinity\r\n );\r\n };\r\n export type NonEmptyArray<T> = [T, ...T[]];\r\n export const isNonEmptyArray = <T>(array: Array<T>): array is NonEmptyArray<T> => {\r\n return array.length > 0;\r\n };\r\n\r\n export const neverCheck = (args: never) => {\r\n console.log(\"OOPS: This value slipped through the never-check\", args);\r\n };\r\n\r\n export const isString = (str: unknown): str is string => typeof str === \"string\";\r\n\r\n export const hasKey = <T extends string>(\r\n obj: unknown,\r\n key: T,\r\n ): obj is Record<typeof key, unknown> => {\r\n if (!isRecord(obj)) {\r\n return false;\r\n }\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n };\r\n\r\n export const isRecord = (obj: unknown): obj is Record<string, unknown> => {\r\n if (!obj) {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return false;\r\n }\r\n\r\n if (typeof obj !== \"object\") {\r\n return false;\r\n }\r\n\r\n if (obj === null) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n export const isBool = (obj?: boolean): obj is boolean => typeof obj === \"boolean\";\r\n\r\n export const isTrue = (bool?: boolean): bool is true => bool === true;\r\n\r\n export const isFalse = (bool?: boolean): bool is false => bool === false;\r\n\r\n export const isDefined = (obj: unknown): boolean => {\r\n const notNull = obj !== null;\r\n const notUndefined = obj !== undefined;\r\n return notNull && notUndefined;\r\n };\r\n\r\n export const hasKind = (obj: unknown): obj is { readonly kind: string } => {\r\n if (!hasKey(obj, \"kind\")) {\r\n return false;\r\n }\r\n if (typeof obj.kind !== \"string\") {\r\n return false;\r\n }\r\n return obj.kind.length > 0;\r\n };\r\n\r\n export const hasValue = (obj: unknown): obj is { value: unknown } => {\r\n return hasKey(obj, \"value\");\r\n };\r\n export const isNumber = (value?: number): value is number => {\r\n const isNumber = typeof value === \"number\";\r\n const notNaN = !Number.isNaN(value);\r\n return isNumber && notNaN;\r\n };\r\n\r\n export const maxFn = (upperLimit: number) => {\r\n return (value: number) => {\r\n return Math.min(value, upperLimit);\r\n };\r\n };\r\n\r\n export const minFn = (lowerLimit: number) => {\r\n return (value: number) => {\r\n return Math.min(value, lowerLimit);\r\n };\r\n };\r\n}\r\n","import { Fact } from \"./fact\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\nexport type Condition = Condition.String | Condition.Numeric | Condition.Complex;\r\n\r\nexport namespace Condition {\r\n export type StringOperator = \"eq\" | \"not-eq\" | \"longer-then\" | \"shorter-then\";\r\n\r\n export type NumericOperator =\r\n | \"eq\"\r\n | \"not-eq\"\r\n | \"greater-then\"\r\n | \"less-then\"\r\n | \"greater-then-inclusive\"\r\n | \"less-then-inclusive\";\r\n\r\n export interface Numeric {\r\n readonly referenceId: string;\r\n readonly referenceLabel: string;\r\n readonly valueLabel: string;\r\n readonly kind: \"numeric-condition\";\r\n readonly operator: NumericOperator;\r\n readonly value: number;\r\n }\r\n export interface String {\r\n readonly referenceId: string;\r\n readonly referenceLabel: string;\r\n readonly valueLabel: string;\r\n readonly kind: \"string-condition\";\r\n readonly operator: StringOperator;\r\n readonly value: string;\r\n }\r\n\r\n export interface Complex {\r\n readonly kind: \"complex-condition\";\r\n readonly name: string;\r\n readonly all: ReadonlyArray<Condition.Simple>;\r\n readonly some: ReadonlyArray<Condition.Simple>;\r\n }\r\n\r\n export type Simple = Condition.String | Condition.Numeric;\r\n\r\n /**\r\n * An empty condition will evaluate to false,\r\n * @param condition: Condition.Any\r\n * @param facts\r\n */\r\n export const evaluate = (condition: Condition, facts: ReadonlyArray<Fact>) => {\r\n let result: boolean = false;\r\n switch (condition.kind) {\r\n case \"string-condition\":\r\n result = evaluateSimple(condition, facts);\r\n break;\r\n case \"numeric-condition\":\r\n result = evaluateSimple(condition, facts);\r\n break;\r\n case \"complex-condition\":\r\n result = evaluateComplex(condition, facts);\r\n break;\r\n default:\r\n const check: never = condition;\r\n }\r\n return result;\r\n };\r\n\r\n const evaluateComplex = (condition: Condition.Complex, facts: ReadonlyArray<Fact>): boolean => {\r\n if (condition.some.length === 0 && condition.all.length === 0) {\r\n return false;\r\n }\r\n const allSolved = condition.all.map((condition) => {\r\n return evaluateSimple(condition, facts);\r\n });\r\n\r\n const someEvaluated = condition.some.map((condition) => {\r\n return evaluateSimple(condition, facts);\r\n });\r\n const allResult = allSolved.every(DUtil.isTrue);\r\n const someResult = someEvaluated.length === 0 || someEvaluated.some(DUtil.isTrue);\r\n return someResult && allResult;\r\n };\r\n\r\n const evaluateSimple = (condition: Condition.Simple, facts: ReadonlyArray<Fact>): boolean => {\r\n const fact = facts.find((f) => f.referenceId === condition.referenceId);\r\n if (!fact) {\r\n return false;\r\n }\r\n let res = false;\r\n switch (condition.kind) {\r\n case \"numeric-condition\":\r\n if (fact.kind === \"numeric-fact\") {\r\n res = evaluateNumeric(condition, fact.value);\r\n }\r\n break;\r\n case \"string-condition\":\r\n if (fact.kind === \"string-fact\") {\r\n res = evaluateString(condition, fact.value);\r\n }\r\n break;\r\n default:\r\n const check: never = condition;\r\n }\r\n return res;\r\n };\r\n\r\n export const isEmpty = (complex: Complex) => {\r\n return complex.all.length === 0 && complex.some.length === 0;\r\n };\r\n\r\n const evaluateString = (condition: Readonly<Condition.String>, value: string): boolean => {\r\n const operator = condition.operator;\r\n let result = false;\r\n switch (operator) {\r\n case \"eq\":\r\n result = condition.value === value;\r\n break;\r\n case \"not-eq\":\r\n result = condition.value !== value;\r\n break;\r\n case \"shorter-then\":\r\n result = condition.value !== value;\r\n break;\r\n case \"longer-then\":\r\n result = condition.value !== value;\r\n break;\r\n default:\r\n const check: never = operator;\r\n }\r\n return result;\r\n };\r\n\r\n const evaluateNumeric = (condition: Numeric, value: number): boolean => {\r\n const op = condition.operator;\r\n const conditionValue = condition.value;\r\n let result = false;\r\n switch (op) {\r\n case \"eq\":\r\n result = value === conditionValue;\r\n break;\r\n case \"not-eq\":\r\n result = value !== conditionValue;\r\n break;\r\n case \"greater-then\":\r\n result = value > conditionValue;\r\n break;\r\n case \"greater-then-inclusive\":\r\n result = value >= conditionValue;\r\n break;\r\n case \"less-then\":\r\n result = value < conditionValue;\r\n break;\r\n case \"less-then-inclusive\":\r\n result = value <= conditionValue;\r\n break;\r\n default:\r\n const check: never = op;\r\n }\r\n return result;\r\n };\r\n\r\n const _getAllSimple = (condition: Condition): ReadonlyArray<Condition.Simple> => {\r\n const simple: Array<Condition.Simple> = [];\r\n switch (condition.kind) {\r\n case \"complex-condition\":\r\n simple.push(...condition.all);\r\n simple.push(...condition.some);\r\n break;\r\n case \"numeric-condition\":\r\n simple.push(condition);\r\n break;\r\n case \"string-condition\":\r\n simple.push(condition);\r\n break;\r\n default:\r\n DUtil.neverCheck(condition);\r\n }\r\n return simple;\r\n };\r\n\r\n export const getAllSimpleConditions = (\r\n condition: Condition | Array<Condition>\r\n ): ReadonlyArray<Condition.Simple> => {\r\n const simple: Array<Condition.Simple> = [];\r\n if (Array.isArray(condition)) {\r\n condition.forEach((c) => {\r\n simple.push(..._getAllSimple(c));\r\n });\r\n } else {\r\n simple.push(..._getAllSimple(condition));\r\n }\r\n return simple;\r\n };\r\n}\r\n","import { Condition } from \"./condition\";\r\nimport { Fact } from \"./fact\";\r\nimport { DUtil } from \"../utils/DUtil\";\r\n\r\nexport interface Rule<OnSuccessAction, OnFailureAction> {\r\n readonly id?: string;\r\n readonly description: string;\r\n readonly all: ReadonlyArray<Condition>;\r\n readonly some: ReadonlyArray<Condition>;\r\n readonly onSuccess: ReadonlyArray<OnSuccessAction>;\r\n readonly onFailure: ReadonlyArray<OnFailureAction>;\r\n}\r\n\r\nexport namespace Rule {\r\n /**\r\n * Validates that the rule is valid.\r\n * @param rule\r\n */\r\n\r\n export const isEmpty = (rule: Rule<any, any>): boolean => {\r\n const emptyConditions = rule.all.length === 0 && rule.some.length === 0;\r\n const emptyActions = rule.onSuccess.length === 0 && rule.onFailure.length === 0;\r\n return emptyConditions || emptyActions;\r\n };\r\n\r\n export const solve = (rule: Rule<any, any>, facts: ReadonlyArray<Fact>): boolean => {\r\n if (rule.some.length === 0 && rule.all.length === 0) {\r\n // TODO RETURN WARNING? OR LOGGING ?\r\n return false;\r\n }\r\n\r\n const someSolved = rule.some.map((condition) => Condition.evaluate(condition, facts));\r\n\r\n const someResult = someSolved.length === 0 || someSolved.some(DUtil.isTrue);\r\n\r\n const allSolved = rule.all.map((condition) => Condition.evaluate(condition, facts)).every(DUtil.isTrue);\r\n\r\n return allSolved && someResult;\r\n };\r\n}\r\n","import { Fact } from \"./fact\";\r\nimport { Rule } from \"./rule\";\r\n\r\nexport interface SolveResult<S, F> {\r\n matching: ReadonlyArray<Match<S, F>>;\r\n errors: ReadonlyArray<RuleEngineError>;\r\n}\r\n\r\nexport interface Match<S, F> {\r\n readonly matchingRuleId: string;\r\n readonly ruleDescription: string;\r\n readonly actionList: ReadonlyArray<S> | ReadonlyArray<F>;\r\n}\r\n\r\nexport interface RuleEngineError {\r\n readonly kind?: string;\r\n readonly message: string;\r\n}\r\n\r\nexport class RuleEngine<S, F> {\r\n constructor() {}\r\n\r\n solveAll(rules: Rule<S, F>[], facts: Fact[]): SolveResult<S, F> {\r\n const errors: RuleEngineError[] = [];\r\n const matching: Match<S, F>[] = [];\r\n rules.forEach((rule) => {\r\n if (Rule.isEmpty(rule)) {\r\n errors.push({ message: \"Empty rule: \" + rule.id });\r\n } else if (Rule.solve(rule, facts)) {\r\n const match: Match<S, F> = {\r\n ruleDescription: rule.description,\r\n matchingRuleId: rule.id ?? \"no-id-given\",\r\n actionList: [...rule.onSuccess],\r\n };\r\n matching.push(match);\r\n }\r\n });\r\n return { matching, errors };\r\n }\r\n\r\n solve(rule: Rule<S, F>, facts: Fact[]): boolean {\r\n // TODO Validate, and Return result\r\n return Rule.solve(rule, facts);\r\n }\r\n}\r\n","import { PageDto } from \"../page/Page\";\n\nexport class NextQue {\n private originalOrder: ReadonlyArray<string> = [];\n private allPages: PageDto[] = [];\n private excludedTags = new Set<string>();\n private excludedByPageId = new Set<string>();\n private remaining: PageDto[] = [];\n constructor(pages: PageDto[] = []) {\n this.resetQue(pages);\n }\n\n /**\n * Will reset que with the new pages.\n * @param pages\n */\n resetQue(pages: PageDto[]) {\n this.allPages = [...pages];\n this.remaining = [...pages];\n this.excludedTags = new Set();\n this.excludedByPageId = new Set();\n this.originalOrder = this.allPages.map((p) => p.id);\n }\n\n pop(): PageDto | false {\n const next = this.remaining.shift();\n // TODO CLONE??\n return next ?? false;\n }\n\n peek(): PageDto | false {\n const next = this.remaining[0];\n return next ?? false;\n }\n\n jumpToPageById(pageId: string): boolean {\n const index = this.remaining.findIndex((p) => p.id === pageId);\n if (index < 0) {\n return false;\n }\n this.remaining = this.remaining.slice(index);\n return true;\n }\n\n removeByTag(tag: string | string[]) {\n if (Array.isArray(tag)) {\n tag.forEach((tag) => {\n this.excludedTags.add(tag);\n });\n } else {\n this.excludedTags.add(tag);\n }\n this.filterRemaining();\n }\n\n /**\n * Will not be included\n * @param pages\n */\n insertAsNextByForce(pages: PageDto[]) {\n this.remaining.unshift(...pages);\n }\n\n removeByPageId(pageId: string | string[]) {\n if (Array.isArray(pageId)) {\n pageId.forEach((id) => {\n this.excludedByPageId.add(id);\n });\n } else {\n this.excludedByPageId.add(pageId);\n }\n this.filterRemaining();\n // this.excludedByPageId.add(pageId);\n }\n\n private filterRemaining() {\n this.remaining = this.remaining.filter((p) => {\n const tags = p.tags ?? [];\n const isIncluededByTag = !tags.some((tag) => this.excludedTags.has(tag));\n const isIncludedByPageId = !this.excludedByPageId.has(p.id);\n return isIncludedByPageId && isIncluededByTag;\n });\n }\n get isEmpty(): boolean {\n return this.remaining.length === 0;\n }\n\n /**\n * Total number of pages left in que\n */\n get size(): number {\n return this.remaining.length;\n }\n\n /**\n * Total number of pages in test\n */\n get pageCount(): number {\n return this.originalOrder.length;\n }\n}\n","import { HistoryQue } from \"./history-que\";\nimport { RuleEngine } from \"../rules/rule-engine\";\nimport { NextQue } from \"./next-que\";\nimport { SchemaDto } from \"./SchemaDto\";\nimport { RuleActionPageQue } from \"./page-que-ruleengine-action\";\nimport { PageDto } from \"../page/Page\";\nimport { PageResult } from \"../page/page-result\";\nimport { Fact } from \"../rules/fact\";\nimport { MqEvent } from \"../events/mq-events\";\n\nexport type DPlayerData = Pick<SchemaDto, \"pages\" | \"pageSequences\" | \"rules\" | \"predefinedFacts\">;\nexport class DPlayer {\n private readonly eventLog: Array<MqEvent> = [];\n private history = new HistoryQue();\n private ruleEngine = new RuleEngine<RuleActionPageQue, never>();\n private nextQue = new NextQue();\n private data: DPlayerData;\n private readonly predefinedFacts: ReadonlyArray<Fact>;\n\n constructor(data: DPlayerData) {\n this.data = data;\n const pages = data.pages ?? [];\n this.predefinedFacts = data.predefinedFacts ? [...data.predefinedFacts] : [];\n this.nextQue.resetQue(pages);\n }\n\n saveEvent(event: MqEvent) {\n this.eventLog.push(event);\n }\n\n saveHistory(pageResult: PageResult) {\n // console.log(\"SAVE HISTORY\", pageHistory);\n this.history.addToHistory(pageResult);\n this.eventLog.push(...pageResult.eventLog);\n // Evaluate rules\n const userGeneratedFact = this.history.getFacts();\n const predefinedFacts = this.predefinedFacts;\n const facts = [...userGeneratedFact, ...predefinedFacts];\n const result = this.ruleEngine.solveAll(this.data.rules, facts);\n\n const matchingRules = result.matching;\n const actions = matchingRules.map((r) => r.actionList).flat(1);\n // Execute actions\n actions.forEach((a) => {\n // console.log(a.payload);\n switch (a.kind) {\n case \"jumpToPage\":\n this.nextQue.jumpToPageById(a.pageId);\n break;\n case \"excludeByPageId\":\n this.nextQue.removeByPageId(a.pageIds);\n break;\n case \"excludeByTag\":\n this.nextQue.removeByTag(a.tagIds);\n break;\n default:\n console.log(\"UNKNOWN ACTION\", a);\n const check: never = a;\n }\n });\n }\n\n getResults() {\n const pagesLeft = this.nextQue.size;\n const answerFacts = this.history.getFacts();\n const predefinedFacts = this.predefinedFacts;\n const eventLog = [...this.eventLog];\n const pageResults = this.history.getPageResults();\n // const pageResults = this.history.;\n // console.log(answerFacts);\n return { answerFacts, predefinedFacts, eventLog, pagesLeft, pageResults };\n }\n\n insertSequence(sequenceId: string) {\n this.insertSequenceById(sequenceId);\n }\n\n getNextPage(): PageDto | false {\n const next = this.nextQue.pop();\n return next ?? false;\n }\n\n private insertSequenceById(id: string) {\n const seq = this.data.pageSequences?.find((s) => s.id === id);\n if (seq) {\n this.nextQue.insertAsNextByForce([...seq.pages]);\n } else {\n // HOW TO HANDLE INVALID ID_REFS?? LOGGER??\n // LOG INVALID COMMAND.\n }\n }\n\n /**\n * Total number of pages left in que\n */\n get pagesLeft(): number {\n return this.nextQue.pageCount;\n }\n\n /**\n * Total number of pages in test\n */\n get totalPageCount(): number {\n return this.data.pages.length;\n }\n}\n","export class ScaleService {\r\n private readonly baseHeight;\r\n private readonly baseWidth;\r\n private containerHeight = 1300;\r\n private containerWidth = 1300;\r\n\r\n get scale() {\r\n return this._scale;\r\n }\r\n\r\n get pageHeight() {\r\n return this.baseHeight * this.scale;\r\n }\r\n get pageWidth() {\r\n return this.baseWidth * this._scale;\r\n }\r\n\r\n private _scale = 1;\r\n\r\n private readonly subscribers = new Set<(scale: number) => void>();\r\n\r\n constructor(config: { baseHeight: number; baseWidth: number; containerHeight: number; containerWidth: number }) {\r\n this.baseHeight = config.baseHeight;\r\n this.baseWidth = config.baseWidth;\r\n this.containerHeight = config.containerHeight;\r\n this.containerWidth = config.containerWidth;\r\n this.updateScale();\r\n }\r\n\r\n setContainerBounds(bounds: { height: number; width: number }) {\r\n this.containerWidth = bounds.width;\r\n this.containerHeight = bounds.height;\r\n this.updateScale();\r\n }\r\n private updateScale() {\r\n const scaleFn = Scale.calc(this.baseHeight, this.baseWidth);\r\n const scale = scaleFn({ height: this.containerHeight, width: this.containerWidth });\r\n const hasChanged = this.scale !== scale;\r\n this._scale = scale;\r\n if (hasChanged) {\r\n this.subscribers.forEach((fn) => {\r\n fn(this._scale);\r\n });\r\n }\r\n }\r\n\r\n onChange(scaleChangeHandler: (scale: number) => void, subscriberId: string) {\r\n // console.log(subscriberId);\r\n this.subscribers.add(scaleChangeHandler);\r\n scaleChangeHandler(this._scale);\r\n return () => {\r\n this.subscribers.delete(scaleChangeHandler);\r\n };\r\n }\r\n}\r\nexport namespace Scale {\r\n export const calc = (baseHeight: number, baseWidth: number) => {\r\n return (container: { height: number; width: number }) => {\r\n const heightRatio = container.height / baseHeight;\r\n const widthRatio = container.width / baseWidth;\r\n return Math.min(heightRatio, widthRatio);\r\n };\r\n };\r\n\r\n type ScalePosInput = { x: number; y: number; h: number; w: number };\r\n\r\n export const scaleFunctionCreator = (scale: number) => {\r\n return (value: number) => value * scale;\r\n };\r\n}\r\n","import { DUtil } from \"../utils/DUtil\";\n\nexport namespace DCss {\n export interface Px {\n readonly _unit: \"px\";\n readonly value: number;\n }\n\n export type LengthString = `${number}px` | `${number}%`;\n export interface Percent {\n readonly _unit: \"percent\";\n readonly value: number;\n }\n\n export type LengthUnit = Px | Percent | number;\n\n /**\n * Will scale to 3% of baseScale\n * @param unit\n * @param scale\n */\n export const toString = (unit: Readonly<LengthUnit>, scale: number): LengthString => {\n const _mapped: Percent | Px =\n typeof unit === \"number\" ? { _unit: \"percent\", value: unit } : unit;\n return _toString(_mapped, scale);\n };\n const _toString = (unit: Readonly<Percent | Px>, scale: number): LengthString => {\n const clampedScale = Math.max(scale, 0.03);\n if (unit._unit === \"px\") {\n if (unit.value < 0.1) {\n return \"0px\";\n }\n\n const rounded = Math.round(unit.value * clampedScale);\n const clamped = Math.max(rounded, 1);\n return (clamped + \"px\") as LengthString;\n }\n return (unit.value + \"%\") as LengthString;\n };\n\n export const isLengthUnit = (unit?: LengthUnit): unit is LengthUnit => {\n if (typeof unit === \"number\") {\n return true;\n }\n\n if (!unit) {\n return false;\n }\n\n const unitKey: keyof DCss.Px = \"_unit\";\n const valueKey: keyof DCss.Px = \"value\";\n const hasUnitKey = DUtil.hasKey(unit, unitKey);\n const hasValueKey = DUtil.hasKey(unit, valueKey);\n return hasUnitKey && hasValueKey;\n };\n}\n","import { DCss } from \"./css\";\nimport { DUtil } from \"../utils/DUtil\";\n\nexport type PStyle = Partial<DStyle>;\nexport interface DStyle {\n opacity: number;\n backgroundColor: string;\n visibility: \"visible\" | \"hidden\";\n cursor:\n | \"pointer\"\n | \"help\"\n | \"copy\"\n | \"wait\"\n | \"not-allowed\"\n | \"context-menu\"\n | \"move\"\n | \"grabbing\"\n | \"grab\"\n | \"zoom-in\"\n | \"zoom-out\"\n | \"none\"\n | \"auto\"\n | \"default\";\n\n zIndex: number;\n // POSITION\n h: number;\n w: number;\n x: number;\n y: number;\n height: DCss.LengthUnit;\n maxHeight: DCss.LengthUnit;\n minHeight: DCss.LengthUnit;\n width: DCss.LengthUnit;\n maxWidth: DCss.LengthUnit;\n minWidth: DCss.LengthUnit;\n bottom: DCss.LengthUnit;\n top: DCss.LengthUnit;\n left: DCss.LengthUnit;\n right: DCss.LengthUnit;\n boxShadow: string;\n\n // BORDERS\n borderStyle: \"solid\" | \"none\" | \"dotted\" | \"dashed\";\n borderRadius: DCss.Px | DCss.Percent;\n borderWidth: DCss.Px;\n borderColor: string;\n\n margin: DCss.Px | DCss.Percent;\n padding: DCss.Px | DCss.Percent;\n paddingLeft: DCss.Px | DCss.Percent;\n paddingRight: DCss.Px | DCss.Percent;\n paddingTop: DCss.Px | DCss.Percent;\n paddingBottom: DCss.Px | DCss.Percent;\n\n // Translate\n transform: string;\n translate: string;\n\n // TEXT\n fontSize: DCss.Px;\n textColor: string;\n fontWeight: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n textAlign: \"right\" | \"left\" | \"center\";\n letterSpacing: DCss.Px;\n lineHeight: number;\n\n // LAYOUT & POSITIONING OVERRIDE\n position: \"absolute\" | \"relative\";\n flex: string;\n display: \"flex\" | \"block\";\n flexDirection: \"row\" | \"colum\";\n flexWrap: \"nowrap\" | \"wrap\";\n justifyContent:\n | \"flex-start\"\n | \"flex-end\"\n | \"center\"\n | \"space-around\"\n | \"space-evenly\"\n | \"space-between\";\n alignItems: \"stretch\" | \"baseline\" | \"center\" | \"flex-start\" | \"flex-end\";\n gap: DCss.Px;\n alignContent:\n | \"stretch\"\n | \"center\"\n | \"flex-start\"\n | \"flex-end\"\n | \"space-around\"\n | \"space-evenly\"\n | \"space-between\";\n}\n\nexport namespace DStyle {\n // import isNumber = DUtil.isNumber;\n import isLengthUnit = DCss.isLengthUnit;\n export const normalize = <T extends HTMLElement>(el: T): T => {\n const s = el.style;\n s.position = \"absolute\";\n s.boxSizing = \"border-box\";\n s.padding = \"0px\";\n s.margin = \"0px\";\n\n s.height = \"\";\n s.width = \"fit-content\";\n\n s.bottom = \"\";\n s.top = \"\";\n s.left = \"\";\n s.right = \"\";\n s.flex = \"none\";\n\n s.boxShadow = \"\";\n s.fontSize = \"12px\";\n s.lineHeight = \"1\";\n s.textAlign = \"center\";\n s.textDecoration = \"none\";\n s.boxShadow = \"\";\n s.boxSizing = \"border-box\";\n s.fontWeight = \"500\";\n s.borderStyle = \"\";\n s.borderRadius = \"\";\n s.borderWidth = \"\";\n s.borderWidth = \"0px\";\n s.borderColor = \"black\";\n s.backgroundColor = \"\";\n s.border = \"\";\n s.borderStyle = \"none\";\n s.outline = \"\";\n s.wordSpacing = \"\";\n s.userSelect = \"none\";\n s.textShadow = \"\";\n return el;\n };\n\n export const applyStyles = <T extends HTMLElement>(\n el: T,\n style: Partial<DStyle>,\n scale: number,\n ): T => {\n const { isNumber, isString } = DUtil;\n // const scalePx = DCss.toStringCre(this.scale);\n const {\n x,\n y,\n left,\n right,\n top,\n bottom,\n backgroundColor,\n borderColor,\n borderWidth,\n borderRadius,\n borderStyle,\n w,\n opacity,\n cursor,\n fontSize,\n fontWeight,\n lineHeight,\n textColor,\n textAlign,\n translate,\n flex,\n margin,\n padding,\n letterSpacing,\n h,\n height,\n width,\n transform,\n visibility,\n justifyContent,\n alignContent,\n flexWrap,\n display,\n flexDirection,\n alignItems,\n position,\n paddingLeft,\n paddingTop,\n paddingRight,\n paddingBottom,\n gap,\n\n zIndex,\n //\n boxShadow,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n } = style;\n\n if (isNumber(zIndex)) {\n el.style.zIndex = \"\" + zIndex;\n }\n if (isString(flex)) {\n el.style.flex = flex;\n }\n\n if (DCss.isLengthUnit(minWidth)) {\n el.style.minWidth = DCss.toString(minWidth, scale);\n }\n\n if (DCss.isLengthUnit(maxWidth)) {\n el.style.maxWidth = DCss.toString(maxWidth, scale);\n }\n\n if (typeof lineHeight === \"number\") {\n el.style.lineHeight = \"\" + lineHeight;\n }\n\n if (DCss.isLengthUnit(minHeight)) {\n el.style.minHeight = DCss.toString(minHeight, scale);\n }\n\n if (DCss.isLengthUnit(maxHeight)) {\n el.style.maxHeight = DCss.toString(maxHeight, scale);\n }\n\n if (boxShadow) {\n el.style.boxShadow = boxShadow;\n }\n\n if (gap) {\n el.style.gap = DCss.toString(gap, scale);\n }\n\n if (paddingLeft) {\n el.style.paddingLeft = DCss.toString(paddingLeft, scale);\n }\n\n if (paddingRight) {\n el.style.paddingRight = DCss.toString(paddingRight, scale);\n }\n\n if (paddingTop) {\n el.style.paddingTop = DCss.toString(paddingTop, scale);\n }\n\n if (paddingBottom) {\n el.style.paddingBottom = DCss.toString(paddingBottom, scale);\n }\n\n if (position) {\n el.style.position = position;\n }\n if (justifyContent) {\n el.style.justifyContent = justifyContent;\n }\n\n if (alignContent) {\n el.style.alignContent = alignContent;\n }\n if (flexWrap) {\n el.style.flexWrap = flexWrap;\n }\n if (display) {\n el.style.display = display;\n }\n if (flexDirection) {\n el.style.flexDirection = flexDirection;\n }\n if (alignItems) {\n el.style.alignItems = alignItems;\n }\n\n // this.el.style.fontWeight = '900';\n if (backgroundColor) {\n el.style.backgroundColor = backgroundColor;\n }\n\n if (cursor) {\n el.style.cursor = cursor;\n }\n\n if (transform) {\n el.style.transform = transform;\n }\n\n if (textColor) {\n el.style.color = textColor;\n }\n if (textAlign) {\n el.style.textAlign = textAlign;\n }\n\n if (borderColor) {\n el.style.borderColor = borderColor;\n }\n\n if (borderWidth) {\n el.style.borderWidth = DCss.toString(borderWidth, scale);\n }\n\n if (fontWeight) {\n el.style.fontWeight = fontWeight + \"\";\n }\n\n if (borderStyle) {\n el.style.borderStyle = borderStyle;\n }\n\n if (fontSize) {\n el.style.fontSize = DCss.toString(fontSize, scale);\n }\n\n if (DUtil.isNumber(x)) {\n el.style.left = x + \"%\";\n }\n\n if (DUtil.isNumber(y)) {\n el.style.bottom = y + \"%\";\n }\n\n if (DCss.isLengthUnit(height)) {\n el.style.height = DCss.toString(height, scale);\n }\n\n if (DCss.isLengthUnit(width)) {\n el.style.width = DCss.toString(width, scale);\n }\n\n if (DCss.isLengthUnit(left)) {\n el.style.left = DCss.toString(left, scale);\n }\n\n if (DCss.isLengthUnit(right)) {\n el.style.right = DCss.toString(right, scale);\n }\n\n if (DCss.isLengthUnit(bottom)) {\n el.style.bottom = DCss.toString(bottom, scale);\n }\n\n if (DCss.isLengthUnit(top)) {\n el.style.top = DCss.toString(top, scale);\n }\n\n if (DUtil.isNumber(h)) {\n el.style.height = DCss.toString(h, scale);\n }\n\n if (isNumber(w)) {\n el.style.width = DCss.toString(w, scale);\n }\n\n if (DCss.isLengthUnit(borderRadius)) {\n el.style.borderRadius = DCss.toString(borderRadius, scale);\n }\n\n if (letterSpacing) {\n el.style.letterSpacing = DCss.toString(letterSpacing, scale);\n }\n\n if (margin) {\n el.style.margin = DCss.toString(margin, scale);\n }\n\n if (padding) {\n el.style.padding = DCss.toString(padding, scale);\n }\n\n if (isNumber(opacity)) {\n el.style.opacity = opacity + \"\";\n }\n\n if (visibility) {\n el.style.visibility = visibility;\n }\n return el;\n };\n\n // const propNames = new Set(...ElementKeyNames);\n // export const validKey = (keyName: string) => propNames.has(keyName);\n}\n","export type DTimestamp = number & { __timestamp__: true };\r\nexport namespace DTimestamp {\r\n export const now = () => Date.now() as DTimestamp;\r\n export type Diff = number & { __diff__: true };\r\n\r\n export const addMills = (t: DTimestamp, ms: number): DTimestamp => {\r\n const res = t + Math.abs(ms);\r\n return res as DTimestamp;\r\n };\r\n\r\n export const diff = (t1: DTimestamp, t2: DTimestamp): Diff => {\r\n const t1Abs = Math.abs(t1);\r\n const t2Abs = Math.abs(t2);\r\n return Math.abs(t1Abs - t2Abs) as Diff;\r\n };\r\n\r\n export const diffNow = (t: DTimestamp): Diff => {\r\n return diff(t, now());\r\n };\r\n}\r\n","import { DTimestamp } from \"../common/DTimestamp\";\nimport diff = DTimestamp.diff;\n\nexport type TaskState = {\n audioIsPlaying: boolean;\n isGifMode: boolean;\n videoPlayState:\n | \"playing\"\n | \"paused\"\n | \"ended\"\n | \"playing-and-muted\"\n | \"paused-and-muted\"\n | \"ended-and-muted\";\n blockFormInput: boolean;\n blockResponseButton: boolean;\n blockAudio: boolean;\n blockVideo: boolean;\n};\n\nexport type TaskStateDiff = Partial<TaskState> & { __diffed__: true };\nexport const TaskState = {\n eq: (a: TaskState, b: TaskState) => {\n return (\n a.audioIsPlaying === b.audioIsPlaying &&\n a.isGifMode === b.isGifMode &&\n a.videoPlayState === b.videoPlayState &&\n a.blockFormInput === b.blockFormInput &&\n a.blockResponseButton === b.blockResponseButton &&\n a.blockAudio === b.blockAudio &&\n a.blockVideo === b.blockVideo\n );\n },\n\n getDiff: (curr: TaskState, prev: TaskState | false): TaskStateDiff => {\n if (prev === false) {\n return curr as TaskStateDiff;\n }\n\n const diff = {} as TaskStateDiff;\n\n if (curr.audioIsPlaying !== prev.audioIsPlaying) {\n diff.audioIsPlaying = curr.audioIsPlaying;\n }\n if (curr.isGifMode !== prev.isGifMode) {\n diff.isGifMode = curr.isGifMode;\n }\n if (curr.videoPlayState !== prev.videoPlayState) {\n diff.videoPlayState = curr.videoPlayState;\n }\n\n if (curr.blockFormInput !== prev.blockFormInput) {\n diff.blockFormInput = curr.blockFormInput;\n }\n if (curr.blockResponseButton !== prev.blockResponseButton) {\n diff.blockResponseButton = curr.blockResponseButton;\n }\n if (curr.blockAudio !== prev.blockAudio) {\n diff.blockAudio = curr.blockAudio;\n }\n if (curr.blockVideo !== prev.blockVideo) {\n diff.blockVideo = curr.blockVideo;\n }\n return diff;\n },\n};\n","import { DStyle, PStyle } from \"./DStyle\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\nimport { TaskState, TaskStateDiff } from \"../page/task-state\";\n\nexport interface DElementBaseDto {\n readonly style: PStyle;\n readonly onMouseEnter?: PStyle;\n readonly onMouseLeave?: PStyle;\n readonly onMouseDown?: PStyle;\n readonly onMouseUp?: PStyle;\n readonly innerText?: string;\n\n // ACTIONS HANDLERS\n readonly onClick?: ButtonClickAction;\n\n // VIDEO STATED\n readonly whenVideoPaused?: PStyle;\n readonly whenVideoPausedAndMuted?: PStyle;\n readonly whenVideoEnded?: PStyle;\n readonly whenVideoEndedAndMuted?: PStyle;\n readonly whenVideoPlaying?: PStyle;\n readonly whenVideoPlayingAndMuted?: PStyle;\n\n readonly whenAudioPlaying?: PStyle;\n readonly whenAudioPaused?: PStyle;\n readonly whenAudioBlocked?: PStyle;\n readonly whenVideoBlocked?: PStyle;\n readonly whenAudioUnblocked?: PStyle;\n readonly whenVideoUnblocked?: PStyle;\n readonly whenResponseBlocked?: PStyle;\n readonly whenResponseUnblocked?: PStyle;\n readonly whenFormInputBlocked?: PStyle;\n readonly whenFormInputUnblocked?: PStyle;\n}\n\nconst isFalse = (bool?: boolean): bool is false => bool === false;\nconst isTrue = (bool?: boolean): bool is true => bool === true;\n\nexport abstract class DElement<T extends HTMLElement> {\n private prevState: TaskState | false = false;\n\n protected currStyle: Partial<DStyle> = {\n fontSize: { _unit: \"px\", value: 100 },\n fontWeight: 500,\n textColor: \"black\",\n opacity: 1,\n };\n\n protected constructor(\n protected readonly el: T,\n protected readonly dto: DElementBaseDto,\n protected readonly scale: ScaleService,\n ) {\n if (dto.innerText) {\n this.el.innerText = dto.innerText;\n }\n this.setStyle = this.setStyle.bind(this);\n // this.normalize = this.normalize.bind(this);\n this.appendYourself = this.appendYourself.bind(this);\n this.updateStyles = this.updateStyles.bind(this);\n const { onMouseEnter, onMouseLeave } = dto;\n\n if (onMouseEnter) {\n this.el.onmouseenter = () => {\n this.setStyle(onMouseEnter);\n };\n }\n if (onMouseLeave) {\n this.el.onmouseleave = () => {\n this.setStyle(onMouseLeave);\n };\n }\n\n DStyle.normalize(this.el);\n\n if (dto) {\n this.updateStyles(dto?.style);\n }\n }\n\n /**\n * This method is called when the element is clicked.\n * This method shall be overridden by the pageClass.\n * @param style\n */\n setStyle(style: PStyle) {\n this.updateStyles(style);\n }\n\n getElementByDangerousReference() {\n return this.el;\n }\n\n appendYourself(parent: { append: (el: HTMLElement) => void }) {\n parent.append(this.el);\n // console.log(parent);\n }\n\n updateState(state: TaskStateDiff) {\n this.handleStateChanges(state);\n }\n\n setState(state: TaskState) {\n const prev = this.prevState;\n const diff = TaskState.getDiff(state, prev);\n this.prevState = state;\n if (Object.keys(diff).length > 0) {\n this.handleStateChanges(diff);\n }\n }\n\n private handleStateChanges(diff: TaskStateDiff) {\n const {\n audioIsPlaying,\n videoPlayState,\n blockAudio,\n blockVideo,\n blockResponseButton,\n blockFormInput,\n isGifMode,\n } = diff;\n const {\n whenAudioPaused,\n whenVideoPaused,\n whenAudioPlaying,\n whenFormInputBlocked,\n whenResponseBlocked,\n\n whenVideoPlaying,\n whenVideoEnded,\n\n whenAudioBlocked,\n whenVideoBlocked,\n whenAudioUnblocked,\n whenVideoUnblocked,\n whenResponseUnblocked,\n whenFormInputUnblocked,\n whenVideoPausedAndMuted,\n whenVideoEndedAndMuted,\n whenVideoPlayingAndMuted,\n } = this.dto;\n\n if (isTrue(audioIsPlaying) && whenAudioPlaying) {\n this.setStyle(whenAudioPlaying);\n }\n\n if (isFalse(audioIsPlaying) && whenAudioPaused) {\n this.setStyle(whenAudioPaused);\n }\n\n if (videoPlayState === \"playing\" && whenVideoPlaying) {\n this.setStyle(whenVideoPlaying);\n }\n\n if (videoPlayState === \"paused\" && whenVideoPaused) {\n this.setStyle(whenVideoPaused);\n }\n\n if (videoPlayState === \"ended\" && whenVideoEnded) {\n this.setStyle(whenVideoEnded);\n }\n if (videoPlayState === \"playing-and-muted\" && whenVideoPlayingAndMuted) {\n this.setStyle(whenVideoPlayingAndMuted);\n }\n\n if (videoPlayState === \"paused-and-muted\" && whenVideoPausedAndMuted) {\n this.setStyle(whenVideoPausedAndMuted);\n }\n\n if (videoPlayState === \"ended-and-muted\" && whenVideoEndedAndMuted) {\n this.setStyle(whenVideoEndedAndMuted);\n }\n }\n\n // private normalize() {\n // this.el.style.padding = \"0\";\n // this.el.style.margin = \"0\";\n // this.el.style.position = \"absolute\";\n // this.el.style.boxSizing = \"border-box\";\n // }\n\n abstract registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void;\n\n protected updateStyles(style: Partial<DStyle>) {\n this.currStyle = Object.assign(this.currStyle, style);\n DStyle.applyStyles(this.el, this.currStyle, this.scale.scale);\n window.getComputedStyle(this.el);\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { DText, DTextDto } from \"./DText\";\nimport { DImg, DImgDto } from \"./DImg\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DButton, DButtonDto } from \"./DButton\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DDivDto extends DElementBaseDto {\n readonly _tag: \"div\";\n readonly children: Array<DTextDto | DImgDto | DButtonDto>;\n}\n\nexport class DDiv extends DElement<HTMLDivElement> {\n private readonly TAG = \"[ DDiv ]: \";\n protected readonly defaultStyle = { x: 22, y: 4 };\n private children: Array<DText | DImg | DButton> = [];\n\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n this.children.forEach((child) => {\n child.registerClickHandler(clickHandler);\n });\n }\n\n constructor(dto: DDivDto, scale: ScaleService, children: Array<DText | DImg | DButton>) {\n const d = document.createElement(\"div\");\n super(d, dto, scale);\n this.children = children;\n\n this.children.forEach((child) => {\n child.appendYourself(this.el);\n });\n }\n protected whenConstructed() {\n this.children.forEach((child) => {\n console.log(child);\n });\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DTimestamp } from \"../common/DTimestamp\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DImgDto extends DElementBaseDto {\n readonly _tag: \"img\";\n // readonly id: string;\n readonly url: string;\n}\n\nexport class DImg extends DElement<HTMLImageElement> {\n private static IMAGE_COUNT = 0;\n private readonly imageCount: number;\n readonly TAG: string;\n readonly TIMING_TAG: string;\n private readonly loadStart: DTimestamp;\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void): void {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n }\n\n constructor(\n protected readonly dto: DImgDto,\n readonly scaleService: ScaleService,\n ) {\n super(document.createElement(\"img\"), dto, scaleService);\n DImg.IMAGE_COUNT += 1;\n this.imageCount = DImg.IMAGE_COUNT;\n this.TAG = \"[D_IMG \" + DImg.IMAGE_COUNT + \" ]: \";\n this.TIMING_TAG = \"load-time (\" + DImg.IMAGE_COUNT + \") \";\n this.el.loading = \"eager\";\n this.el.style.position = \"absolute\";\n this.setStyle(dto.style);\n\n this.loadStart = DTimestamp.now();\n this.el.onload = () => {};\n this.el.onerror = () => {};\n this.el.src = dto.url;\n console.time(this.TIMING_TAG);\n }\n\n log(): void {}\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DTextDto extends DElementBaseDto {\n readonly _tag: \"p\";\n readonly innerText: string;\n}\n\nexport class DText extends DElement<HTMLParagraphElement> {\n constructor(dto: DTextDto, scale: ScaleService) {\n super(document.createElement(\"p\"), dto, scale);\n }\n\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const onClick = this.dto.onClick;\n if (onClick) {\n clickHandler(onClick);\n }\n };\n }\n}\n","import { DElement, DElementBaseDto } from \"./DElement\";\nimport { ScaleService } from \"../engine/scale\";\nimport { ButtonClickAction } from \"./button-click-action\";\n\nexport interface DButtonDto extends DElementBaseDto {\n readonly _tag: \"button\";\n}\n\nexport class DButton extends DElement<HTMLButtonElement> {\n private readonly TAG = \"[ DDiv ]: \";\n protected readonly defaultStyle = { x: 40, y: 40 };\n\n constructor(dto: DButtonDto, scale: ScaleService) {\n const d = document.createElement(\"button\");\n super(d, dto, scale);\n }\n registerClickHandler(clickHandler: (action: ButtonClickAction) => void) {\n this.el.onclick = () => {\n const action = this.dto.onClick;\n if (action) {\n clickHandler(action);\n }\n };\n }\n}\n","import { DElement } from \"./DElement\";\nimport { DDiv, DDivDto } from \"./Ddiv\";\nimport { DImg } from \"./DImg\";\nimport { DText } from \"./DText\";\nimport { ScaleService } from \"../engine/scale\";\nimport { DElementDto } from \"./DElement.dto\";\nimport { DButton } from \"./DButton\";\n\nexport const createDElement = (dto: DElementDto, scale: ScaleService): DElement<any> => {\n switch (dto._tag) {\n case \"div\":\n const childEls = createChildrenForDiv(dto, scale);\n return new DDiv(dto, scale, childEls);\n case \"img\":\n return new DImg(dto, scale);\n case \"p\":\n return new DText(dto, scale);\n case \"button\":\n return new DButton(dto, scale);\n default:\n const check: never = dto;\n throw new Error(\"Unknown dto given to the createDElement function.\");\n // TODO LOGGING or create any HTML-ELEMENT??\n }\n};\n\nconst createChildrenForDiv = (dto: DDivDto, scale: ScaleService): DDiv[\"children\"] => {\n const childDto = dto.children;\n const childEls: Array<DImg | DText | DButton> = [];\n childDto.forEach((dto) => {\n switch (dto._tag) {\n case \"p\":\n const newText = new DText(dto, scale);\n childEls.push(newText);\n break;\n case \"img\":\n const newImage = new DImg(dto, scale);\n childEls.push(newImage);\n break;\n case \"button\":\n const newButton = new DButton(dto, scale);\n childEls.push(newButton);\n break;\n default:\n const check: never = dto;\n }\n });\n return childEls;\n};\n","import { PlayAudioTask, PlayVideoTask } from \"../page/task\";\nimport { Fact } from \"../rules/fact\";\n\nexport type ButtonClickAction =\n | { kind: \"play-audio\"; task: PlayAudioTask; vibrateMs?: number }\n | { kind: \"pause-audio\"; vibrateMs?: number }\n | { kind: \"play-video\"; task: PlayVideoTask; vibrateMs?: number }\n | { kind: \"mute-video\"; vibrateMs?: number }\n | { kind: \"un-mute-video\"; vibrateMs?: number }\n | { kind: \"pause-video\"; vibrateMs?: number }\n | { kind: \"submit-fact\"; fact: Fact; vibrateMs?: number }\n | { kind: \"next-page\"; vibrateMs?: number }\n | { kind: \"submit-form\"; vibrateMs?: number };\n\n// export type ButtonClickAction = _ButtonClickAction & ;\nexport const ButtonClickAction = {\n describe: (a: ButtonClickAction): string => {\n switch (a.kind) {\n case \"next-page\":\n return \"go to next page\";\n case \"play-video\":\n return \"VideoId = \" + a.task.videoId;\n case \"play-audio\":\n return \"AudioId = \" + a.task.audioId;\n case \"pause-video\":\n return \"\";\n case \"pause-audio\":\n return \"\";\n case \"submit-fact\":\n return a.fact.label + \" = \" + a.fact.value;\n case \"submit-form\":\n return \"\";\n case \"mute-video\":\n return \"mute-video\";\n case \"un-mute-video\":\n return \"un-mute-video\";\n default:\n const _exhaustiveCheck: never = a;\n return \"\";\n }\n },\n};\n","import { DTimestamp } from \"../common/DTimestamp\";\ninterface _MqEvent<K extends string, P extends object> {\n readonly kind: K;\n readonly timestamp: DTimestamp;\n readonly payload: P;\n}\n\nexport type MqEventEngineStart = _MqEvent<\n \"engine-start\",\n {\n readonly schemaId: string;\n readonly schemaPrefix: string;\n }\n>;\nexport interface MqEventPageEnter\n extends _MqEvent<\n \"page-enter\",\n { readonly pageId: string; readonly pageNumber: number; readonly pagePrefix: string }\n > {}\n\nexport interface MqEventPageLeave\n extends _MqEvent<\n \"page-leave\",\n { readonly pageId: string; readonly pageNumber: number; readonly pagePrefix: string }\n > {}\n\nexport type MqEventUserClicked = _MqEvent<\n \"user-clicked\",\n {\n readonly pageId: string;\n readonly pagePrefix: string;\n readonly pageNumber: number;\n action: string;\n descriptions: string;\n }\n>;\n\nexport type MqEvent = MqEventPageEnter | MqEventPageLeave | MqEventEngineStart | MqEventUserClicked;\n\nexport const MqEvent = {\n engineStart(schemaId: string, schemaPrefix: string): MqEventEngineStart {\n return {\n kind: \"engine-start\",\n timestamp: DTimestamp.now(),\n payload: { schemaId, schemaPrefix },\n };\n },\n pageEnter(pageId: string, pagePrefix: string, pageNumber: number): MqEventPageEnter {\n return {\n kind: \"page-enter\",\n timestamp: DTimestamp.now(),\n payload: { pageId, pagePrefix, pageNumber },\n };\n },\n pageLeave(pageId: string, pagePrefix: string, pageNumber: number): MqEventPageLeave {\n return {\n kind: \"page-leave\",\n timestamp: DTimestamp.now(),\n payload: { pageId, pagePrefix, pageNumber },\n };\n },\n userClicked(data: {\n pageId: string;\n pagePrefix: string;\n pageNumber: number;\n action: string;\n descriptions: string;\n }): MqEventUserClicked {\n const { pageId, pageNumber, pagePrefix, action, descriptions } = data;\n return {\n kind: \"user-clicked\",\n timestamp: DTimestamp.now(),\n payload: { pageId, pagePrefix, action, descriptions, pageNumber },\n };\n },\n} as const;\n","import { DElement } from \"../Delement/DElement\";\nimport { TaskManager } from \"./task-manager\";\nimport { createDElement } from \"../Delement/element-factory\";\nimport { ScaleService } from \"../engine/scale\";\nimport { Task } from \"./task\";\nimport { PStyle } from \"../Delement/DStyle\";\nimport { ButtonClickAction } from \"../Delement/button-click-action\";\nimport { DElementDto } from \"../Delement/DElement.dto\";\nimport { Fact } from \"../rules/fact\";\nimport { DTimestamp } from \"../common/DTimestamp\";\nimport { PageResult } from \"./page-result\";\nimport { TaskState } from \"./task-state\";\nimport { MqEvent } from \"../events/mq-events\";\n\nexport interface VideoPlayerDto {\n playUrl: string;\n style?: PStyle;\n}\n\nexport interface PageDto {\n readonly id: string;\n readonly prefix: string;\n /**\n * Page number in the sequence (starts at 1)\n */\n readonly pageNumber: number;\n readonly tags: string[];\n background: string;\n elements: Array<DElementDto>;\n videoPlayer?: VideoPlayerDto;\n initialTasks: Array<Task>;\n}\n\nexport const PageDto = {\n createDummy: (id: number): PageDto => {\n return {\n id: \"id\" + id,\n pageNumber: id,\n prefix: \"prefix\" + id,\n tags: [],\n background: \"white\",\n elements: [\n {\n _tag: \"div\",\n style: { x: 10, y: 0, w: 40, h: 20, backgroundColor: \"red\" },\n children: [],\n innerText: \"Next btn \" + id,\n },\n ],\n\n initialTasks: [],\n };\n },\n};\n\nexport class Page {\n private readonly TAG = \"[ DPage ]: \";\n private elements: DElement<HTMLElement>[] = [];\n private readonly pageNumber: number;\n private pageEntered: DTimestamp = DTimestamp.now();\n private previousState: TaskState | false = false;\n private eventLog = new Array<MqEvent>();\n\n constructor(\n private readonly dto: PageDto,\n private readonly taskManager: TaskManager,\n private readonly scaleService: ScaleService,\n private readonly onCompleted: (result: PageResult) => void,\n ) {\n this.pageNumber = dto.pageNumber;\n dto.elements.forEach((el) => {\n const element = createDElement(el, scaleService);\n element.registerClickHandler((action) => {\n this.handleButtonAction(action);\n });\n\n this.elements.push(element);\n });\n\n if (dto.videoPlayer) {\n this.taskManager.loadVideo(dto.videoPlayer.playUrl);\n if (dto.videoPlayer.style) {\n this.taskManager.setVideoStyles(dto.videoPlayer.style);\n }\n }\n\n if (dto.initialTasks.length) {\n this.taskManager.autoPlaySequence(dto.initialTasks);\n }\n }\n\n private createPageResult(facts: Fact[]): PageResult {\n const pageExited = DTimestamp.now();\n const pageTime = DTimestamp.diff(this.pageEntered, pageExited);\n const pageExit = MqEvent.pageLeave(this.dto.id, this.dto.prefix, this.pageNumber);\n this.eventLog.push(pageExit);\n const eventLog = [...this.eventLog];\n return {\n pagePrefix: this.dto.prefix,\n pageId: this.dto.id,\n pageNumber: this.pageNumber,\n eventLog,\n pageTime,\n collectedFacts: facts,\n };\n }\n private handleButtonAction(a: ButtonClickAction) {\n const event = MqEvent.userClicked({\n pageId: this.dto.id,\n pagePrefix: this.dto.prefix,\n pageNumber: this.pageNumber,\n action: a.kind,\n descriptions: ButtonClickAction.describe(a),\n });\n this.eventLog.push(event);\n navigator.vibrate(200);\n const { vibrateMs } = a;\n if (vibrateMs) {\n navigator.vibrate(vibrateMs);\n }\n\n switch (a.kind) {\n case \"next-page\":\n const nextPageResult = this.createPageResult([]);\n this.onCompleted(nextPageResult);\n break;\n case \"play-video\":\n this.taskManager.execute(a.task);\n break;\n case \"play-audio\":\n this.taskManager.execute(a.task);\n break;\n case \"pause-video\":\n this.taskManager.pauseVideo();\n break;\n case \"pause-audio\":\n this.taskManager.pauseAudio();\n break;\n case \"mute-video\":\n this.taskManager.muteVideo();\n break;\n case \"un-mute-video\":\n this.taskManager.unMuteVideo();\n break;\n case \"submit-fact\":\n const submitFactResult = this.createPageResult([a.fact]);\n this.onCompleted(submitFactResult);\n break;\n case \"submit-form\":\n // TODO IMPLEMENT Collection of form-data // LOOP OVER ALL INPUTS\n const submitFormResult = this.createPageResult([]);\n this.onCompleted(submitFormResult);\n break;\n default:\n const _exhaustiveCheck: never = a;\n console.log(_exhaustiveCheck);\n }\n }\n\n appendYourself(parent: HTMLElement) {\n const pageEnterEvent = MqEvent.pageEnter(this.dto.id, this.dto.prefix, this.pageNumber);\n this.pageEntered = DTimestamp.now();\n this.eventLog.push(pageEnterEvent);\n this.elements.forEach((el) => {\n el.appendYourself(parent);\n });\n }\n\n destroy() {\n this.taskManager.clear();\n }\n\n tick() {\n const prev = this.previousState;\n const curr = this.taskManager.getState();\n const diff = TaskState.getDiff(curr, prev);\n this.elements.forEach((element) => {\n element.updateState(diff);\n });\n }\n}\n","type BaseTask = {\r\n readonly blockAudio: boolean;\r\n readonly blockVideo: boolean;\r\n readonly blockResponseButton: boolean;\r\n readonly blockFormInput: boolean;\r\n readonly priority:\r\n | \"run-if-idle\"\r\n | \"follow-queue\"\r\n | \"replace-all\"\r\n | \"replace-current\"\r\n | \"replace-queue\"\r\n | \"prepend-to-queue\"\r\n | \"append-to-queue\";\r\n};\r\nexport type DelayTask = BaseTask & {\r\n readonly kind: \"delay-task\";\r\n readonly duration: number;\r\n};\r\n\r\nexport type PlayAudioTask = BaseTask & {\r\n readonly kind: \"play-audio-task\";\r\n readonly url: string;\r\n readonly audioId: string;\r\n};\r\n\r\nexport type PlayVideoTask = BaseTask & {\r\n readonly kind: \"play-video-task\";\r\n readonly url: string;\r\n readonly videoId: string;\r\n readonly loop?: boolean;\r\n readonly startAt?: number;\r\n readonly stopAt?: \"end\" | \"start\" | number;\r\n readonly volume?: number;\r\n};\r\nconst eq = (a: Task, b: Task) => {\r\n if (!b) {\r\n return false;\r\n }\r\n if (a.kind !== b.kind) {\r\n return false;\r\n }\r\n if (a.kind === \"delay-task\" && b.kind === \"delay-task\") {\r\n return a.duration === b.duration;\r\n }\r\n\r\n if (a.kind === \"play-audio-task\" && b.kind === \"play-audio-task\") {\r\n return a.url === b.url && a.audioId === b.audioId;\r\n }\r\n if (a.kind === \"play-video-task\" && b.kind === \"play-video-task\") {\r\n return (\r\n a.url === b.url &&\r\n a.videoId === b.videoId &&\r\n a.startAt === b.startAt &&\r\n a.stopAt === b.stopAt &&\r\n a.volume === b.volume\r\n );\r\n }\r\n return false;\r\n};\r\nconst deleteTaskList = (task: Task) => {\r\n return task.priority === \"replace-all\" || task.priority === \"replace-queue\";\r\n};\r\n\r\nconst shallRemoveCurrent = (task: Task) => {\r\n return task.priority === \"replace-current\" || task.priority === \"replace-all\";\r\n};\r\n\r\nconst notEq = (a: Task, b: Task) => !eq(a, b);\r\n\r\nconst is = (task: Task | undefined | false | null | {}): task is Task => {\r\n if (!task) {\r\n return false;\r\n }\r\n if (typeof task !== \"object\") {\r\n return false;\r\n }\r\n if (Array.isArray(task)) {\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const Task = {\r\n eq,\r\n is,\r\n notEq,\r\n deleteTaskList,\r\n shallRemoveCurrent,\r\n};\r\nexport type Task = PlayVideoTask | PlayAudioTask | DelayTask;\r\n","import { DTimestamp } from \"../common/DTimestamp\";\nimport { Task } from \"./task\";\nimport { DStyle, PStyle } from \"../Delement/DStyle\";\nimport { ScaleService } from \"../engine/scale\";\nimport { TaskState } from \"./task-state\";\n\nexport class TaskManager {\n private readonly TAG = \"[TaskManager]: \";\n private readonly videoElement = document.createElement(\"video\");\n private readonly audioElement = document.createElement(\"audio\");\n private readonly showConsoleLogs = false;\n private readonly defaultVideoStyles: PStyle = {\n height: 50,\n width: 100,\n top: 0,\n left: 0,\n };\n private videoStyles: PStyle;\n private runningTask: { task: Task; startedAt: DTimestamp } | false = false;\n private taskList: Array<Task> = [];\n private delayRef: number | false = false;\n\n clear() {\n if (this.showConsoleLogs) console.log(this.TAG + \"CLEAR\");\n if (typeof this.delayRef === \"number\") {\n window.clearTimeout(this.delayRef);\n }\n\n this.pauseVideo();\n this.pauseAudio();\n this.videoElement.removeAttribute(\"src\");\n this.videoElement.load();\n this.audioElement.removeAttribute(\"src\");\n this.audioElement.load();\n this.taskList = [];\n this.runningTask = false;\n this.hideVideo();\n }\n\n getState(): TaskState {\n const c = this.runningTask;\n const isGifMode = this.videoElement.loop;\n const audioIsPlaying = c && c.task.kind === \"play-audio-task\" && !this.audioElement.paused;\n const videoIsPlaying = c && c.task.kind === \"play-video-task\" && !this.videoElement.paused;\n const blockResponseButton = c && c.task.blockResponseButton;\n const blockAudio = c && c.task.blockAudio;\n const blockVideo = c && c.task.blockVideo;\n const blockFormInput = c && c.task.blockFormInput;\n const videoIsMuted = this.videoElement.muted;\n\n const videoIsAtTheEnd = this.videoElement.ended;\n let videoPlayState: TaskState[\"videoPlayState\"] = videoIsMuted ? \"paused-and-muted\" : \"paused\";\n\n if (videoIsPlaying) {\n videoPlayState = videoIsMuted ? \"playing-and-muted\" : \"playing\";\n }\n if (videoIsAtTheEnd) {\n videoPlayState = videoIsMuted ? \"ended-and-muted\" : \"ended\";\n }\n\n return {\n audioIsPlaying,\n videoPlayState,\n isGifMode,\n blockFormInput,\n blockResponseButton,\n blockAudio,\n blockVideo,\n };\n }\n\n constructor(\n private readonly mediaLayer: HTMLDivElement,\n private readonly scale: ScaleService,\n private readonly onError: (error: string) => void,\n ) {\n this.hideVideo();\n this.mediaLayer.appendChild(this.videoElement);\n this.mediaLayer.appendChild(this.audioElement);\n this.videoStyles = this.defaultVideoStyles;\n DStyle.normalize(this.videoElement);\n DStyle.applyStyles(this.videoElement, this.videoStyles, this.scale.scale);\n\n this.videoElement.onended = () => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n };\n this.videoElement.onerror = (e) => {\n if (this.videoElement.src !== \"\") {\n onError(\"Error playing video: \" + this.videoElement.src);\n }\n };\n\n this.audioElement.onended = () => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n };\n }\n\n execute(task: Task): boolean {\n // console.log(\"EXECUTE TASK\" + task.kind);\n const curr = this.runningTask;\n // TODO Background-task should be handeled as its own kind or something.\n let isBackgroundTask = false;\n\n // Check if we should remove the current task.\n if (curr && Task.shallRemoveCurrent(task) && Task.notEq(curr.task, task)) {\n this.pauseAudio();\n this.pauseVideo();\n this.runningTask = false;\n }\n\n if (!curr) {\n this.runningTask = { startedAt: DTimestamp.now(), task: task };\n } else if (Task.notEq(curr.task, task)) {\n this.runningTask = { startedAt: DTimestamp.now(), task: task };\n }\n\n if (task.priority === \"replace-all\" || task.priority === \"replace-queue\") {\n this.taskList = [];\n }\n\n // STARTING PLAY VIDEO\n if (task.kind === \"play-video-task\") {\n this.showVideo();\n // this.pauseAudio()\n this.loadVideo(task.url);\n if (task.loop) {\n this.videoElement.loop = true;\n isBackgroundTask = true;\n } else {\n this.videoElement.loop = false;\n }\n\n try {\n this.videoElement.play();\n } catch (e) {\n console.error(e);\n }\n }\n\n // STARTING PLAY AUDIO\n if (task.kind === \"play-audio-task\") {\n if (!this.videoElement.loop) {\n this.pauseVideo();\n }\n if (task.url !== this.audioElement.src) {\n this.audioElement.src = task.url;\n }\n this.audioElement.play();\n }\n\n if (task.kind === \"delay-task\") {\n if (typeof this.delayRef === \"number\") {\n window.clearTimeout(this.delayRef);\n }\n this.delayRef = window.setTimeout(() => {\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n } else {\n this.runningTask = false;\n }\n }, task.duration);\n }\n\n if (isBackgroundTask) {\n const startNextTask = this.getNextTask();\n if (startNextTask) {\n this.execute(startNextTask);\n }\n }\n\n return true;\n }\n\n setVideoStyles(styles: PStyle) {\n this.videoStyles = { ...styles };\n DStyle.applyStyles(this.videoElement, this.videoStyles, this.scale.scale);\n }\n\n autoPlaySequence(tasks: Task[]) {\n this.taskList = [...tasks];\n const next = this.getNextTask();\n if (next) {\n this.execute(next);\n if (next.kind === \"play-video-task\" && next.loop) {\n this.videoElement.loop = true;\n }\n }\n }\n\n loadVideo(url: string) {\n // console.log(\"LOAD VIDEO \" + !!url + \" \");\n if (this.videoElement.src !== url) {\n this.videoElement.src = url;\n }\n this.showVideo();\n }\n\n private playVideoElement() {\n this.videoElement\n .play()\n .then(() => {})\n .catch((e) => {\n console.log(e);\n this.onError(\"Error playing video.\");\n });\n }\n\n private showVideo() {\n this.videoElement.style.display = \"block\";\n }\n\n private hideVideo() {\n this.videoElement.style.display = \"none\";\n }\n\n pauseVideo() {\n try {\n if (!this.videoElement.loop) {\n this.videoElement.pause();\n }\n } catch (e) {\n console.log(e);\n this.onError(\"Error pausing video.\");\n }\n }\n\n pauseAudio() {\n try {\n if (!this.audioElement.loop) {\n this.audioElement.pause();\n }\n } catch (e) {\n console.log(e);\n this.onError(\"Error pausing audio.\");\n }\n }\n\n private getNextTask(): Task | false {\n // console.log(\"Getting next task.\");\n // console.log(this.taskList);\n const first = this.taskList.shift();\n return first ?? false;\n }\n\n muteVideo() {\n this.videoElement.muted = true;\n }\n\n unMuteVideo() {\n this.videoElement.muted = false;\n }\n}\n","import { SchemaDto } from \"./SchemaDto\";\nimport { DPlayer } from \"./dplayer\";\nimport { ScaleService } from \"./scale\";\nimport { Page } from \"../page/Page\";\nimport { TaskManager } from \"../page/task-manager\";\nimport { PageResult } from \"../page/page-result\";\nimport { SchemaResult } from \"./SchemaResult\";\nexport interface EngineLogger {\n info(message: string): void;\n error(message: string): void;\n warn(message: string): void;\n}\n\nconst voidLogger: EngineLogger = {\n info: (message: string) => {},\n error: (message: string) => {},\n warn: (message: string) => {},\n};\n\nexport interface ISchemaEngine {\n onProgress(handler: (result: SchemaResult) => void): void;\n onFatalError(handler: (error: { message: string }) => void): void;\n setLogger(logger: EngineLogger): void;\n}\n\nexport class SchemaEngine implements ISchemaEngine {\n private readonly TAG = \"[ SCHEMA_ENGINE ] :\";\n private readonly scale: ScaleService;\n private readonly hostElement: HTMLDivElement;\n private readonly taskManager: TaskManager;\n private logger: EngineLogger = voidLogger;\n private readonly uiLayer: HTMLDivElement = document.createElement(\"div\");\n private readonly mediaLayer: HTMLDivElement = document.createElement(\"div\");\n private player: DPlayer;\n private currentPage: Page | false = false;\n private readonly tickerRef: number | false = false;\n constructor(\n hostEl: HTMLDivElement,\n private readonly height: number,\n private readonly width: number,\n private readonly schema: SchemaDto,\n ) {\n this.tickerRef = window.setInterval(() => {\n if (this.currentPage) {\n this.currentPage.tick();\n }\n }, 100);\n this.hostElement = hostEl;\n this.hostElement.appendChild(this.mediaLayer);\n this.hostElement.appendChild(this.uiLayer);\n this.scale = new ScaleService({\n baseHeight: schema.baseHeight,\n baseWidth: schema.baseWidth,\n containerWidth: this.width,\n containerHeight: this.height,\n });\n this.logger.info(this.TAG + \"Scale: \" + JSON.stringify(this.scale));\n this.player = new DPlayer(this.schema);\n this.taskManager = new TaskManager(this.mediaLayer, this.scale, (error) => {\n console.log(error);\n });\n\n this.styleSelf();\n this.handlePageCompleted = this.handlePageCompleted.bind(this);\n this.nextPage();\n }\n\n private handlePageCompleted(result: PageResult) {\n // 1 Save data from last page\n this.player.saveHistory(result);\n\n // 2 Emit progress\n const currentResults = this.player.getResults();\n const a: SchemaResult = {\n schemaId: this.schema.id,\n pageResults: currentResults.pageResults,\n pagesLeft: currentResults.pagesLeft,\n predefinedFacts: currentResults.predefinedFacts,\n eventLog: currentResults.eventLog,\n answers: currentResults.answerFacts,\n };\n if (this._onProgress) {\n this._onProgress(a);\n }\n\n // 3. Next page\n this.nextPage();\n }\n\n private styleSelf() {\n this.hostElement.style.height = this.scale.pageHeight + \"px\";\n this.hostElement.style.width = this.scale.pageWidth + \"px\";\n this.hostElement.style.backgroundColor = this.schema.backgroundColor ?? \"white\";\n this.hostElement.style.position = \"relative\";\n // this.hostElement.style.overflow = \"hidden\";\n const makeStatic = (div: HTMLDivElement) => {\n div.style.height = \"0px\";\n div.style.width = \"0px\";\n div.style.position = \"static\";\n };\n\n makeStatic(this.uiLayer);\n this.uiLayer.style.zIndex = \"10\";\n this.mediaLayer.style.zIndex = \"8\";\n makeStatic(this.mediaLayer);\n }\n\n private nextPage() {\n const nextPage = this.player.getNextPage();\n if (this.currentPage) {\n this.currentPage.destroy();\n this.uiLayer.innerHTML = \"\";\n }\n\n // console.log(nextPage);\n if (nextPage && nextPage.videoPlayer && nextPage.videoPlayer.style) {\n this.taskManager.setVideoStyles(nextPage.videoPlayer.style);\n }\n\n if (!nextPage) {\n // TODO FIGURE OUT WHAQT TO DO AT END OF TEST!! Start over??\n this.player = new DPlayer(this.schema);\n if (this.player.pagesLeft > 0) {\n this.nextPage();\n }\n return false;\n }\n\n const newPage = new Page(nextPage, this.taskManager, this.scale, (result) => {\n this.handlePageCompleted(result);\n });\n\n this.currentPage = newPage;\n newPage.appendYourself(this.uiLayer);\n return true;\n }\n\n destroy() {\n if (this.currentPage) {\n this.currentPage.destroy();\n this.uiLayer.innerHTML = \"\";\n }\n if (this.tickerRef) {\n window.clearInterval(this.tickerRef);\n }\n }\n\n private _onProgress: ((result: SchemaResult) => void) | false = false;\n onProgress(handler: (result: SchemaResult) => void) {\n this._onProgress = handler;\n }\n\n private _onFatalError: ((error: { message: string }) => void) | false = false;\n onFatalError(handler: (error: { message: string }) => void): void {\n this._onFatalError = handler;\n }\n setLogger(logger: EngineLogger) {\n this.logger = logger;\n }\n}\n"],"mappings":"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","names":["DUtil","isNumber","Condition","condition","Rule","tag","Scale","DCss","DStyle","DTimestamp","dto"]}
|
package/package.json
CHANGED
|
@@ -73,6 +73,7 @@ export class SchemaEngine implements ISchemaEngine {
|
|
|
73
73
|
const currentResults = this.player.getResults();
|
|
74
74
|
const a: SchemaResult = {
|
|
75
75
|
schemaId: this.schema.id,
|
|
76
|
+
pageResults: currentResults.pageResults,
|
|
76
77
|
pagesLeft: currentResults.pagesLeft,
|
|
77
78
|
predefinedFacts: currentResults.predefinedFacts,
|
|
78
79
|
eventLog: currentResults.eventLog,
|
|
@@ -128,6 +129,7 @@ export class SchemaEngine implements ISchemaEngine {
|
|
|
128
129
|
const newPage = new Page(nextPage, this.taskManager, this.scale, (result) => {
|
|
129
130
|
this.handlePageCompleted(result);
|
|
130
131
|
});
|
|
132
|
+
|
|
131
133
|
this.currentPage = newPage;
|
|
132
134
|
newPage.appendYourself(this.uiLayer);
|
|
133
135
|
return true;
|
|
@@ -138,6 +140,9 @@ export class SchemaEngine implements ISchemaEngine {
|
|
|
138
140
|
this.currentPage.destroy();
|
|
139
141
|
this.uiLayer.innerHTML = "";
|
|
140
142
|
}
|
|
143
|
+
if (this.tickerRef) {
|
|
144
|
+
window.clearInterval(this.tickerRef);
|
|
145
|
+
}
|
|
141
146
|
}
|
|
142
147
|
|
|
143
148
|
private _onProgress: ((result: SchemaResult) => void) | false = false;
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { Fact } from "../rules/fact";
|
|
2
|
-
import { MqEvent } from "../events/mq-events";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
readonly
|
|
7
|
-
readonly
|
|
8
|
-
readonly
|
|
9
|
-
readonly
|
|
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
|
+
}
|