@quizpot/quizcore 0.0.1

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.
Files changed (125) hide show
  1. package/README.md +9 -0
  2. package/dist/events/client/host/kick-player.d.ts +8 -0
  3. package/dist/events/client/host/kick-player.d.ts.map +1 -0
  4. package/dist/events/client/host/kick-player.js +4 -0
  5. package/dist/events/client/host/next-step.d.ts +5 -0
  6. package/dist/events/client/host/next-step.d.ts.map +1 -0
  7. package/dist/events/client/host/next-step.js +3 -0
  8. package/dist/events/client/host/start-lobby.d.ts +6 -0
  9. package/dist/events/client/host/start-lobby.d.ts.map +1 -0
  10. package/dist/events/client/host/start-lobby.js +4 -0
  11. package/dist/events/client/player/submit-answer.d.ts +9 -0
  12. package/dist/events/client/player/submit-answer.d.ts.map +1 -0
  13. package/dist/events/client/player/submit-answer.js +4 -0
  14. package/dist/events/server/lobby-deleted.d.ts +8 -0
  15. package/dist/events/server/lobby-deleted.d.ts.map +1 -0
  16. package/dist/events/server/lobby-deleted.js +4 -0
  17. package/dist/events/server/lobby-joined.d.ts +14 -0
  18. package/dist/events/server/lobby-joined.d.ts.map +1 -0
  19. package/dist/events/server/lobby-joined.js +18 -0
  20. package/dist/events/server/lobby-status-update.d.ts +32 -0
  21. package/dist/events/server/lobby-status-update.d.ts.map +1 -0
  22. package/dist/events/server/lobby-status-update.js +4 -0
  23. package/dist/events/server/player-answer-result.d.ts +11 -0
  24. package/dist/events/server/player-answer-result.d.ts.map +1 -0
  25. package/dist/events/server/player-answer-result.js +4 -0
  26. package/dist/events/server/player-joined.d.ts +9 -0
  27. package/dist/events/server/player-joined.d.ts.map +1 -0
  28. package/dist/events/server/player-joined.js +4 -0
  29. package/dist/events/server/player-kicked.d.ts +6 -0
  30. package/dist/events/server/player-kicked.d.ts.map +1 -0
  31. package/dist/events/server/player-kicked.js +4 -0
  32. package/dist/events/server/player-left.d.ts +9 -0
  33. package/dist/events/server/player-left.d.ts.map +1 -0
  34. package/dist/events/server/player-left.js +4 -0
  35. package/dist/events/server/player-update.d.ts +9 -0
  36. package/dist/events/server/player-update.d.ts.map +1 -0
  37. package/dist/events/server/player-update.js +4 -0
  38. package/dist/events/server/update-lobby-answers.d.ts +8 -0
  39. package/dist/events/server/update-lobby-answers.d.ts.map +1 -0
  40. package/dist/events/server/update-lobby-answers.js +4 -0
  41. package/dist/index.d.ts +26 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +25 -0
  44. package/dist/managers/lobby-manager.d.ts +12 -0
  45. package/dist/managers/lobby-manager.d.ts.map +1 -0
  46. package/dist/managers/lobby-manager.js +112 -0
  47. package/dist/questions/multiple-choice.d.ts +22 -0
  48. package/dist/questions/multiple-choice.d.ts.map +1 -0
  49. package/dist/questions/multiple-choice.js +1 -0
  50. package/dist/questions/short-answer.d.ts +12 -0
  51. package/dist/questions/short-answer.d.ts.map +1 -0
  52. package/dist/questions/short-answer.js +1 -0
  53. package/dist/questions/true-false.d.ts +12 -0
  54. package/dist/questions/true-false.d.ts.map +1 -0
  55. package/dist/questions/true-false.js +1 -0
  56. package/dist/schemas/quizfile.d.ts +87 -0
  57. package/dist/schemas/quizfile.d.ts.map +1 -0
  58. package/dist/schemas/quizfile.js +55 -0
  59. package/dist/slides/comparison.d.ts +9 -0
  60. package/dist/slides/comparison.d.ts.map +1 -0
  61. package/dist/slides/comparison.js +7 -0
  62. package/dist/slides/titleImageTextSlide.d.ts +9 -0
  63. package/dist/slides/titleImageTextSlide.d.ts.map +1 -0
  64. package/dist/slides/titleImageTextSlide.js +7 -0
  65. package/dist/slides/titleSlide.d.ts +8 -0
  66. package/dist/slides/titleSlide.d.ts.map +1 -0
  67. package/dist/slides/titleSlide.js +6 -0
  68. package/dist/types/events.d.ts +16 -0
  69. package/dist/types/events.d.ts.map +1 -0
  70. package/dist/types/events.js +1 -0
  71. package/dist/types/lobby.d.ts +42 -0
  72. package/dist/types/lobby.d.ts.map +1 -0
  73. package/dist/types/lobby.js +10 -0
  74. package/dist/types/question.d.ts +106 -0
  75. package/dist/types/question.d.ts.map +1 -0
  76. package/dist/types/question.js +22 -0
  77. package/dist/types/questions/multiple-choice.d.ts +51 -0
  78. package/dist/types/questions/multiple-choice.d.ts.map +1 -0
  79. package/dist/types/questions/multiple-choice.js +21 -0
  80. package/dist/types/questions/short-answer.d.ts +34 -0
  81. package/dist/types/questions/short-answer.d.ts.map +1 -0
  82. package/dist/types/questions/short-answer.js +11 -0
  83. package/dist/types/questions/true-false.d.ts +36 -0
  84. package/dist/types/questions/true-false.d.ts.map +1 -0
  85. package/dist/types/questions/true-false.js +12 -0
  86. package/dist/types/quizfile.d.ts +79 -0
  87. package/dist/types/quizfile.d.ts.map +1 -0
  88. package/dist/types/quizfile.js +23 -0
  89. package/dist/types/quizstep.d.ts +73 -0
  90. package/dist/types/quizstep.d.ts.map +1 -0
  91. package/dist/types/quizstep.js +7 -0
  92. package/dist/types/quiztheme.d.ts +7 -0
  93. package/dist/types/quiztheme.d.ts.map +1 -0
  94. package/dist/types/quiztheme.js +5 -0
  95. package/dist/types/slide.d.ts +18 -0
  96. package/dist/types/slide.d.ts.map +1 -0
  97. package/dist/types/slide.js +9 -0
  98. package/dist/types/slides/comparison.d.ts +9 -0
  99. package/dist/types/slides/comparison.d.ts.map +1 -0
  100. package/dist/types/slides/comparison.js +7 -0
  101. package/dist/types/slides/titleImageTextSlide.d.ts +9 -0
  102. package/dist/types/slides/titleImageTextSlide.d.ts.map +1 -0
  103. package/dist/types/slides/titleImageTextSlide.js +7 -0
  104. package/dist/types/slides/titleSlide.d.ts +8 -0
  105. package/dist/types/slides/titleSlide.d.ts.map +1 -0
  106. package/dist/types/slides/titleSlide.js +6 -0
  107. package/dist/util/guards.d.ts +18 -0
  108. package/dist/util/guards.d.ts.map +1 -0
  109. package/dist/util/guards.js +15 -0
  110. package/dist/util/names/additives.json +23 -0
  111. package/dist/util/names/animals.json +23 -0
  112. package/dist/util/names/colors.json +14 -0
  113. package/dist/util/names/names.d.ts +4 -0
  114. package/dist/util/names/names.d.ts.map +1 -0
  115. package/dist/util/names/names.js +31 -0
  116. package/dist/util/sanitizer.d.ts +3 -0
  117. package/dist/util/sanitizer.d.ts.map +1 -0
  118. package/dist/util/sanitizer.js +18 -0
  119. package/dist/util/score.d.ts +11 -0
  120. package/dist/util/score.d.ts.map +1 -0
  121. package/dist/util/score.js +33 -0
  122. package/dist/util/validator.d.ts +14 -0
  123. package/dist/util/validator.d.ts.map +1 -0
  124. package/dist/util/validator.js +27 -0
  125. package/package.json +28 -0
