@pickleball/expo-sdk 0.1.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 (129) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/LICENSE +21 -0
  3. package/README.md +75 -0
  4. package/app.plugin.js +6 -0
  5. package/dist/chunk-VHLUJQG5.js +17 -0
  6. package/dist/index.cjs +6284 -0
  7. package/dist/index.d.cts +1436 -0
  8. package/dist/index.d.ts +1436 -0
  9. package/dist/index.js +6186 -0
  10. package/dist/plugin.cjs +153 -0
  11. package/dist/plugin.d.cts +21 -0
  12. package/dist/plugin.d.ts +21 -0
  13. package/dist/plugin.js +131 -0
  14. package/dist/version.cjs +35 -0
  15. package/dist/version.d.cts +4 -0
  16. package/dist/version.d.ts +4 -0
  17. package/dist/version.js +6 -0
  18. package/package.json +126 -0
  19. package/src/contracts.ts +211 -0
  20. package/src/engine.ts +1332 -0
  21. package/src/errors.ts +128 -0
  22. package/src/http-session-provider.ts +259 -0
  23. package/src/index.ts +16 -0
  24. package/src/livekit-room-adapter.ts +353 -0
  25. package/src/livestream-screen.tsx +980 -0
  26. package/src/match/contracts.ts +137 -0
  27. package/src/match/engine.ts +702 -0
  28. package/src/match/persistence/default-store.native.ts +20 -0
  29. package/src/match/persistence/default-store.ts +11 -0
  30. package/src/match/persistence/index.ts +6 -0
  31. package/src/match/persistence/memory-driver.ts +255 -0
  32. package/src/match/persistence/migrations.ts +40 -0
  33. package/src/match/persistence/sqlite-driver.ts +348 -0
  34. package/src/match/persistence/store.ts +497 -0
  35. package/src/match/persistence/types.ts +98 -0
  36. package/src/match/provider.tsx +728 -0
  37. package/src/match/remote/deduplicator.ts +54 -0
  38. package/src/match/remote/encoding.ts +12 -0
  39. package/src/match/remote/hid-gesture.ts +61 -0
  40. package/src/match/remote/index.ts +5 -0
  41. package/src/match/remote/native-service.ts +62 -0
  42. package/src/match/remote/parser.ts +134 -0
  43. package/src/match/remote/types.ts +116 -0
  44. package/src/match/replay.ts +102 -0
  45. package/src/match/state.ts +72 -0
  46. package/src/match/validation.ts +375 -0
  47. package/src/match/voice/assets/court-left.wav +0 -0
  48. package/src/match/voice/assets/court-right.wav +0 -0
  49. package/src/match/voice/assets/court-switch.wav +0 -0
  50. package/src/match/voice/assets/game-point.wav +0 -0
  51. package/src/match/voice/assets/game-won.wav +0 -0
  52. package/src/match/voice/assets/match-won.wav +0 -0
  53. package/src/match/voice/assets/number-0.wav +0 -0
  54. package/src/match/voice/assets/number-1.wav +0 -0
  55. package/src/match/voice/assets/number-10.wav +0 -0
  56. package/src/match/voice/assets/number-11.wav +0 -0
  57. package/src/match/voice/assets/number-12.wav +0 -0
  58. package/src/match/voice/assets/number-13.wav +0 -0
  59. package/src/match/voice/assets/number-14.wav +0 -0
  60. package/src/match/voice/assets/number-15.wav +0 -0
  61. package/src/match/voice/assets/number-16.wav +0 -0
  62. package/src/match/voice/assets/number-17.wav +0 -0
  63. package/src/match/voice/assets/number-18.wav +0 -0
  64. package/src/match/voice/assets/number-19.wav +0 -0
  65. package/src/match/voice/assets/number-2.wav +0 -0
  66. package/src/match/voice/assets/number-20.wav +0 -0
  67. package/src/match/voice/assets/number-3.wav +0 -0
  68. package/src/match/voice/assets/number-30.wav +0 -0
  69. package/src/match/voice/assets/number-4.wav +0 -0
  70. package/src/match/voice/assets/number-40.wav +0 -0
  71. package/src/match/voice/assets/number-5.wav +0 -0
  72. package/src/match/voice/assets/number-50.wav +0 -0
  73. package/src/match/voice/assets/number-6.wav +0 -0
  74. package/src/match/voice/assets/number-60.wav +0 -0
  75. package/src/match/voice/assets/number-7.wav +0 -0
  76. package/src/match/voice/assets/number-70.wav +0 -0
  77. package/src/match/voice/assets/number-8.wav +0 -0
  78. package/src/match/voice/assets/number-80.wav +0 -0
  79. package/src/match/voice/assets/number-9.wav +0 -0
  80. package/src/match/voice/assets/number-90.wav +0 -0
  81. package/src/match/voice/assets/number-lam.wav +0 -0
  82. package/src/match/voice/assets/number-mot.wav +0 -0
  83. package/src/match/voice/assets/score-deu-0.wav +0 -0
  84. package/src/match/voice/assets/score-deu-1.wav +0 -0
  85. package/src/match/voice/assets/score-deu-10.wav +0 -0
  86. package/src/match/voice/assets/score-deu-11.wav +0 -0
  87. package/src/match/voice/assets/score-deu-12.wav +0 -0
  88. package/src/match/voice/assets/score-deu-13.wav +0 -0
  89. package/src/match/voice/assets/score-deu-14.wav +0 -0
  90. package/src/match/voice/assets/score-deu-15.wav +0 -0
  91. package/src/match/voice/assets/score-deu-16.wav +0 -0
  92. package/src/match/voice/assets/score-deu-17.wav +0 -0
  93. package/src/match/voice/assets/score-deu-18.wav +0 -0
  94. package/src/match/voice/assets/score-deu-19.wav +0 -0
  95. package/src/match/voice/assets/score-deu-2.wav +0 -0
  96. package/src/match/voice/assets/score-deu-20.wav +0 -0
  97. package/src/match/voice/assets/score-deu-3.wav +0 -0
  98. package/src/match/voice/assets/score-deu-30.wav +0 -0
  99. package/src/match/voice/assets/score-deu-4.wav +0 -0
  100. package/src/match/voice/assets/score-deu-40.wav +0 -0
  101. package/src/match/voice/assets/score-deu-5.wav +0 -0
  102. package/src/match/voice/assets/score-deu-50.wav +0 -0
  103. package/src/match/voice/assets/score-deu-6.wav +0 -0
  104. package/src/match/voice/assets/score-deu-60.wav +0 -0
  105. package/src/match/voice/assets/score-deu-7.wav +0 -0
  106. package/src/match/voice/assets/score-deu-70.wav +0 -0
  107. package/src/match/voice/assets/score-deu-8.wav +0 -0
  108. package/src/match/voice/assets/score-deu-80.wav +0 -0
  109. package/src/match/voice/assets/score-deu-9.wav +0 -0
  110. package/src/match/voice/assets/score-deu-90.wav +0 -0
  111. package/src/match/voice/assets/score-deu-lam.wav +0 -0
  112. package/src/match/voice/assets/score-deu-mot.wav +0 -0
  113. package/src/match/voice/assets/server-1.wav +0 -0
  114. package/src/match/voice/assets/server-2.wav +0 -0
  115. package/src/match/voice/assets/service-change.wav +0 -0
  116. package/src/match/voice/assets/test-speaker.wav +0 -0
  117. package/src/match/voice/audio.ts +231 -0
  118. package/src/match/voice/bundled-assets.native.ts +47 -0
  119. package/src/match/voice/bundled-assets.ts +3 -0
  120. package/src/match/voice/gemini-engine.ts +167 -0
  121. package/src/match/voice/index.ts +7 -0
  122. package/src/match/voice/phrases.ts +185 -0
  123. package/src/match/voice/scheduler.ts +205 -0
  124. package/src/match/voice/service.ts +147 -0
  125. package/src/match/voice/types.ts +118 -0
  126. package/src/native-runtime.ts +241 -0
  127. package/src/plugin.ts +145 -0
  128. package/src/provider.tsx +176 -0
  129. package/src/version.ts +4 -0
