@vived/host 4.5.1 → 4.5.2

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.
@@ -48,7 +48,8 @@ class SubmitResultHandlerImp extends SubmitResultHandler {
48
48
  this.warn(`Cannot parse Multi Hit Result V1 payload: ${JSON.stringify(result)}`);
49
49
  return;
50
50
  }
51
- this.challengeResults?.submitMultiHitResult(slideId, hits, misses, unanswered, tries, message);
51
+ this.challengeResults?.submitMultiHitResult(slideId, hits, misses, unanswered, misses, // Using misses as tries instead of the tries parameter
52
+ message);
52
53
  }
53
54
  handleQualityV1(result, tries, slideId, message) {
54
55
  const { maxStars, stars } = result;
@@ -1 +1 @@
1
- {"version":3,"file":"SubmitResultHandler.js","sourceRoot":"","sources":["../../../../src/Handler/UCs/SubmitResultHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObject, AppObjectUC } from \"@vived/core\";\r\nimport { ChallengeResultsEntity } from \"../../ChallengeResults\";\r\nimport {\r\n ChallengeResponse,\r\n HostStateEntity,\r\n HostStateMachine\r\n} from \"../../StateMachine\";\r\nimport {\r\n HostHandlerEntity,\r\n RequestHandler,\r\n UnableToParsePayload,\r\n UnsupportedRequestVersion\r\n} from \"../Entities\";\r\n\r\nexport type ResultType =\r\n | \"HIT_V1\"\r\n | \"MULTIHIT_V1\"\r\n | \"QUALITY_V1\"\r\n | \"SCORE_V1\"\r\n | \"PROGRESS_V1\";\r\nexport type Results =\r\n | HitResultV1\r\n | MultiHitResultV1\r\n | QualityResultV1\r\n | ScoreResultV1\r\n | ProgressResultV1;\r\n\r\nexport type HitResultV1 = {\r\n success: boolean;\r\n};\r\n\r\nexport type MultiHitResultV1 = {\r\n hits: number;\r\n misses: number;\r\n unanswered: number;\r\n};\r\n\r\nexport type QualityResultV1 = {\r\n stars: number;\r\n maxStars: number;\r\n};\r\n\r\nexport type ScoreResultV1 = {\r\n score: number;\r\n maxScore: number;\r\n};\r\n\r\nexport type ProgressResultV1 = {\r\n progress: number;\r\n};\r\n\r\nexport type SubmitResultAction = (\r\n type: ResultType,\r\n result: Results,\r\n description: string\r\n) => void;\r\n\r\nexport abstract class SubmitResultHandler\r\n extends AppObjectUC\r\n implements RequestHandler\r\n{\r\n static readonly type = \"SubmitResultHandler\";\r\n\r\n readonly requestType = \"SUBMIT_RESULTS\";\r\n\r\n abstract action: SubmitResultAction;\r\n abstract handleRequest: (version: number, payload?: unknown) => void;\r\n}\r\n\r\nexport function makeSubmitResultHandler(\r\n appObject: AppObject\r\n): SubmitResultHandler {\r\n return new SubmitResultHandlerImp(appObject);\r\n}\r\n\r\nclass SubmitResultHandlerImp extends SubmitResultHandler {\r\n private get challengeResults() {\r\n return this.getCachedSingleton<ChallengeResultsEntity>(\r\n ChallengeResultsEntity.type\r\n );\r\n }\r\n\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n // Map result types to challenge responses\r\n private resultTypeToResponseMap: Record<ResultType, ChallengeResponse> = {\r\n HIT_V1: ChallengeResponse.HIT,\r\n MULTIHIT_V1: ChallengeResponse.MULTIHIT,\r\n QUALITY_V1: ChallengeResponse.QUALITY,\r\n SCORE_V1: ChallengeResponse.SCORE,\r\n PROGRESS_V1: ChallengeResponse.PROGRESS\r\n };\r\n\r\n action = (type: ResultType, result: Results, description: string) => {\r\n if (!this.challengeResults || !this.stateMachine) {\r\n this.error(\"Missing Component\");\r\n return;\r\n }\r\n\r\n if (this.stateMachine.activeState === undefined) {\r\n this.warn(\"Cannot store result because there is no active slide\");\r\n return;\r\n }\r\n\r\n const currentSlideId = this.stateMachine.activeState;\r\n const currentStateEntity = this.stateMachine.getStateByID(currentSlideId);\r\n\r\n if (!currentStateEntity) {\r\n this.warn(\"Cannot find active state entity\");\r\n return;\r\n }\r\n\r\n // Set the expected response based on the result type\r\n currentStateEntity.expectedResponse = this.resultTypeToResponseMap[type];\r\n\r\n let tries =\r\n this.challengeResults.getResultForSlide(currentSlideId)?.tries ?? 0;\r\n if (type !== \"PROGRESS_V1\") {\r\n tries += 1;\r\n }\r\n\r\n if (type === \"HIT_V1\") {\r\n this.handleHitV1(\r\n result as HitResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"MULTIHIT_V1\") {\r\n this.handleMultiHitV1(\r\n result as MultiHitResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"QUALITY_V1\") {\r\n this.handleQualityV1(\r\n result as QualityResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"SCORE_V1\") {\r\n this.handleScoreV1(\r\n result as ScoreResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"PROGRESS_V1\") {\r\n this.handleProgressV1(\r\n result as ProgressResultV1,\r\n currentSlideId,\r\n description\r\n );\r\n }\r\n };\r\n\r\n handleRequest = (version: number, payload: unknown) => {\r\n if (version === 2) {\r\n const { description, result, resultType } = this.castPayloadV2(payload);\r\n this.action(resultType, result, description);\r\n } else if (version === 3) {\r\n const { description, result, resultType } = this.castPayloadV3(payload);\r\n this.action(resultType, result, description);\r\n } else {\r\n throw new UnsupportedRequestVersion(this.requestType, version);\r\n }\r\n };\r\n\r\n private handleHitV1(\r\n result: HitResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const castResult = result;\r\n\r\n if (castResult.success === undefined) {\r\n this.warn(\r\n `Cannot parse Hit Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitHitResult(\r\n slideId,\r\n castResult.success,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private handleProgressV1(\r\n result: ProgressResultV1,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const castResult = result;\r\n\r\n if (castResult.progress === undefined) {\r\n this.warn(\r\n `Cannot parse Progress Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitProgressResult(\r\n slideId,\r\n castResult.progress,\r\n message\r\n );\r\n }\r\n\r\n private handleMultiHitV1(\r\n result: MultiHitResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { hits, misses, unanswered } = result;\r\n\r\n if (\r\n hits === undefined ||\r\n misses === undefined ||\r\n unanswered === undefined\r\n ) {\r\n this.warn(\r\n `Cannot parse Multi Hit Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitMultiHitResult(\r\n slideId,\r\n hits,\r\n misses,\r\n unanswered,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private handleQualityV1(\r\n result: QualityResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { maxStars, stars } = result;\r\n\r\n if (maxStars === undefined || stars === undefined) {\r\n this.warn(\r\n `Cannot parse Quality Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitQualityResult(\r\n slideId,\r\n stars,\r\n maxStars,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private handleScoreV1(\r\n result: ScoreResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { score, maxScore } = result;\r\n\r\n if (maxScore === undefined || score === undefined) {\r\n this.warn(\r\n `Cannot parse Score Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitScoreResult(\r\n slideId,\r\n score,\r\n maxScore,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private castPayloadV2(payload: unknown): Payload_V2 {\r\n const castPayload = payload as Payload_V2;\r\n if (\r\n castPayload.result === undefined ||\r\n castPayload.resultType === undefined\r\n ) {\r\n throw new UnableToParsePayload(\r\n this.requestType,\r\n 1,\r\n JSON.stringify(payload)\r\n );\r\n }\r\n\r\n return castPayload;\r\n }\r\n\r\n private castPayloadV3(payload: unknown): Payload_V3 {\r\n const castPayload = payload as Payload_V3;\r\n if (\r\n castPayload.result === undefined ||\r\n castPayload.resultType === undefined\r\n ) {\r\n throw new UnableToParsePayload(\r\n this.requestType,\r\n 2,\r\n JSON.stringify(payload)\r\n );\r\n }\r\n\r\n return castPayload;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, SubmitResultHandler.type);\r\n\r\n const hostHandler = HostHandlerEntity.get(appObject);\r\n if (!hostHandler) {\r\n this.error(\"UC added to an entity that does not have HostHandlerEntity\");\r\n return;\r\n }\r\n\r\n hostHandler.registerRequestHandler(this);\r\n }\r\n}\r\n\r\n// Payload V1 is unsupported\r\n\r\ntype Payload_V2 = {\r\n tries: number;\r\n description: string;\r\n result: Results;\r\n resultType: ResultType;\r\n};\r\n\r\ntype Payload_V3 = {\r\n description: string;\r\n result: Results;\r\n resultType: ResultType;\r\n};\r\n"]}
1
+ {"version":3,"file":"SubmitResultHandler.js","sourceRoot":"","sources":["../../../../src/Handler/UCs/SubmitResultHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObject, AppObjectUC } from \"@vived/core\";\r\nimport { ChallengeResultsEntity } from \"../../ChallengeResults\";\r\nimport {\r\n ChallengeResponse,\r\n HostStateEntity,\r\n HostStateMachine\r\n} from \"../../StateMachine\";\r\nimport {\r\n HostHandlerEntity,\r\n RequestHandler,\r\n UnableToParsePayload,\r\n UnsupportedRequestVersion\r\n} from \"../Entities\";\r\n\r\nexport type ResultType =\r\n | \"HIT_V1\"\r\n | \"MULTIHIT_V1\"\r\n | \"QUALITY_V1\"\r\n | \"SCORE_V1\"\r\n | \"PROGRESS_V1\";\r\nexport type Results =\r\n | HitResultV1\r\n | MultiHitResultV1\r\n | QualityResultV1\r\n | ScoreResultV1\r\n | ProgressResultV1;\r\n\r\nexport type HitResultV1 = {\r\n success: boolean;\r\n};\r\n\r\nexport type MultiHitResultV1 = {\r\n hits: number;\r\n misses: number;\r\n unanswered: number;\r\n};\r\n\r\nexport type QualityResultV1 = {\r\n stars: number;\r\n maxStars: number;\r\n};\r\n\r\nexport type ScoreResultV1 = {\r\n score: number;\r\n maxScore: number;\r\n};\r\n\r\nexport type ProgressResultV1 = {\r\n progress: number;\r\n};\r\n\r\nexport type SubmitResultAction = (\r\n type: ResultType,\r\n result: Results,\r\n description: string\r\n) => void;\r\n\r\nexport abstract class SubmitResultHandler\r\n extends AppObjectUC\r\n implements RequestHandler\r\n{\r\n static readonly type = \"SubmitResultHandler\";\r\n\r\n readonly requestType = \"SUBMIT_RESULTS\";\r\n\r\n abstract action: SubmitResultAction;\r\n abstract handleRequest: (version: number, payload?: unknown) => void;\r\n}\r\n\r\nexport function makeSubmitResultHandler(\r\n appObject: AppObject\r\n): SubmitResultHandler {\r\n return new SubmitResultHandlerImp(appObject);\r\n}\r\n\r\nclass SubmitResultHandlerImp extends SubmitResultHandler {\r\n private get challengeResults() {\r\n return this.getCachedSingleton<ChallengeResultsEntity>(\r\n ChallengeResultsEntity.type\r\n );\r\n }\r\n\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n // Map result types to challenge responses\r\n private resultTypeToResponseMap: Record<ResultType, ChallengeResponse> = {\r\n HIT_V1: ChallengeResponse.HIT,\r\n MULTIHIT_V1: ChallengeResponse.MULTIHIT,\r\n QUALITY_V1: ChallengeResponse.QUALITY,\r\n SCORE_V1: ChallengeResponse.SCORE,\r\n PROGRESS_V1: ChallengeResponse.PROGRESS\r\n };\r\n\r\n action = (type: ResultType, result: Results, description: string) => {\r\n if (!this.challengeResults || !this.stateMachine) {\r\n this.error(\"Missing Component\");\r\n return;\r\n }\r\n\r\n if (this.stateMachine.activeState === undefined) {\r\n this.warn(\"Cannot store result because there is no active slide\");\r\n return;\r\n }\r\n\r\n const currentSlideId = this.stateMachine.activeState;\r\n const currentStateEntity = this.stateMachine.getStateByID(currentSlideId);\r\n\r\n if (!currentStateEntity) {\r\n this.warn(\"Cannot find active state entity\");\r\n return;\r\n }\r\n\r\n // Set the expected response based on the result type\r\n currentStateEntity.expectedResponse = this.resultTypeToResponseMap[type];\r\n\r\n let tries =\r\n this.challengeResults.getResultForSlide(currentSlideId)?.tries ?? 0;\r\n if (type !== \"PROGRESS_V1\") {\r\n tries += 1;\r\n }\r\n\r\n if (type === \"HIT_V1\") {\r\n this.handleHitV1(\r\n result as HitResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"MULTIHIT_V1\") {\r\n this.handleMultiHitV1(\r\n result as MultiHitResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"QUALITY_V1\") {\r\n this.handleQualityV1(\r\n result as QualityResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"SCORE_V1\") {\r\n this.handleScoreV1(\r\n result as ScoreResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"PROGRESS_V1\") {\r\n this.handleProgressV1(\r\n result as ProgressResultV1,\r\n currentSlideId,\r\n description\r\n );\r\n }\r\n };\r\n\r\n handleRequest = (version: number, payload: unknown) => {\r\n if (version === 2) {\r\n const { description, result, resultType } = this.castPayloadV2(payload);\r\n this.action(resultType, result, description);\r\n } else if (version === 3) {\r\n const { description, result, resultType } = this.castPayloadV3(payload);\r\n this.action(resultType, result, description);\r\n } else {\r\n throw new UnsupportedRequestVersion(this.requestType, version);\r\n }\r\n };\r\n\r\n private handleHitV1(\r\n result: HitResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const castResult = result;\r\n\r\n if (castResult.success === undefined) {\r\n this.warn(\r\n `Cannot parse Hit Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitHitResult(\r\n slideId,\r\n castResult.success,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private handleProgressV1(\r\n result: ProgressResultV1,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const castResult = result;\r\n\r\n if (castResult.progress === undefined) {\r\n this.warn(\r\n `Cannot parse Progress Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitProgressResult(\r\n slideId,\r\n castResult.progress,\r\n message\r\n );\r\n }\r\n\r\n private handleMultiHitV1(\r\n result: MultiHitResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { hits, misses, unanswered } = result;\r\n\r\n if (\r\n hits === undefined ||\r\n misses === undefined ||\r\n unanswered === undefined\r\n ) {\r\n this.warn(\r\n `Cannot parse Multi Hit Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitMultiHitResult(\r\n slideId,\r\n hits,\r\n misses,\r\n unanswered,\r\n misses, // Using misses as tries instead of the tries parameter\r\n message\r\n );\r\n }\r\n\r\n private handleQualityV1(\r\n result: QualityResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { maxStars, stars } = result;\r\n\r\n if (maxStars === undefined || stars === undefined) {\r\n this.warn(\r\n `Cannot parse Quality Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitQualityResult(\r\n slideId,\r\n stars,\r\n maxStars,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private handleScoreV1(\r\n result: ScoreResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { score, maxScore } = result;\r\n\r\n if (maxScore === undefined || score === undefined) {\r\n this.warn(\r\n `Cannot parse Score Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitScoreResult(\r\n slideId,\r\n score,\r\n maxScore,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private castPayloadV2(payload: unknown): Payload_V2 {\r\n const castPayload = payload as Payload_V2;\r\n if (\r\n castPayload.result === undefined ||\r\n castPayload.resultType === undefined\r\n ) {\r\n throw new UnableToParsePayload(\r\n this.requestType,\r\n 1,\r\n JSON.stringify(payload)\r\n );\r\n }\r\n\r\n return castPayload;\r\n }\r\n\r\n private castPayloadV3(payload: unknown): Payload_V3 {\r\n const castPayload = payload as Payload_V3;\r\n if (\r\n castPayload.result === undefined ||\r\n castPayload.resultType === undefined\r\n ) {\r\n throw new UnableToParsePayload(\r\n this.requestType,\r\n 2,\r\n JSON.stringify(payload)\r\n );\r\n }\r\n\r\n return castPayload;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, SubmitResultHandler.type);\r\n\r\n const hostHandler = HostHandlerEntity.get(appObject);\r\n if (!hostHandler) {\r\n this.error(\"UC added to an entity that does not have HostHandlerEntity\");\r\n return;\r\n }\r\n\r\n hostHandler.registerRequestHandler(this);\r\n }\r\n}\r\n\r\n// Payload V1 is unsupported\r\n\r\ntype Payload_V2 = {\r\n tries: number;\r\n description: string;\r\n result: Results;\r\n resultType: ResultType;\r\n};\r\n\r\ntype Payload_V3 = {\r\n description: string;\r\n result: Results;\r\n resultType: ResultType;\r\n};\r\n"]}
@@ -43,7 +43,8 @@ class SubmitResultHandlerImp extends SubmitResultHandler {
43
43
  this.warn(`Cannot parse Multi Hit Result V1 payload: ${JSON.stringify(result)}`);
44
44
  return;
45
45
  }
46
- this.challengeResults?.submitMultiHitResult(slideId, hits, misses, unanswered, tries, message);
46
+ this.challengeResults?.submitMultiHitResult(slideId, hits, misses, unanswered, misses, // Using misses as tries instead of the tries parameter
47
+ message);
47
48
  }
