|
6 | 6 | import { onMount } from "svelte"; |
7 | 7 | import { page } from "$app/state"; |
8 | 8 | import { detectAdBlockEnabled, trackClick } from "$lib/helpers.js"; |
| 9 | + import { browser } from "$app/environment"; |
9 | 10 |
|
10 | 11 | let game: Game | null = $state(null); |
11 | 12 | let adblock = $state(false); |
12 | 13 | let error: string | null = $state(null); |
13 | 14 | let withoutSupportingTimer = $state(5); |
14 | 15 | let continued = $state(false); |
15 | 16 |
|
16 | | - const searchParam = page.url.searchParams; |
17 | | - const gameID = searchParam.get("gameID"); |
18 | | -
|
19 | 17 | async function fetchGameData() { |
| 18 | + if (!browser) return; |
| 19 | + const searchParam = page.url.searchParams; |
| 20 | + const gameID = searchParam.get("gameID"); |
20 | 21 | if (!gameID) { |
21 | 22 | error = "Missing gameID query parameter"; |
22 | 23 | return; |
|
51 | 52 | onMount(async () => { |
52 | 53 | await fetchGameData(); |
53 | 54 | if (error || !game) return; |
54 | | - const searchParam = page.url.searchParams; |
55 | | - const r = searchParam.get("r"); |
| 55 | + const r = page.url.searchParams.get("r"); |
56 | 56 | if (!r || r !== "t") { |
57 | 57 | // Track a click |
58 | 58 | try { |
|
62 | 62 | console.error("Failed to track click:", err); |
63 | 63 | } |
64 | 64 | } else { |
65 | | - const url = new URL(window.location.href); |
| 65 | + const url = new URL(page.url); |
66 | 66 | url.searchParams.delete("r"); |
67 | 67 | window.history.replaceState({}, document.title, url.toString()); |
68 | 68 | } |
|
86 | 86 | }) { |
87 | 87 | console.log("UPDATING TO", server); |
88 | 88 | if (server.name == State.currentServer.name) return; |
89 | | - if (!iframe || !game) return; |
| 89 | + if (!iframe || !game || !browser) return; |
90 | 90 | iframe.src = `https://${server.address.split(",")[0]}/${server.path}${game.gameID}/index.html`; |
91 | | - let query = new URLSearchParams(window.location.search); |
| 91 | + let query = page.url.searchParams; |
92 | 92 | query.set("server", server.name); |
93 | | - var url = new URL(window.location.href); |
| 93 | + var url = new URL(page.url); |
94 | 94 | url.search = query.toString(); |
95 | 95 | window.history.pushState({}, "", url); |
96 | 96 | } |
|
127 | 127 | }, 0); |
128 | 128 |
|
129 | 129 | // Secure message handling from iframes |
130 | | - window.addEventListener("message", async (event) => { |
131 | | - try { |
132 | | - console.log(event); |
133 | | - if (!event.data.fromInternal) return; |
134 | | - const allowedOrigins = State.servers.map( |
135 | | - (s) => `https://${s.hostname}`, |
136 | | - ); |
137 | | - if ( |
138 | | - !["http://localhost:8080", ...allowedOrigins].includes( |
139 | | - event.origin, |
140 | | - ) |
141 | | - ) { |
142 | | - console.warn( |
143 | | - `Rejected message from unauthorized origin: ${event.origin}`, |
| 130 | + if (browser) { |
| 131 | + window.addEventListener("message", async (event) => { |
| 132 | + try { |
| 133 | + console.log(event); |
| 134 | + if (!event.data.fromInternal) return; |
| 135 | + const allowedOrigins = State.servers.map( |
| 136 | + (s) => `https://${s.hostname}`, |
144 | 137 | ); |
145 | | - return; |
146 | | - } |
| 138 | + if ( |
| 139 | + ![ |
| 140 | + "http://localhost:8080", |
| 141 | + ...allowedOrigins, |
| 142 | + ].includes(event.origin) |
| 143 | + ) { |
| 144 | + console.warn( |
| 145 | + `Rejected message from unauthorized origin: ${event.origin}`, |
| 146 | + ); |
| 147 | + return; |
| 148 | + } |
147 | 149 |
|
148 | | - const data = event.data; |
| 150 | + const data = event.data; |
149 | 151 |
|
150 | | - if (data.action === "GET_TOKENS") { |
151 | | - // Prepare response with the same requestId |
152 | | - const response: any = { |
153 | | - requestId: data.requestId, |
154 | | - }; |
| 152 | + if (data.action === "GET_TOKENS") { |
| 153 | + // Prepare response with the same requestId |
| 154 | + const response: any = { |
| 155 | + requestId: data.requestId, |
| 156 | + }; |
155 | 157 |
|
156 | | - if (SessionState.loggedIn && SessionState.user) { |
157 | | - console.log("User logged in, sending tokens"); |
158 | | - try { |
159 | | - const tokens = SessionState.user.tokens || {}; |
160 | | - response.action = "SET_TOKENS"; |
161 | | - response.content = tokens; |
162 | | - } catch (error) { |
163 | | - console.error( |
164 | | - "Error getting user tokens:", |
165 | | - error, |
166 | | - ); |
167 | | - response.action = "ERROR"; |
168 | | - response.error = "Failed to get user tokens"; |
169 | | - } |
170 | | - } else { |
171 | | - // Try waiting for tooling/user |
172 | | - await initializeTooling(); |
173 | 158 | if (SessionState.loggedIn && SessionState.user) { |
| 159 | + console.log("User logged in, sending tokens"); |
174 | 160 | try { |
175 | 161 | const tokens = |
176 | 162 | SessionState.user.tokens || {}; |
|
186 | 172 | "Failed to get user tokens"; |
187 | 173 | } |
188 | 174 | } else { |
189 | | - response.action = "NO_USER"; |
| 175 | + // Try waiting for tooling/user |
| 176 | + await initializeTooling(); |
| 177 | + if ( |
| 178 | + SessionState.loggedIn && |
| 179 | + SessionState.user |
| 180 | + ) { |
| 181 | + try { |
| 182 | + const tokens = |
| 183 | + SessionState.user.tokens || {}; |
| 184 | + response.action = "SET_TOKENS"; |
| 185 | + response.content = tokens; |
| 186 | + } catch (error) { |
| 187 | + console.error( |
| 188 | + "Error getting user tokens:", |
| 189 | + error, |
| 190 | + ); |
| 191 | + response.action = "ERROR"; |
| 192 | + response.error = |
| 193 | + "Failed to get user tokens"; |
| 194 | + } |
| 195 | + } else { |
| 196 | + response.action = "NO_USER"; |
| 197 | + } |
190 | 198 | } |
191 | | - } |
192 | 199 |
|
193 | | - // Send response back to the exact source iframe |
194 | | - console.log(response, event.origin); |
| 200 | + // Send response back to the exact source iframe |
| 201 | + console.log(response, event.origin); |
| 202 | + if (!event.source) return; |
| 203 | + event.source.postMessage(response, { |
| 204 | + targetOrigin: event.origin, |
| 205 | + }); |
| 206 | + } else if (data.action === "SWITCH_SERVER") { |
| 207 | + updateIframe(data.server); |
| 208 | + } else if (data.action === "CACHE_ENABLED") { |
| 209 | + // Acknowledged (not an unknown action, but nothing to do) |
| 210 | + // NOTE: FOR CACHE ACTIONS, ADD "TYPE": "CACHE_CONTROL" so that it is not confused with auth flow. |
| 211 | + } else { |
| 212 | + // Handle unknown action |
| 213 | + if (!event.source) return; |
| 214 | + event.source.postMessage( |
| 215 | + { |
| 216 | + action: "UNKNOWN_ACTION", |
| 217 | + requestId: data.requestId, |
| 218 | + }, |
| 219 | + { |
| 220 | + targetOrigin: event.origin, |
| 221 | + }, |
| 222 | + ); |
| 223 | + } |
| 224 | + } catch (e: any) { |
195 | 225 | if (!event.source) return; |
196 | | - event.source.postMessage(response, { |
197 | | - targetOrigin: event.origin, |
| 226 | + event.source.postMessage({ |
| 227 | + action: "ERROR", |
| 228 | + error: e.message, |
| 229 | + requestId: event.data.requestId, |
198 | 230 | }); |
199 | | - } else if (data.action === "SWITCH_SERVER") { |
200 | | - updateIframe(data.server); |
201 | | - } else if (data.action === "CACHE_ENABLED") { |
202 | | - // Acknowledged (not an unknown action, but nothing to do) |
203 | | - // NOTE: FOR CACHE ACTIONS, ADD "TYPE": "CACHE_CONTROL" so that it is not confused with auth flow. |
204 | | - } else { |
205 | | - // Handle unknown action |
206 | | - if (!event.source) return; |
207 | | - event.source.postMessage( |
208 | | - { |
209 | | - action: "UNKNOWN_ACTION", |
210 | | - requestId: data.requestId, |
211 | | - }, |
212 | | - { |
213 | | - targetOrigin: event.origin, |
214 | | - }, |
215 | | - ); |
216 | 231 | } |
217 | | - } catch (e: any) { |
218 | | - if (!event.source) return; |
219 | | - event.source.postMessage({ |
220 | | - action: "ERROR", |
221 | | - error: e.message, |
222 | | - requestId: event.data.requestId, |
223 | | - }); |
224 | | - } |
225 | | - }); |
| 232 | + }); |
| 233 | + } |
226 | 234 | } |
227 | 235 | }); |
228 | 236 | </script> |
|
0 commit comments