@@ -0,0 +1,137 @@
1
+ export type MatchFormat = "singles" | "doubles";
2
+ export type MatchScoringMode = "rally" | "sideOut";
3
+ export type MatchTeamId = "A" | "B";
4
+ export type CourtSide = "left" | "right";
5
+ export type MatchInputSource =
6
+ | "local"
7
+ | "remote"
8
+ | "voice"
9
+ | "ble"
10
+ | "system";
11
+
12
+ export interface MatchPlayer {
13
+ readonly id: string;
14
+ readonly name: string;
15
+ }
16
+
17
+ export interface MatchTeam {
18
+ readonly id: MatchTeamId;
19
+ readonly name?: string;
20
+ /** Defaults to the first player in the roster. */
21
+ readonly initialServerId?: string;
22
+ readonly players: readonly MatchPlayer[];
23
+ }
24
+
25
+ export interface MatchCreateInput {
26
+ readonly id: string;
27
+ readonly format: MatchFormat;
28
+ readonly scoringMode: MatchScoringMode;
29
+ readonly targetScore?: number;
30
+ readonly initialServingTeam?: MatchTeamId;
31
+ readonly teams: Readonly<Record<MatchTeamId, MatchTeam>>;
32
+ }
33
+
34
+ export interface TeamScore {
35
+ readonly A: number;
36
+ readonly B: number;
37
+ }
38
+
39
+ export interface ServeState {
40
+ readonly teamId: MatchTeamId;
41
+ readonly playerId: string;
42
+ readonly serverNumber: 1 | 2;
43
+ readonly court: CourtSide;
44
+ }
45
+
46
+ export interface GameSnapshot {
47
+ readonly number: 1 | 2 | 3;
48
+ readonly score: TeamScore;
49
+ readonly startingServingTeam: MatchTeamId;
50
+ readonly winner: MatchTeamId | null;
51
+ readonly midGameSwitchCompleted: boolean;
52
+ }
53
+
54
+ export type PendingCourtSwitch =
55
+ | { readonly reason: "gameEnd"; readonly game: 1 | 2 }
56
+ | { readonly reason: "gameThreeMidpoint"; readonly game: 3 };
57
+
58
+ export interface MatchSnapshot {
59
+ readonly id: string;
60
+ readonly format: MatchFormat;
61
+ readonly scoringMode: MatchScoringMode;
62
+ readonly targetScore: number;
63
+ readonly bestOf: 3;
64
+ readonly teams: Readonly<Record<MatchTeamId, MatchTeam>>;
65
+ readonly designatedServerByTeam: Readonly<Record<MatchTeamId, string>>;
66
+ readonly initialServingTeam: MatchTeamId;
67
+ readonly courtSides: Readonly<Record<CourtSide, MatchTeamId>>;
68
+ readonly playerCourts: Readonly<Record<string, CourtSide>>;
69
+ readonly games: readonly GameSnapshot[];
70
+ readonly currentGame: 1 | 2 | 3;
71
+ readonly gamesWon: TeamScore;
72
+ readonly serve: ServeState;
73
+ readonly pendingCourtSwitch: PendingCourtSwitch | null;
74
+ readonly status: "inProgress" | "completed" | "ended";
75
+ readonly winner: MatchTeamId | null;
76
+ readonly endReason: string | null;
77
+ readonly sequence: number;
78
+ }
79
+
80
+ export interface MatchCorrection {
81
+ readonly score?: Partial<TeamScore>;
82
+ readonly serve?: ServeState;
83
+ readonly playerCourts?: Readonly<Record<string, CourtSide>>;
84
+ }
85
+
86
+ interface MatchEventBase {
87
+ readonly schemaVersion: 1;
88
+ readonly id: string;
89
+ readonly sequence: number;
90
+ readonly source: MatchInputSource;
91
+ }
92
+
93
+ export interface MatchCreatedEvent extends MatchEventBase {
94
+ readonly type: "matchCreated";
95
+ readonly input: MatchCreateInput;
96
+ readonly snapshot: MatchSnapshot;
97
+ }
98
+
99
+ export interface RallyAwardedEvent extends MatchEventBase {
100
+ readonly type: "rallyAwarded";
101
+ readonly displaySide: CourtSide;
102
+ readonly winnerTeamId: MatchTeamId;
103
+ }
104
+
105
+ export interface CourtSwitchConfirmedEvent extends MatchEventBase {
106
+ readonly type: "courtSwitchConfirmed";
107
+ readonly pending: PendingCourtSwitch;
108
+ }
109
+
110
+ export interface MatchCorrectedEvent extends MatchEventBase {
111
+ readonly type: "matchCorrected";
112
+ readonly correction: MatchCorrection;
113
+ }
114
+
115
+ export interface MatchEndedEvent extends MatchEventBase {
116
+ readonly type: "matchEnded";
117
+ readonly reason: string;
118
+ }
119
+
120
+ export interface MatchEventUndoneEvent extends MatchEventBase {
121
+ readonly type: "matchEventUndone";
122
+ readonly targetEventId: string;
123
+ readonly restoredSnapshot: MatchSnapshot;
124
+ }
125
+
126
+ export type MatchEvent =
127
+ | MatchCreatedEvent
128
+ | RallyAwardedEvent
129
+ | CourtSwitchConfirmedEvent
130
+ | MatchCorrectedEvent
131
+ | MatchEndedEvent
132
+ | MatchEventUndoneEvent;
133
+
134
+ export interface MatchCreation {
135
+ readonly snapshot: MatchSnapshot;
136
+ readonly events: readonly [MatchCreatedEvent];
137
+ }