package/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # Quizcore
2
+
3
+ Core library for Quizpot
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install git+https://github.com/quizpot/quizcore.git
9
+ ```
@@ -0,0 +1,8 @@
1
+ export type KickPlayer = {
2
+ type: "KICK_PLAYER";
3
+ payload: {
4
+ playerId: string;
5
+ };
6
+ };
7
+ export declare const createKickPlayerEvent: (playerId: string) => KickPlayer;
8
+ //# sourceMappingURL=kick-player.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kick-player.d.ts","sourceRoot":"","sources":["../../../../src/events/client/host/kick-player.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,UAAU,MAAM,KAAG,UAGvD,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const createKickPlayerEvent = (playerId) => ({
2
+ type: "KICK_PLAYER",
3
+ payload: { playerId }
4
+ });
@@ -0,0 +1,5 @@
1
+ export type NextStep = {
2
+ type: "NEXT_STEP";
3
+ };
4
+ export declare const createNextStepEvent: () => NextStep;
5
+ //# sourceMappingURL=next-step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-step.d.ts","sourceRoot":"","sources":["../../../../src/events/client/host/next-step.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAO,QAErC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export const createNextStepEvent = () => ({
2
+ type: "NEXT_STEP",
3
+ });
@@ -0,0 +1,6 @@
1
+ export type StartLobby = {
2
+ type: "START_LOBBY";
3
+ payload: {};
4
+ };
5
+ export declare const createStartLobbyEvent: () => StartLobby;
6
+ //# sourceMappingURL=start-lobby.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-lobby.d.ts","sourceRoot":"","sources":["../../../../src/events/client/host/start-lobby.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,EAAE,CAAC;CACb,CAAC;AAEF,eAAO,MAAM,qBAAqB,QAAO,UAGvC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const createStartLobbyEvent = () => ({
2
+ type: "START_LOBBY",
3
+ payload: {}
4
+ });
@@ -0,0 +1,9 @@
1
+ import { SubmittedAnswer } from "../../../util/validator";
2
+ export type SubmitAnswer = {
3
+ type: "SUBMIT_ANSWER";
4
+ payload: {
5
+ submission: SubmittedAnswer;
6
+ };
7
+ };
8
+ export declare const createSubmitAnswerEvent: (submission: SubmittedAnswer) => SubmitAnswer;
9
+ //# sourceMappingURL=submit-answer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit-answer.d.ts","sourceRoot":"","sources":["../../../../src/events/client/player/submit-answer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE;QAAE,UAAU,EAAE,eAAe,CAAA;KAAE,CAAC;CAC1C,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,YAAY,eAAe,KAAG,YAGpE,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const createSubmitAnswerEvent = (submission) => ({
2
+ type: "SUBMIT_ANSWER",
3
+ payload: { submission }
4
+ });
@@ -0,0 +1,8 @@
1
+ export type LobbyDeleted = {
2
+ type: "LOBBY_DELETED";
3
+ payload: {
4
+ reason: string;
5
+ };
6
+ };
7
+ export declare const createLobbyDeletedEvent: (reason: string) => LobbyDeleted;
8
+ //# sourceMappingURL=lobby-deleted.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lobby-deleted.d.ts","sourceRoot":"","sources":["../../../src/events/server/lobby-deleted.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,QAAQ,MAAM,KAAG,YAGvD,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const createLobbyDeletedEvent = (reason) => ({
2
+ type: "LOBBY_DELETED",
3
+ payload: { reason }
4
+ });
@@ -0,0 +1,14 @@
1
+ import { Lobby, Player } from "../../types/lobby";
2
+ import { Answer } from "../../util/validator";
3
+ export type LobbyJoined = {
4
+ type: "LOBBY_JOINED";
5
+ payload: {
6
+ lobby: Omit<Lobby, "host" | "quiz" | "players" | "currentAnswers" | "answers">;
7
+ me?: Player;
8
+ players?: Player[];
9
+ currentAnswers?: Answer[];
10
+ answers?: Answer[];
11
+ };
12
+ };
13
+ export declare const createLobbyJoinedEvent: (lobby: Lobby, me: Player, isHost: boolean) => LobbyJoined;
14
+ //# sourceMappingURL=lobby-joined.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lobby-joined.d.ts","sourceRoot":"","sources":["../../../src/events/server/lobby-joined.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE;QACP,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,gBAAgB,GAAG,SAAS,CAAC,CAAC;QAC/E,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,OAAO,KAAK,EACZ,IAAI,MAAM,EACV,QAAQ,OAAO,KACd,WAiBD,CAAC"}
@@ -0,0 +1,18 @@
1
+ export const createLobbyJoinedEvent = (lobby, me, isHost) => ({
2
+ type: "LOBBY_JOINED",
3
+ payload: {
4
+ lobby: {
5
+ code: lobby.code,
6
+ quizInfo: lobby.quizInfo,
7
+ status: lobby.status,
8
+ timeoutStartedAt: lobby.timeoutStartedAt,
9
+ duration: lobby.duration,
10
+ currentStep: lobby.currentStep,
11
+ settings: lobby.settings,
12
+ },
13
+ me,
14
+ players: isHost ? lobby.players : undefined,
15
+ currentAnswers: isHost ? lobby.currentAnswers : undefined,
16
+ answers: isHost ? lobby.answers : undefined,
17
+ }
18
+ });
@@ -0,0 +1,32 @@
1
+ import { LobbyStatus, Player } from "../../types/lobby";
2
+ import { SafeQuestion } from "../../types/question";
3
+ import { Slide } from "../../types/slide";
4
+ import { Answer } from "../../util/validator";
5
+ export type LobbyStatusUpdate = {
6
+ type: "LOBBY_STATUS_UPDATE";
7
+ payload: {
8
+ status: LobbyStatus.waiting;
9
+ } | {
10
+ status: LobbyStatus.slide;
11
+ slide: Slide;
12
+ } | {
13
+ status: LobbyStatus.question;
14
+ question: SafeQuestion;
15
+ timeoutStartedAt: number;
16
+ duration: number;
17
+ } | {
18
+ status: LobbyStatus.answer;
19
+ timeoutStartedAt: number;
20
+ duration: number;
21
+ } | {
22
+ status: LobbyStatus.answers;
23
+ answers: Answer[];
24
+ } | {
25
+ status: LobbyStatus.score;
26
+ leaderboard: Player[];
27
+ } | {
28
+ status: LobbyStatus.end;
29
+ };
30
+ };
31
+ export declare const createLobbyStatusUpdateEvent: (payload: LobbyStatusUpdate["payload"]) => LobbyStatusUpdate;
32
+ //# sourceMappingURL=lobby-status-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lobby-status-update.d.ts","sourceRoot":"","sources":["../../../src/events/server/lobby-status-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,qBAAqB,CAAC;IAC5B,OAAO,EACH;QAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAA;KAAE,GAC/B;QAAE,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,GAC3C;QAAE,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GACpG;QAAE,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAC1E;QAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,GAClD;QAAE,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,GACpD;QAAE,MAAM,EAAE,WAAW,CAAC,GAAG,CAAA;KAAE,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,SAAS,iBAAiB,CAAC,SAAS,CAAC,KACpC,iBAGD,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const createLobbyStatusUpdateEvent = (payload) => ({
2
+ type: "LOBBY_STATUS_UPDATE",
3
+ payload,
4
+ });
@@ -0,0 +1,11 @@
1
+ export type PlayerAnswerResult = {
2
+ type: "PLAYER_ANSWER_RESULT";
3
+ payload: {
4
+ isCorrect: boolean;
5
+ pointsAwarded: number;
6
+ score: number;
7
+ streak: number;
8
+ };
9
+ };
10
+ export declare const createPlayerAnswerResultEvent: (isCorrect: boolean, pointsAwarded: number, score: number, streak: number) => PlayerAnswerResult;
11
+ //# sourceMappingURL=player-answer-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-answer-result.d.ts","sourceRoot":"","sources":["../../../src/events/server/player-answer-result.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,sBAAsB,CAAC;IAC7B,OAAO,EAAE;QACP,SAAS,EAAE,OAAO,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,WAAW,OAAO,EAClB,eAAe,MAAM,EACrB,OAAO,MAAM,EACb,QAAQ,MAAM,KACb,kBAGD,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const createPlayerAnswerResultEvent = (isCorrect, pointsAwarded, score, streak) => ({
2
+ type: "PLAYER_ANSWER_RESULT",
3
+ payload: { isCorrect, pointsAwarded, score, streak }
4
+ });
@@ -0,0 +1,9 @@
1
+ import { Player } from "../../types/lobby";
2
+ export type PlayerJoined = {
3
+ type: "PLAYER_JOINED";
4
+ payload: {
5
+ player: Player;
6
+ };
7
+ };
8
+ export declare const createPlayerJoinedEvent: (player: Player) => PlayerJoined;
9
+ //# sourceMappingURL=player-joined.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-joined.d.ts","sourceRoot":"","sources":["../../../src/events/server/player-joined.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,QAAQ,MAAM,KAAG,YAGvD,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const createPlayerJoinedEvent = (player) => ({
2
+ type: "PLAYER_JOINED",
3
+ payload: { player }
4
+ });
@@ -0,0 +1,6 @@
1
+ export type PlayerKicked = {
2
+ type: "PLAYER_KICKED";
3
+ payload: {};
4
+ };
5
+ export declare const createPlayerKickedEvent: () => PlayerKicked;
6
+ //# sourceMappingURL=player-kicked.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-kicked.d.ts","sourceRoot":"","sources":["../../../src/events/server/player-kicked.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,EAAE,CAAC;CACb,CAAC;AAEF,eAAO,MAAM,uBAAuB,QAAO,YAGzC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const createPlayerKickedEvent = () => ({
2
+ type: "PLAYER_KICKED",
3
+ payload: {}
4
+ });
@@ -0,0 +1,9 @@
1
+ import { Player } from "../../types/lobby";
2
+ export type PlayerLeft = {
3
+ type: "PLAYER_LEFT";
4
+ payload: {
5
+ player: Player;
6
+ };
7
+ };
8
+ export declare const createPlayerLeftEvent: (player: Player) => PlayerLeft;
9
+ //# sourceMappingURL=player-left.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-left.d.ts","sourceRoot":"","sources":["../../../src/events/server/player-left.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,QAAQ,MAAM,KAAG,UAGrD,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const createPlayerLeftEvent = (player) => ({
2
+ type: "PLAYER_LEFT",
3
+ payload: { player }
4
+ });
@@ -0,0 +1,9 @@
1
+ import { Player } from "../../types/lobby";
2
+ export type PlayerUpdate = {
3
+ type: "PLAYER_UPDATE";
4
+ payload: {
5
+ player: Player;
6
+ };
7
+ };
8
+ export declare const createPlayerUpdateEvent: (player: Player) => PlayerUpdate;
9
+ //# sourceMappingURL=player-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-update.d.ts","sourceRoot":"","sources":["../../../src/events/server/player-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,QAAQ,MAAM,KAAG,YAGvD,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const createPlayerUpdateEvent = (player) => ({
2
+ type: "PLAYER_UPDATE",
3
+ payload: { player }
4
+ });
@@ -0,0 +1,8 @@
1
+ export type UpdateLobbyAnswers = {
2
+ type: "UPDATE_LOBBY_ANSWERS";
3
+ payload: {
4
+ count: number;
5
+ };
6
+ };
7
+ export declare const createUpdateLobbyAnswersEvent: (count: number) => UpdateLobbyAnswers;
8
+ //# sourceMappingURL=update-lobby-answers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-lobby-answers.d.ts","sourceRoot":"","sources":["../../../src/events/server/update-lobby-answers.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,sBAAsB,CAAC;IAC7B,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,6BAA6B,GAAI,OAAO,MAAM,KAAG,kBAG5D,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const createUpdateLobbyAnswersEvent = (count) => ({
2
+ type: "UPDATE_LOBBY_ANSWERS",
3
+ payload: { count }
4
+ });
@@ -0,0 +1,26 @@
1
+ export * from './events/client/host/kick-player';
2
+ export * from './events/client/host/next-step';
3
+ export * from './events/client/host/start-lobby';
4
+ export * from './events/client/player/submit-answer';
5
+ export * from './events/server/lobby-deleted';
6
+ export * from './events/server/lobby-joined';
7
+ export * from './events/server/lobby-status-update';
8
+ export * from './events/server/player-answer-result';
9
+ export * from './events/server/player-joined';
10
+ export * from './events/server/player-kicked';
11
+ export * from './events/server/player-left';
12
+ export * from './events/server/player-update';
13
+ export * from './events/server/update-lobby-answers';
14
+ export * from './managers/lobby-manager';
15
+ export * from './types/questions/multiple-choice';
16
+ export * from './types/questions/short-answer';
17
+ export * from './types/questions/true-false';
18
+ export * from './types/events';
19
+ export * from './types/lobby';
20
+ export * from './types/quizfile';
21
+ export * from './util/guards';
22
+ export * from './util/names/names';
23
+ export * from './util/sanitizer';
24
+ export * from './util/score';
25
+ export * from './util/validator';
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ export * from './events/client/host/kick-player';
2
+ export * from './events/client/host/next-step';
3
+ export * from './events/client/host/start-lobby';
4
+ export * from './events/client/player/submit-answer';
5
+ export * from './events/server/lobby-deleted';
6
+ export * from './events/server/lobby-joined';
7
+ export * from './events/server/lobby-status-update';
8
+ export * from './events/server/player-answer-result';
9
+ export * from './events/server/player-joined';
10
+ export * from './events/server/player-kicked';
11
+ export * from './events/server/player-left';
12
+ export * from './events/server/player-update';
13
+ export * from './events/server/update-lobby-answers';
14
+ export * from './managers/lobby-manager';
15
+ export * from './types/questions/multiple-choice';
16
+ export * from './types/questions/short-answer';
17
+ export * from './types/questions/true-false';
18
+ export * from './types/events';
19
+ export * from './types/lobby';
20
+ export * from './types/quizfile';
21
+ export * from './util/guards';
22
+ export * from './util/names/names';
23
+ export * from './util/sanitizer';
24
+ export * from './util/score';
25
+ export * from './util/validator';
@@ -0,0 +1,12 @@
1
+ import { PlayerAnswerResult } from "../events/server/player-answer-result";
2
+ import { Lobby } from "../types/lobby";
3
+ import { QuizFile } from "../types/quizfile";
4
+ import { SubmittedAnswer } from "../util/validator";
5
+ export declare const createLobby: (code: string, hostId: string, quiz: QuizFile) => Lobby;
6
+ export declare const advanceLobby: (lobby: Lobby) => Lobby;
7
+ export type SubmissionResult = {
8
+ nextLobby: Lobby;
9
+ result: PlayerAnswerResult;
10
+ };
11
+ export declare const handleSubmission: (lobby: Lobby, playerId: string, submission: SubmittedAnswer) => SubmissionResult | null;
12
+ //# sourceMappingURL=lobby-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lobby-manager.d.ts","sourceRoot":"","sources":["../../src/managers/lobby-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,KAAK,EAAe,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,OAAO,EAAqB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEvE,eAAO,MAAM,WAAW,GACtB,MAAM,MAAM,EACZ,QAAQ,MAAM,EACd,MAAM,QAAQ,KACb,KAiBD,CAAC;AAEH,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,KAAG,KAmC3C,CAAC;AA0BF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,kBAAkB,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,KAAK,EACZ,UAAU,MAAM,EAChB,YAAY,eAAe,KAC1B,gBAAgB,GAAG,IA0CrB,CAAC"}
@@ -0,0 +1,112 @@
1
+ import { LobbyStatus } from "../types/lobby";
2
+ import { isQuestion } from "../util/guards";
3
+ import { calculateScore } from "../util/score";
4
+ import { isCorrect } from "../util/validator";
5
+ export const createLobby = (code, hostId, quiz) => ({
6
+ code,
7
+ host: hostId,
8
+ quiz,
9
+ quizInfo: {
10
+ title: quiz.title,
11
+ stepCount: quiz.steps.length,
12
+ theme: quiz.theme
13
+ },
14
+ players: [],
15
+ status: LobbyStatus.waiting,
16
+ currentStep: 0,
17
+ timeoutStartedAt: null,
18
+ duration: null,
19
+ currentAnswers: [],
20
+ answers: [],
21
+ settings: { customNames: true, displayOnDevice: true }
22
+ });
23
+ export const advanceLobby = (lobby) => {
24
+ const isLastStep = lobby.currentStep >= lobby.quiz.steps.length - 1;
25
+ switch (lobby.status) {
26
+ case LobbyStatus.waiting:
27
+ return prepareStep(lobby, 0);
28
+ case LobbyStatus.slide:
29
+ case LobbyStatus.score:
30
+ return isLastStep
31
+ ? { ...lobby, status: LobbyStatus.end }
32
+ : prepareStep(lobby, lobby.currentStep + 1);
33
+ case LobbyStatus.question: {
34
+ const step = lobby.quiz.steps[lobby.currentStep];
35
+ if (step.type !== 'question')
36
+ return lobby;
37
+ return {
38
+ ...lobby,
39
+ status: LobbyStatus.answer,
40
+ timeoutStartedAt: Date.now(),
41
+ duration: step.data.timeLimit * 1000,
42
+ currentAnswers: []
43
+ };
44
+ }
45
+ case LobbyStatus.answer:
46
+ return { ...lobby, status: LobbyStatus.answers };
47
+ case LobbyStatus.answers:
48
+ return { ...lobby, status: LobbyStatus.score };
49
+ default:
50
+ return lobby;
51
+ }
52
+ };
53
+ // Prepares the lobby for the next step
54
+ const prepareStep = (lobby, index) => {
55
+ const step = lobby.quiz.steps[index];
56
+ if (!step)
57
+ return lobby;
58
+ if (step.type === "slide") {
59
+ return {
60
+ ...lobby,
61
+ status: LobbyStatus.slide,
62
+ currentStep: index
63
+ };
64
+ }
65
+ return {
66
+ ...lobby,
67
+ status: LobbyStatus.question,
68
+ currentStep: index,
69
+ timeoutStartedAt: null,
70
+ duration: null,
71
+ currentAnswers: []
72
+ };
73
+ };
74
+ export const handleSubmission = (lobby, playerId, submission) => {
75
+ if (lobby.status !== LobbyStatus.answer)
76
+ return null;
77
+ const step = lobby.quiz.steps[lobby.currentStep];
78
+ if (!isQuestion(step))
79
+ return null;
80
+ const player = lobby.players.find(p => p.id === playerId);
81
+ if (!player)
82
+ return null;
83
+ if (lobby.currentAnswers.some(a => a.playerId === playerId))
84
+ return null;
85
+ const correct = isCorrect(step.data, submission);
86
+ const timeTaken = Date.now() - (lobby.timeoutStartedAt ?? 0);
87
+ const answerObj = {
88
+ playerId,
89
+ submission,
90
+ timeTaken,
91
+ isCorrect: correct,
92
+ pointsAwarded: 0
93
+ };
94
+ const { newScore, pointsAwarded } = calculateScore(player, step.data, answerObj, lobby.quiz);
95
+ answerObj.pointsAwarded = pointsAwarded;
96
+ const nextLobby = {
97
+ ...lobby,
98
+ players: lobby.players.map(p => p.id === playerId ? {
99
+ ...p,
100
+ score: newScore,
101
+ streak: correct ? p.streak + 1 : 0
102
+ } : p),
103
+ currentAnswers: [...lobby.currentAnswers, answerObj]
104
+ };
105
+ return {
106
+ nextLobby,
107
+ result: {
108
+ type: "PLAYER_ANSWER_RESULT",
109
+ payload: { isCorrect: correct, pointsAwarded, score: newScore, streak: correct ? player.streak + 1 : 0 }
110
+ }
111
+ };
112
+ };
@@ -0,0 +1,22 @@
1
+ import { BaseQuestion } from "../types/quizfile";
2
+ export interface MultipleChoiceQuestion extends BaseQuestion {
3
+ questionType: "multipleChoice";
4
+ choices: Choice[];
5
+ matchAll: boolean;
6
+ }
7
+ export interface Choice {
8
+ text: string;
9
+ correct: boolean;
10
+ }
11
+ export interface SafeMultipleChoiceQuestion extends Omit<MultipleChoiceQuestion, "choices"> {
12
+ choices: SafeChoice[];
13
+ matchAll: boolean;
14
+ }
15
+ export interface SafeChoice {
16
+ text: string;
17
+ }
18
+ export interface MultipleChoiceQuestionAnswer {
19
+ type: "multipleChoice";
20
+ choices: number[];
21
+ }
22
+ //# sourceMappingURL=multiple-choice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiple-choice.d.ts","sourceRoot":"","sources":["../../src/questions/multiple-choice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,WAAW,sBAAuB,SAAQ,YAAY;IAC1D,YAAY,EAAE,gBAAgB,CAAC;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,0BAA2B,SAAQ,IAAI,CAAC,sBAAsB,EAAE,SAAS,CAAC;IACzF,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { BaseQuestion } from "../types/quizfile";
2
+ export interface ShortAnswerQuestion extends BaseQuestion {
3
+ questionType: "shortAnswer";
4
+ answers: string[];
5
+ }
6
+ export interface SafeShortAnswerQuestion extends Omit<ShortAnswerQuestion, "answers"> {
7
+ }
8
+ export interface ShortAnswerQuestionAnswer {
9
+ type: "shortAnswer";
10
+ answer: string;
11
+ }
12
+ //# sourceMappingURL=short-answer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"short-answer.d.ts","sourceRoot":"","sources":["../../src/questions/short-answer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACvD,YAAY,EAAE,aAAa,CAAC;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC;CAAG;AAExF,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { BaseQuestion } from "../types/quizfile";
2
+ export interface TrueFalseQuestion extends BaseQuestion {
3
+ questionType: "trueFalse";
4
+ answer: boolean;
5
+ }
6
+ export interface SafeTrueFalseQuestion extends Omit<TrueFalseQuestion, "answer"> {
7
+ }
8
+ export interface TrueFalseQuestionAnswer {
9
+ type: "trueFalse";
10
+ answer: boolean;
11
+ }
12
+ //# sourceMappingURL=true-false.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"true-false.d.ts","sourceRoot":"","sources":["../../src/questions/true-false.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,YAAY,EAAE,WAAW,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC;CAAG;AAEnF,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB"}
@@ -0,0 +1 @@
1
+ export {};