48
49
  handleQualityV1(result, tries, slideId, message) {
49
50
  const { maxStars, stars } = result;
@@ -1 +1 @@
1
- {"version":3,"file":"SubmitResultHandler.js","sourceRoot":"","sources":["../../../../src/Handler/UCs/SubmitResultHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObject, AppObjectUC } from \"@vived/core\";\r\nimport { ChallengeResultsEntity } from \"../../ChallengeResults\";\r\nimport {\r\n ChallengeResponse,\r\n HostStateEntity,\r\n HostStateMachine\r\n} from \"../../StateMachine\";\r\nimport {\r\n HostHandlerEntity,\r\n RequestHandler,\r\n UnableToParsePayload,\r\n UnsupportedRequestVersion\r\n} from \"../Entities\";\r\n\r\nexport type ResultType =\r\n | \"HIT_V1\"\r\n | \"MULTIHIT_V1\"\r\n | \"QUALITY_V1\"\r\n | \"SCORE_V1\"\r\n | \"PROGRESS_V1\";\r\nexport type Results =\r\n | HitResultV1\r\n | MultiHitResultV1\r\n | QualityResultV1\r\n | ScoreResultV1\r\n | ProgressResultV1;\r\n\r\nexport type HitResultV1 = {\r\n success: boolean;\r\n};\r\n\r\nexport type MultiHitResultV1 = {\r\n hits: number;\r\n misses: number;\r\n unanswered: number;\r\n};\r\n\r\nexport type QualityResultV1 = {\r\n stars: number;\r\n maxStars: number;\r\n};\r\n\r\nexport type ScoreResultV1 = {\r\n score: number;\r\n maxScore: number;\r\n};\r\n\r\nexport type ProgressResultV1 = {\r\n progress: number;\r\n};\r\n\r\nexport type SubmitResultAction = (\r\n type: ResultType,\r\n result: Results,\r\n description: string\r\n) => void;\r\n\r\nexport abstract class SubmitResultHandler\r\n extends AppObjectUC\r\n implements RequestHandler\r\n{\r\n static readonly type = \"SubmitResultHandler\";\r\n\r\n readonly requestType = \"SUBMIT_RESULTS\";\r\n\r\n abstract action: SubmitResultAction;\r\n abstract handleRequest: (version: number, payload?: unknown) => void;\r\n}\r\n\r\nexport function makeSubmitResultHandler(\r\n appObject: AppObject\r\n): SubmitResultHandler {\r\n return new SubmitResultHandlerImp(appObject);\r\n}\r\n\r\nclass SubmitResultHandlerImp extends SubmitResultHandler {\r\n private get challengeResults() {\r\n return this.getCachedSingleton<ChallengeResultsEntity>(\r\n ChallengeResultsEntity.type\r\n );\r\n }\r\n\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n // Map result types to challenge responses\r\n private resultTypeToResponseMap: Record<ResultType, ChallengeResponse> = {\r\n HIT_V1: ChallengeResponse.HIT,\r\n MULTIHIT_V1: ChallengeResponse.MULTIHIT,\r\n QUALITY_V1: ChallengeResponse.QUALITY,\r\n SCORE_V1: ChallengeResponse.SCORE,\r\n PROGRESS_V1: ChallengeResponse.PROGRESS\r\n };\r\n\r\n action = (type: ResultType, result: Results, description: string) => {\r\n if (!this.challengeResults || !this.stateMachine) {\r\n this.error(\"Missing Component\");\r\n return;\r\n }\r\n\r\n if (this.stateMachine.activeState === undefined) {\r\n this.warn(\"Cannot store result because there is no active slide\");\r\n return;\r\n }\r\n\r\n const currentSlideId = this.stateMachine.activeState;\r\n const currentStateEntity = this.stateMachine.getStateByID(currentSlideId);\r\n\r\n if (!currentStateEntity) {\r\n this.warn(\"Cannot find active state entity\");\r\n return;\r\n }\r\n\r\n // Set the expected response based on the result type\r\n currentStateEntity.expectedResponse = this.resultTypeToResponseMap[type];\r\n\r\n let tries =\r\n this.challengeResults.getResultForSlide(currentSlideId)?.tries ?? 0;\r\n if (type !== \"PROGRESS_V1\") {\r\n tries += 1;\r\n }\r\n\r\n if (type === \"HIT_V1\") {\r\n this.handleHitV1(\r\n result as HitResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"MULTIHIT_V1\") {\r\n this.handleMultiHitV1(\r\n result as MultiHitResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"QUALITY_V1\") {\r\n this.handleQualityV1(\r\n result as QualityResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"SCORE_V1\") {\r\n this.handleScoreV1(\r\n result as ScoreResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"PROGRESS_V1\") {\r\n this.handleProgressV1(\r\n result as ProgressResultV1,\r\n currentSlideId,\r\n description\r\n );\r\n }\r\n };\r\n\r\n handleRequest = (version: number, payload: unknown) => {\r\n if (version === 2) {\r\n const { description, result, resultType } = this.castPayloadV2(payload);\r\n this.action(resultType, result, description);\r\n } else if (version === 3) {\r\n const { description, result, resultType } = this.castPayloadV3(payload);\r\n this.action(resultType, result, description);\r\n } else {\r\n throw new UnsupportedRequestVersion(this.requestType, version);\r\n }\r\n };\r\n\r\n private handleHitV1(\r\n result: HitResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const castResult = result;\r\n\r\n if (castResult.success === undefined) {\r\n this.warn(\r\n `Cannot parse Hit Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitHitResult(\r\n slideId,\r\n castResult.success,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private handleProgressV1(\r\n result: ProgressResultV1,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const castResult = result;\r\n\r\n if (castResult.progress === undefined) {\r\n this.warn(\r\n `Cannot parse Progress Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitProgressResult(\r\n slideId,\r\n castResult.progress,\r\n message\r\n );\r\n }\r\n\r\n private handleMultiHitV1(\r\n result: MultiHitResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { hits, misses, unanswered } = result;\r\n\r\n if (\r\n hits === undefined ||\r\n misses === undefined ||\r\n unanswered === undefined\r\n ) {\r\n this.warn(\r\n `Cannot parse Multi Hit Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitMultiHitResult(\r\n slideId,\r\n hits,\r\n misses,\r\n unanswered,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private handleQualityV1(\r\n result: QualityResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { maxStars, stars } = result;\r\n\r\n if (maxStars === undefined || stars === undefined) {\r\n this.warn(\r\n `Cannot parse Quality Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitQualityResult(\r\n slideId,\r\n stars,\r\n maxStars,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private handleScoreV1(\r\n result: ScoreResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { score, maxScore } = result;\r\n\r\n if (maxScore === undefined || score === undefined) {\r\n this.warn(\r\n `Cannot parse Score Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitScoreResult(\r\n slideId,\r\n score,\r\n maxScore,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private castPayloadV2(payload: unknown): Payload_V2 {\r\n const castPayload = payload as Payload_V2;\r\n if (\r\n castPayload.result === undefined ||\r\n castPayload.resultType === undefined\r\n ) {\r\n throw new UnableToParsePayload(\r\n this.requestType,\r\n 1,\r\n JSON.stringify(payload)\r\n );\r\n }\r\n\r\n return castPayload;\r\n }\r\n\r\n private castPayloadV3(payload: unknown): Payload_V3 {\r\n const castPayload = payload as Payload_V3;\r\n if (\r\n castPayload.result === undefined ||\r\n castPayload.resultType === undefined\r\n ) {\r\n throw new UnableToParsePayload(\r\n this.requestType,\r\n 2,\r\n JSON.stringify(payload)\r\n );\r\n }\r\n\r\n return castPayload;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, SubmitResultHandler.type);\r\n\r\n const hostHandler = HostHandlerEntity.get(appObject);\r\n if (!hostHandler) {\r\n this.error(\"UC added to an entity that does not have HostHandlerEntity\");\r\n return;\r\n }\r\n\r\n hostHandler.registerRequestHandler(this);\r\n }\r\n}\r\n\r\n// Payload V1 is unsupported\r\n\r\ntype Payload_V2 = {\r\n tries: number;\r\n description: string;\r\n result: Results;\r\n resultType: ResultType;\r\n};\r\n\r\ntype Payload_V3 = {\r\n description: string;\r\n result: Results;\r\n resultType: ResultType;\r\n};\r\n"]}
1
+ {"version":3,"file":"SubmitResultHandler.js","sourceRoot":"","sources":["../../../../src/Handler/UCs/SubmitResultHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObject, AppObjectUC } from \"@vived/core\";\r\nimport { ChallengeResultsEntity } from \"../../ChallengeResults\";\r\nimport {\r\n ChallengeResponse,\r\n HostStateEntity,\r\n HostStateMachine\r\n} from \"../../StateMachine\";\r\nimport {\r\n HostHandlerEntity,\r\n RequestHandler,\r\n UnableToParsePayload,\r\n UnsupportedRequestVersion\r\n} from \"../Entities\";\r\n\r\nexport type ResultType =\r\n | \"HIT_V1\"\r\n | \"MULTIHIT_V1\"\r\n | \"QUALITY_V1\"\r\n | \"SCORE_V1\"\r\n | \"PROGRESS_V1\";\r\nexport type Results =\r\n | HitResultV1\r\n | MultiHitResultV1\r\n | QualityResultV1\r\n | ScoreResultV1\r\n | ProgressResultV1;\r\n\r\nexport type HitResultV1 = {\r\n success: boolean;\r\n};\r\n\r\nexport type MultiHitResultV1 = {\r\n hits: number;\r\n misses: number;\r\n unanswered: number;\r\n};\r\n\r\nexport type QualityResultV1 = {\r\n stars: number;\r\n maxStars: number;\r\n};\r\n\r\nexport type ScoreResultV1 = {\r\n score: number;\r\n maxScore: number;\r\n};\r\n\r\nexport type ProgressResultV1 = {\r\n progress: number;\r\n};\r\n\r\nexport type SubmitResultAction = (\r\n type: ResultType,\r\n result: Results,\r\n description: string\r\n) => void;\r\n\r\nexport abstract class SubmitResultHandler\r\n extends AppObjectUC\r\n implements RequestHandler\r\n{\r\n static readonly type = \"SubmitResultHandler\";\r\n\r\n readonly requestType = \"SUBMIT_RESULTS\";\r\n\r\n abstract action: SubmitResultAction;\r\n abstract handleRequest: (version: number, payload?: unknown) => void;\r\n}\r\n\r\nexport function makeSubmitResultHandler(\r\n appObject: AppObject\r\n): SubmitResultHandler {\r\n return new SubmitResultHandlerImp(appObject);\r\n}\r\n\r\nclass SubmitResultHandlerImp extends SubmitResultHandler {\r\n private get challengeResults() {\r\n return this.getCachedSingleton<ChallengeResultsEntity>(\r\n ChallengeResultsEntity.type\r\n );\r\n }\r\n\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n // Map result types to challenge responses\r\n private resultTypeToResponseMap: Record<ResultType, ChallengeResponse> = {\r\n HIT_V1: ChallengeResponse.HIT,\r\n MULTIHIT_V1: ChallengeResponse.MULTIHIT,\r\n QUALITY_V1: ChallengeResponse.QUALITY,\r\n SCORE_V1: ChallengeResponse.SCORE,\r\n PROGRESS_V1: ChallengeResponse.PROGRESS\r\n };\r\n\r\n action = (type: ResultType, result: Results, description: string) => {\r\n if (!this.challengeResults || !this.stateMachine) {\r\n this.error(\"Missing Component\");\r\n return;\r\n }\r\n\r\n if (this.stateMachine.activeState === undefined) {\r\n this.warn(\"Cannot store result because there is no active slide\");\r\n return;\r\n }\r\n\r\n const currentSlideId = this.stateMachine.activeState;\r\n const currentStateEntity = this.stateMachine.getStateByID(currentSlideId);\r\n\r\n if (!currentStateEntity) {\r\n this.warn(\"Cannot find active state entity\");\r\n return;\r\n }\r\n\r\n // Set the expected response based on the result type\r\n currentStateEntity.expectedResponse = this.resultTypeToResponseMap[type];\r\n\r\n let tries =\r\n this.challengeResults.getResultForSlide(currentSlideId)?.tries ?? 0;\r\n if (type !== \"PROGRESS_V1\") {\r\n tries += 1;\r\n }\r\n\r\n if (type === \"HIT_V1\") {\r\n this.handleHitV1(\r\n result as HitResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"MULTIHIT_V1\") {\r\n this.handleMultiHitV1(\r\n result as MultiHitResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"QUALITY_V1\") {\r\n this.handleQualityV1(\r\n result as QualityResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"SCORE_V1\") {\r\n this.handleScoreV1(\r\n result as ScoreResultV1,\r\n tries,\r\n currentSlideId,\r\n description\r\n );\r\n } else if (type === \"PROGRESS_V1\") {\r\n this.handleProgressV1(\r\n result as ProgressResultV1,\r\n currentSlideId,\r\n description\r\n );\r\n }\r\n };\r\n\r\n handleRequest = (version: number, payload: unknown) => {\r\n if (version === 2) {\r\n const { description, result, resultType } = this.castPayloadV2(payload);\r\n this.action(resultType, result, description);\r\n } else if (version === 3) {\r\n const { description, result, resultType } = this.castPayloadV3(payload);\r\n this.action(resultType, result, description);\r\n } else {\r\n throw new UnsupportedRequestVersion(this.requestType, version);\r\n }\r\n };\r\n\r\n private handleHitV1(\r\n result: HitResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const castResult = result;\r\n\r\n if (castResult.success === undefined) {\r\n this.warn(\r\n `Cannot parse Hit Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitHitResult(\r\n slideId,\r\n castResult.success,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private handleProgressV1(\r\n result: ProgressResultV1,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const castResult = result;\r\n\r\n if (castResult.progress === undefined) {\r\n this.warn(\r\n `Cannot parse Progress Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitProgressResult(\r\n slideId,\r\n castResult.progress,\r\n message\r\n );\r\n }\r\n\r\n private handleMultiHitV1(\r\n result: MultiHitResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { hits, misses, unanswered } = result;\r\n\r\n if (\r\n hits === undefined ||\r\n misses === undefined ||\r\n unanswered === undefined\r\n ) {\r\n this.warn(\r\n `Cannot parse Multi Hit Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitMultiHitResult(\r\n slideId,\r\n hits,\r\n misses,\r\n unanswered,\r\n misses, // Using misses as tries instead of the tries parameter\r\n message\r\n );\r\n }\r\n\r\n private handleQualityV1(\r\n result: QualityResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { maxStars, stars } = result;\r\n\r\n if (maxStars === undefined || stars === undefined) {\r\n this.warn(\r\n `Cannot parse Quality Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitQualityResult(\r\n slideId,\r\n stars,\r\n maxStars,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private handleScoreV1(\r\n result: ScoreResultV1,\r\n tries: number,\r\n slideId: string,\r\n message: string\r\n ) {\r\n const { score, maxScore } = result;\r\n\r\n if (maxScore === undefined || score === undefined) {\r\n this.warn(\r\n `Cannot parse Score Result V1 payload: ${JSON.stringify(result)}`\r\n );\r\n return;\r\n }\r\n\r\n this.challengeResults?.submitScoreResult(\r\n slideId,\r\n score,\r\n maxScore,\r\n tries,\r\n message\r\n );\r\n }\r\n\r\n private castPayloadV2(payload: unknown): Payload_V2 {\r\n const castPayload = payload as Payload_V2;\r\n if (\r\n castPayload.result === undefined ||\r\n castPayload.resultType === undefined\r\n ) {\r\n throw new UnableToParsePayload(\r\n this.requestType,\r\n 1,\r\n JSON.stringify(payload)\r\n );\r\n }\r\n\r\n return castPayload;\r\n }\r\n\r\n private castPayloadV3(payload: unknown): Payload_V3 {\r\n const castPayload = payload as Payload_V3;\r\n if (\r\n castPayload.result === undefined ||\r\n castPayload.resultType === undefined\r\n ) {\r\n throw new UnableToParsePayload(\r\n this.requestType,\r\n 2,\r\n JSON.stringify(payload)\r\n );\r\n }\r\n\r\n return castPayload;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, SubmitResultHandler.type);\r\n\r\n const hostHandler = HostHandlerEntity.get(appObject);\r\n if (!hostHandler) {\r\n this.error(\"UC added to an entity that does not have HostHandlerEntity\");\r\n return;\r\n }\r\n\r\n hostHandler.registerRequestHandler(this);\r\n }\r\n}\r\n\r\n// Payload V1 is unsupported\r\n\r\ntype Payload_V2 = {\r\n tries: number;\r\n description: string;\r\n result: Results;\r\n resultType: ResultType;\r\n};\r\n\r\ntype Payload_V3 = {\r\n description: string;\r\n result: Results;\r\n resultType: ResultType;\r\n};\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vived/host",
3
- "version": "4.5.1",
3
+ "version": "4.5.2",
4
4
  "description": "Public Host package for the VIVED Learning App system",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",