@series-inc/venus-sdk 3.4.3-beta.2 → 3.4.3-beta.4
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/{SandboxHost-EUT6YDBE.js → SandboxHost-2Q5PK7LP.js} +58 -20
- package/dist/SandboxHost-2Q5PK7LP.js.map +1 -0
- package/dist/{chunk-GJAEABTM.js → chunk-LPDIY3ZJ.js} +5 -5
- package/dist/{chunk-GJAEABTM.js.map → chunk-LPDIY3ZJ.js.map} +1 -1
- package/dist/{chunk-NSUUMXUE.js → chunk-Z72SXERI.js} +2 -2
- package/dist/{chunk-NSUUMXUE.js.map → chunk-Z72SXERI.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/venus-api/index.js +2 -2
- package/dist/vite/index.d.ts +4 -1
- package/dist/vite/index.js +15 -762
- package/dist/vite/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/SandboxHost-EUT6YDBE.js.map +0 -1
|
@@ -1,10 +1,28 @@
|
|
|
1
|
-
import { MockAdsApi, MockLifecycleApi, MockAnalyticsApi, getSandboxConfig, createMockStorageApi, MockAvatarApi, MockNavigationApi, MockNotificationsApi, MockPopupsApi, SandboxProfileApi, MockDeviceApi, MockEnvironmentApi, MockSystemApi, MockCdnApi, MockTimeApi, MockAiApi, MockHapticsApi, MockFeaturesApi, MockLoggingApi, MockIapApi, MockSocialApi, initializeRoomsApi, MockPreloaderApi, MockSharedAssetsApi, VenusRoom, buildFunctionsBaseUrl } from './chunk-
|
|
1
|
+
import { MockAdsApi, MockLifecycleApi, MockAnalyticsApi, getSandboxConfig, createMockStorageApi, MockAvatarApi, MockNavigationApi, MockNotificationsApi, MockPopupsApi, SandboxProfileApi, MockDeviceApi, MockEnvironmentApi, MockSystemApi, MockCdnApi, MockTimeApi, MockAiApi, MockHapticsApi, MockFeaturesApi, MockLoggingApi, MockIapApi, MockSocialApi, initializeRoomsApi, MockPreloaderApi, MockSharedAssetsApi, VenusRoom, buildFunctionsBaseUrl } from './chunk-Z72SXERI.js';
|
|
2
2
|
import './chunk-3APM3V2M.js';
|
|
3
3
|
|
|
4
|
+
// src/firebase/localSandboxIdentity.ts
|
|
5
|
+
var DEFAULT_PLAYER_ID = "player1";
|
|
6
|
+
function normalizeLocalSandboxPlayerId(value) {
|
|
7
|
+
if (typeof value !== "string") return DEFAULT_PLAYER_ID;
|
|
8
|
+
const trimmed = value.trim().toLowerCase();
|
|
9
|
+
if (trimmed.length === 0) return DEFAULT_PLAYER_ID;
|
|
10
|
+
const match = trimmed.match(/^player(\d+)$/);
|
|
11
|
+
if (!match) return DEFAULT_PLAYER_ID;
|
|
12
|
+
const n = Number(match[1]);
|
|
13
|
+
if (!Number.isFinite(n) || n < 1) return DEFAULT_PLAYER_ID;
|
|
14
|
+
return `player${n}`;
|
|
15
|
+
}
|
|
16
|
+
function buildLocalSandboxEmail(playerId) {
|
|
17
|
+
const normalized = normalizeLocalSandboxPlayerId(playerId);
|
|
18
|
+
return `venus-sandbox+${normalized}@local.test`;
|
|
19
|
+
}
|
|
20
|
+
|
|
4
21
|
// src/firebase/firebaseClient.ts
|
|
5
22
|
var APP_NAME = "venus-sandbox";
|
|
6
23
|
var firebaseClientPromise = null;
|
|
7
24
|
var cachedClient = null;
|
|
25
|
+
var LOCAL_TEST_PASSWORD = "venus-dev-password";
|
|
8
26
|
async function getFirebaseClient() {
|
|
9
27
|
if (cachedClient) {
|
|
10
28
|
return cachedClient;
|
|
@@ -121,29 +139,35 @@ async function initializeFirebaseClient() {
|
|
|
121
139
|
},
|
|
122
140
|
async signInWithGoogle() {
|
|
123
141
|
if (isLocalMode) {
|
|
124
|
-
|
|
125
|
-
const testEmail = "dev@series.ai";
|
|
126
|
-
const testPassword = "venus-dev-password";
|
|
127
|
-
try {
|
|
128
|
-
const result2 = await signInWithEmailAndPassword(auth, testEmail, testPassword);
|
|
129
|
-
console.log("[Venus SDK] Sign-in successful, user:", result2.user.uid);
|
|
130
|
-
return result2;
|
|
131
|
-
} catch (error) {
|
|
132
|
-
const authError = error;
|
|
133
|
-
if (authError.code === "auth/user-not-found" || authError.code === "auth/invalid-credential") {
|
|
134
|
-
console.log("[Venus SDK] Test user not found, creating...");
|
|
135
|
-
const result2 = await createUserWithEmailAndPassword(auth, testEmail, testPassword);
|
|
136
|
-
console.log("[Venus SDK] Test user created, user:", result2.user.uid);
|
|
137
|
-
return result2;
|
|
138
|
-
}
|
|
139
|
-
throw error;
|
|
140
|
-
}
|
|
142
|
+
return this.signInWithLocalPlayer("player1");
|
|
141
143
|
}
|
|
142
144
|
console.log("[Venus SDK] Signing in with Google popup...");
|
|
143
145
|
const result = await signInWithPopup(auth, googleProvider);
|
|
144
146
|
console.log("[Venus SDK] Sign-in successful, user:", result.user.uid);
|
|
145
147
|
return result;
|
|
146
148
|
},
|
|
149
|
+
async signInWithLocalPlayer(playerId) {
|
|
150
|
+
if (!isLocalMode) {
|
|
151
|
+
throw new Error("[Venus SDK] signInWithLocalPlayer is only available in local (emulator) mode.");
|
|
152
|
+
}
|
|
153
|
+
const normalizedPlayerId = normalizeLocalSandboxPlayerId(playerId);
|
|
154
|
+
const email = buildLocalSandboxEmail(normalizedPlayerId);
|
|
155
|
+
console.log("[Venus SDK] Local mode: signing in as", normalizedPlayerId, "(", email, ")");
|
|
156
|
+
try {
|
|
157
|
+
const result = await signInWithEmailAndPassword(auth, email, LOCAL_TEST_PASSWORD);
|
|
158
|
+
console.log("[Venus SDK] Local sign-in successful, user:", result.user.uid);
|
|
159
|
+
return result;
|
|
160
|
+
} catch (error) {
|
|
161
|
+
const authError = error;
|
|
162
|
+
if (authError.code === "auth/user-not-found" || authError.code === "auth/invalid-credential") {
|
|
163
|
+
console.log("[Venus SDK] Local test user not found, creating:", email);
|
|
164
|
+
const result = await createUserWithEmailAndPassword(auth, email, LOCAL_TEST_PASSWORD);
|
|
165
|
+
console.log("[Venus SDK] Local test user created, user:", result.user.uid);
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
},
|
|
147
171
|
async signOut() {
|
|
148
172
|
return auth.signOut();
|
|
149
173
|
},
|
|
@@ -1378,6 +1402,19 @@ var SandboxHost = class {
|
|
|
1378
1402
|
console.warn("[Venus SDK] Firebase client still initializing, please wait a moment...");
|
|
1379
1403
|
throw new Error("[Venus SDK] Firebase client still initializing. Please wait a moment and try again.");
|
|
1380
1404
|
};
|
|
1405
|
+
window.__VENUS_SANDBOX_SIGN_IN_AS__ = (playerId) => {
|
|
1406
|
+
if (this.client) {
|
|
1407
|
+
return this.client.signInWithLocalPlayer(playerId).then(() => console.log("[Venus SDK] Local sign-in successful")).catch((error) => {
|
|
1408
|
+
console.error("[Venus SDK] Local sign-in failed:", error);
|
|
1409
|
+
throw error;
|
|
1410
|
+
});
|
|
1411
|
+
}
|
|
1412
|
+
if (!this.clientReady) {
|
|
1413
|
+
throw new Error("[Venus SDK] Firebase not configured.");
|
|
1414
|
+
}
|
|
1415
|
+
console.warn("[Venus SDK] Firebase client still initializing, please wait a moment...");
|
|
1416
|
+
throw new Error("[Venus SDK] Firebase client still initializing. Please wait a moment and try again.");
|
|
1417
|
+
};
|
|
1381
1418
|
window.__VENUS_SANDBOX_SIGN_OUT__ = async () => {
|
|
1382
1419
|
try {
|
|
1383
1420
|
const client = await getFirebaseClient();
|
|
@@ -1390,6 +1427,7 @@ var SandboxHost = class {
|
|
|
1390
1427
|
};
|
|
1391
1428
|
this.cleanupFunctions.push(() => {
|
|
1392
1429
|
delete window.__VENUS_SANDBOX_SIGN_IN__;
|
|
1430
|
+
delete window.__VENUS_SANDBOX_SIGN_IN_AS__;
|
|
1393
1431
|
delete window.__VENUS_SANDBOX_SIGN_OUT__;
|
|
1394
1432
|
});
|
|
1395
1433
|
}
|
|
@@ -1900,5 +1938,5 @@ var SandboxHost = class {
|
|
|
1900
1938
|
};
|
|
1901
1939
|
|
|
1902
1940
|
export { SandboxHost };
|
|
1903
|
-
//# sourceMappingURL=SandboxHost-
|
|
1904
|
-
//# sourceMappingURL=SandboxHost-
|
|
1941
|
+
//# sourceMappingURL=SandboxHost-2Q5PK7LP.js.map
|
|
1942
|
+
//# sourceMappingURL=SandboxHost-2Q5PK7LP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/firebase/localSandboxIdentity.ts","../src/firebase/firebaseClient.ts","../src/storage/FirestoreStorageApi.ts","../src/http/callRemoteFunction.ts","../src/simulation/HttpSimulationApi.ts","../src/rooms/HttpRoomsApi.ts","../src/rooms/FirestoreRoomsApi.ts","../src/rooms/CompositeRemoteRoomsApi.ts","../src/leaderboard/HttpLeaderboardApi.ts","../src/SandboxHost.ts"],"names":["app"],"mappings":"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","file":"SandboxHost-2Q5PK7LP.js","sourcesContent":["/**\r\n * Local sandbox identity helpers.\r\n *\r\n * These are used only for local Firebase Auth emulator mode to allow multiple\r\n * concurrent \"players\" (player1, player2, ...) across different browser profiles.\r\n */\r\n\r\nconst DEFAULT_PLAYER_ID = 'player1'\r\n\r\n/**\r\n * Normalize a requested player id to the supported format.\r\n *\r\n * - Empty/invalid values fall back to \"player1\"\r\n * - Accepts \"playerN\" (N >= 1)\r\n */\r\nexport function normalizeLocalSandboxPlayerId(value: unknown): string {\r\n if (typeof value !== 'string') return DEFAULT_PLAYER_ID\r\n const trimmed = value.trim().toLowerCase()\r\n if (trimmed.length === 0) return DEFAULT_PLAYER_ID\r\n\r\n const match = trimmed.match(/^player(\\d+)$/)\r\n if (!match) return DEFAULT_PLAYER_ID\r\n\r\n const n = Number(match[1])\r\n if (!Number.isFinite(n) || n < 1) return DEFAULT_PLAYER_ID\r\n return `player${n}`\r\n}\r\n\r\n/**\r\n * Build a deterministic email address for a local sandbox player id.\r\n */\r\nexport function buildLocalSandboxEmail(playerId: unknown): string {\r\n const normalized = normalizeLocalSandboxPlayerId(playerId)\r\n return `venus-sandbox+${normalized}@local.test`\r\n}\r\n\r\n\r\n","/**\r\n * Firebase Web SDK wrapper for sandbox mode.\r\n *\r\n * This client provides:\r\n * 1. Firebase initialization with environment-specific config\r\n * 2. Google OAuth authentication (persisted in IndexedDB)\r\n * 3. Firestore helpers for direct database operations\r\n * 4. Emulator connection for local development\r\n *\r\n * Auth flow:\r\n * - User signs in once with Google via popup\r\n * - Firebase Auth persists session in IndexedDB\r\n * - Session survives browser restarts (valid for weeks/months)\r\n * - All API calls use the same auth session\r\n */\r\n\r\nimport { getSandboxConfig, type SandboxConfig } from '../config/sandbox'\r\nimport { buildLocalSandboxEmail, normalizeLocalSandboxPlayerId } from './localSandboxIdentity'\r\n\r\n// Firebase types - we use dynamic imports to avoid bundling Firebase in production\r\ntype FirebaseApp = import('firebase/app').FirebaseApp\r\ntype Auth = import('firebase/auth').Auth\r\ntype User = import('firebase/auth').User\r\ntype UserCredential = import('firebase/auth').UserCredential\r\ntype Firestore = import('firebase/firestore').Firestore\r\n\r\n/**\r\n * Firebase client interface providing auth and Firestore access.\r\n */\r\nexport interface FirebaseClient {\r\n app: FirebaseApp\r\n auth: Auth\r\n firestore: Firestore\r\n config: SandboxConfig\r\n\r\n // Auth helpers\r\n isSignedIn(): boolean\r\n getProfileId(): string | null\r\n signInWithGoogle(): Promise<UserCredential>\r\n /**\r\n * Local-only: sign in as a deterministic test user (player1, player2, ...).\r\n * Uses the Auth emulator and email/password.\r\n */\r\n signInWithLocalPlayer(playerId: string): Promise<UserCredential>\r\n signOut(): Promise<void>\r\n getIdToken(): Promise<string | null>\r\n getIdTokenOrThrow(): Promise<string>\r\n getCurrentUser(): User | null\r\n onAuthStateChanged(callback: (user: User | null) => void): () => void\r\n\r\n // Firestore helpers\r\n doc: typeof import('firebase/firestore').doc\r\n collection: typeof import('firebase/firestore').collection\r\n getDoc: typeof import('firebase/firestore').getDoc\r\n setDoc: typeof import('firebase/firestore').setDoc\r\n updateDoc: typeof import('firebase/firestore').updateDoc\r\n deleteDoc: typeof import('firebase/firestore').deleteDoc\r\n addDoc: typeof import('firebase/firestore').addDoc\r\n query: typeof import('firebase/firestore').query\r\n where: typeof import('firebase/firestore').where\r\n orderBy: typeof import('firebase/firestore').orderBy\r\n limit: typeof import('firebase/firestore').limit\r\n onSnapshot: typeof import('firebase/firestore').onSnapshot\r\n serverTimestamp: typeof import('firebase/firestore').serverTimestamp\r\n deleteField: typeof import('firebase/firestore').deleteField\r\n}\r\n\r\nconst APP_NAME = 'venus-sandbox'\r\nlet firebaseClientPromise: Promise<FirebaseClient> | null = null\r\nlet cachedClient: FirebaseClient | null = null\r\n\r\nconst LOCAL_TEST_PASSWORD = 'venus-dev-password'\r\n\r\n/**\r\n * Get the Firebase client instance.\r\n * Initializes Firebase on first call and caches the instance.\r\n */\r\nexport async function getFirebaseClient(): Promise<FirebaseClient> {\r\n if (cachedClient) {\r\n return cachedClient\r\n }\r\n\r\n if (!firebaseClientPromise) {\r\n firebaseClientPromise = initializeFirebaseClient()\r\n }\r\n\r\n cachedClient = await firebaseClientPromise\r\n return cachedClient\r\n}\r\n\r\n/**\r\n * Check if Firebase has been initialized.\r\n */\r\nexport function isFirebaseInitialized(): boolean {\r\n return cachedClient !== null\r\n}\r\n\r\n/**\r\n * Initialize the Firebase client with dynamic imports.\r\n */\r\nasync function initializeFirebaseClient(): Promise<FirebaseClient> {\r\n console.log('[Venus SDK] === FIREBASE CLIENT BUILD #4 ===')\r\n const config = getSandboxConfig()\r\n console.log('[Venus SDK] Config:', config?.target, config?.gameId)\r\n if (!config || !config.firebaseConfig) {\r\n throw new Error(\r\n '[Venus SDK] Cannot initialize Firebase: Sandbox config not available. ' +\r\n 'Make sure the Vite plugin is configured correctly.'\r\n )\r\n }\r\n\r\n // Dynamic imports to avoid bundling Firebase in production builds\r\n // The Vite plugin handles optimizeDeps configuration to make this work in dev\r\n console.log('[Venus SDK] Importing Firebase modules...')\r\n const [\r\n firebaseApp,\r\n firebaseAuth,\r\n firebaseFirestore,\r\n ] = await Promise.all([\r\n import('firebase/app'),\r\n import('firebase/auth'),\r\n import('firebase/firestore'),\r\n ])\r\n const { initializeApp, getApps, getApp } = firebaseApp\r\n const { getAuth, GoogleAuthProvider, signInWithPopup, signInWithRedirect, getRedirectResult, signInWithEmailAndPassword, createUserWithEmailAndPassword, browserLocalPersistence, setPersistence, connectAuthEmulator } = firebaseAuth\r\n const { getFirestore, connectFirestoreEmulator, doc, collection, getDoc, setDoc, updateDoc, deleteDoc, addDoc, query, where, orderBy, limit, onSnapshot, serverTimestamp, deleteField } = firebaseFirestore\r\n console.log('[Venus SDK] Firebase modules imported')\r\n\r\n // Initialize or get existing app\r\n console.log('[Venus SDK] Getting/creating Firebase app...')\r\n const existingApps = getApps()\r\n const existingApp = existingApps.find(app => app.name === APP_NAME)\r\n const app = existingApp ?? initializeApp(config.firebaseConfig!, APP_NAME)\r\n console.log('[Venus SDK] Firebase app ready:', app.name)\r\n\r\n // Initialize Auth\r\n console.log('[Venus SDK] Getting auth...')\r\n const auth = getAuth(app)\r\n console.log('[Venus SDK] Auth ready')\r\n\r\n // Connect to Auth emulator for local mode\r\n // This is required because the Functions emulator validates tokens against the Auth emulator\r\n // For non-local targets (dev/staging), we use real Firebase Auth with Google OAuth\r\n const isLocalMode = config.target === 'local'\r\n if (isLocalMode && config.authEmulatorHost) {\r\n console.log('[Venus SDK] Connecting to Auth emulator:', config.authEmulatorHost)\r\n try {\r\n connectAuthEmulator(auth, `http://${config.authEmulatorHost}`, { disableWarnings: true })\r\n console.log('[Venus SDK] Auth emulator connected')\r\n } catch (e) {\r\n console.log('[Venus SDK] Auth emulator connection error (may already be connected):', e)\r\n }\r\n } else {\r\n console.log('[Venus SDK] Using real Firebase Auth (target:', config.target, ')')\r\n }\r\n\r\n // Set persistence FIRST (must await before checking auth state)\r\n console.log('[Venus SDK] Setting persistence...')\r\n try {\r\n await setPersistence(auth, browserLocalPersistence)\r\n console.log('[Venus SDK] Persistence set')\r\n } catch (e) {\r\n console.log('[Venus SDK] Persistence error:', e)\r\n }\r\n\r\n // Wait for auth state to be restored from IndexedDB\r\n // This is crucial - Firebase needs time to restore the persisted session\r\n console.log('[Venus SDK] Waiting for auth state restoration...')\r\n const initialUser = await new Promise<User | null>((resolve) => {\r\n const unsubscribe = auth.onAuthStateChanged((user) => {\r\n console.log('[Venus SDK] onAuthStateChanged fired, user:', user?.uid ?? 'null')\r\n unsubscribe()\r\n resolve(user)\r\n })\r\n // Timeout fallback in case onAuthStateChanged doesn't fire\r\n setTimeout(() => {\r\n unsubscribe()\r\n resolve(null)\r\n }, 3000)\r\n })\r\n console.log('[Venus SDK] Auth state restored, user:', initialUser?.uid ?? 'none')\r\n\r\n // Check for redirect result (this captures the result of signInWithRedirect)\r\n // Only needed if no user was restored from persistence\r\n const googleProvider = new GoogleAuthProvider()\r\n if (!initialUser) {\r\n console.log('[Venus SDK] No persisted user, checking for redirect result...')\r\n try {\r\n const redirectResult = await getRedirectResult(auth)\r\n if (redirectResult?.user) {\r\n console.log('[Venus SDK] Sign-in redirect completed successfully, user:', redirectResult.user.uid)\r\n } else {\r\n console.log('[Venus SDK] No redirect result (normal page load or redirect state lost)')\r\n }\r\n } catch (error) {\r\n console.error('[Venus SDK] Redirect sign-in error:', error)\r\n }\r\n } else {\r\n console.log('[Venus SDK] User already restored from persistence, skipping redirect check')\r\n }\r\n\r\n // Log current auth state\r\n console.log('[Venus SDK] Current auth state:', auth.currentUser ? `signed in as ${auth.currentUser.uid}` : 'not signed in')\r\n\r\n // Initialize Firestore\r\n console.log('[Venus SDK] Getting Firestore...')\r\n const firestore = getFirestore(app)\r\n\r\n // Connect to Firestore emulator for local development\r\n if (config.target === 'local' && config.firestoreEmulatorHost) {\r\n console.log('[Venus SDK] Connecting to Firestore emulator:', config.firestoreEmulatorHost)\r\n try {\r\n const [host, port] = config.firestoreEmulatorHost.split(':')\r\n connectFirestoreEmulator(firestore, host, parseInt(port, 10))\r\n console.log('[Venus SDK] Firestore emulator connected')\r\n } catch (e) {\r\n console.log('[Venus SDK] Firestore emulator already connected or error:', e)\r\n }\r\n }\r\n\r\n const client: FirebaseClient = {\r\n app,\r\n auth,\r\n firestore,\r\n config,\r\n\r\n // Auth helpers\r\n isSignedIn(): boolean {\r\n return auth.currentUser !== null\r\n },\r\n\r\n getProfileId(): string | null {\r\n return auth.currentUser?.uid ?? null\r\n },\r\n\r\n async signInWithGoogle(): Promise<UserCredential> {\r\n // For local mode (Auth emulator), use email/password instead of Google OAuth\r\n // The Auth emulator doesn't support real Google OAuth\r\n if (isLocalMode) {\r\n // Backwards-compatible default: player1\r\n return this.signInWithLocalPlayer('player1')\r\n }\r\n\r\n // For dev/staging, use real Google OAuth\r\n console.log('[Venus SDK] Signing in with Google popup...')\r\n const result = await signInWithPopup(auth, googleProvider)\r\n console.log('[Venus SDK] Sign-in successful, user:', result.user.uid)\r\n return result\r\n },\r\n\r\n async signInWithLocalPlayer(playerId: string): Promise<UserCredential> {\r\n if (!isLocalMode) {\r\n throw new Error('[Venus SDK] signInWithLocalPlayer is only available in local (emulator) mode.')\r\n }\r\n\r\n const normalizedPlayerId = normalizeLocalSandboxPlayerId(playerId)\r\n const email = buildLocalSandboxEmail(normalizedPlayerId)\r\n console.log('[Venus SDK] Local mode: signing in as', normalizedPlayerId, '(', email, ')')\r\n\r\n try {\r\n const result = await signInWithEmailAndPassword(auth, email, LOCAL_TEST_PASSWORD)\r\n console.log('[Venus SDK] Local sign-in successful, user:', result.user.uid)\r\n return result\r\n } catch (error: unknown) {\r\n const authError = error as { code?: string }\r\n if (authError.code === 'auth/user-not-found' || authError.code === 'auth/invalid-credential') {\r\n console.log('[Venus SDK] Local test user not found, creating:', email)\r\n const result = await createUserWithEmailAndPassword(auth, email, LOCAL_TEST_PASSWORD)\r\n console.log('[Venus SDK] Local test user created, user:', result.user.uid)\r\n return result\r\n }\r\n throw error\r\n }\r\n },\r\n\r\n async signOut(): Promise<void> {\r\n return auth.signOut()\r\n },\r\n\r\n async getIdToken(): Promise<string | null> {\r\n const user = auth.currentUser\r\n if (!user) {\r\n console.log('[Venus SDK] getIdToken: No current user')\r\n return null\r\n }\r\n // Force refresh to ensure we get a fresh token\r\n console.log('[Venus SDK] getIdToken: Refreshing token for user:', user.uid)\r\n const token = await user.getIdToken(true)\r\n console.log('[Venus SDK] getIdToken: Got token, length:', token?.length)\r\n return token\r\n },\r\n\r\n async getIdTokenOrThrow(): Promise<string> {\r\n const user = auth.currentUser\r\n console.log('[Venus SDK] getIdTokenOrThrow: currentUser =', user ? user.uid : null)\r\n if (!user) {\r\n throw new Error(\r\n '[Venus SDK] Not signed in. Click the Venus Sandbox toolbar to sign in.'\r\n )\r\n }\r\n // Force refresh to ensure we get a fresh token\r\n console.log('[Venus SDK] getIdTokenOrThrow: Forcing token refresh...')\r\n try {\r\n const token = await user.getIdToken(true)\r\n console.log('[Venus SDK] getIdTokenOrThrow: Got fresh token, length:', token?.length)\r\n return token\r\n } catch (error) {\r\n console.error('[Venus SDK] getIdTokenOrThrow: Token refresh failed:', error)\r\n // If token refresh fails (e.g., emulator restarted), sign out and prompt re-auth\r\n console.log('[Venus SDK] getIdTokenOrThrow: Signing out stale session...')\r\n await auth.signOut()\r\n throw new Error(\r\n '[Venus SDK] Session expired. Please sign in again via the Venus toolbar.'\r\n )\r\n }\r\n },\r\n\r\n getCurrentUser(): User | null {\r\n return auth.currentUser\r\n },\r\n\r\n onAuthStateChanged(callback: (user: User | null) => void): () => void {\r\n return auth.onAuthStateChanged(callback)\r\n },\r\n\r\n // Firestore helpers\r\n doc,\r\n collection,\r\n getDoc,\r\n setDoc,\r\n updateDoc,\r\n deleteDoc,\r\n addDoc,\r\n query,\r\n where,\r\n orderBy,\r\n limit,\r\n onSnapshot,\r\n serverTimestamp,\r\n deleteField,\r\n }\r\n\r\n console.log('[Venus SDK] Firebase client initialization complete!')\r\n return client\r\n}\r\n\r\n/**\r\n * Subscribe to a Firestore document and receive real-time updates.\r\n *\r\n * @param path - Firestore document path (e.g., \"profiles/abc123/h5AppStorage/myAppId\")\r\n * @param onChange - Callback invoked when the document changes\r\n * @returns Unsubscribe function to stop listening\r\n */\r\nexport async function observeFirestoreDocument<T>(\r\n path: string,\r\n onChange: (data: T | null) => void,\r\n): Promise<() => void> {\r\n const client = await getFirebaseClient()\r\n const segments = path.split('/').filter(segment => segment.length > 0)\r\n\r\n if (segments.length === 0) {\r\n throw new Error(`[Venus SDK] Invalid Firestore path \"${path}\".`)\r\n }\r\n\r\n const ref = client.doc(client.firestore, segments.join('/'))\r\n const unsubscribe = client.onSnapshot(\r\n ref,\r\n (snapshot) => {\r\n onChange(snapshot.exists() ? (snapshot.data() as T) : null)\r\n },\r\n (error) => {\r\n console.error('[Venus SDK] Firestore subscription error:', error)\r\n },\r\n )\r\n\r\n return unsubscribe\r\n}\r\n\r\n/**\r\n * Filter condition for Firestore collection queries.\r\n */\r\nexport interface FirestoreFilter {\r\n field: string\r\n op: '<' | '<=' | '==' | '!=' | '>=' | '>' | 'array-contains' | 'in' | 'not-in' | 'array-contains-any'\r\n value: unknown\r\n}\r\n\r\n/**\r\n * Order specification for Firestore collection queries.\r\n */\r\nexport interface FirestoreOrder {\r\n field: string\r\n direction: 'asc' | 'desc'\r\n}\r\n\r\n/**\r\n * Options for observeFirestoreCollection.\r\n */\r\nexport interface FirestoreCollectionOptions {\r\n filters?: FirestoreFilter[]\r\n orderBy?: FirestoreOrder[]\r\n limitCount?: number\r\n}\r\n\r\n/**\r\n * Subscribe to a Firestore collection query and receive real-time updates.\r\n *\r\n * @param collectionPath - Firestore collection path (e.g., \"h5_rooms/roomId/messages\")\r\n * @param options - Query filters and ordering\r\n * @param onChange - Callback invoked when query results change\r\n * @returns Unsubscribe function to stop listening\r\n */\r\nexport async function observeFirestoreCollection<T>(\r\n collectionPath: string,\r\n options: FirestoreCollectionOptions,\r\n onChange: (docs: Array<T & { id: string }>) => void,\r\n): Promise<() => void> {\r\n const client = await getFirebaseClient()\r\n\r\n const collectionRef = client.collection(client.firestore, collectionPath)\r\n\r\n // Build query constraints\r\n const constraints: Array<\r\n ReturnType<typeof client.where> |\r\n ReturnType<typeof client.orderBy> |\r\n ReturnType<typeof client.limit>\r\n > = []\r\n\r\n if (options.filters) {\r\n for (const filter of options.filters) {\r\n constraints.push(client.where(filter.field, filter.op, filter.value))\r\n }\r\n }\r\n\r\n if (options.orderBy) {\r\n for (const order of options.orderBy) {\r\n constraints.push(client.orderBy(order.field, order.direction))\r\n }\r\n }\r\n\r\n if (options.limitCount) {\r\n constraints.push(client.limit(options.limitCount))\r\n }\r\n\r\n const q = client.query(collectionRef, ...constraints)\r\n\r\n const unsubscribe = client.onSnapshot(\r\n q,\r\n (snapshot) => {\r\n const docs = snapshot.docs.map(doc => ({\r\n id: doc.id,\r\n ...doc.data(),\r\n })) as Array<T & { id: string }>\r\n onChange(docs)\r\n },\r\n (error) => {\r\n console.error('[Venus SDK] Firestore collection subscription error:', error)\r\n },\r\n )\r\n\r\n return unsubscribe\r\n}\r\n","/**\r\n * Firestore-backed storage API for sandbox mode.\r\n *\r\n * Implements the same storage interface as the mobile app, using direct Firestore writes.\r\n *\r\n * Paths:\r\n * - App storage: profiles/{profileId}/h5AppStorage/{appId}\r\n * - Global storage: profiles/{profileId}/h5GlobalStorage/data\r\n *\r\n * ⚠️ SANDBOX-ONLY: This file depends on Firebase and should ONLY be imported by SandboxHost.\r\n * Do NOT import from barrel exports (storage/index.ts) - use direct import path instead.\r\n * This ensures Firebase is not bundled in production builds.\r\n */\r\nimport { StorageApi } from './StorageApi'\r\nimport { getFirebaseClient, type FirebaseClient } from '../firebase/firebaseClient'\r\n\r\ntype FirestoreStorageType = 'app' | 'global'\r\n\r\n/**\r\n * Firestore-backed implementation of StorageApi.\r\n */\r\nexport class FirestoreStorageApi implements StorageApi {\r\n private readonly type: FirestoreStorageType\r\n private readonly appId?: string\r\n private client: FirebaseClient | null = null\r\n\r\n constructor(type: FirestoreStorageType, appId?: string) {\r\n this.type = type\r\n this.appId = appId\r\n\r\n if (type === 'app' && !appId) {\r\n throw new Error('[Venus SDK] App storage requires an appId')\r\n }\r\n }\r\n\r\n private async getClient(): Promise<FirebaseClient> {\r\n if (!this.client) {\r\n this.client = await getFirebaseClient()\r\n }\r\n return this.client\r\n }\r\n\r\n private getProfileId(): string {\r\n if (!this.client) {\r\n throw new Error('[Venus SDK] Firebase not initialized. Call getClient() first.')\r\n }\r\n const profileId = this.client.getProfileId()\r\n if (!profileId) {\r\n throw new Error('[Venus SDK] Not signed in. Click the Venus toolbar to sign in with Google.')\r\n }\r\n return profileId\r\n }\r\n\r\n private async getDocRef() {\r\n const client = await this.getClient()\r\n const profileId = this.getProfileId()\r\n\r\n if (this.type === 'app') {\r\n return client.doc(client.firestore, `profiles/${profileId}/h5AppStorage/${this.appId}`)\r\n } else {\r\n return client.doc(client.firestore, `profiles/${profileId}/h5GlobalStorage/data`)\r\n }\r\n }\r\n\r\n async getItem(key: string): Promise<string | null> {\r\n const client = await this.getClient()\r\n const docRef = await this.getDocRef()\r\n const snapshot = await client.getDoc(docRef)\r\n\r\n if (!snapshot.exists()) {\r\n return null\r\n }\r\n\r\n const data = snapshot.data()\r\n const value = data?.[key]\r\n\r\n // Return null if key doesn't exist, otherwise return the value as string\r\n if (value === undefined || value === null) {\r\n return null\r\n }\r\n\r\n return typeof value === 'string' ? value : JSON.stringify(value)\r\n }\r\n\r\n async setItem(key: string, value: string): Promise<void> {\r\n const client = await this.getClient()\r\n const docRef = await this.getDocRef()\r\n\r\n await client.setDoc(\r\n docRef,\r\n {\r\n [key]: value,\r\n lastUpdated: client.serverTimestamp(),\r\n },\r\n { merge: true },\r\n )\r\n }\r\n\r\n async removeItem(key: string): Promise<void> {\r\n const client = await this.getClient()\r\n const docRef = await this.getDocRef()\r\n\r\n try {\r\n await client.updateDoc(docRef, {\r\n [key]: client.deleteField(),\r\n })\r\n } catch (error) {\r\n // Document might not exist, which is fine for removeItem\r\n const err = error as { code?: string }\r\n if (err.code !== 'not-found') {\r\n throw error\r\n }\r\n }\r\n }\r\n\r\n async clear(): Promise<void> {\r\n const client = await this.getClient()\r\n const docRef = await this.getDocRef()\r\n\r\n try {\r\n await client.deleteDoc(docRef)\r\n } catch (error) {\r\n // Document might not exist, which is fine for clear\r\n const err = error as { code?: string }\r\n if (err.code !== 'not-found') {\r\n throw error\r\n }\r\n }\r\n }\r\n\r\n async key(index: number): Promise<string | null> {\r\n const client = await this.getClient()\r\n const docRef = await this.getDocRef()\r\n const snapshot = await client.getDoc(docRef)\r\n\r\n if (!snapshot.exists()) {\r\n return null\r\n }\r\n\r\n const data = snapshot.data() || {}\r\n const keys = Object.keys(data).filter((k) => k !== 'lastUpdated')\r\n\r\n if (index < 0 || index >= keys.length) {\r\n return null\r\n }\r\n\r\n return keys[index]\r\n }\r\n\r\n async length(): Promise<number> {\r\n const client = await this.getClient()\r\n const docRef = await this.getDocRef()\r\n const snapshot = await client.getDoc(docRef)\r\n\r\n if (!snapshot.exists()) {\r\n return 0\r\n }\r\n\r\n const data = snapshot.data() || {}\r\n // Exclude lastUpdated from count\r\n return Object.keys(data).filter((k) => k !== 'lastUpdated').length\r\n }\r\n\r\n async getAllItems(): Promise<string[]> {\r\n const client = await this.getClient()\r\n const docRef = await this.getDocRef()\r\n const snapshot = await client.getDoc(docRef)\r\n\r\n if (!snapshot.exists()) {\r\n return []\r\n }\r\n\r\n const data = snapshot.data() || {}\r\n // Return all keys except lastUpdated\r\n return Object.keys(data).filter((k) => k !== 'lastUpdated')\r\n }\r\n\r\n async getAllData(): Promise<Record<string, string>> {\r\n const client = await this.getClient()\r\n const docRef = await this.getDocRef()\r\n const snapshot = await client.getDoc(docRef)\r\n\r\n if (!snapshot.exists()) {\r\n return {}\r\n }\r\n\r\n const data = snapshot.data() || {}\r\n const result: Record<string, string> = {}\r\n\r\n for (const [key, value] of Object.entries(data)) {\r\n if (key === 'lastUpdated') continue\r\n result[key] = typeof value === 'string' ? value : JSON.stringify(value)\r\n }\r\n\r\n return result\r\n }\r\n\r\n async setMultipleItems(items: { key: string; value: string }[]): Promise<void> {\r\n const client = await this.getClient()\r\n const docRef = await this.getDocRef()\r\n\r\n const updates: Record<string, unknown> = {\r\n lastUpdated: client.serverTimestamp(),\r\n }\r\n\r\n for (const item of items) {\r\n updates[item.key] = item.value\r\n }\r\n\r\n await client.setDoc(docRef, updates, { merge: true })\r\n }\r\n\r\n async removeMultipleItems(keys: string[]): Promise<void> {\r\n const client = await this.getClient()\r\n const docRef = await this.getDocRef()\r\n\r\n const updates: Record<string, unknown> = {}\r\n for (const key of keys) {\r\n updates[key] = client.deleteField()\r\n }\r\n\r\n try {\r\n await client.updateDoc(docRef, updates)\r\n } catch (error) {\r\n const err = error as { code?: string }\r\n if (err.code !== 'not-found') {\r\n throw error\r\n }\r\n }\r\n }\r\n}\r\n","/**\r\n * HTTP wrapper for calling Cloud Functions.\r\n *\r\n * Gets the ID token from Firebase Auth (user signs in once via Google).\r\n * Token is refreshed automatically by Firebase SDK.\r\n *\r\n * @example\r\n * ```typescript\r\n * const state = await callRemoteFunction<SimulationState>('apiGetSimulationState', {\r\n * appId: 'my-game',\r\n * })\r\n * ```\r\n *\r\n * ⚠️ SANDBOX-ONLY: This file depends on Firebase and should ONLY be imported by SandboxHost\r\n * and other sandbox-only modules. Do NOT import from barrel exports (http/index.ts).\r\n * This ensures Firebase is not bundled in production builds.\r\n */\r\n\r\nimport { getSandboxConfig, buildFunctionsBaseUrl } from '../config/sandbox'\r\nimport { getFirebaseClient } from '../firebase/firebaseClient'\r\n\r\n/**\r\n * Type for a function that invokes a remote Cloud Function.\r\n */\r\nexport type RemoteFunctionInvoker = <TResponse>(\r\n functionName: string,\r\n payload?: unknown,\r\n) => Promise<TResponse>\r\n\r\n/**\r\n * Call a Cloud Function via HTTP POST with Bearer token authentication.\r\n *\r\n * @param functionName - Name of the Cloud Function to call (e.g., 'apiGetSimulationState')\r\n * @param payload - Optional JSON payload to send in the request body\r\n * @returns The JSON response from the function\r\n * @throws Error if not signed in or if the request fails\r\n */\r\nexport async function callRemoteFunction<TResponse>(\r\n functionName: string,\r\n payload?: unknown,\r\n): Promise<TResponse> {\r\n console.log('[Venus SDK] callRemoteFunction:', functionName)\r\n const config = getSandboxConfig()\r\n\r\n if (!config) {\r\n throw new Error(\r\n '[Venus SDK] Sandbox mode is not enabled. ' +\r\n 'Make sure the Vite plugin is configured and you are running in dev mode.'\r\n )\r\n }\r\n\r\n // Get token from Firebase Auth (user must be signed in)\r\n console.log('[Venus SDK] callRemoteFunction: Getting Firebase client...')\r\n const client = await getFirebaseClient()\r\n console.log('[Venus SDK] callRemoteFunction: Getting ID token...')\r\n const idToken = await client.getIdTokenOrThrow()\r\n console.log('[Venus SDK] callRemoteFunction: Got token, making request...')\r\n\r\n const baseUrl = buildFunctionsBaseUrl(config)\r\n const url = `${baseUrl}/${functionName}`\r\n\r\n const response = await fetchWithRetry(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${idToken}`,\r\n },\r\n body: JSON.stringify(payload ?? {}),\r\n }, config.rpcMaxRetries ?? 0, config.rpcRetryDelayMs ?? 1000)\r\n\r\n if (!response.ok) {\r\n const errorMessage = await extractErrorMessage(response, functionName)\r\n throw new Error(errorMessage)\r\n }\r\n\r\n // Handle empty responses (204 No Content or empty body)\r\n const text = await response.text()\r\n if (!text || text.trim().length === 0) {\r\n return undefined as TResponse\r\n }\r\n\r\n try {\r\n return JSON.parse(text) as TResponse\r\n } catch {\r\n throw new Error(\r\n `[Venus SDK] Backend call to ${functionName} returned invalid JSON: ${text.substring(0, 100)}`\r\n )\r\n }\r\n}\r\n\r\n/**\r\n * Fetch with retry logic for transient failures.\r\n */\r\nasync function fetchWithRetry(\r\n url: string,\r\n options: RequestInit,\r\n maxRetries: number,\r\n retryDelayMs: number,\r\n): Promise<Response> {\r\n let lastError: Error | null = null\r\n\r\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\r\n try {\r\n const response = await fetch(url, options)\r\n\r\n // Don't retry client errors (4xx), only server errors (5xx)\r\n if (response.ok || (response.status >= 400 && response.status < 500)) {\r\n return response\r\n }\r\n\r\n // Server error - might be transient, retry if we have attempts left\r\n if (attempt < maxRetries) {\r\n await delay(retryDelayMs)\r\n continue\r\n }\r\n\r\n return response\r\n } catch (error) {\r\n lastError = error instanceof Error ? error : new Error(String(error))\r\n\r\n if (attempt < maxRetries) {\r\n await delay(retryDelayMs)\r\n continue\r\n }\r\n\r\n throw lastError\r\n }\r\n }\r\n\r\n throw lastError ?? new Error('[Venus SDK] Request failed with no error details')\r\n}\r\n\r\n/**\r\n * Extract a meaningful error message from a failed response.\r\n */\r\nasync function extractErrorMessage(response: Response, functionName: string): Promise<string> {\r\n try {\r\n const errorBody = await response.json()\r\n const message = errorBody.error || errorBody.message || response.statusText\r\n return `[Venus SDK] Backend call to ${functionName} failed (${response.status}): ${message}`\r\n } catch {\r\n return `[Venus SDK] Backend call to ${functionName} failed (${response.status}): ${response.statusText}`\r\n }\r\n}\r\n\r\n/**\r\n * Simple delay helper.\r\n */\r\nfunction delay(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms))\r\n}\r\n\r\n/**\r\n * Create a remote function invoker with a custom implementation.\r\n * Useful for testing or custom authentication flows.\r\n */\r\nexport function createRemoteFunctionInvoker(\r\n invoke: RemoteFunctionInvoker = callRemoteFunction,\r\n): RemoteFunctionInvoker {\r\n return invoke\r\n}\r\n","/**\r\n * HTTP-backed {@link SimulationApi} implementation for sandbox mode.\r\n *\r\n * Uses HTTP calls to Cloud Functions for all operations.\r\n * Real-time subscriptions use Firestore listeners.\r\n *\r\n * ⚠️ SANDBOX-ONLY: This file depends on Firebase and should ONLY be imported by SandboxHost.\r\n * Do NOT import from barrel exports (simulation/index.ts) - use direct import path instead.\r\n * This ensures Firebase is not bundled in production builds.\r\n */\r\nimport {\r\n CollectRecipeResult,\r\n ExecuteRecipeOptions,\r\n ExecuteRecipeResponse,\r\n ExecuteScopedRecipeResult,\r\n ExecuteScopedRecipeOptions,\r\n GetActiveRunsOptions,\r\n GetAvailableRecipesOptions,\r\n GetAvailableRecipesResult,\r\n GetBatchRecipeRequirements,\r\n Recipe,\r\n SimulationApi,\r\n SimulationAvailableItem,\r\n SimulationAssignment,\r\n SimulationBatchOperation,\r\n SimulationBatchOperationsResult,\r\n SimulationPowerPreview,\r\n SimulationSlotMutationResult,\r\n SimulationSlotValidationResult,\r\n SimulationSlotContainer,\r\n SimulationRunSummary,\r\n SimulationState,\r\n TriggerRecipeChainOptions,\r\n} from './SimulationApi'\r\nimport { callRemoteFunction, type RemoteFunctionInvoker } from '../http/callRemoteFunction'\r\nimport {\r\n RecipeRequirementResult,\r\n VenusSimulationConfig,\r\n SimulationSubscribeOptions,\r\n SimulationSnapshotUpdate,\r\n} from '../venus-api/types'\r\nimport {\r\n observeFirestoreDocument,\r\n observeFirestoreCollection,\r\n} from '../firebase/firebaseClient'\r\n\r\n/**\r\n * Firestore document structure for simulation state.\r\n */\r\ninterface FirestoreSimulationState {\r\n inventory?: Record<string, number | string>\r\n disabledRecipes?: string[]\r\n sharedAssets?: Record<string, unknown>\r\n lastUpdated?: unknown\r\n}\r\n\r\n/**\r\n * Firestore document structure for simulation runs.\r\n */\r\ninterface FirestoreSimulationRun {\r\n id: string\r\n recipeId: string\r\n status: string\r\n startTime: unknown\r\n expiresAt: unknown\r\n entity?: string\r\n inputs?: Record<string, number | string>\r\n outputs?: Record<string, number | string>\r\n profileId: string\r\n appId: string\r\n roomId?: string\r\n}\r\n\r\n/**\r\n * HTTP-based implementation of SimulationApi for sandbox mode.\r\n */\r\nexport class HttpSimulationApi implements SimulationApi {\r\n private readonly appId: string\r\n private _simulationConfig: VenusSimulationConfig | null = null\r\n private readonly callRemote: RemoteFunctionInvoker\r\n private readonly getProfileId: () => string\r\n private readonly activeSubscriptions: Set<() => void> = new Set()\r\n\r\n constructor(\r\n appId: string,\r\n options: {\r\n callRemote?: RemoteFunctionInvoker\r\n getProfileId: () => string\r\n },\r\n ) {\r\n this.appId = appId\r\n this.callRemote = options.callRemote ?? callRemoteFunction\r\n this.getProfileId = options.getProfileId\r\n }\r\n\r\n isEnabled(): boolean {\r\n return true\r\n }\r\n\r\n // ===== SUBSCRIPTION (FIRESTORE) =====\r\n\r\n async subscribeAsync(\r\n options: SimulationSubscribeOptions,\r\n ): Promise<() => void> {\r\n this.ensureValidSubscribeOptions(options)\r\n\r\n const roomId = options.roomId\r\n const unsubscribers: Array<() => void> = []\r\n\r\n let lastInventorySignature: string | null = null\r\n let lastRunsSignature: string | null = null\r\n let latestInventory: Record<string, number | string> = {}\r\n let latestRuns: SimulationRunSummary[] = []\r\n\r\n const sendUpdate = (): void => {\r\n const snapshot: SimulationSnapshotUpdate = {\r\n type: 'snapshot',\r\n entities: Object.entries(latestInventory).map(([entityId, quantity]) => ({\r\n entityId,\r\n quantity,\r\n })),\r\n activeRuns: latestRuns,\r\n timestamp: Date.now(),\r\n }\r\n options.onUpdate(snapshot)\r\n }\r\n\r\n // Subscribe to state document\r\n const statePath = roomId\r\n ? `h5_rooms/${roomId}/h5_simulation/${this.appId}`\r\n : `profiles/${this.getProfileId()}/h5_simulation/${this.appId}`\r\n\r\n const unsubscribeState = await observeFirestoreDocument<FirestoreSimulationState>(\r\n statePath,\r\n (doc) => {\r\n const inventory = doc?.inventory ?? {}\r\n const signature = JSON.stringify(inventory)\r\n if (signature !== lastInventorySignature) {\r\n lastInventorySignature = signature\r\n latestInventory = inventory\r\n sendUpdate()\r\n }\r\n },\r\n )\r\n unsubscribers.push(unsubscribeState)\r\n\r\n // Subscribe to active runs if requested\r\n if (options.activeRuns) {\r\n const filters = roomId\r\n ? [\r\n { field: 'roomId', op: '==' as const, value: roomId },\r\n { field: 'appId', op: '==' as const, value: this.appId },\r\n { field: 'status', op: 'in' as const, value: ['running', 'awaiting_collection'] },\r\n ]\r\n : [\r\n { field: 'profileId', op: '==' as const, value: this.getProfileId() },\r\n { field: 'appId', op: '==' as const, value: this.appId },\r\n { field: 'status', op: 'in' as const, value: ['running', 'awaiting_collection'] },\r\n ]\r\n\r\n const unsubscribeRuns = await observeFirestoreCollection<FirestoreSimulationRun>(\r\n 'h5_simulation_runs',\r\n {\r\n filters,\r\n orderBy: [{ field: 'expiresAt', direction: 'desc' }],\r\n },\r\n (docs) => {\r\n const runs: SimulationRunSummary[] = docs.map((doc) => ({\r\n id: doc.id,\r\n recipeId: doc.recipeId,\r\n status: doc.status as 'running' | 'awaiting_collection',\r\n startTime: normalizeTimestamp(doc.startTime),\r\n expiresAt: normalizeTimestamp(doc.expiresAt),\r\n entity: doc.entity,\r\n inputs: doc.inputs,\r\n outputs: doc.outputs,\r\n }))\r\n\r\n const signature = JSON.stringify(runs)\r\n if (signature !== lastRunsSignature) {\r\n lastRunsSignature = signature\r\n latestRuns = runs\r\n sendUpdate()\r\n }\r\n },\r\n )\r\n unsubscribers.push(unsubscribeRuns)\r\n }\r\n\r\n const unsubscribe = (): void => {\r\n for (const unsub of unsubscribers) {\r\n unsub()\r\n }\r\n this.activeSubscriptions.delete(unsubscribe)\r\n }\r\n\r\n this.activeSubscriptions.add(unsubscribe)\r\n return unsubscribe\r\n }\r\n\r\n // ===== STATE & CONFIG (HTTP) =====\r\n\r\n async getStateAsync(roomId?: string): Promise<SimulationState> {\r\n return this.callRemote<SimulationState>('apiGetSimulationState', {\r\n appId: this.appId,\r\n roomId,\r\n })\r\n }\r\n\r\n async getConfigAsync(roomId?: string): Promise<VenusSimulationConfig> {\r\n if (this._simulationConfig) {\r\n return this._simulationConfig\r\n }\r\n\r\n const config = await this.callRemote<VenusSimulationConfig>('apiGetSimulationConfig', {\r\n appId: this.appId,\r\n roomId,\r\n })\r\n\r\n if (config) {\r\n this._simulationConfig = config\r\n return config\r\n }\r\n\r\n throw new Error('No simulation configuration available')\r\n }\r\n\r\n // ===== RECIPE EXECUTION (HTTP) =====\r\n\r\n executeRecipeAsync(\r\n recipeId: string,\r\n inputs?: Record<string, unknown>,\r\n options?: ExecuteRecipeOptions,\r\n ): Promise<ExecuteRecipeResponse> {\r\n return this.callRemote<ExecuteRecipeResponse>('apiExecuteSimulationRecipe', {\r\n appId: this.appId,\r\n recipeId,\r\n inputs,\r\n roomId: options?.roomId,\r\n batchAmount: options?.batchAmount,\r\n allowPartialBatch: options?.allowPartialBatch,\r\n entity: options?.entity,\r\n })\r\n }\r\n\r\n collectRecipeAsync(runId: string): Promise<CollectRecipeResult> {\r\n return this.callRemote<CollectRecipeResult>('apiCollectRecipeRewards', {\r\n appId: this.appId,\r\n runId,\r\n })\r\n }\r\n\r\n getActiveRunsAsync(options?: GetActiveRunsOptions): Promise<SimulationRunSummary[]> {\r\n return this.callRemote<SimulationRunSummary[]>('apiGetSimulationActiveRuns', {\r\n appId: this.appId,\r\n roomId: options?.roomId,\r\n })\r\n }\r\n\r\n executeScopedRecipeAsync(\r\n recipeId: string,\r\n entity: string,\r\n inputs?: Record<string, unknown>,\r\n options?: ExecuteScopedRecipeOptions,\r\n ): Promise<ExecuteScopedRecipeResult> {\r\n return this.callRemote<ExecuteScopedRecipeResult>('apiExecuteScopedRecipe', {\r\n appId: this.appId,\r\n recipeId,\r\n entity,\r\n inputs,\r\n roomId: options?.roomId ?? null,\r\n options,\r\n })\r\n }\r\n\r\n getAvailableRecipesAsync(options?: GetAvailableRecipesOptions): Promise<GetAvailableRecipesResult> {\r\n return this.callRemote<GetAvailableRecipesResult>('apiGetAvailableRecipes', {\r\n appId: this.appId,\r\n roomId: options?.roomId || null,\r\n includeActorRecipes: options?.includeActorRecipes || false,\r\n })\r\n }\r\n\r\n getRecipeRequirementsAsync(recipe: Recipe): Promise<RecipeRequirementResult> {\r\n return this.callRemote<RecipeRequirementResult>('apiGetRecipeRequirements', {\r\n appId: this.appId,\r\n recipeId: recipe.recipeId,\r\n entity: recipe.entity,\r\n batchAmount: recipe.batchAmount,\r\n })\r\n }\r\n\r\n getBatchRecipeRequirementsAsync(recipes: Recipe[]): Promise<GetBatchRecipeRequirements> {\r\n return this.callRemote<GetBatchRecipeRequirements>('apiGetBatchRecipeRequirements', {\r\n appId: this.appId,\r\n recipes,\r\n })\r\n }\r\n\r\n triggerRecipeChainAsync(\r\n recipeId: string,\r\n options?: TriggerRecipeChainOptions,\r\n ): Promise<ExecuteRecipeResponse> {\r\n return this.callRemote<ExecuteRecipeResponse>('apiTriggerRecipeChain', {\r\n appId: this.appId,\r\n triggerRecipeId: recipeId,\r\n context: options?.context,\r\n roomId: options?.roomId,\r\n })\r\n }\r\n\r\n // ===== FIELD RESOLUTION & METADATA (HTTP) =====\r\n\r\n async resolveFieldValueAsync(\r\n entityId: string,\r\n fieldPath: string,\r\n entity?: string,\r\n ): Promise<unknown> {\r\n const response = await this.callRemote<{ value: unknown }>('apiResolveFieldValue', {\r\n appId: this.appId,\r\n entityId,\r\n fieldPath,\r\n entity,\r\n })\r\n return response.value\r\n }\r\n\r\n getEntityMetadataAsync(entityId: string): Promise<Record<string, unknown>> {\r\n return this.callRemote<Record<string, unknown>>('apiGetEntityMetadata', {\r\n appId: this.appId,\r\n entityId,\r\n })\r\n }\r\n\r\n // ===== SLOT MANAGEMENT (HTTP) =====\r\n\r\n async getSlotContainersAsync(): Promise<SimulationSlotContainer[]> {\r\n const response = await this.callRemote<{ containers?: SimulationSlotContainer[] }>(\r\n 'apiGetSlotContainers',\r\n { appId: this.appId },\r\n )\r\n return response.containers || []\r\n }\r\n\r\n async getSlotAssignmentsAsync(containerId: string): Promise<SimulationAssignment[]> {\r\n const response = await this.callRemote<\r\n SimulationAssignment[] | { assignments?: SimulationAssignment[] }\r\n >('apiGetSlotAssignments', {\r\n appId: this.appId,\r\n containerId,\r\n })\r\n return Array.isArray(response) ? response : response.assignments || []\r\n }\r\n\r\n assignItemToSlotAsync(\r\n containerId: string,\r\n slotId: string,\r\n itemId: string,\r\n ): Promise<SimulationSlotMutationResult> {\r\n return this.callRemote<SimulationSlotMutationResult>('apiAssignItemToSlot', {\r\n appId: this.appId,\r\n containerId,\r\n slotId,\r\n itemId,\r\n })\r\n }\r\n\r\n removeItemFromSlotAsync(containerId: string, slotId: string): Promise<SimulationSlotMutationResult> {\r\n return this.callRemote<SimulationSlotMutationResult>('apiRemoveItemFromSlot', {\r\n appId: this.appId,\r\n containerId,\r\n slotId,\r\n })\r\n }\r\n\r\n async getAvailableItemsAsync(containerId: string, slotId: string): Promise<SimulationAvailableItem[]> {\r\n const response = await this.callRemote<{ availableItems?: SimulationAvailableItem[] }>(\r\n 'apiGetAvailableItemsForSlot',\r\n {\r\n appId: this.appId,\r\n containerId,\r\n slotId,\r\n },\r\n )\r\n return response.availableItems || []\r\n }\r\n\r\n calculatePowerPreviewAsync(\r\n containerId: string,\r\n slotId: string,\r\n candidateItemId: string,\r\n ): Promise<SimulationPowerPreview> {\r\n return this.callRemote<SimulationPowerPreview>('apiCalculatePowerPreview', {\r\n appId: this.appId,\r\n containerId,\r\n slotId,\r\n candidateItemId,\r\n })\r\n }\r\n\r\n validateSlotAssignmentAsync(\r\n containerId: string,\r\n slotId: string,\r\n itemId: string,\r\n ): Promise<SimulationSlotValidationResult> {\r\n return this.callRemote<SimulationSlotValidationResult>('apiValidateSlotAssignment', {\r\n appId: this.appId,\r\n containerId,\r\n slotId,\r\n itemId,\r\n })\r\n }\r\n\r\n executeBatchOperationsAsync(\r\n operations: Array<SimulationBatchOperation>,\r\n validateOnly?: boolean,\r\n ): Promise<SimulationBatchOperationsResult> {\r\n return this.callRemote<SimulationBatchOperationsResult>('apiBatchSlotOperations', {\r\n appId: this.appId,\r\n operations,\r\n validateOnly,\r\n })\r\n }\r\n\r\n // ===== HELPERS =====\r\n\r\n private ensureValidSubscribeOptions(\r\n options: unknown,\r\n ): asserts options is SimulationSubscribeOptions {\r\n if (typeof options !== 'object' || options === null) {\r\n throw new Error('Simulation subscribe requires an options object')\r\n }\r\n\r\n const opts = options as Record<string, unknown>\r\n\r\n if (typeof opts.onUpdate !== 'function') {\r\n throw new Error('Simulation subscribe requires an onUpdate callback')\r\n }\r\n\r\n const hasFilter =\r\n (Array.isArray(opts.entities) && opts.entities.length > 0) ||\r\n (Array.isArray(opts.tags) && opts.tags.length > 0) ||\r\n Boolean(opts.activeRuns)\r\n\r\n if (!hasFilter) {\r\n throw new Error(\r\n 'Simulation subscribe requires at least one filter (entities, tags, activeRuns)',\r\n )\r\n }\r\n }\r\n\r\n destroy(): void {\r\n for (const unsubscribe of this.activeSubscriptions) {\r\n unsubscribe()\r\n }\r\n this.activeSubscriptions.clear()\r\n }\r\n}\r\n\r\n/**\r\n * Normalize Firestore Timestamp or epoch milliseconds to Unix timestamp in milliseconds.\r\n */\r\nfunction normalizeTimestamp(value: unknown): number {\r\n if (value === null || value === undefined) {\r\n return 0\r\n }\r\n\r\n if (\r\n typeof value === 'object' &&\r\n 'toMillis' in value &&\r\n typeof (value as { toMillis: unknown }).toMillis === 'function'\r\n ) {\r\n return (value as { toMillis: () => number }).toMillis()\r\n }\r\n\r\n if (typeof value === 'object' && '_seconds' in value) {\r\n const ts = value as { _seconds: number; _nanoseconds?: number }\r\n return ts._seconds * 1000 + Math.floor((ts._nanoseconds ?? 0) / 1_000_000)\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return value\r\n }\r\n\r\n return 0\r\n}\r\n","/**\r\n * HTTP-backed rooms API for lifecycle operations.\r\n *\r\n * Handles room creation, joining, leaving, starting, and kicking via Cloud Functions.\r\n * Room data, messages, and subscriptions are handled by FirestoreRoomsApi.\r\n *\r\n * ⚠️ SANDBOX-ONLY: This file depends on Firebase (via callRemoteFunction) and should\r\n * ONLY be imported by SandboxHost. Do NOT import from barrel exports (rooms/index.ts).\r\n * This ensures Firebase is not bundled in production builds.\r\n */\r\nimport {\r\n CreateRoomOptions,\r\n JoinOrCreateRoomOptions,\r\n JoinOrCreateResult,\r\n ListRoomsOptions,\r\n StartRoomGameOptions,\r\n} from './RoomsApi'\r\nimport { VenusRoom, VenusRoomPayload } from './VenusRoom'\r\nimport { callRemoteFunction, type RemoteFunctionInvoker } from '../http/callRemoteFunction'\r\n\r\n/**\r\n * Standard envelope for endpoints that return a single room.\r\n */\r\ninterface RoomEnvelopeResponse {\r\n success: boolean\r\n room: VenusRoomPayload\r\n}\r\n\r\n/**\r\n * Standard envelope for endpoints that return multiple rooms.\r\n */\r\ninterface RoomsEnvelopeResponse {\r\n success: boolean\r\n rooms: VenusRoomPayload[]\r\n}\r\n\r\n/**\r\n * Standard envelope for join-or-create room endpoint.\r\n */\r\ninterface JoinOrCreateRoomEnvelopeResponse {\r\n success: boolean\r\n action: 'created' | 'joined'\r\n playersJoined: number\r\n room: VenusRoomPayload\r\n}\r\n\r\n/**\r\n * HTTP-based rooms API for lifecycle operations.\r\n */\r\nexport class HttpRoomsApi {\r\n private readonly appId: string\r\n private readonly callRemote: RemoteFunctionInvoker\r\n private readonly getProfileId: () => string\r\n\r\n constructor(\r\n appId: string,\r\n options: {\r\n callRemote?: RemoteFunctionInvoker\r\n getProfileId: () => string\r\n },\r\n ) {\r\n this.appId = appId\r\n this.callRemote = options.callRemote ?? callRemoteFunction\r\n this.getProfileId = options.getProfileId\r\n }\r\n\r\n async createRoomAsync(options: CreateRoomOptions): Promise<VenusRoom> {\r\n const response = await this.callRemote<RoomEnvelopeResponse>('apiCreateH5Room', {\r\n appId: this.appId,\r\n options: {\r\n maxPlayers: options.maxPlayers ?? 4,\r\n gameType: options.gameType,\r\n isPrivate: options.isPrivate ?? false,\r\n roomCode: options.roomCode,\r\n name: options.name,\r\n description: options.description,\r\n customMetadata: options.customMetadata,\r\n data: options.data,\r\n },\r\n })\r\n\r\n return new VenusRoom(response.room)\r\n }\r\n\r\n async joinOrCreateRoomAsync(options: JoinOrCreateRoomOptions): Promise<JoinOrCreateResult> {\r\n const response = await this.callRemote<JoinOrCreateRoomEnvelopeResponse>('apiJoinOrCreateH5Room', {\r\n appId: this.appId,\r\n options: {\r\n matchCriteria: options.matchCriteria,\r\n createOptions: {\r\n maxPlayers: options.createOptions.maxPlayers ?? 4,\r\n gameType: options.createOptions.gameType,\r\n isPrivate: options.createOptions.isPrivate ?? false,\r\n name: options.createOptions.name,\r\n description: options.createOptions.description,\r\n customMetadata: options.createOptions.customMetadata,\r\n data: options.createOptions.data,\r\n },\r\n },\r\n })\r\n\r\n return {\r\n action: response.action,\r\n room: new VenusRoom(response.room),\r\n playersJoined: response.playersJoined,\r\n }\r\n }\r\n\r\n async joinRoomByCodeAsync(roomCode: string): Promise<VenusRoom> {\r\n const response = await this.callRemote<RoomEnvelopeResponse>('apiJoinH5RoomByCode', {\r\n appId: this.appId,\r\n roomCode,\r\n })\r\n\r\n return new VenusRoom(response.room)\r\n }\r\n\r\n async getUserRoomsAsync(options?: ListRoomsOptions): Promise<VenusRoom[]> {\r\n const response = await this.callRemote<RoomsEnvelopeResponse>('apiGetUserH5Rooms', {\r\n appId: this.appId,\r\n includeArchived: options?.includeArchived ?? false,\r\n })\r\n\r\n return response.rooms.map((roomPayload) => new VenusRoom(roomPayload))\r\n }\r\n\r\n async leaveRoomAsync(room: VenusRoom): Promise<void> {\r\n await this.callRemote<void>('apiLeaveH5Room', {\r\n appId: this.appId,\r\n roomId: room.id,\r\n })\r\n }\r\n\r\n async kickPlayerAsync(\r\n room: VenusRoom,\r\n targetProfileId: string,\r\n options?: { reason?: string },\r\n ): Promise<void> {\r\n await this.callRemote<void>('apiKickH5RoomPlayer', {\r\n appId: this.appId,\r\n roomId: room.id,\r\n targetProfileId,\r\n reason: options?.reason,\r\n })\r\n }\r\n\r\n async startRoomGameAsync(room: VenusRoom, options?: StartRoomGameOptions): Promise<void> {\r\n // Backend contract: req.body must include { roomId, options: { gameConfig, turnOrder } }\r\n await this.callRemote<RoomEnvelopeResponse>('apiStartH5Game', {\r\n roomId: room.id,\r\n options: {\r\n gameConfig: options?.gameConfig,\r\n turnOrder: options?.turnOrder ?? null,\r\n },\r\n })\r\n }\r\n}\r\n","/**\r\n * Firestore-backed rooms API for data, messages, and subscriptions.\r\n *\r\n * Handles direct Firestore operations for room data (like mobile app).\r\n * Room lifecycle (create, join, leave, start, kick) is handled by HttpRoomsApi.\r\n *\r\n * Paths:\r\n * - Room document: h5_rooms/{roomId}\r\n * - Messages: h5_rooms/{roomId}/messages\r\n * - Proposed moves: h5_rooms/{roomId}/proposed_moves\r\n *\r\n * ⚠️ SANDBOX-ONLY: This file depends on Firebase and should ONLY be imported by SandboxHost.\r\n * Do NOT import from barrel exports (rooms/index.ts) - use direct import path instead.\r\n * This ensures Firebase is not bundled in production builds.\r\n */\r\nimport {\r\n RoomSubscriptionOptions,\r\n RoomDataUpdate,\r\n RoomMessageEvent,\r\n ProposedMoveEvent,\r\n UpdateRoomDataOptions,\r\n RoomMessageRequest,\r\n ProposeMoveRequest,\r\n ProposeMoveResult,\r\n ValidateMoveVerdict,\r\n ValidateMoveResult,\r\n} from './RoomsApi'\r\nimport { VenusRoom, VenusRoomPayload } from './VenusRoom'\r\nimport { getFirebaseClient, type FirebaseClient } from '../firebase/firebaseClient'\r\n\r\n// Firestore types for snapshot callbacks\r\ntype DocumentSnapshot = import('firebase/firestore').DocumentSnapshot\r\ntype QuerySnapshot = import('firebase/firestore').QuerySnapshot\r\ntype DocumentChange = import('firebase/firestore').DocumentChange\r\ntype FirestoreError = import('firebase/firestore').FirestoreError\r\n\r\n/**\r\n * Firestore-backed rooms API for data operations.\r\n */\r\nexport class FirestoreRoomsApi {\r\n private client: FirebaseClient | null = null\r\n private readonly activeSubscriptions: Set<() => void> = new Set()\r\n\r\n private async getClient(): Promise<FirebaseClient> {\r\n if (!this.client) {\r\n this.client = await getFirebaseClient()\r\n }\r\n return this.client\r\n }\r\n\r\n private getProfileId(): string {\r\n if (!this.client) {\r\n throw new Error('[Venus SDK] Firebase not initialized. Call getClient() first.')\r\n }\r\n const profileId = this.client.getProfileId()\r\n if (!profileId) {\r\n throw new Error('[Venus SDK] Not signed in. Click the Venus toolbar to sign in with Google.')\r\n }\r\n return profileId\r\n }\r\n\r\n // ===== ROOM DATA OPERATIONS =====\r\n\r\n async getRoomDataAsync(room: VenusRoom): Promise<Record<string, unknown>> {\r\n const client = await this.getClient()\r\n const roomRef = client.doc(client.firestore, `h5_rooms/${room.id}`)\r\n const snapshot = await client.getDoc(roomRef)\r\n\r\n if (!snapshot.exists()) {\r\n throw new Error(`Room ${room.id} not found`)\r\n }\r\n\r\n const roomData = snapshot.data()\r\n return (roomData?.data as Record<string, unknown>) || {}\r\n }\r\n\r\n async updateRoomDataAsync(\r\n room: VenusRoom,\r\n updates: Record<string, unknown>,\r\n options?: UpdateRoomDataOptions,\r\n ): Promise<void> {\r\n const client = await this.getClient()\r\n const roomRef = client.doc(client.firestore, `h5_rooms/${room.id}`)\r\n\r\n const merge = options?.merge !== false\r\n\r\n const updateData = {\r\n data: merge ? updates : updates,\r\n updatedAt: client.serverTimestamp(),\r\n }\r\n\r\n await client.updateDoc(roomRef, updateData)\r\n }\r\n\r\n // ===== MESSAGE OPERATIONS =====\r\n\r\n async sendRoomMessageAsync(room: VenusRoom, request: RoomMessageRequest): Promise<string> {\r\n const client = await this.getClient()\r\n const messagesRef = client.collection(client.firestore, `h5_rooms/${room.id}/messages`)\r\n\r\n const messageDoc = await client.addDoc(messagesRef, {\r\n roomId: room.id,\r\n senderId: this.getProfileId(),\r\n content: request.message.content || '',\r\n type: request.message.type || 'chat',\r\n metadata: request.metadata || {},\r\n timestamp: client.serverTimestamp(),\r\n })\r\n\r\n return messageDoc.id\r\n }\r\n\r\n // ===== PROPOSED MOVES =====\r\n\r\n async proposeMoveAsync(room: VenusRoom, request: ProposeMoveRequest): Promise<ProposeMoveResult> {\r\n const client = await this.getClient()\r\n const movesRef = client.collection(client.firestore, `h5_rooms/${room.id}/proposed_moves`)\r\n\r\n const moveDoc = await client.addDoc(movesRef, {\r\n proposerProfileId: this.getProfileId(),\r\n roomId: room.id,\r\n gameSpecificState: request.gameSpecificState,\r\n moveType: request.moveType,\r\n clientContext: request.clientContext || {},\r\n clientProposalId: request.clientProposalId,\r\n timestamp: client.serverTimestamp(),\r\n serverGenericValidationStatus: 'pending',\r\n })\r\n\r\n return { proposedMoveId: moveDoc.id }\r\n }\r\n\r\n async validateMoveAsync(\r\n room: VenusRoom,\r\n moveId: string,\r\n verdict: ValidateMoveVerdict,\r\n ): Promise<ValidateMoveResult> {\r\n const client = await this.getClient()\r\n const moveRef = client.doc(client.firestore, `h5_rooms/${room.id}/proposed_moves/${moveId}`)\r\n\r\n await client.updateDoc(moveRef, {\r\n serverGenericValidationStatus: verdict.isValid ? 'valid' : 'invalid',\r\n serverGenericValidationReason: verdict.reason || null,\r\n validatorId: verdict.validatorId || this.getProfileId(),\r\n updatedAt: client.serverTimestamp(),\r\n })\r\n\r\n return {\r\n success: true,\r\n moveId,\r\n isValid: verdict.isValid,\r\n reason: verdict.reason,\r\n }\r\n }\r\n\r\n // ===== SUBSCRIPTIONS =====\r\n\r\n async subscribeAsync(room: VenusRoom, options?: RoomSubscriptionOptions): Promise<() => void> {\r\n const client = await this.getClient()\r\n const unsubscribers: Array<() => void> = []\r\n\r\n // Subscribe to room data\r\n if (options?.onData) {\r\n const roomRef = client.doc(client.firestore, `h5_rooms/${room.id}`)\r\n const unsubscribeData = client.onSnapshot(\r\n roomRef,\r\n (snapshot: DocumentSnapshot) => {\r\n if (snapshot.exists()) {\r\n const roomData = {\r\n id: snapshot.id,\r\n ...snapshot.data(),\r\n } as VenusRoomPayload\r\n\r\n const update: RoomDataUpdate = {\r\n type: 'H5_ROOM_DATA_UPDATED',\r\n roomId: room.id,\r\n roomData,\r\n timestamp: Date.now(),\r\n }\r\n options.onData!(update)\r\n }\r\n },\r\n (error: FirestoreError) => {\r\n console.error('[Venus SDK] Room subscription error:', error)\r\n },\r\n )\r\n unsubscribers.push(unsubscribeData)\r\n }\r\n\r\n // Subscribe to messages\r\n if (options?.onMessages) {\r\n const messagesRef = client.collection(client.firestore, `h5_rooms/${room.id}/messages`)\r\n const messagesQuery = client.query(\r\n messagesRef,\r\n client.orderBy('timestamp', 'desc'),\r\n client.limit(50),\r\n )\r\n\r\n const unsubscribeMessages = client.onSnapshot(\r\n messagesQuery,\r\n (snapshot: QuerySnapshot) => {\r\n snapshot.docChanges().forEach((change: DocumentChange) => {\r\n const messageData = {\r\n id: change.doc.id,\r\n ...change.doc.data(),\r\n }\r\n\r\n let eventType: 'H5_ROOM_MESSAGE_RECEIVED' | 'H5_ROOM_MESSAGE_UPDATED' | 'H5_ROOM_MESSAGE_DELETED'\r\n if (change.type === 'added') {\r\n eventType = 'H5_ROOM_MESSAGE_RECEIVED'\r\n } else if (change.type === 'modified') {\r\n eventType = 'H5_ROOM_MESSAGE_UPDATED'\r\n } else {\r\n eventType = 'H5_ROOM_MESSAGE_DELETED'\r\n }\r\n\r\n const event: RoomMessageEvent = {\r\n type: eventType,\r\n roomId: room.id,\r\n message: messageData,\r\n timestamp: Date.now(),\r\n }\r\n options.onMessages!(event)\r\n })\r\n },\r\n (error: FirestoreError) => {\r\n console.error('[Venus SDK] Messages subscription error:', error)\r\n },\r\n )\r\n unsubscribers.push(unsubscribeMessages)\r\n }\r\n\r\n // Subscribe to proposed moves (game events)\r\n if (options?.onGameEvents) {\r\n const movesRef = client.collection(client.firestore, `h5_rooms/${room.id}/proposed_moves`)\r\n const movesQuery = client.query(\r\n movesRef,\r\n client.orderBy('timestamp', 'desc'),\r\n client.limit(10),\r\n )\r\n\r\n const unsubscribeMoves = client.onSnapshot(\r\n movesQuery,\r\n (snapshot: QuerySnapshot) => {\r\n snapshot.docChanges().forEach((change: DocumentChange) => {\r\n const moveData = {\r\n id: change.doc.id,\r\n ...change.doc.data(),\r\n }\r\n\r\n const event: ProposedMoveEvent = {\r\n type: 'app:h5:proposedMoveValidationUpdated',\r\n roomId: room.id,\r\n proposedMoveData: moveData,\r\n proposedMoveId: change.doc.id,\r\n changeType: change.type,\r\n timestamp: Date.now(),\r\n }\r\n options.onGameEvents!(event)\r\n })\r\n },\r\n (error: FirestoreError) => {\r\n console.error('[Venus SDK] Proposed moves subscription error:', error)\r\n },\r\n )\r\n unsubscribers.push(unsubscribeMoves)\r\n }\r\n\r\n // Create combined unsubscribe function\r\n const unsubscribe = (): void => {\r\n for (const unsub of unsubscribers) {\r\n unsub()\r\n }\r\n this.activeSubscriptions.delete(unsubscribe)\r\n }\r\n\r\n this.activeSubscriptions.add(unsubscribe)\r\n return unsubscribe\r\n }\r\n\r\n /**\r\n * Clean up all active subscriptions.\r\n */\r\n destroy(): void {\r\n for (const unsubscribe of this.activeSubscriptions) {\r\n unsubscribe()\r\n }\r\n this.activeSubscriptions.clear()\r\n }\r\n}\r\n","/**\r\n * Composite rooms API for sandbox mode.\r\n *\r\n * Combines HttpRoomsApi (lifecycle operations) with FirestoreRoomsApi (data/subscriptions).\r\n * This matches how the mobile app works - HTTP for server-managed operations,\r\n * direct Firestore for data and real-time subscriptions.\r\n *\r\n * ⚠️ SANDBOX-ONLY: This file depends on Firebase and should ONLY be imported by SandboxHost.\r\n * Do NOT import from barrel exports (rooms/index.ts) - use direct import path instead.\r\n * This ensures Firebase is not bundled in production builds.\r\n */\r\nimport {\r\n RoomsApi,\r\n CreateRoomOptions,\r\n JoinOrCreateRoomOptions,\r\n JoinOrCreateResult,\r\n ListRoomsOptions,\r\n RoomSubscriptionOptions,\r\n UpdateRoomDataOptions,\r\n RoomMessageRequest,\r\n StartRoomGameOptions,\r\n ProposeMoveRequest,\r\n ProposeMoveResult,\r\n ValidateMoveVerdict,\r\n ValidateMoveResult,\r\n} from './RoomsApi'\r\nimport { VenusRoom } from './VenusRoom'\r\nimport { HttpRoomsApi } from './HttpRoomsApi'\r\nimport { FirestoreRoomsApi } from './FirestoreRoomsApi'\r\n\r\n/**\r\n * Composite implementation that delegates to HTTP or Firestore as appropriate.\r\n */\r\nexport class CompositeRemoteRoomsApi implements RoomsApi {\r\n private readonly httpApi: HttpRoomsApi\r\n private readonly firestoreApi: FirestoreRoomsApi\r\n\r\n constructor(httpApi: HttpRoomsApi, firestoreApi: FirestoreRoomsApi) {\r\n this.httpApi = httpApi\r\n this.firestoreApi = firestoreApi\r\n }\r\n\r\n // ===== HTTP-backed lifecycle operations =====\r\n\r\n async createRoomAsync(options: CreateRoomOptions): Promise<VenusRoom> {\r\n return this.httpApi.createRoomAsync(options)\r\n }\r\n\r\n async joinOrCreateRoomAsync(options: JoinOrCreateRoomOptions): Promise<JoinOrCreateResult> {\r\n return this.httpApi.joinOrCreateRoomAsync(options)\r\n }\r\n\r\n async joinRoomByCodeAsync(roomCode: string): Promise<VenusRoom> {\r\n return this.httpApi.joinRoomByCodeAsync(roomCode)\r\n }\r\n\r\n async getUserRoomsAsync(options?: ListRoomsOptions): Promise<VenusRoom[]> {\r\n return this.httpApi.getUserRoomsAsync(options)\r\n }\r\n\r\n async leaveRoomAsync(room: VenusRoom): Promise<void> {\r\n return this.httpApi.leaveRoomAsync(room)\r\n }\r\n\r\n async kickPlayerAsync(\r\n room: VenusRoom,\r\n targetProfileId: string,\r\n options?: { reason?: string },\r\n ): Promise<void> {\r\n return this.httpApi.kickPlayerAsync(room, targetProfileId, options)\r\n }\r\n\r\n async startRoomGameAsync(room: VenusRoom, options?: StartRoomGameOptions): Promise<void> {\r\n return this.httpApi.startRoomGameAsync(room, options)\r\n }\r\n\r\n // ===== Firestore-backed data operations =====\r\n\r\n async subscribeAsync(room: VenusRoom, options?: RoomSubscriptionOptions): Promise<() => void> {\r\n return this.firestoreApi.subscribeAsync(room, options)\r\n }\r\n\r\n async updateRoomDataAsync(\r\n room: VenusRoom,\r\n updates: Record<string, unknown>,\r\n options?: UpdateRoomDataOptions,\r\n ): Promise<void> {\r\n return this.firestoreApi.updateRoomDataAsync(room, updates, options)\r\n }\r\n\r\n async getRoomDataAsync(room: VenusRoom): Promise<Record<string, unknown>> {\r\n return this.firestoreApi.getRoomDataAsync(room)\r\n }\r\n\r\n async sendRoomMessageAsync(room: VenusRoom, message: RoomMessageRequest): Promise<string> {\r\n return this.firestoreApi.sendRoomMessageAsync(room, message)\r\n }\r\n\r\n async proposeMoveAsync(room: VenusRoom, request: ProposeMoveRequest): Promise<ProposeMoveResult> {\r\n return this.firestoreApi.proposeMoveAsync(room, request)\r\n }\r\n\r\n async validateMoveAsync(\r\n room: VenusRoom,\r\n moveId: string,\r\n verdict: ValidateMoveVerdict,\r\n ): Promise<ValidateMoveResult> {\r\n return this.firestoreApi.validateMoveAsync(room, moveId, verdict)\r\n }\r\n\r\n /**\r\n * Clean up all active subscriptions.\r\n */\r\n destroy(): void {\r\n this.firestoreApi.destroy()\r\n }\r\n}\r\n","/**\r\n * HTTP-backed {@link LeaderboardApi} implementation for sandbox mode.\r\n *\r\n * All operations call Cloud Functions directly via HTTP.\r\n *\r\n * ⚠️ SANDBOX-ONLY: This file depends on Firebase (via callRemoteFunction) and should\r\n * ONLY be imported by SandboxHost. Do NOT import from barrel exports (leaderboard/index.ts).\r\n * This ensures Firebase is not bundled in production builds.\r\n */\r\nimport {\r\n LeaderboardApi,\r\n ScoreToken,\r\n SubmitScoreParams,\r\n SubmitScoreResult,\r\n GetPagedScoresOptions,\r\n PagedScoresResponse,\r\n PlayerRankOptions,\r\n PlayerRankResult,\r\n GetPodiumScoresOptions,\r\n PodiumScoresResponse,\r\n} from './LeaderboardApi'\r\nimport { callRemoteFunction, type RemoteFunctionInvoker } from '../http/callRemoteFunction'\r\n\r\n/**\r\n * HTTP-based implementation of LeaderboardApi for sandbox mode.\r\n */\r\nexport class HttpLeaderboardApi implements LeaderboardApi {\r\n private readonly appId: string\r\n private readonly callRemote: RemoteFunctionInvoker\r\n private readonly getProfileId: () => string\r\n\r\n constructor(\r\n appId: string,\r\n options: {\r\n callRemote?: RemoteFunctionInvoker\r\n getProfileId: () => string\r\n },\r\n ) {\r\n this.appId = appId\r\n this.callRemote = options.callRemote ?? callRemoteFunction\r\n this.getProfileId = options.getProfileId\r\n }\r\n\r\n async createScoreToken(mode?: string): Promise<ScoreToken> {\r\n return this.callRemote<ScoreToken>('apiCreateScoreToken', {\r\n appId: this.appId,\r\n mode: mode || 'default',\r\n })\r\n }\r\n\r\n async submitScore(params: SubmitScoreParams): Promise<SubmitScoreResult> {\r\n return this.callRemote<SubmitScoreResult>('apiSubmitScore', {\r\n appId: this.appId,\r\n token: params.token,\r\n score: params.score,\r\n duration: params.duration,\r\n mode: params.mode || 'default',\r\n telemetry: params.telemetry,\r\n metadata: params.metadata,\r\n })\r\n }\r\n\r\n async getPagedScores(options?: GetPagedScoresOptions): Promise<PagedScoresResponse> {\r\n return this.callRemote<PagedScoresResponse>('apiGetPagedScores', {\r\n appId: this.appId,\r\n mode: options?.mode || 'default',\r\n period: options?.period || 'alltime',\r\n periodDate: options?.periodDate,\r\n cursor: options?.cursor,\r\n limit: options?.limit,\r\n variant: options?.variant || 'standard',\r\n topCount: options?.topCount,\r\n contextAhead: options?.contextAhead,\r\n contextBehind: options?.contextBehind,\r\n })\r\n }\r\n\r\n async getMyRank(options?: PlayerRankOptions): Promise<PlayerRankResult> {\r\n return this.callRemote<PlayerRankResult>('apiGetMyRank', {\r\n appId: this.appId,\r\n mode: options?.mode || 'default',\r\n period: options?.period || 'alltime',\r\n periodDate: options?.periodDate,\r\n })\r\n }\r\n\r\n async getPodiumScores(options?: GetPodiumScoresOptions): Promise<PodiumScoresResponse> {\r\n return this.callRemote<PodiumScoresResponse>('apiGetPodiumScores', {\r\n appId: this.appId,\r\n mode: options?.mode || 'default',\r\n period: options?.period || 'alltime',\r\n periodDate: options?.periodDate,\r\n topCount: options?.topCount,\r\n contextAhead: options?.contextAhead,\r\n contextBehind: options?.contextBehind,\r\n })\r\n }\r\n}\r\n","import { AnalyticsApi, MockAnalyticsApi } from './analytics'\r\nimport { Host, InitializationContext, InitializationOptions } from './Host.ts'\r\nimport { AdsApi, MockAdsApi } from './ads'\r\nimport { createMockStorageApi, StorageApi } from './storage'\r\nimport { FirestoreStorageApi } from './storage/FirestoreStorageApi'\r\nimport { Avatar3dApi, MockAvatarApi } from './avatar3d'\r\nimport { VenusAPI } from './venus-api/types.ts'\r\nimport { MockNavigationApi, NavigationApi } from './navigation'\r\nimport { MockNotificationsApi, NotificationsApi } from './notifications'\r\nimport { MockPopupsApi, PopupsApi } from './popups'\r\nimport { ProfileApi, SandboxProfileApi } from './profile'\r\nimport { SystemApi, MockSystemApi } from './system'\r\nimport { MockDeviceApi } from './device'\r\nimport { MockEnvironmentApi } from './environment'\r\nimport { CdnApi, MockCdnApi } from './cdn'\r\nimport { MockTimeApi, TimeApi } from './time'\r\nimport { AiApi, MockAiApi } from './ai'\r\nimport { HapticsApi, MockHapticsApi } from './haptics'\r\nimport { FeaturesApi, MockFeaturesApi } from './features'\r\nimport { LifecycleApi, MockLifecycleApi } from './lifecycles'\r\nimport { SimulationApi } from './simulation'\r\nimport { HttpSimulationApi } from './simulation/HttpSimulationApi'\r\nimport { RoomsApi, initializeRoomsApi } from './rooms'\r\nimport { HttpRoomsApi } from './rooms/HttpRoomsApi'\r\nimport { FirestoreRoomsApi } from './rooms/FirestoreRoomsApi'\r\nimport { CompositeRemoteRoomsApi } from './rooms/CompositeRemoteRoomsApi'\r\nimport { LoggingApi, MockLoggingApi } from './logging'\r\nimport { IapApi, MockIapApi } from './iap'\r\nimport { VenusMessageId } from './VenusMessageId'\r\nimport {\r\n MockOverlay,\r\n MockActionSheetItem,\r\n MockActionSheetOptions,\r\n} from './MockOverlay'\r\nimport { MockSharedAssetsApi } from './shared-assets'\r\nimport { LeaderboardApi } from './leaderboard'\r\nimport { HttpLeaderboardApi } from './leaderboard/HttpLeaderboardApi'\r\nimport { MockPreloaderApi, PreloaderApi } from './game-preloader'\r\nimport { SocialApi } from './social/SocialApi'\r\nimport { MockSocialApi } from './social/MockSocialApi'\r\nimport { getSandboxConfig } from './config/sandbox'\r\nimport { getFirebaseClient, type FirebaseClient } from './firebase/firebaseClient'\r\nimport { callRemoteFunction } from './http/callRemoteFunction'\r\n\r\nenum SandboxHostState {\r\n PLAYING,\r\n PAUSED,\r\n SLEEPING,\r\n TERMINATED,\r\n}\r\n\r\n/**\r\n * SandboxHost connects to a real backend (local emulator, dev, or staging)\r\n * for browser-based development with live data.\r\n */\r\nexport class SandboxHost implements Host {\r\n readonly ads: AdsApi\r\n readonly analytics: AnalyticsApi\r\n readonly deviceCache: StorageApi\r\n readonly appStorage: StorageApi\r\n readonly globalStorage: StorageApi\r\n readonly avatar3d: Avatar3dApi\r\n readonly navigation: NavigationApi\r\n readonly notifications: NotificationsApi\r\n readonly popups: PopupsApi\r\n readonly profile: ProfileApi\r\n readonly system: SystemApi\r\n readonly cdn: CdnApi\r\n readonly time: TimeApi\r\n readonly ai: AiApi\r\n readonly haptics: HapticsApi\r\n readonly features: FeaturesApi\r\n readonly lifecycle: LifecycleApi\r\n readonly simulation: SimulationApi\r\n readonly rooms: RoomsApi\r\n readonly logging: LoggingApi\r\n readonly iap: IapApi\r\n readonly leaderboard: LeaderboardApi\r\n readonly preloader: PreloaderApi\r\n readonly social: SocialApi\r\n\r\n context?: InitializationContext\r\n\r\n private state: SandboxHostState = SandboxHostState.PLAYING\r\n\r\n get isInitialized() {\r\n return this._isInitialized\r\n }\r\n\r\n private readonly venusApi: VenusAPI\r\n private _isInitialized: boolean = false\r\n private readonly _overlay: MockOverlay\r\n\r\n private readonly _mockLifecyclesApi: MockLifecycleApi\r\n private readonly _mockAdsApi: MockAdsApi\r\n private client: FirebaseClient | null = null\r\n private clientReady: Promise<FirebaseClient> | null = null\r\n private authUnsubscribe: (() => void) | null = null\r\n private readonly cleanupFunctions: Array<() => void> = []\r\n\r\n constructor(venusApi: VenusAPI) {\r\n this.venusApi = venusApi\r\n this._overlay = this.createOverlay()\r\n this._mockAdsApi = new MockAdsApi(this._overlay)\r\n this._mockLifecyclesApi = new MockLifecycleApi()\r\n\r\n this.ads = this._mockAdsApi\r\n this.analytics = new MockAnalyticsApi()\r\n\r\n // Get sandbox configuration (guaranteed to exist when SandboxHost is created)\r\n const sandboxConfig = getSandboxConfig()!\r\n const gameId = sandboxConfig.gameId\r\n\r\n console.log('[Venus SDK] SandboxHost: Connecting to:', sandboxConfig.target)\r\n\r\n // profileId is fetched from Firebase Auth (set after user signs in)\r\n const getProfileId = (): string => {\r\n if (this.client && this.client.isSignedIn()) {\r\n return this.client.getProfileId() || 'unknown-user'\r\n }\r\n return 'unknown-user'\r\n }\r\n\r\n // Use Firestore-backed storage APIs\r\n this.deviceCache = createMockStorageApi('deviceCache', '') // deviceCache stays local\r\n this.appStorage = new FirestoreStorageApi('app', gameId)\r\n this.globalStorage = new FirestoreStorageApi('global')\r\n\r\n // Use HTTP-backed simulation API with Firestore subscriptions\r\n this.simulation = new HttpSimulationApi(gameId, { getProfileId })\r\n\r\n // Use HTTP-backed leaderboard API\r\n this.leaderboard = new HttpLeaderboardApi(gameId, { getProfileId })\r\n\r\n // Use composite rooms API (HTTP for lifecycle, Firestore for data)\r\n const httpRoomsApi = new HttpRoomsApi(gameId, { getProfileId })\r\n const firestoreRoomsApi = new FirestoreRoomsApi()\r\n this.rooms = new CompositeRemoteRoomsApi(httpRoomsApi, firestoreRoomsApi)\r\n\r\n // Shared mock APIs (UI/system - same behavior as MockHost)\r\n this.avatar3d = new MockAvatarApi(venusApi)\r\n this.navigation = new MockNavigationApi(venusApi)\r\n this.notifications = new MockNotificationsApi(venusApi)\r\n this.popups = new MockPopupsApi(this._overlay)\r\n this.profile = new SandboxProfileApi(venusApi)\r\n\r\n const deviceApi = new MockDeviceApi(venusApi)\r\n const environmentApi = new MockEnvironmentApi(venusApi)\r\n this.system = new MockSystemApi(deviceApi, environmentApi, venusApi)\r\n\r\n this.cdn = new MockCdnApi(venusApi)\r\n this.time = new MockTimeApi(venusApi)\r\n this.ai = new MockAiApi()\r\n this.haptics = new MockHapticsApi(venusApi)\r\n this.features = new MockFeaturesApi()\r\n this.lifecycle = this._mockLifecyclesApi\r\n this.logging = new MockLoggingApi()\r\n this.iap = new MockIapApi()\r\n this.social = new MockSocialApi()\r\n\r\n initializeRoomsApi(this.venusApi, this)\r\n\r\n this.preloader = new MockPreloaderApi()\r\n venusApi.isMock = () => true\r\n this.venusApi.sharedAssets = new MockSharedAssetsApi(this.venusApi)\r\n\r\n // Set up Firebase auth and sign-in for toolbar\r\n this.setupSandboxSignIn()\r\n }\r\n\r\n /**\r\n * Set up global sign-in/sign-out functions and auth state broadcasting.\r\n */\r\n private setupSandboxSignIn(): void {\r\n if (typeof window === 'undefined') return\r\n\r\n // Broadcast auth state to toolbar\r\n const broadcastAuthState = (user: import('firebase/auth').User | null): void => {\r\n window.dispatchEvent(\r\n new CustomEvent('venus-auth-state-changed', {\r\n detail: {\r\n signedIn: user !== null,\r\n user: user\r\n ? {\r\n uid: user.uid,\r\n email: user.email,\r\n displayName: user.displayName,\r\n }\r\n : null,\r\n },\r\n })\r\n )\r\n }\r\n\r\n // Initialize Firebase client and set up auth state listener\r\n // Store promise to fix race condition - sign-in can await this\r\n console.log('[Venus SDK] SandboxHost: Initializing Firebase client...')\r\n this.clientReady = getFirebaseClient().then((client) => {\r\n this.client = client\r\n console.log('[Venus SDK] SandboxHost: Firebase client initialized, currentUser:', client.getCurrentUser()?.uid ?? 'none')\r\n\r\n // Listen for auth state changes and broadcast to toolbar\r\n this.authUnsubscribe = client.onAuthStateChanged(async (user) => {\r\n console.log('[Venus SDK] SandboxHost: Auth state changed, user:', user?.uid ?? 'signed out')\r\n broadcastAuthState(user)\r\n\r\n // IMPORTANT: In sandbox, profileId must match backend (Firebase Auth UID).\r\n // Set _profileData immediately so room membership checks work without races.\r\n if (!user) {\r\n this.venusApi._profileData = undefined\r\n return\r\n }\r\n\r\n // Step 1: Set a placeholder profile immediately with correct id (uid).\r\n // This prevents \"created then removed\" flows where the app checks membership\r\n // against VenusAPI.getProfile().id before the backend profile fetch completes.\r\n this.venusApi._profileData = {\r\n id: user.uid,\r\n username: user.email || user.displayName || user.uid.slice(-8),\r\n name: user.displayName || undefined,\r\n avatarUrl: user.photoURL || null,\r\n isAnonymous: true,\r\n }\r\n\r\n // Step 2: Ensure a backend profile exists (idempotent).\r\n await this.ensureProfileExists(user)\r\n\r\n // Step 3: Fetch backend profile and upgrade _profileData with canonical fields.\r\n try {\r\n const backendProfile = await callRemoteFunction<{\r\n id?: string\r\n username?: string\r\n name?: string\r\n avatarUrl?: string | null\r\n userId?: string\r\n } | null>('getProfile', {})\r\n\r\n if (backendProfile?.id && backendProfile?.username) {\r\n this.venusApi._profileData = {\r\n id: backendProfile.id,\r\n username: backendProfile.username,\r\n name: backendProfile.name || undefined,\r\n avatarUrl: backendProfile.avatarUrl ?? null,\r\n // Best-effort inference: anonymous profiles are created with empty name in this backend\r\n isAnonymous: (backendProfile.name ?? '').trim().length === 0,\r\n }\r\n }\r\n } catch (error) {\r\n console.warn('[Venus SDK] SandboxHost: Failed to fetch backend profile:', error)\r\n }\r\n })\r\n\r\n return client\r\n })\r\n\r\n this.clientReady.catch((error) => {\r\n console.error('[Venus SDK] SandboxHost: Firebase client init failed:', error)\r\n })\r\n\r\n // Listen for toolbar requesting current auth state\r\n const checkAuthHandler = async (): Promise<void> => {\r\n const client = await getFirebaseClient()\r\n broadcastAuthState(client.getCurrentUser())\r\n }\r\n window.addEventListener('venus-check-auth-state', checkAuthHandler)\r\n this.cleanupFunctions.push(() => window.removeEventListener('venus-check-auth-state', checkAuthHandler))\r\n\r\n // Expose global sign-in function for toolbar button\r\n // IMPORTANT: Must call signInWithGoogle synchronously from click to avoid popup blocker.\r\n // If client isn't ready yet, we throw an error rather than awaiting (which would break popup).\r\n window.__VENUS_SANDBOX_SIGN_IN__ = () => {\r\n // Fast path: client already initialized (normal case after page load)\r\n if (this.client) {\r\n return this.client.signInWithGoogle()\r\n .then(() => console.log('[Venus SDK] Google sign-in successful'))\r\n .catch((error) => {\r\n console.error('[Venus SDK] Google sign-in failed:', error)\r\n throw error\r\n })\r\n }\r\n\r\n // Slow path: client not ready yet (user clicked very fast)\r\n // We can't await here without triggering popup blocker, so throw helpful error\r\n if (!this.clientReady) {\r\n throw new Error('[Venus SDK] Firebase not configured.')\r\n }\r\n\r\n console.warn('[Venus SDK] Firebase client still initializing, please wait a moment...')\r\n throw new Error('[Venus SDK] Firebase client still initializing. Please wait a moment and try again.')\r\n }\r\n\r\n // Expose global local sign-in-as function for toolbar button (local emulator mode only)\r\n window.__VENUS_SANDBOX_SIGN_IN_AS__ = (playerId: string) => {\r\n if (this.client) {\r\n return this.client.signInWithLocalPlayer(playerId)\r\n .then(() => console.log('[Venus SDK] Local sign-in successful'))\r\n .catch((error) => {\r\n console.error('[Venus SDK] Local sign-in failed:', error)\r\n throw error\r\n })\r\n }\r\n\r\n if (!this.clientReady) {\r\n throw new Error('[Venus SDK] Firebase not configured.')\r\n }\r\n\r\n console.warn('[Venus SDK] Firebase client still initializing, please wait a moment...')\r\n throw new Error('[Venus SDK] Firebase client still initializing. Please wait a moment and try again.')\r\n }\r\n\r\n // Expose global sign-out function for toolbar button\r\n window.__VENUS_SANDBOX_SIGN_OUT__ = async () => {\r\n try {\r\n const client = await getFirebaseClient()\r\n await client.signOut()\r\n console.log('[Venus SDK] Sign-out successful')\r\n } catch (error) {\r\n console.error('[Venus SDK] Sign-out failed:', error)\r\n throw error\r\n }\r\n }\r\n\r\n // Track global functions for cleanup\r\n this.cleanupFunctions.push(() => {\r\n delete window.__VENUS_SANDBOX_SIGN_IN__\r\n delete window.__VENUS_SANDBOX_SIGN_IN_AS__\r\n delete window.__VENUS_SANDBOX_SIGN_OUT__\r\n })\r\n }\r\n\r\n /**\r\n * Ensure a profile exists for the signed-in user.\r\n * Checks if profile exists first to avoid overwriting existing profiles on staging/dev.\r\n * Only creates a new profile if one doesn't exist.\r\n */\r\n private async ensureProfileExists(user: import('firebase/auth').User): Promise<void> {\r\n try {\r\n console.log('[Venus SDK] Checking if profile exists for user:', user.uid)\r\n\r\n // First, check if profile already exists\r\n try {\r\n const existingProfile = await callRemoteFunction<{ id: string } | null>('getProfile', {})\r\n if (existingProfile?.id) {\r\n console.log('[Venus SDK] Profile already exists:', existingProfile.id)\r\n return\r\n }\r\n } catch (checkError: unknown) {\r\n // 404 or \"not found\" means no profile - continue to create\r\n // Other errors we'll log but still try to create\r\n const err = checkError as { message?: string; status?: number }\r\n if (!err?.message?.includes('not found') && err?.status !== 404) {\r\n console.warn('[Venus SDK] Error checking profile, will attempt creation:', err?.message)\r\n }\r\n }\r\n\r\n // Profile doesn't exist - create one\r\n console.log('[Venus SDK] No profile found, creating one for user:', user.uid)\r\n const shortId = user.uid.slice(-8)\r\n const timestamp = Date.now()\r\n\r\n await callRemoteFunction('createUserProfile', {\r\n name: user.displayName || `Dev User ${shortId}`,\r\n username: `dev_${shortId}_${timestamp}`,\r\n description: 'Auto-created for sandbox development',\r\n isAnonymous: true, // Uses retry logic for username conflicts\r\n onboardingCompleted: true,\r\n })\r\n\r\n console.log('[Venus SDK] Profile created for user:', user.uid)\r\n } catch (error: unknown) {\r\n // Profile creation failed - log but don't throw\r\n const message = error instanceof Error ? error.message : String(error)\r\n console.warn('[Venus SDK] Could not ensure profile exists:', message)\r\n }\r\n }\r\n\r\n initialize(_options?: InitializationOptions): Promise<InitializationContext> {\r\n this._isInitialized = true\r\n\r\n // Populate system data on VenusAPI instance\r\n this.venusApi._profileData = this.profile.getCurrentProfile()\r\n this.venusApi._deviceData = this.system.getDevice()\r\n this.venusApi._environmentData = this.system.getEnvironment()\r\n\r\n this.venusApi._localeData = this.venusApi._mock?.locale || 'en-US'\r\n this.venusApi._languageCodeData = this.venusApi._mock?.languageCode || 'en'\r\n\r\n this.context = {\r\n initializeAsleep: false,\r\n safeArea: this.venusApi._safeAreaData,\r\n }\r\n\r\n return Promise.resolve(this.context)\r\n }\r\n\r\n // ============================================================\r\n // Overlay and UI methods (shared with MockHost)\r\n // ============================================================\r\n\r\n private createOverlay(): MockOverlay {\r\n const overlayContainer = document.createElement('div')\r\n overlayContainer.id = 'venus-sandbox-overlay'\r\n overlayContainer.style.cssText = `\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n pointer-events: none;\r\n z-index: 10000;\r\n `\r\n document.body.appendChild(overlayContainer)\r\n\r\n const menuButton = this.createOverlayButton(\r\n 'close',\r\n 'Menu',\r\n { x: window.innerWidth - 48, y: 16, width: 32, height: 32 },\r\n () => {\r\n this.handleMenuButtonClicked()\r\n },\r\n 'rgba(59, 130, 246, 0.7)',\r\n '#FFFFFF',\r\n )\r\n overlayContainer.appendChild(menuButton)\r\n\r\n const adOverlay = this.setupAdOverlay()\r\n const actionSheet = this.setupActionSheetOverlay()\r\n\r\n const resizeHandler = (): void => {\r\n this.updateOverlayLayout()\r\n }\r\n window.addEventListener('resize', resizeHandler)\r\n this.cleanupFunctions.push(() => window.removeEventListener('resize', resizeHandler))\r\n\r\n return {\r\n container: overlayContainer,\r\n elements: {\r\n menuButton: menuButton,\r\n },\r\n appVisibilityState: 'visible',\r\n actionSheetOverlay: actionSheet,\r\n adOverlay: adOverlay,\r\n showAdOverlay: () => {\r\n return this.showAdOverlay('rewarded')\r\n },\r\n showActionSheet: (items, options) => {\r\n return this.showActionSheetOverlay(items, options)\r\n },\r\n }\r\n }\r\n\r\n private async handleMenuButtonClicked() {\r\n if (this.state === SandboxHostState.PLAYING) {\r\n this.triggerLifecycleEvent(VenusMessageId.PAUSE)\r\n this.state = SandboxHostState.PAUSED\r\n }\r\n\r\n const actionSheetItems: MockActionSheetItem[] = []\r\n\r\n const awakeAction: MockActionSheetItem = { label: '⏰ Awake', id: 'awakeAction' }\r\n const sleepAction: MockActionSheetItem = { label: '💤 Sleep', id: 'sleepAction' }\r\n const quitAction: MockActionSheetItem = { label: '🛑 Quit', id: 'quitAction' }\r\n const playAction: MockActionSheetItem = { label: '▶️ Play', id: 'playAction' }\r\n\r\n if (this.state === SandboxHostState.PAUSED) {\r\n actionSheetItems.push(sleepAction)\r\n } else if (this.state === SandboxHostState.SLEEPING) {\r\n actionSheetItems.push(awakeAction)\r\n }\r\n\r\n if (this.state !== SandboxHostState.TERMINATED) {\r\n actionSheetItems.push(quitAction)\r\n } else if (this.state === SandboxHostState.TERMINATED) {\r\n actionSheetItems.push(playAction)\r\n }\r\n\r\n const action = await this.showActionSheetOverlay(actionSheetItems)\r\n\r\n if (action === awakeAction.id) {\r\n this.tryAwake()\r\n } else if (action === sleepAction.id) {\r\n this.trySleep()\r\n } else if (action === playAction.id) {\r\n this.tryPlay()\r\n } else if (action === quitAction.id) {\r\n this.tryQuit()\r\n } else {\r\n this.tryResume()\r\n }\r\n }\r\n\r\n private tryAwake() {\r\n if (this.state === SandboxHostState.SLEEPING) {\r\n this.triggerLifecycleEvent(VenusMessageId.AWAKE)\r\n this.state = SandboxHostState.PAUSED\r\n }\r\n }\r\n\r\n private trySleep() {\r\n if (this.state === SandboxHostState.PAUSED) {\r\n this.triggerLifecycleEvent(VenusMessageId.SLEEP)\r\n this.state = SandboxHostState.SLEEPING\r\n }\r\n }\r\n\r\n private tryPlay() {\r\n if (this.state === SandboxHostState.TERMINATED) {\r\n this.triggerLifecycleEvent(VenusMessageId.AWAKE)\r\n this.state = SandboxHostState.PAUSED\r\n this.triggerLifecycleEvent(VenusMessageId.RESUME)\r\n this.state = SandboxHostState.PLAYING\r\n }\r\n }\r\n\r\n private tryQuit() {\r\n if (this.state === SandboxHostState.PLAYING) {\r\n this.triggerLifecycleEvent(VenusMessageId.PAUSE)\r\n this.state = SandboxHostState.PAUSED\r\n }\r\n\r\n if (this.state === SandboxHostState.PAUSED) {\r\n this.triggerLifecycleEvent(VenusMessageId.SLEEP)\r\n this.state = SandboxHostState.SLEEPING\r\n }\r\n\r\n if (this.state === SandboxHostState.SLEEPING) {\r\n this.triggerLifecycleEvent(VenusMessageId.QUIT)\r\n this.state = SandboxHostState.TERMINATED\r\n }\r\n }\r\n\r\n private tryResume() {\r\n if (this.state === SandboxHostState.PAUSED) {\r\n this.triggerLifecycleEvent(VenusMessageId.RESUME)\r\n this.state = SandboxHostState.PLAYING\r\n }\r\n }\r\n\r\n private async showAdOverlay(type: 'interstitial' | 'rewarded'): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n const overlay = this._overlay\r\n const adOverlay = overlay.adOverlay\r\n\r\n overlay.adOverlay.innerHTML = ''\r\n\r\n const heading = document.createElement('h1')\r\n heading.style.cssText = `\r\n font-size: 24px;\r\n margin-bottom: 20px;\r\n text-align: center;\r\n `\r\n heading.innerText = type === 'interstitial' ? 'INTERSTITIAL AD' : 'REWARDED VIDEO AD'\r\n overlay.adOverlay.appendChild(heading)\r\n\r\n const content = document.createElement('div')\r\n content.style.cssText = `\r\n width: 300px;\r\n height: 250px;\r\n background-color: #1e40af;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n margin-bottom: 20px;\r\n border-radius: 8px;\r\n `\r\n content.innerText = 'Mock Ad Content'\r\n adOverlay.appendChild(content)\r\n\r\n const timer = document.createElement('p')\r\n timer.style.cssText = `\r\n margin-bottom: 20px;\r\n font-size: 16px;\r\n `\r\n timer.innerText = 'Normally ads would have a timer...'\r\n adOverlay.appendChild(timer)\r\n\r\n const okButton = document.createElement('button')\r\n okButton.style.cssText = `\r\n padding: 10px 40px;\r\n background-color: #2563eb;\r\n color: white;\r\n border: none;\r\n border-radius: 4px;\r\n font-size: 16px;\r\n cursor: pointer;\r\n `\r\n okButton.innerText = 'Close Ad'\r\n adOverlay.appendChild(okButton)\r\n\r\n adOverlay.style.display = 'flex'\r\n\r\n okButton.onclick = () => {\r\n this.hideAdOverlay()\r\n resolve(true)\r\n }\r\n })\r\n }\r\n\r\n private hideAdOverlay() {\r\n const overlay = this._overlay\r\n if (overlay.adOverlay) {\r\n overlay.adOverlay.style.display = 'none'\r\n }\r\n }\r\n\r\n private setupActionSheetOverlay() {\r\n const actionSheetOverlay = document.createElement('div')\r\n actionSheetOverlay.id = 'venus-action-sheet-overlay'\r\n actionSheetOverlay.style.cssText = `\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background-color: rgba(0, 0, 0, 0.5);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 10600;\r\n font-family: sans-serif;\r\n display: none;\r\n `\r\n document.body.appendChild(actionSheetOverlay)\r\n return actionSheetOverlay\r\n }\r\n\r\n private createOverlayButton(\r\n id: string,\r\n text: string,\r\n position: { x: number; y: number; width: number; height: number },\r\n onClick: () => void,\r\n background: string,\r\n color: string,\r\n ) {\r\n const button = document.createElement('button')\r\n button.id = `venus-sandbox-${id}-button`\r\n button.innerText = text\r\n button.style.cssText = `\r\n position: absolute;\r\n left: ${position.x}px;\r\n top: ${position.y}px;\r\n width: ${position.width}px;\r\n min-width: ${position.width}px;\r\n height: ${position.height}px;\r\n background: ${background};\r\n color: ${color};\r\n border: none;\r\n border-radius: 8px;\r\n font-family: sans-serif;\r\n font-weight: bold;\r\n font-size: ${Math.min(position.width, position.height) / 3}px;\r\n cursor: pointer;\r\n pointer-events: auto;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n opacity: 0.9;\r\n transition: opacity 0.2s;\r\n `\r\n button.addEventListener('click', onClick)\r\n button.addEventListener('mouseover', () => {\r\n button.style.opacity = '1'\r\n })\r\n button.addEventListener('mouseout', () => {\r\n button.style.opacity = '0.9'\r\n })\r\n\r\n return button\r\n }\r\n\r\n private updateOverlayLayout() {\r\n const overlay = this._overlay\r\n const menuBtn = overlay.elements.menuButton\r\n\r\n menuBtn.style.left = `${window.innerWidth - 48}px`\r\n menuBtn.style.top = '16px'\r\n menuBtn.style.width = '32px'\r\n menuBtn.style.minWidth = '32px'\r\n menuBtn.style.height = '32px'\r\n }\r\n\r\n private triggerLifecycleEvent(name: string) {\r\n console.log('Trigger Lifecycle Event: ', name)\r\n\r\n if (name === VenusMessageId.PAUSE) {\r\n this._mockLifecyclesApi.triggerPauseCallbacks()\r\n } else if (name === VenusMessageId.RESUME) {\r\n this._mockLifecyclesApi.triggerResumeCallbacks()\r\n } else if (name === VenusMessageId.QUIT) {\r\n this._mockLifecyclesApi.triggerQuitCallbacks()\r\n } else if (name === VenusMessageId.AWAKE) {\r\n this._mockLifecyclesApi.triggerAwakeCallbacks()\r\n } else if (name === VenusMessageId.SLEEP) {\r\n this._mockLifecyclesApi.triggerSleepCallbacks()\r\n }\r\n }\r\n\r\n private setupAdOverlay() {\r\n const adOverlay = document.createElement('div')\r\n adOverlay.id = 'venus-ad-overlay'\r\n adOverlay.style.cssText = `\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background-color: rgba(37, 99, 235, 0.9);\r\n color: white;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 10500;\r\n font-family: sans-serif;\r\n display: none;\r\n `\r\n document.body.appendChild(adOverlay)\r\n return adOverlay\r\n }\r\n\r\n private showActionSheetOverlay(\r\n items: MockActionSheetItem[],\r\n options?: MockActionSheetOptions,\r\n ): Promise<string | number | null> {\r\n return new Promise((resolve) => {\r\n const overlay = this._overlay\r\n overlay.actionSheetOverlay.innerHTML = ''\r\n overlay.actionSheetOverlay.style.display = 'flex'\r\n\r\n const actionSheet = document.createElement('div')\r\n actionSheet.className = 'venus-action-sheet'\r\n actionSheet.style.cssText = `\r\n background-color: white;\r\n border-radius: 8px;\r\n width: 80%;\r\n max-width: 400px;\r\n max-height: 80%;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n color: black;\r\n `\r\n\r\n if (options?.title) {\r\n const titleContainer = document.createElement('div')\r\n titleContainer.style.cssText = `\r\n padding: 16px;\r\n border-bottom: 1px solid #eaeaea;\r\n font-weight: bold;\r\n font-size: 18px;\r\n text-align: center;\r\n color: black;\r\n `\r\n titleContainer.innerText = options.title\r\n actionSheet.appendChild(titleContainer)\r\n }\r\n\r\n if (options?.message) {\r\n const messageContainer = document.createElement('div')\r\n messageContainer.style.cssText = `\r\n padding: 8px 16px;\r\n color: #666;\r\n font-size: 14px;\r\n text-align: center;\r\n `\r\n messageContainer.innerText = options.message\r\n actionSheet.appendChild(messageContainer)\r\n }\r\n\r\n const optionsContainer = document.createElement('div')\r\n optionsContainer.style.cssText = `\r\n overflow-y: auto;\r\n max-height: 300px;\r\n `\r\n\r\n items.forEach((item, index) => {\r\n const optionItem = document.createElement('div')\r\n optionItem.style.cssText = `\r\n padding: 12px 16px;\r\n border-bottom: 1px solid #eaeaea;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n transition: background-color 0.2s;\r\n color: black;\r\n `\r\n\r\n optionItem.addEventListener('mouseover', () => {\r\n optionItem.style.backgroundColor = '#f5f5f5'\r\n })\r\n\r\n optionItem.addEventListener('mouseout', () => {\r\n optionItem.style.backgroundColor = 'white'\r\n })\r\n\r\n if (item.icon) {\r\n const iconSpan = document.createElement('span')\r\n iconSpan.style.cssText = `\r\n margin-right: 12px;\r\n font-size: 16px;\r\n `\r\n iconSpan.innerText = item.icon\r\n optionItem.appendChild(iconSpan)\r\n }\r\n\r\n const labelSpan = document.createElement('span')\r\n labelSpan.style.cssText = `color: black;`\r\n labelSpan.innerText = item.label\r\n optionItem.appendChild(labelSpan)\r\n\r\n optionItem.addEventListener('click', () => {\r\n this.hideActionSheetOverlay()\r\n const optionId = item.id !== undefined ? item.id : index\r\n resolve(optionId)\r\n })\r\n\r\n optionsContainer.appendChild(optionItem)\r\n })\r\n\r\n actionSheet.appendChild(optionsContainer)\r\n\r\n if (!options?.disableCancel) {\r\n const cancelButton = document.createElement('div')\r\n cancelButton.style.cssText = `\r\n padding: 14px 16px;\r\n text-align: center;\r\n font-weight: bold;\r\n cursor: pointer;\r\n color: #3b82f6;\r\n border-top: 1px solid #eaeaea;\r\n `\r\n cancelButton.innerText = options?.cancelButtonText || 'Cancel'\r\n cancelButton.addEventListener('click', () => {\r\n this.hideActionSheetOverlay()\r\n resolve(null)\r\n })\r\n\r\n actionSheet.appendChild(cancelButton)\r\n }\r\n\r\n if (!options?.disableCancel) {\r\n const closeButton = document.createElement('div')\r\n closeButton.style.cssText = `\r\n position: absolute;\r\n top: 8px;\r\n right: 8px;\r\n width: 24px;\r\n height: 24px;\r\n border-radius: 12px;\r\n background-color: rgba(0,0,0,0.1);\r\n color: #666;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n font-size: 14px;\r\n `\r\n closeButton.innerText = '✕'\r\n closeButton.addEventListener('click', () => {\r\n this.hideActionSheetOverlay()\r\n resolve(null)\r\n })\r\n\r\n actionSheet.appendChild(closeButton)\r\n overlay.actionSheetOverlay.appendChild(actionSheet)\r\n }\r\n })\r\n }\r\n\r\n private hideActionSheetOverlay() {\r\n const overlay = this._overlay\r\n if (overlay.actionSheetOverlay) {\r\n overlay.actionSheetOverlay.style.display = 'none'\r\n }\r\n }\r\n\r\n /**\r\n * Clean up all resources held by SandboxHost.\r\n * Call this when the host is no longer needed to prevent memory leaks.\r\n */\r\n destroy(): void {\r\n // Unsubscribe from Firebase auth state changes\r\n if (this.authUnsubscribe) {\r\n this.authUnsubscribe()\r\n this.authUnsubscribe = null\r\n }\r\n\r\n // Run all cleanup functions (removes event listeners, global functions)\r\n for (const cleanup of this.cleanupFunctions) {\r\n try {\r\n cleanup()\r\n } catch (e) {\r\n console.warn('[Venus SDK] Cleanup error:', e)\r\n }\r\n }\r\n this.cleanupFunctions.length = 0\r\n\r\n // Clean up simulation subscriptions\r\n if (this.simulation && 'destroy' in this.simulation) {\r\n (this.simulation as { destroy(): void }).destroy()\r\n }\r\n\r\n // Clean up rooms subscriptions\r\n if (this.rooms && 'destroy' in this.rooms) {\r\n (this.rooms as { destroy(): void }).destroy()\r\n }\r\n\r\n // Remove DOM elements\r\n if (typeof document !== 'undefined') {\r\n const overlay = this._overlay\r\n if (overlay.container?.parentNode) {\r\n overlay.container.parentNode.removeChild(overlay.container)\r\n }\r\n if (overlay.adOverlay?.parentNode) {\r\n overlay.adOverlay.parentNode.removeChild(overlay.adOverlay)\r\n }\r\n if (overlay.actionSheetOverlay?.parentNode) {\r\n overlay.actionSheetOverlay.parentNode.removeChild(overlay.actionSheetOverlay)\r\n }\r\n }\r\n\r\n // Clear references\r\n this.client = null\r\n this.clientReady = null\r\n }\r\n}\r\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RpcAdsApi, RpcAnalyticsApi, RpcStorageApi, RpcAvatarApi, RpcNavigationApi, RpcNotificationsApi, RpcPopupsApi, HostProfileApi, HostDeviceApi, HostEnvironmentApi, HostSystemApi, HostCdnApi, HostTimeApi, RpcAiApi, RpcHapticsApi, RpcFeaturesApi, RpcLifecycleApi, RpcRoomsApi, RpcLoggingApi, RpcIapApi, RpcPreloaderApi, RpcSharedAssetsApi, initializeRoomsApi, isSandboxEnabled, MockAdsApi, MockLifecycleApi, MockAnalyticsApi, createMockStorageApi, MockAvatarApi, MockNavigationApi, MockNotificationsApi, MockPopupsApi, MockProfileApi, MockDeviceApi, MockEnvironmentApi, MockSystemApi, MockCdnApi, MockTimeApi, MockAiApi, MockHapticsApi, MockFeaturesApi, MockLoggingApi, MockIapApi, MockSocialApi, MockPreloaderApi, MockSharedAssetsApi } from './chunk-
|
|
1
|
+
import { RpcAdsApi, RpcAnalyticsApi, RpcStorageApi, RpcAvatarApi, RpcNavigationApi, RpcNotificationsApi, RpcPopupsApi, HostProfileApi, HostDeviceApi, HostEnvironmentApi, HostSystemApi, HostCdnApi, HostTimeApi, RpcAiApi, RpcHapticsApi, RpcFeaturesApi, RpcLifecycleApi, RpcRoomsApi, RpcLoggingApi, RpcIapApi, RpcPreloaderApi, RpcSharedAssetsApi, initializeRoomsApi, isSandboxEnabled, MockAdsApi, MockLifecycleApi, MockAnalyticsApi, createMockStorageApi, MockAvatarApi, MockNavigationApi, MockNotificationsApi, MockPopupsApi, MockProfileApi, MockDeviceApi, MockEnvironmentApi, MockSystemApi, MockCdnApi, MockTimeApi, MockAiApi, MockHapticsApi, MockFeaturesApi, MockLoggingApi, MockIapApi, MockSocialApi, MockPreloaderApi, MockSharedAssetsApi } from './chunk-Z72SXERI.js';
|
|
2
2
|
|
|
3
3
|
// src/utils/idGenerator.ts
|
|
4
4
|
function generateId() {
|
|
@@ -462,7 +462,7 @@ function initializeSimulation(venusApi, host) {
|
|
|
462
462
|
}
|
|
463
463
|
|
|
464
464
|
// src/version.ts
|
|
465
|
-
var SDK_VERSION = "3.4.3-beta.
|
|
465
|
+
var SDK_VERSION = "3.4.3-beta.4";
|
|
466
466
|
|
|
467
467
|
// src/leaderboard/utils.ts
|
|
468
468
|
var HASH_ALGORITHM_WEB_CRYPTO = "SHA-256";
|
|
@@ -1868,7 +1868,7 @@ var MockHost = class {
|
|
|
1868
1868
|
async function createHost(venusApi, isMock) {
|
|
1869
1869
|
if (isMock) {
|
|
1870
1870
|
if (import.meta.env?.DEV && isSandboxEnabled()) {
|
|
1871
|
-
const { SandboxHost } = await import('./SandboxHost-
|
|
1871
|
+
const { SandboxHost } = await import('./SandboxHost-2Q5PK7LP.js');
|
|
1872
1872
|
return new SandboxHost(venusApi);
|
|
1873
1873
|
}
|
|
1874
1874
|
return new MockHost(venusApi);
|
|
@@ -1886,5 +1886,5 @@ function initializeSocial(venusApi, host) {
|
|
|
1886
1886
|
}
|
|
1887
1887
|
|
|
1888
1888
|
export { HASH_ALGORITHM_NODE, HASH_ALGORITHM_WEB_CRYPTO, MockLeaderboardApi, RemoteHost, RpcClient, RpcLeaderboardApi, RpcSimulationApi, RpcSocialApi, SDK_VERSION, computeScoreHash, createHost, initializeLeaderboard, initializeSimulation, initializeSocial };
|
|
1889
|
-
//# sourceMappingURL=chunk-
|
|
1890
|
-
//# sourceMappingURL=chunk-
|
|
1889
|
+
//# sourceMappingURL=chunk-LPDIY3ZJ.js.map
|
|
1890
|
+
//# sourceMappingURL=chunk-LPDIY3ZJ.js.map
|