@series-inc/venus-sdk 3.4.2 → 3.4.3-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/VenusMessageId.ts","../src/ads/RpcAdsApi.ts","../src/ads/MockAdsApi.ts","../src/ads/index.ts","../src/ai/RpcAiApi.ts","../src/ai/MockAiApi.ts","../src/ai/index.ts","../src/analytics/MockAnalyticsApi.ts","../src/analytics/RpcAnalyticsApi.ts","../src/analytics/index.ts","../src/avatar3d/MockAvatarApi.ts","../src/avatar3d/RpcAvatarApi.ts","../src/avatar3d/index.ts","../src/cdn/HostCdnApi.ts","../src/cdn/MockCdnApi.ts","../src/cdn/index.ts","../src/device/HostDeviceApi.ts","../src/device/MockDeviceApi.ts","../src/environment/HostEnvironmentApi.ts","../src/environment/MockEnvironmentApi.ts","../src/system/HostSystemApi.ts","../src/system/MockSystemApi.ts","../src/system/index.ts","../src/features/RpcFeaturesApi.ts","../src/features/MockFeaturesApi.ts","../src/features/index.ts","../src/haptics/HapticsApi.ts","../src/haptics/RpcHapticsApi.ts","../src/haptics/MockHapticsApi.ts","../src/haptics/index.ts","../src/iap/RpcIapApi.ts","../src/iap/MockCurrencyIcon.ts","../src/iap/MockIapApi.ts","../src/iap/index.ts","../src/lifecycles/MockLifecycleApi.ts","../src/lifecycles/RpcLifecycleApi.ts","../src/lifecycles/index.ts","../src/logging/MockLoggingApi.ts","../src/logging/RpcLoggingApi.ts","../src/logging/index.ts","../src/navigation/MockNavigationApi.ts","../src/navigation/RpcNavigationApi.ts","../src/navigation/index.ts","../src/notifications/MockNotificationsApi.ts","../src/notifications/RpcNotificationsApi.ts","../src/notifications/index.ts","../src/popups/RpcPopupsApi.ts","../src/popups/MockPopupsApi.ts","../src/popups/index.ts","../src/profile/HostProfileApi.ts","../src/profile/MockProfileApi.ts","../src/profile/index.ts","../src/rooms/VenusRoom.ts","../src/rooms/setupRoomNotifications.ts","../src/rooms/RpcRoomsApi.ts","../src/rooms/index.ts","../src/storage/MockStorageApi.ts","../src/storage/RpcStorageApi.ts","../src/storage/index.ts","../src/time/utils.ts","../src/time/HostTimeApi.ts","../src/time/MockTimeApi.ts","../src/time/index.ts","../src/shared-assets/base64Utils.ts","../src/shared-assets/RpcSharedAssetsApi.ts","../src/shared-assets/MockSharedAssetsApi.ts","../src/shared-assets/embeddedLibrariesManifest.ts","../src/game-preloader/MockPreloaderApi.ts","../src/game-preloader/RpcPreloaderApi.ts","../src/game-preloader/index.ts","../src/social/MockSocialApi.ts","../src/config/sandbox.ts"],"names":["VenusMessageId","selectedAsset","HapticFeedbackStyle"],"mappings":"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","file":"chunk-Q7SNANYR.js","sourcesContent":["export enum VenusMessageId {\r\n H5_RESPONSE = 'H5_RESPONSE',\r\n\r\n // Ads\r\n IS_REWARDED_AD_READY = 'H5_IS_REWARDED_AD_READY',\r\n SHOW_REWARDED_AD = 'H5_SHOW_REWARDED_AD',\r\n\r\n // Analytics\r\n LOG_ANALYTICS_EVENT = 'H5_LOG_ANALYTICS_EVENT',\r\n TRACK_FUNNEL_STEP = 'H5_TRACK_FUNNEL_STEP',\r\n\r\n // Device Cache operations (renamed from Local Storage)\r\n DEVICE_CACHE_GET_ITEM = 'H5_DEVICE_CACHE_GET_ITEM',\r\n DEVICE_CACHE_SET_ITEM = 'H5_DEVICE_CACHE_SET_ITEM',\r\n DEVICE_CACHE_REMOVE_ITEM = 'H5_DEVICE_CACHE_REMOVE_ITEM',\r\n DEVICE_CACHE_CLEAR = 'H5_DEVICE_CACHE_CLEAR',\r\n DEVICE_CACHE_KEY = 'H5_DEVICE_CACHE_KEY',\r\n DEVICE_CACHE_LENGTH = 'H5_DEVICE_CACHE_LENGTH',\r\n\r\n // App Storage operations (NEW - cloud-synced)\r\n APP_STORAGE_GET_ITEM = 'H5_APP_STORAGE_GET_ITEM',\r\n APP_STORAGE_SET_ITEM = 'H5_APP_STORAGE_SET_ITEM',\r\n APP_STORAGE_REMOVE_ITEM = 'H5_APP_STORAGE_REMOVE_ITEM',\r\n APP_STORAGE_CLEAR = 'H5_APP_STORAGE_CLEAR',\r\n APP_STORAGE_KEY = 'H5_APP_STORAGE_KEY',\r\n APP_STORAGE_LENGTH = 'H5_APP_STORAGE_LENGTH',\r\n APP_STORAGE_GET_ALL_ITEMS = 'H5_APP_STORAGE_GET_ALL_ITEMS',\r\n APP_STORAGE_SET_MULTIPLE_ITEMS = 'H5_APP_STORAGE_SET_MULTIPLE_ITEMS',\r\n APP_STORAGE_REMOVE_MULTIPLE_ITEMS = 'H5_APP_STORAGE_REMOVE_MULTIPLE_ITEMS',\r\n\r\n // Global Storage operations (NEW - cloud-synced, cross-app)\r\n GLOBAL_STORAGE_GET_ITEM = 'H5_GLOBAL_STORAGE_GET_ITEM',\r\n GLOBAL_STORAGE_SET_ITEM = 'H5_GLOBAL_STORAGE_SET_ITEM',\r\n GLOBAL_STORAGE_REMOVE_ITEM = 'H5_GLOBAL_STORAGE_REMOVE_ITEM',\r\n GLOBAL_STORAGE_CLEAR = 'H5_GLOBAL_STORAGE_CLEAR',\r\n GLOBAL_STORAGE_KEY = 'H5_GLOBAL_STORAGE_KEY',\r\n GLOBAL_STORAGE_LENGTH = 'H5_GLOBAL_STORAGE_LENGTH',\r\n GLOBAL_STORAGE_GET_ALL_ITEMS = 'H5_GLOBAL_STORAGE_GET_ALL_ITEMS',\r\n GLOBAL_STORAGE_SET_MULTIPLE_ITEMS = 'H5_GLOBAL_STORAGE_SET_MULTIPLE_ITEMS',\r\n GLOBAL_STORAGE_REMOVE_MULTIPLE_ITEMS = 'H5_GLOBAL_STORAGE_REMOVE_MULTIPLE_ITEMS',\r\n\r\n // Avatar3d operations\r\n AVATAR3D_LOAD = 'H5_AVATAR3D_LOAD',\r\n AVATAR3D_SAVE = 'H5_AVATAR3D_SAVE',\r\n AVATAR3D_DELETE = 'H5_AVATAR3D_DELETE',\r\n\r\n // Stack navigation operations\r\n H5_STACK_PUSH_REQUEST = 'H5_STACK_PUSH_REQUEST',\r\n H5_STACK_POP_REQUEST = 'H5_STACK_POP_REQUEST',\r\n\r\n // Local notifications\r\n SCHEDULE_LOCAL_NOTIFICATION = 'H5_SCHEDULE_LOCAL_NOTIFICATION',\r\n CANCEL_LOCAL_NOTIFICATION = 'H5_CANCEL_LOCAL_NOTIFICATION',\r\n GET_ALL_SCHEDULED_LOCAL_NOTIFICATIONS = 'H5_GET_ALL_SCHEDULED_LOCAL_NOTIFICATIONS',\r\n IS_LOCAL_NOTIFICATIONS_ENABLED = 'H5_IS_LOCAL_NOTIFICATIONS_ENABLED',\r\n SET_LOCAL_NOTIFICATIONS_ENABLED = 'H5_SET_LOCAL_NOTIFICATIONS_ENABLED',\r\n\r\n // UI requests\r\n TOAST = 'H5_TOAST',\r\n\r\n // Utils operations\r\n REQUEST_SERVER_TIME = 'H5_REQUEST_SERVER_TIME',\r\n\r\n // Social distribution\r\n SHARE_LINK = 'H5_SHARE_LINK',\r\n CREATE_SHARE_QRCODE = 'H5_CREATE_SHARE_QRCODE',\r\n\r\n // AI requests\r\n AI_CHAT_COMPLETION = 'H5_AI_CHAT_COMPLETION',\r\n AI_GET_AVAILABLE_MODELS = 'H5_AI_GET_AVAILABLE_MODELS',\r\n\r\n // Haptic feedback\r\n TRIGGER_HAPTIC = 'H5_TRIGGER_HAPTIC',\r\n\r\n DEBUG = 'H5_DEBUG',\r\n\r\n // IAP\r\n // these are probably not going to be the endpoints\r\n H5_IAP_GET_WALLET = 'H5_IAP_GET_WALLET',\r\n H5_IAP_SPEND_CURRENCY = 'H5_IAP_SPEND_CURRENCY',\r\n SHOW_INTERSTITIAL_AD = 'H5_SHOW_INTERSTITIAL_AD',\r\n\r\n // IAP Notifications (from parent to H5)\r\n IAP_SPEND_CURRENCY_COMPLETE = 'IAP_SPEND_CURRENCY_COMPLETE',\r\n IAP_WALLET_UPDATE = 'IAP_WALLET_UPDATE',\r\n\r\n // Lifecycle messages\r\n READY = 'READY',\r\n INIT_SDK = 'INITIALIZE_SDK',\r\n PAUSE = 'PAUSE',\r\n RESUME = 'RESUME',\r\n AWAKE = 'AWAKE',\r\n SLEEP = 'SLEEP',\r\n QUIT = 'QUIT',\r\n\r\n // ab testing\r\n /** given the experiment name, returns the entire experiment object as configured for the current user */\r\n GET_EXPERIMENT = 'H5_GET_EXPERIMENT',\r\n /** returns the boolean value for a feature flag using the statsig parameter store, or the feature flags constants as fallback */\r\n GET_FEATURE_FLAG = 'H5_GET_FEATURE_FLAG',\r\n /** returns the gate value (boolean) for a given feature gate for the current user */\r\n GET_FEATURE_GATE = 'H5_GET_FEATURE_GATE',\r\n\r\n // Simulations\r\n\r\n // Recipe\r\n H5_SIMULATION_EXECUTE_RECIPE = 'H5_SIMULATION_EXECUTE_RECIPE',\r\n H5_SIMULATION_GET_ACTIVE_RUNS = 'H5_SIMULATION_GET_ACTIVE_RUNS',\r\n H5_SIMULATION_COLLECT_RECIPE = 'H5_SIMULATION_COLLECT_RECIPE',\r\n H5_SIMULATION_EXECUTE_SCOPED_RECIPE = 'H5_SIMULATION_EXECUTE_SCOPED_RECIPE',\r\n H5_SIMULATION_GET_AVAILABLE_RECIPES = 'H5_SIMULATION_GET_AVAILABLE_RECIPES',\r\n H5_SIMULATION_GET_RECIPE_REQUIREMENTS = 'H5_SIMULATION_GET_RECIPE_REQUIREMENTS',\r\n H5_SIMULATION_GET_BATCH_RECIPE_REQUIREMENTS = 'H5_SIMULATION_GET_BATCH_RECIPE_REQUIREMENTS',\r\n H5_SIMULATION_TRIGGER_RECIPE_CHAIN = 'H5_SIMULATION_TRIGGER_RECIPE_CHAIN',\r\n\r\n H5_SIMULATION_RESOLVE_VALUE = 'H5_SIMULATION_RESOLVE_VALUE',\r\n H5_SIMULATION_GET_ENTITY_METADATA = 'H5_SIMULATION_GET_ENTITY_METADATA',\r\n\r\n H5_SIMULATION_GET_STATE = 'H5_SIMULATION_GET_STATE',\r\n H5_SIMULATION_GET_CONFIG = 'H5_SIMULATION_GET_CONFIG',\r\n\r\n H5_SIMULATION_GET_CONTAINERS = 'H5_SIMULATION_GET_CONTAINERS',\r\n H5_SIMULATION_GET_ASSIGNMENTS = 'H5_SIMULATION_GET_ASSIGNMENTS',\r\n H5_SIMULATION_ASSIGN_ITEM = 'H5_SIMULATION_ASSIGN_ITEM',\r\n H5_SIMULATION_REMOVE_ITEM = 'H5_SIMULATION_REMOVE_ITEM',\r\n H5_SIMULATION_CALCULATE_POWER_PREVIEW = 'H5_SIMULATION_CALCULATE_POWER_PREVIEW',\r\n H5_SIMULATION_GET_AVAILABLE_ITEMS = 'H5_SIMULATION_GET_AVAILABLE_ITEMS',\r\n\r\n H5_SIMULATION_VALIDATE_ASSIGNMENT = 'H5_SIMULATION_VALIDATE_ASSIGNMENT',\r\n H5_SIMULATION_BATCH_OPERATIONS = 'H5_SIMULATION_BATCH_OPERATIONS',\r\n H5_SIMULATION_SUBSCRIBE = 'H5_SIMULATION_SUBSCRIBE',\r\n H5_SIMULATION_UNSUBSCRIBE = 'H5_SIMULATION_UNSUBSCRIBE',\r\n H5_SIMULATION_UPDATE = 'H5_SIMULATION_UPDATE',\r\n\r\n // Leaderboard operations\r\n H5_LEADERBOARD_CREATE_SCORE_TOKEN = 'H5_LEADERBOARD_CREATE_SCORE_TOKEN',\r\n H5_LEADERBOARD_SUBMIT_SCORE = 'H5_LEADERBOARD_SUBMIT_SCORE',\r\n H5_LEADERBOARD_GET_PAGED_SCORES = 'H5_LEADERBOARD_GET_PAGED_SCORES',\r\n H5_LEADERBOARD_GET_PODIUM_SCORES = 'H5_LEADERBOARD_GET_PODIUM_SCORES',\r\n H5_LEADERBOARD_GET_MY_RANK = 'H5_LEADERBOARD_GET_MY_RANK',\r\n\r\n // H5 Room operations (Stage 1)\r\n H5_ROOM_CREATE = 'H5_ROOM_CREATE',\r\n H5_ROOM_JOIN = 'H5_ROOM_JOIN',\r\n H5_ROOM_JOIN_OR_CREATE = 'H5_ROOM_JOIN_OR_CREATE',\r\n H5_ROOM_LEAVE = 'H5_ROOM_LEAVE',\r\n H5_ROOM_UPDATE_DATA = 'H5_ROOM_UPDATE_DATA',\r\n H5_ROOM_GET_DATA = 'H5_ROOM_GET_DATA',\r\n H5_ROOM_SUBSCRIBE = 'H5_ROOM_SUBSCRIBE',\r\n H5_ROOM_UNSUBSCRIBE = 'H5_ROOM_UNSUBSCRIBE',\r\n H5_ROOM_SEND_MESSAGE = 'H5_ROOM_SEND_MESSAGE',\r\n H5_ROOM_GET_MESSAGES = 'H5_ROOM_GET_MESSAGES',\r\n H5_ROOM_LIST_ROOMS = 'H5_ROOM_LIST_ROOMS',\r\n H5_ROOM_LIST_PUBLIC = 'H5_ROOM_LIST_PUBLIC',\r\n H5_ROOM_SEARCH = 'H5_ROOM_SEARCH',\r\n H5_ROOM_JOIN_BY_CODE = 'H5_ROOM_JOIN_BY_CODE',\r\n H5_ROOM_GET_USER_ROOMS = 'H5_ROOM_GET_USER_ROOMS',\r\n H5_ROOM_GET_PLAYERS = 'H5_ROOM_GET_PLAYERS',\r\n H5_ROOM_UPDATE_PLAYER_DATA = 'H5_ROOM_UPDATE_PLAYER_DATA',\r\n H5_ROOM_START_GAME = 'H5_ROOM_START_GAME',\r\n H5_ROOM_PROPOSE_MOVE = 'h5:room:proposeMove',\r\n H5_ROOM_END_GAME = 'H5_ROOM_END_GAME',\r\n H5_ROOM_KICK_PLAYER = 'H5_ROOM_KICK_PLAYER',\r\n H5_ROOM_PROMOTE_TO_SPECTATOR = 'H5_ROOM_PROMOTE_TO_SPECTATOR',\r\n\r\n // Embedded Assets\r\n H5_LOAD_EMBEDDED_ASSET = 'H5_LOAD_EMBEDDED_ASSET',\r\n\r\n //Preloader operations\r\n H5_SHOW_LOAD_SCREEN = 'H5_SHOW_LOAD_SCREEN',\r\n H5_HIDE_LOAD_SCREEN = 'H5_HIDE_LOAD_SCREEN',\r\n H5_SET_LOADER_TEXT = 'H5_SET_LOADER_TEXT',\r\n H5_SET_LOADER_PROGRESS = 'H5_SET_LOADER_PROGRESS',\r\n H5_IAP_OPEN_STORE = \"H5_IAP_OPEN_STORE\",\r\n H5_IAP_GET_CURRENCY_ICON = \"H5_IAP_GET_CURRENCY_ICON\",\r\n}\r\n","import { AdsApi, ShowInterstitialAdOptions, ShowRewardedAdOptions } from './AdsApi.ts'\r\nimport { RpcClient } from '../rpc'\r\nimport { VenusMessageId } from '../VenusMessageId.ts'\r\n\r\nexport class RpcAdsApi implements AdsApi {\r\n private readonly rpcClient: RpcClient\r\n\r\n constructor(rpcClient: RpcClient) {\r\n this.rpcClient = rpcClient\r\n }\r\n\r\n async showInterstitialAd(options?: ShowInterstitialAdOptions): Promise<boolean> {\r\n console.log(`[Venus SDK] [RpcAdsApi] showInterstitialAd`)\r\n const response = await this.rpcClient.call<ShowInterstitialAdResponse>(\r\n VenusMessageId.SHOW_INTERSTITIAL_AD,\r\n options || {},\r\n -1,\r\n )\r\n return response.shown\r\n }\r\n\r\n async isRewardedAdReadyAsync(): Promise<boolean> {\r\n console.log(`[Venus SDK] [RpcAdsApi] isRewardedAdReadyAsync`)\r\n const response = await this.rpcClient.call<IsRewardedAdReadyResponse>(\r\n VenusMessageId.IS_REWARDED_AD_READY,\r\n )\r\n return response.ready\r\n }\r\n\r\n async showRewardedAdAsync(options?: ShowRewardedAdOptions): Promise<boolean> {\r\n console.log('[Venus SDK] [RpcAdsApi] showRewardedAdAsync')\r\n const result = await this.rpcClient.call<ShowRewardedAdResponse>(\r\n VenusMessageId.SHOW_REWARDED_AD,\r\n options || {},\r\n -1,\r\n )\r\n const resultAsString = JSON.stringify(result, null, 2)\r\n console.log(\r\n `[Venus SDK] [RpcAdsApi] rewarded ad shown with result as JSON:\\n${resultAsString}`,\r\n )\r\n return result.rewardEarned\r\n }\r\n}\r\n\r\ninterface IsRewardedAdReadyResponse {\r\n ready: boolean\r\n adType: 'rewarded'\r\n}\r\n\r\ninterface ShowInterstitialAdResponse {\r\n shown: boolean\r\n adType: 'interstitial'\r\n}\r\n\r\ninterface ShowRewardedAdResponse {\r\n shown: boolean\r\n adType: string\r\n rewardEarned: boolean\r\n}\r\n","import { AdsApi, ShowInterstitialAdOptions, ShowRewardedAdOptions } from './AdsApi.ts'\r\nimport { createMockDelay, MOCK_DELAYS } from '../venus-api/systems/core'\r\nimport { MockOverlay } from '../MockOverlay'\r\n\r\nexport class MockAdsApi implements AdsApi {\r\n private mockOverlay: MockOverlay\r\n\r\n constructor(mockOverlay: MockOverlay) {\r\n this.mockOverlay = mockOverlay\r\n }\r\n\r\n async isRewardedAdReadyAsync(): Promise<boolean> {\r\n this.log('[MockAdsApi] isRewardedAdReadyAsync called')\r\n await createMockDelay(MOCK_DELAYS.short)\r\n return true\r\n }\r\n\r\n async showRewardedAdAsync(options?: ShowRewardedAdOptions): Promise<boolean> {\r\n this.log('[MockAdsApi] showRewardedAdAsync called')\r\n await this.mockOverlay.showAdOverlay(options)\r\n this.log('[MockAdsApi] Rewarded ad completed')\r\n return true\r\n }\r\n\r\n async showInterstitialAd(options?: ShowInterstitialAdOptions): Promise<boolean> {\r\n this.log(`[MockAdsApi] showInterstitialAd`)\r\n await this.mockOverlay.showAdOverlay(options)\r\n this.log('[MockAdsApi] interstitial ad shown')\r\n return true\r\n }\r\n\r\n private log(message: string, ...args: any[]): void {\r\n console.log(`[Venus SDK] ${message}`, ...args)\r\n }\r\n}\r\n","import { VenusAPI } from '../venus-api/types.ts'\r\nimport { Host } from '../Host.ts'\r\n\r\nexport * from './AdsApi.ts'\r\nexport * from './RpcAdsApi'\r\nexport * from './MockAdsApi'\r\n\r\n// Initialize ads functionality on a VenusAPI instance\r\nexport function initializeAds(venusApiInstance: VenusAPI, host: Host) {\r\n // Legacy\r\n venusApiInstance.isRewardedAdReadyAsync =\r\n host.ads.isRewardedAdReadyAsync.bind(host.ads)\r\n venusApiInstance.showRewardedAdAsync = host.ads.showRewardedAdAsync.bind(\r\n host.ads,\r\n )\r\n\r\n venusApiInstance.ads = host.ads\r\n}\r\n","import { AiApi, AiChatCompletionRequest, AiChatCompletionData } from './AiApi'\r\nimport { RpcClient } from '../rpc'\r\nimport { VenusMessageId } from '../VenusMessageId'\r\n\r\nexport class RpcAiApi implements AiApi {\r\n private readonly rpcClient: RpcClient\r\n\r\n constructor(rpcClient: RpcClient) {\r\n this.rpcClient = rpcClient\r\n }\r\n\r\n async requestChatCompletionAsync(\r\n request: AiChatCompletionRequest,\r\n ): Promise<AiChatCompletionData> {\r\n const response = await this.rpcClient.call<AiChatCompletionData>(\r\n VenusMessageId.AI_CHAT_COMPLETION,\r\n {\r\n request: (() => {\r\n const { apiKey, ...requestWithoutApiKey } = request\r\n return requestWithoutApiKey\r\n })(),\r\n },\r\n -1\r\n )\r\n // Return direct response data\r\n return response\r\n }\r\n\r\n async getAvailableCompletionModels(): Promise<Array<string>> {\r\n const response = await this.rpcClient.call<Array<string>>(\r\n VenusMessageId.AI_GET_AVAILABLE_MODELS,\r\n {},\r\n -1\r\n )\r\n return response\r\n }\r\n}\r\n","import { AiApi, AiChatCompletionData, AiChatCompletionRequest } from './AiApi'\r\n\r\nexport class MockAiApi implements AiApi {\r\n async requestChatCompletionAsync(\r\n request: AiChatCompletionRequest,\r\n ): Promise<AiChatCompletionData> {\r\n const { apiKey, ...requestBody } = request\r\n \r\n if (!apiKey) {\r\n throw new Error('An API key is required for a chat completion request when developing locally.')\r\n }\r\n\r\n const response = await fetch('https://series.ullm.rho.live/api/v1/completions', {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Authorization': `Bearer ${apiKey}`,\r\n },\r\n body: JSON.stringify(requestBody),\r\n })\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`)\r\n }\r\n\r\n const data: AiChatCompletionData = await response.json()\r\n return data\r\n }\r\n\r\n async getAvailableCompletionModels(): Promise<Array<string>> {\r\n const response = await fetch('https://series.ullm.rho.live/api/v1/models', {\r\n method: 'GET',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n })\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`)\r\n }\r\n\r\n const data: Array<string> = await response.json()\r\n return data\r\n }\r\n}\r\n","import { Host } from '../Host'\r\nimport { VenusAPI } from '../venus-api/types'\r\nimport { AiChatCompletionRequest } from './AiApi'\r\n\r\nexport * from './AiApi'\r\nexport * from './RpcAiApi'\r\nexport * from './MockAiApi'\r\n\r\nexport function initializeAi(venusApi: VenusAPI, host: Host) {\r\n venusApi.ai = host.ai\r\n}\r\n","import { AnalyticsApi } from './AnalyticsApi.ts'\r\nimport { createMockDelay, MOCK_DELAYS } from '../venus-api/systems/core'\r\n\r\nexport class MockAnalyticsApi implements AnalyticsApi {\r\n async recordCustomEvent(\r\n eventName: string,\r\n payload: Record<string, any>,\r\n ): Promise<void> {\r\n console.log(\r\n `[Venus Mock] Logging event with ${eventName}, params ${payload}`,\r\n )\r\n await createMockDelay(MOCK_DELAYS.short)\r\n }\r\n\r\n async trackFunnelStep(stepNumber: number, stepName: string, funnelName?: string): Promise<void> {\r\n console.log(`[Venus Mock] tracking funnel step ${stepName} (step ${stepNumber}) for funnel ${funnelName ?? 'game'}`);\r\n await createMockDelay(MOCK_DELAYS.short)\r\n }\r\n}\r\n","import { AnalyticsApi } from './AnalyticsApi.ts'\r\nimport { RpcClient } from '../rpc'\r\nimport { VenusMessageId } from '../VenusMessageId.ts'\r\n\r\nexport class RpcAnalyticsApi implements AnalyticsApi {\r\n private readonly rpcClient: RpcClient\r\n\r\n constructor(rpcClient: RpcClient) {\r\n this.rpcClient = rpcClient\r\n }\r\n\r\n async recordCustomEvent(\r\n eventName: string,\r\n payload: Record<string, any>,\r\n ): Promise<void> {\r\n console.log(\r\n `[Venus SDK] [RpcAnalyticsApi] recordCustomEvent: ${eventName} payload:\\n${JSON.stringify(payload, null, 2)}`,\r\n )\r\n await this.rpcClient.call(VenusMessageId.LOG_ANALYTICS_EVENT, {\r\n eventName: eventName,\r\n params: payload,\r\n })\r\n }\r\n\r\n async trackFunnelStep(stepNumber: number, stepName: string, funnelName?: string): Promise<void> {\r\n console.log(\r\n `[Venus SDK] [RpcAnalyticsApi] trackFunnelStep: stepNumber: ${stepNumber} stepName: ${stepName} funnelName: ${funnelName}`,\r\n )\r\n await this.rpcClient.call(VenusMessageId.TRACK_FUNNEL_STEP, {\r\n stepNumber,\r\n stepName,\r\n funnelName,\r\n })\r\n }\r\n}\r\n","import { VenusAPI } from '../venus-api/types.ts'\r\nimport { Host } from '../Host.ts'\r\n\r\nexport * from './AnalyticsApi'\r\nexport * from './MockAnalyticsApi'\r\nexport * from './RpcAnalyticsApi'\r\n\r\nexport function initializeAnalytics(venusApiInstance: VenusAPI, host: Host) {\r\n venusApiInstance.logCustomEvent = async (options) => {\r\n const result = await host.analytics.recordCustomEvent(\r\n options.eventName,\r\n options.params,\r\n )\r\n }\r\n\r\n venusApiInstance.analytics = host.analytics\r\n}\r\n","import { Avatar3dApi, Avatar3dEdits, ShowEditorOptions } from './Avatar3dApi.ts'\r\nimport { VenusAPI } from '../venus-api/types.ts'\r\nimport { Avatar3dConfig } from './Avatar3dConfig.ts'\r\nimport { AssetManifest, Category } from './AssetManifest.ts'\r\nimport { createMockDelay, MOCK_DELAYS } from '../venus-api/systems/core'\r\n\r\ndeclare global {\r\n interface Window {\r\n VenusPrototyping?: {\r\n showAvatarEditorOverlay: (\r\n options: any,\r\n resolve: (args: any) => void,\r\n ) => Promise<void>\r\n }\r\n }\r\n}\r\n\r\nexport class MockAvatarApi implements Avatar3dApi {\r\n private readonly _venusApi: VenusAPI\r\n\r\n private cachedAssets: Record<string, Category> | null = null\r\n private cachedVersion: string = ''\r\n\r\n constructor(venusApi: VenusAPI) {\r\n this._venusApi = venusApi\r\n }\r\n downloadAssetPaths(): Promise<Record<string, string[]>> {\r\n console.log('[Venus Mock] Downloading avatar3d asset paths...')\r\n return this.getAllAssetPaths()\r\n }\r\n\r\n async deleteAvatar(): Promise<void> {\r\n console.log(`[Venus Mock] Deleting avatar3d config`)\r\n const venusApi = this._venusApi\r\n\r\n // Get current profile from Venus API context\r\n const currentProfile = venusApi.getProfile()\r\n const profileId = currentProfile?.id || 'default_profile'\r\n\r\n // Remove from localStorage\r\n localStorage.removeItem(`venus-mock-avatar3d-${profileId}`)\r\n\r\n console.log(\r\n `[Venus Mock] Avatar3d config deleted from localStorage for profile: ${profileId}`,\r\n )\r\n }\r\n\r\n async loadAvatar(avatar3dId?: string): Promise<Avatar3dConfig | null> {\r\n console.log(`[Venus Mock] Loading avatar3d`, { avatar3dId })\r\n const venusApi = this._venusApi\r\n let config\r\n\r\n if (avatar3dId) {\r\n // Mock shared avatar3d loading using deterministic selection\r\n console.log(`[Venus Mock] Loading shared avatar3d by ID: ${avatar3dId}`)\r\n config = await this.selectAvatarConfig(avatar3dId, false)\r\n } else {\r\n // Always return a valid avatar, even if no profile\r\n const currentProfile = venusApi.getProfile()\r\n const profileId = currentProfile?.id || 'default_profile'\r\n\r\n console.log(`[Venus Mock] Loading avatar3d for profile: ${profileId}`)\r\n\r\n // Always generate fresh avatar config with current CDN URLs\r\n // localStorage is only used for save persistence, not loading\r\n console.log(\r\n '[Venus Mock] Generating fresh avatar config with current CDN URLs',\r\n )\r\n if (profileId === 'default_profile') {\r\n // Use consistent defaults for the default profile\r\n config = await this.selectAvatarConfig(null, true)\r\n } else {\r\n // Use seeded random for other profiles\r\n config = await this.selectAvatarConfig(profileId, false)\r\n }\r\n }\r\n\r\n // Return direct config or null if not found\r\n return config || null\r\n }\r\n\r\n async saveAvatar(config: Avatar3dConfig): Promise<string> {\r\n console.log(`[Venus Mock] Saving avatar3d config:`, config)\r\n const venusApi = this._venusApi\r\n\r\n // Get current profile from Venus API context\r\n const currentProfile = venusApi.getProfile()\r\n const profileId = currentProfile?.id || 'default_profile'\r\n\r\n // Save to localStorage for mock persistence\r\n localStorage.setItem(\r\n `venus-mock-avatar3d-${profileId}`,\r\n JSON.stringify(config),\r\n )\r\n\r\n // Generate a mock avatar3dId\r\n const mockAvatar3dId = `mock_avatar3d_${profileId}_${Date.now()}`\r\n\r\n console.log(\r\n `[Venus Mock] Avatar3d config saved to localStorage with mock ID: ${mockAvatar3dId}`,\r\n )\r\n\r\n // Return direct avatar ID\r\n return mockAvatar3dId\r\n }\r\n\r\n downloadManifest(): Promise<AssetManifest> {\r\n return this.loadAssetsManifest()\r\n }\r\n\r\n async showEditor(options?: ShowEditorOptions): Promise<Avatar3dEdits> {\r\n console.log(\r\n `[Venus Mock] showAvatar3dEditorAsync called with options:`,\r\n options,\r\n )\r\n\r\n // Mock implementation - simulate opening avatar editor\r\n if (window.VenusPrototyping) {\r\n // If prototyping utilities are available, use them for a better experience\r\n return new Promise((resolve) => {\r\n window.VenusPrototyping!.showAvatarEditorOverlay(options, resolve)\r\n })\r\n }\r\n\r\n // Simple browser-based simulation\r\n console.log('[Venus Mock] Simulating avatar editor opening...')\r\n\r\n // Simulate delay for opening editor\r\n await createMockDelay(MOCK_DELAYS.medium)\r\n\r\n // Generate a mock avatar configuration\r\n const mockAvatarConfig = await this.selectAvatarConfig(null, false)\r\n\r\n // Simulate user interaction - 70% chance they save changes, 30% they cancel\r\n const userSavedChanges = Math.random() > 0.3\r\n\r\n console.log(\r\n '[Venus Mock] Avatar editor simulation complete - user would use requestPopOrQuit() with result data',\r\n )\r\n\r\n // Return direct editor result\r\n if (userSavedChanges) {\r\n const mockAvatarId = `mock_avatar_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\r\n\r\n return {\r\n wasChanged: true,\r\n config: mockAvatarConfig,\r\n savedAvatarId: mockAvatarId,\r\n }\r\n } else {\r\n return {\r\n wasChanged: false,\r\n config: null,\r\n savedAvatarId: null,\r\n }\r\n }\r\n }\r\n\r\n private async getAssets() {\r\n let cachedAssets = this.cachedAssets\r\n if (!cachedAssets) {\r\n this.log('No cached assets found, loading new manifest...')\r\n cachedAssets = (await this.loadAssetsManifest()).categories\r\n }\r\n return cachedAssets\r\n }\r\n\r\n private async loadAssetsManifest() {\r\n this.log('Loading avatar3d assets manifest from CDN...')\r\n const venusApi = this._venusApi\r\n\r\n // Use the CDN base URL from Venus API configuration\r\n const baseManifestUrl = venusApi.resolveAvatarAssetUrl('assets.json')\r\n\r\n // Add cache busting to prevent CDN/browser cache issues\r\n const separator = baseManifestUrl.includes('?') ? '&' : '?'\r\n const manifestUrl = `${baseManifestUrl}${separator}v=${Date.now()}`\r\n\r\n console.log('[Venus Mock] Fetching manifest from URL:', manifestUrl)\r\n\r\n try {\r\n const response = await fetch(manifestUrl, {\r\n method: 'GET',\r\n headers: {\r\n Accept: 'application/json, text/plain, */*',\r\n 'Content-Type': 'application/json',\r\n },\r\n mode: 'cors',\r\n cache: 'no-cache',\r\n })\r\n\r\n console.log(\r\n '[Venus Mock] Fetch response status:',\r\n response.status,\r\n response.statusText,\r\n )\r\n console.log(\r\n '[Venus Mock] Response headers:',\r\n Object.fromEntries(response.headers.entries()),\r\n )\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `Failed to fetch assets manifest: ${response.status} ${response.statusText}`,\r\n )\r\n }\r\n\r\n const manifest = (await response.json()) as AssetManifest\r\n console.log('[Venus Mock] Loaded assets manifest:', {\r\n version: manifest.version,\r\n generatedAt: manifest.generatedAt,\r\n categories: Object.keys(manifest.categories || {}),\r\n })\r\n\r\n // Cache the assets but not the raw JSON\r\n this.cachedAssets = manifest.categories || {}\r\n this.cachedVersion = manifest.version\r\n\r\n return manifest\r\n } catch (error) {\r\n console.error('[Venus Mock] Failed to load assets manifest:', error)\r\n\r\n // Return a fallback minimal manifest for development\r\n console.log(\r\n '[Venus Mock] Using fallback minimal manifest for development',\r\n )\r\n const fallbackManifest: AssetManifest = {\r\n version: 'dev-fallback',\r\n generatedAt: new Date().toISOString(),\r\n categories: {\r\n head: {\r\n type: 'mesh',\r\n assets: [\r\n {\r\n id: 'head_default',\r\n filename: 'head_default.glb',\r\n displayName: 'Default Head',\r\n },\r\n {\r\n id: 'head_variant1',\r\n filename: 'head_variant1.glb',\r\n displayName: 'Head Variant 1',\r\n },\r\n ],\r\n },\r\n outfit: {\r\n type: 'mesh',\r\n assets: [\r\n {\r\n id: 'outfit_default',\r\n filename: 'outfit_default.glb',\r\n displayName: 'Default Outfit',\r\n },\r\n {\r\n id: 'outfit_casual',\r\n filename: 'outfit_casual.glb',\r\n displayName: 'Casual Outfit',\r\n },\r\n ],\r\n },\r\n hat: {\r\n type: 'mesh',\r\n assets: [\r\n {\r\n id: 'hat_none',\r\n filename: 'hat_none.glb',\r\n displayName: 'No Hat',\r\n },\r\n {\r\n id: 'hat_cap',\r\n filename: 'hat_cap.glb',\r\n displayName: 'Baseball Cap',\r\n },\r\n ],\r\n },\r\n hair: {\r\n type: 'mesh',\r\n assets: [\r\n {\r\n id: 'hair_default',\r\n filename: 'hair_default.glb',\r\n displayName: 'Default Hair',\r\n },\r\n {\r\n id: 'hair_long',\r\n filename: 'hair_long.glb',\r\n displayName: 'Long Hair',\r\n },\r\n ],\r\n },\r\n 'face-accessory': {\r\n type: 'mesh',\r\n assets: [\r\n {\r\n id: 'glasses_none',\r\n filename: 'glasses_none.glb',\r\n displayName: 'No Glasses',\r\n },\r\n {\r\n id: 'glasses_regular',\r\n filename: 'glasses_regular.glb',\r\n displayName: 'Regular Glasses',\r\n },\r\n ],\r\n },\r\n animation: {\r\n type: 'mesh',\r\n assets: [\r\n {\r\n id: 'idle_default',\r\n filename: 'idle_default.glb',\r\n displayName: 'Default Idle',\r\n },\r\n {\r\n id: 'wave',\r\n filename: 'wave.glb',\r\n displayName: 'Wave Animation',\r\n },\r\n ],\r\n },\r\n },\r\n }\r\n\r\n this.cachedAssets = fallbackManifest.categories\r\n this.cachedVersion = fallbackManifest.version\r\n\r\n return fallbackManifest\r\n }\r\n }\r\n\r\n private async selectAvatarConfig(\r\n avatarId: string | null = null,\r\n useDefaults = false,\r\n ): Promise<Avatar3dConfig> {\r\n const categories = await this.getAssets()\r\n this.log(`Manifest ${JSON.stringify(categories, null, 2)}`)\r\n\r\n const rng = avatarId ? this.seededRandom(avatarId) : () => Math.random()\r\n\r\n const headAsset = this.selectAsset(\r\n categories,\r\n 'head',\r\n rng,\r\n avatarId,\r\n useDefaults,\r\n )\r\n\r\n const outfitAsset = this.selectAsset(\r\n categories,\r\n 'outfit',\r\n rng,\r\n avatarId,\r\n useDefaults,\r\n )\r\n const hatAsset = this.selectAsset(\r\n categories,\r\n 'hat',\r\n rng,\r\n avatarId,\r\n useDefaults,\r\n )\r\n const hairAsset = this.selectAsset(\r\n categories,\r\n 'hair',\r\n rng,\r\n avatarId,\r\n useDefaults,\r\n )\r\n const faceAccessoryAsset = this.selectAsset(\r\n categories,\r\n 'face-accessory',\r\n rng,\r\n avatarId,\r\n useDefaults,\r\n )\r\n const animationAsset = this.selectAsset(\r\n categories,\r\n 'animation',\r\n rng,\r\n avatarId,\r\n useDefaults,\r\n )\r\n\r\n const config: Avatar3dConfig = {\r\n headAsset: headAsset.filename,\r\n outfitAsset: outfitAsset.filename,\r\n animationAsset: animationAsset.filename,\r\n faceAccessoryAsset: faceAccessoryAsset.filename,\r\n hairAsset: hairAsset.filename,\r\n hatAsset: hatAsset.filename,\r\n skinColor: null, // NOTE(Zee): This was not selected anywhere?\r\n }\r\n\r\n console.log(\r\n `[Venus Mock] Selected avatar config for ${avatarId || 'default'}:`,\r\n config,\r\n )\r\n return config\r\n }\r\n\r\n private selectAsset(\r\n manifest: Record<string, Category>,\r\n categoryId: string,\r\n rng: () => number,\r\n avatarId: string | null,\r\n useDefaults = false,\r\n ) {\r\n const categoryAssets = manifest[categoryId].assets\r\n\r\n if (useDefaults) {\r\n // Always use the first asset for default avatar (consistent)\r\n const selectedAsset = categoryAssets[0]\r\n console.log(\r\n `[Venus Mock] Using default asset for ${categoryId}:`,\r\n selectedAsset.id,\r\n )\r\n return selectedAsset\r\n }\r\n\r\n if (avatarId) {\r\n // Use seeded random for deterministic selection based on ID\r\n const index = Math.floor(rng() * categoryAssets.length)\r\n const selectedAsset = categoryAssets[index]\r\n console.log(\r\n `[Venus Mock] Seeded selection for ${avatarId} ${categoryId}:`,\r\n selectedAsset.id,\r\n `(index ${index}/${categoryAssets.length})`,\r\n )\r\n return selectedAsset\r\n }\r\n\r\n // Fallback to first asset if no ID\r\n const selectedAsset = categoryAssets[0]\r\n this.log(`Fallback to first asset for ${categoryId}:`, selectedAsset.id)\r\n\r\n return selectedAsset\r\n }\r\n\r\n private seededRandom(seed: string) {\r\n const hash = this.simpleHash(seed)\r\n let state = hash\r\n return function () {\r\n state = (state * 1664525 + 1013904223) % 4294967296\r\n return state / 4294967296\r\n }\r\n }\r\n\r\n private simpleHash(str: string) {\r\n let hash = 0\r\n for (let i = 0; i < str.length; i++) {\r\n const char = str.charCodeAt(i)\r\n hash = (hash << 5) - hash + char\r\n hash = hash & hash // Convert to 32-bit integer\r\n }\r\n return Math.abs(hash)\r\n }\r\n\r\n private async getAllAssetPaths() {\r\n const venusApi = this._venusApi\r\n const assets = await this.getAssets()\r\n const allPaths: Record<string, string[]> = {}\r\n\r\n for (const [category, categoryData] of Object.entries(assets)) {\r\n allPaths[category] = (categoryData?.assets || []).map((asset) =>\r\n venusApi.resolveAvatarAssetUrl(`${category}/${asset.filename}`),\r\n )\r\n }\r\n\r\n this.log('All available asset paths:', allPaths)\r\n return allPaths\r\n }\r\n\r\n private log(message: string, ...args: any[]) {\r\n console.log(`\"[Venus Mock] ${message}`, args)\r\n }\r\n}\r\n","import { Avatar3dApi, Avatar3dEdits, ShowEditorOptions } from './Avatar3dApi.ts'\r\nimport { Avatar3dConfig } from './Avatar3dConfig.ts'\r\nimport { RpcClient } from '../rpc'\r\nimport { VenusMessageId } from '../VenusMessageId.ts'\r\nimport { Asset, AssetManifest } from './AssetManifest.ts'\r\nimport { VenusAPI } from '../venus-api/types.ts'\r\n\r\nexport class RpcAvatarApi implements Avatar3dApi {\r\n private readonly venusApi: VenusAPI\r\n private readonly rpcClient: RpcClient\r\n\r\n constructor(rpcClient: RpcClient, venusApi: VenusAPI) {\r\n this.rpcClient = rpcClient\r\n this.venusApi = venusApi\r\n }\r\n\r\n async downloadAssetPaths(): Promise<Record<string, string[]>> {\r\n const venusApi = this.venusApi\r\n console.log('[Venus] Downloading avatar3d asset paths...')\r\n\r\n const manifestUrl = venusApi.resolveAvatarAssetUrl('assets.json')\r\n console.log('[Venus] 🔍 Manifest URL resolved to:', manifestUrl)\r\n\r\n const manifest = await this.fetchFromCdn(manifestUrl)\r\n console.log('[Venus] 📦 Manifest loaded successfully:', {\r\n version: manifest.version,\r\n categories: Object.keys(manifest.categories || {}),\r\n totalAssets: Object.values(manifest.categories || {}).reduce(function (\r\n sum,\r\n cat,\r\n ) {\r\n return sum + (cat.assets?.length || 0)\r\n }, 0),\r\n })\r\n\r\n const categories = manifest.categories || {}\r\n\r\n // Process into asset paths with full URLs\r\n const assetPaths: Record<string, string[]> = {}\r\n for (const categoryKey in categories) {\r\n const categoryData = categories[categoryKey]\r\n const categoryPath = categoryKey\r\n const assetUrls = (categoryData?.assets || []).map((asset: Asset) => {\r\n const url = venusApi.resolveAvatarAssetUrl(\r\n categoryPath + '/' + asset.filename,\r\n )\r\n console.log('[Venus] 🎨 Asset URL:', asset.filename, '->', url)\r\n return url\r\n })\r\n assetPaths[categoryKey] = assetUrls\r\n console.log(\r\n '[Venus] 📁 Category',\r\n categoryKey,\r\n 'has',\r\n assetUrls.length,\r\n 'assets',\r\n )\r\n }\r\n\r\n console.log('[Venus] Avatar3d asset paths downloaded successfully')\r\n\r\n // Return direct asset paths\r\n return assetPaths\r\n }\r\n\r\n async downloadManifest(): Promise<AssetManifest> {\r\n console.log('[Venus] Downloading avatar3d manifest...')\r\n const venusApi = this.venusApi\r\n\r\n // Use shared CDN fetch utility\r\n const manifestUrl = venusApi.resolveAvatarAssetUrl('assets.json')\r\n const manifest = await this.fetchFromCdn(manifestUrl)\r\n\r\n console.log('[Venus] Avatar3d manifest downloaded successfully')\r\n\r\n // Return direct manifest\r\n return manifest\r\n }\r\n\r\n async loadAvatar(avatarId?: string): Promise<Avatar3dConfig | null> {\r\n const result = await this.rpcClient.call(VenusMessageId.AVATAR3D_LOAD, {\r\n avatar3dId: avatarId,\r\n })\r\n this.log(\r\n `Avatar loaded with the following result:\\n${JSON.stringify(result, null, 2)}`,\r\n )\r\n return result as Avatar3dConfig\r\n }\r\n\r\n saveAvatar(config: Avatar3dConfig): Promise<string> {\r\n return this.rpcClient.call(VenusMessageId.AVATAR3D_SAVE, {\r\n config: config,\r\n })\r\n }\r\n\r\n deleteAvatar(): Promise<void> {\r\n return this.rpcClient.call(VenusMessageId.AVATAR3D_DELETE)\r\n }\r\n\r\n async showEditor(options?: ShowEditorOptions): Promise<Avatar3dEdits> {\r\n const rpcClient = this.rpcClient\r\n\r\n console.log(\r\n '[Venus] 🎨 showAvatar3dEditorAsync called with options:',\r\n options,\r\n )\r\n\r\n console.log(\r\n '[Venus] 📤 Sending H5_STACK_PUSH_REQUEST for avatar3d using _sendRequest...',\r\n )\r\n\r\n // Use _sendRequest to get the final result when the editor closes\r\n const rawResult = await rpcClient.call<Avatar3dEdits>(\r\n VenusMessageId.H5_STACK_PUSH_REQUEST,\r\n {\r\n targetAppId: 'AVATAR3D',\r\n contextData: options?.contextData || {},\r\n appParams: {\r\n currentAvatar: options?.currentAvatar,\r\n onSave: options?.onSave,\r\n onCancel: options?.onCancel,\r\n },\r\n },\r\n )\r\n\r\n console.log(\r\n '[Venus] ✅ Avatar editor completed with raw result:',\r\n rawResult,\r\n )\r\n\r\n // Return direct editor result\r\n return {\r\n wasChanged: rawResult.wasChanged || false,\r\n config: rawResult.config || null,\r\n savedAvatarId: rawResult.savedAvatarId || null,\r\n }\r\n }\r\n\r\n private async fetchFromCdn(url: string): Promise<AssetManifest> {\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: {\r\n Accept: 'application/json, text/plain, */*',\r\n 'Content-Type': 'application/json',\r\n },\r\n mode: 'cors',\r\n cache: 'no-cache',\r\n })\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `CDN fetch failed: ${response.status} ${response.statusText}`,\r\n )\r\n }\r\n\r\n return (await response.json()) as AssetManifest\r\n }\r\n\r\n private log(message: string, ...options: any[]): void {\r\n console.log(`[Venus] ${message}`, options)\r\n }\r\n}\r\n","import { VenusAPI } from '../venus-api/types.ts'\r\nimport { Host } from '../Host.ts'\r\n\r\nexport * from './Avatar3dApi'\r\nexport * from './Avatar3dConfig'\r\nexport * from './AssetManifest'\r\nexport * from './MockAvatarApi'\r\nexport * from './RpcAvatarApi'\r\n\r\nexport function initializeAvatar3d(venusApi: VenusAPI, host: Host) {\r\n venusApi.loadAvatar3dAsync = host.avatar3d.loadAvatar.bind(host.avatar3d)\r\n venusApi.saveAvatar3dAsync = host.avatar3d.saveAvatar.bind(host.avatar3d)\r\n venusApi.deleteAvatar3dAsync = host.avatar3d.deleteAvatar.bind(host.avatar3d)\r\n venusApi.downloadAvatar3dManifestAsync = host.avatar3d.downloadManifest.bind(\r\n host.avatar3d,\r\n )\r\n venusApi.showAvatar3dEditorAsync = host.avatar3d.showEditor.bind(\r\n host.avatar3d,\r\n )\r\n venusApi.downloadAvatar3dAssetPathsAsync =\r\n host.avatar3d.downloadAssetPaths.bind(host.avatar3d)\r\n}\r\n","import { CdnApi, FetchBlobOptions, SubPath } from './CdnApi'\r\n\r\nexport class HostCdnApi implements CdnApi {\r\n private readonly baseUrl: string\r\n\r\n constructor(baseUrl: string) {\r\n this.baseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl\r\n }\r\n\r\n async fetchBlob(path: SubPath, options?: FetchBlobOptions): Promise<Blob> {\r\n const controller = new AbortController()\r\n const timeoutId = setTimeout(\r\n () => controller.abort(),\r\n options?.timeout ?? 30000,\r\n )\r\n\r\n try {\r\n const url = this.resolveAssetUrl(path)\r\n const response = await fetch(url, {\r\n mode: 'cors',\r\n credentials: 'omit',\r\n headers: { Accept: '/*' },\r\n signal: controller.signal,\r\n })\r\n\r\n clearTimeout(timeoutId)\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\r\n }\r\n\r\n return await response.blob()\r\n } catch (error) {\r\n clearTimeout(timeoutId)\r\n throw error\r\n }\r\n }\r\n\r\n async fetchFromCdn(url: string, request?: RequestInit): Promise<Response> {\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers: {\r\n Accept: 'application/json, text/plain, */*',\r\n 'Content-Type': 'application/json',\r\n },\r\n mode: 'cors',\r\n cache: 'no-cache',\r\n })\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `CDN fetch failed: \\${response.status} \\${response.statusText}`,\r\n )\r\n }\r\n\r\n return response\r\n }\r\n\r\n getAssetCdnBaseUrl(): string {\r\n return this.baseUrl\r\n }\r\n\r\n resolveAssetUrl(subPath: string): string {\r\n // Clean up the subPath (remove leading slash if present)\r\n const cleanSubPath = subPath.startsWith('/') ? subPath.slice(1) : subPath\r\n\r\n // Split path into directory and filename parts, encode only filename to preserve directory structure\r\n const pathParts = cleanSubPath.split('/')\r\n const encodedParts = pathParts.map((part, index) => {\r\n // Only encode the filename (last part), keep directory names as-is for URL structure\r\n return index === pathParts.length - 1 ? encodeURIComponent(part) : part\r\n })\r\n const encodedSubPath = encodedParts.join('/')\r\n\r\n const cacheBust = Date.now()\r\n\r\n const fullUrl = this.baseUrl + '/' + encodedSubPath + `?cacheBust=${cacheBust}`\r\n return fullUrl\r\n }\r\n\r\n resolveAvatarAssetUrl(subPath: string): string {\r\n // Prepend 'avatar3d/' to the subPath and resolve using the base method\r\n const avatarSubPath = 'avatar3d/' + subPath\r\n return this.resolveAssetUrl(avatarSubPath)\r\n }\r\n\r\n resolveSharedLibUrl(subPath: string): string {\r\n // Prepend 'libs/' to the subPath and resolve using the base method\r\n const libSubPath = 'libs/' + subPath\r\n return this.resolveAssetUrl(libSubPath)\r\n }\r\n}\r\n","import { CdnApi, FetchBlobOptions, SubPath } from './CdnApi'\r\nimport { VenusAPI } from '../venus-api/types'\r\n\r\nexport class MockCdnApi implements CdnApi {\r\n private readonly venusApi: VenusAPI\r\n\r\n constructor(venusApi: VenusAPI) {\r\n this.venusApi = venusApi\r\n }\r\n \r\n private get baseUrl(): string {\r\n // Check VenusAPI._mock.cdnBaseUrl for custom URL\r\n return (this.venusApi._mock?.cdnBaseUrl as string | undefined) ?? 'https://venus-static-01293ak.web.app/'\r\n }\r\n \r\n private get forceRemoteCdn(): boolean {\r\n // Check VenusAPI._mock.cdnForceRemote, default to false (use local in dev)\r\n return (this.venusApi._mock?.cdnForceRemote as boolean | undefined) ?? false\r\n }\r\n\r\n async fetchBlob(path: SubPath, options?: FetchBlobOptions): Promise<Blob> {\r\n const controller = new AbortController()\r\n const timeoutId = setTimeout(\r\n () => controller.abort(),\r\n options?.timeout ?? 30000,\r\n )\r\n\r\n try {\r\n const url = this.resolveAssetUrl(path)\r\n const response = await fetch(url, {\r\n mode: 'cors',\r\n credentials: 'omit',\r\n headers: { Accept: '/*' },\r\n signal: controller.signal,\r\n })\r\n\r\n clearTimeout(timeoutId)\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\r\n }\r\n\r\n return await response.blob()\r\n } catch (error) {\r\n clearTimeout(timeoutId)\r\n throw error\r\n }\r\n }\r\n\r\n getAssetCdnBaseUrl(): string {\r\n return this.baseUrl\r\n }\r\n\r\n resolveAssetUrl(subPath: string): string {\r\n // If subPath is already a full URL, return it as-is\r\n if (subPath.startsWith('http://') || subPath.startsWith('https://')) {\r\n // Input is already a full URL\r\n return subPath\r\n }\r\n\r\n if (subPath.startsWith('cdn/')) {\r\n return subPath\r\n }\r\n\r\n // Clean up the subPath (remove leading slash if present)\r\n const cleanSubPath = subPath.startsWith('/') ? subPath.slice(1) : subPath\r\n\r\n // Check if we're on localhost\r\n const isLocalhost = \r\n typeof window !== 'undefined' &&\r\n (window.location.hostname === 'localhost' || \r\n window.location.hostname === '127.0.0.1')\r\n\r\n // If we're on localhost AND not forcing remote CDN, use local paths\r\n // This allows vite dev server to serve from local cdn/ folder\r\n if (isLocalhost && !this.forceRemoteCdn) {\r\n return `cdn/${cleanSubPath}`\r\n }\r\n\r\n // Otherwise use production CDN\r\n // Split path into directory and filename parts, encode only filename to preserve directory structure\r\n const pathParts = cleanSubPath.split('/')\r\n const encodedParts = pathParts.map((part, index) => {\r\n // Only encode the filename (last part), keep directory names as-is for URL structure\r\n return index === pathParts.length - 1 ? encodeURIComponent(part) : part\r\n })\r\n const encodedSubPath = encodedParts.join('/')\r\n\r\n const cacheBust = Date.now()\r\n\r\n // Construct the full URL\r\n const fullUrl = `${this.baseUrl}${encodedSubPath}?cacheBust=${cacheBust}`\r\n\r\n // Resolved asset URL\r\n return fullUrl\r\n }\r\n\r\n resolveAvatarAssetUrl(subPath: string): string {\r\n // If subPath is already a full URL, return it as-is\r\n if (subPath.startsWith('http://') || subPath.startsWith('https://')) {\r\n // Avatar asset input is already a full URL\r\n return subPath\r\n }\r\n\r\n // Prepend 'avatar3d/' to the subPath and resolve using the base method\r\n const avatarSubPath = `avatar3d/${subPath}`\r\n return this.resolveAssetUrl(avatarSubPath)\r\n }\r\n\r\n resolveSharedLibUrl(subPath: string): string {\r\n // If subPath is already a full URL, return it as-is\r\n if (subPath.startsWith('http://') || subPath.startsWith('https://')) {\r\n // Shared lib input is already a full URL\r\n return subPath\r\n }\r\n\r\n // Prepend 'libs/' to the subPath and resolve using the base method\r\n const libSubPath = `libs/${subPath}`\r\n return this.resolveAssetUrl(libSubPath)\r\n }\r\n\r\n async fetchFromCdn(url: string, options?: RequestInit): Promise<Response> {\r\n // Fetching from network\r\n\r\n // Security validation - only allow trusted CDN domains\r\n const allowedDomains = [\r\n 'venus-static-01293ak.web.app',\r\n 'firebasestorage.googleapis.com',\r\n 'cdn.venusapp.com',\r\n 'storage.googleapis.com',\r\n ]\r\n let urlObj: URL | null = null\r\n\r\n try {\r\n let isAllowed = true\r\n\r\n if (url.startsWith('http://') || url.startsWith('https://')) {\r\n urlObj = new URL(url)\r\n isAllowed = allowedDomains.some(\r\n (domain) =>\r\n urlObj!.hostname === domain ||\r\n urlObj!.hostname.endsWith('.' + domain),\r\n )\r\n\r\n if (!isAllowed) {\r\n const error = `Domain not allowed: ${urlObj.hostname}. Allowed domains: ${allowedDomains.join(', ')}`\r\n console.error('[Venus Network Mock] Security error:', error)\r\n throw new Error(error)\r\n }\r\n } else {\r\n // In development mode, let relative URLs be handled naturally by the browser/dev server\r\n // Using relative URL as-is in development mode\r\n // Don't convert to absolute URL - let fetch handle the relative URL\r\n urlObj = null // We'll use the original URL directly\r\n }\r\n\r\n const fetchUrl = urlObj ? urlObj.href : url\r\n // Making request\r\n\r\n const response = await fetch(fetchUrl, {\r\n method: options?.method || 'GET',\r\n headers: {\r\n Accept: 'text/plain, application/octet-stream, application/json, */*',\r\n ...options?.headers,\r\n },\r\n cache: options?.cache || 'default',\r\n mode: 'cors',\r\n })\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\r\n }\r\n\r\n // Fetch successful\r\n return response\r\n } catch (error) {\r\n // CORS Fallback for mock\r\n if (\r\n error instanceof Error &&\r\n error.message &&\r\n (error.message.includes('CORS') ||\r\n error.message.includes('preflight') ||\r\n error.message.includes('Access-Control') ||\r\n error.message.includes('cache-control'))\r\n ) {\r\n // CORS error detected, trying minimal fetch\r\n\r\n try {\r\n const fallbackUrl = urlObj ? urlObj.href : url\r\n const fallbackResponse = await fetch(fallbackUrl, {\r\n method: 'GET',\r\n mode: 'cors',\r\n cache: 'default',\r\n })\r\n\r\n if (!fallbackResponse.ok) {\r\n throw new Error(\r\n `HTTP ${fallbackResponse.status}: ${fallbackResponse.statusText}`,\r\n )\r\n }\r\n\r\n const fallbackText = await fallbackResponse.text()\r\n\r\n // CORS fallback fetch successful\r\n return fallbackResponse\r\n } catch (fallbackError) {\r\n console.error(\r\n '[Venus Network Mock] CORS fallback also failed (from network.js):',\r\n {\r\n url,\r\n originalError: error.message,\r\n fallbackError: fallbackError,\r\n timestamp: new Date().toISOString(),\r\n },\r\n )\r\n throw new Error(\r\n `CORS error: ${error.message}. Fallback also failed: ${fallbackError}`,\r\n )\r\n }\r\n }\r\n\r\n console.error('[Venus Network Mock] Fetch failed (from network.js):', {\r\n url,\r\n error: error,\r\n timestamp: new Date().toISOString(),\r\n })\r\n throw error\r\n }\r\n }\r\n}\r\n","import { VenusAPI } from '../venus-api/types'\r\nimport { Host } from '../Host'\r\n\r\nexport * from './CdnApi'\r\nexport * from './HostCdnApi'\r\nexport * from './MockCdnApi'\r\n\r\nexport function initializeCdn(venusApi: VenusAPI, host: Host) {\r\n // Core asset URL resolver\r\n venusApi.resolveAssetUrl = function (subPath) {\r\n return host.cdn.resolveAssetUrl(subPath)\r\n }\r\n\r\n // Avatar-specific asset URL resolver that prepends 'avatar3d/' to the subPath\r\n venusApi.resolveAvatarAssetUrl = function (subPath) {\r\n return host.cdn.resolveAvatarAssetUrl(subPath)\r\n }\r\n\r\n // Shared library URL resolver that prepends 'libs/' to the subPath\r\n venusApi.resolveSharedLibUrl = function (subPath) {\r\n return host.cdn.resolveSharedLibUrl(subPath)\r\n }\r\n\r\n // Helper method to get the base CDN URL\r\n venusApi.getAssetCdnBaseUrl = function () {\r\n return host.cdn.getAssetCdnBaseUrl()\r\n }\r\n\r\n venusApi.fetchFromCdn = (url: string, options?: RequestInit) => {\r\n return host.cdn.fetchFromCdn(url, options)\r\n }\r\n\r\n venusApi.cdn = host.cdn\r\n}\r\n","import { DeviceApi, DeviceInfo } from './DeviceApi'\r\nimport { VenusAPI } from '../venus-api/types'\r\n\r\nexport class HostDeviceApi implements DeviceApi {\r\n private readonly venusApi: VenusAPI\r\n\r\n constructor(venusApi: VenusAPI) {\r\n this.venusApi = venusApi\r\n }\r\n\r\n getDevice(): DeviceInfo {\r\n const device = this.venusApi._deviceData\r\n \r\n if (!device) {\r\n throw new Error(\r\n '[Venus SDK] Device info not available. You must await VenusAPI.initializeAsync() before calling getDevice(). INIT_SDK has not completed.',\r\n )\r\n }\r\n\r\n return device\r\n }\r\n}\r\n\r\n","import { DeviceApi, DeviceInfo } from './DeviceApi'\r\nimport { VenusAPI } from '../venus-api/types'\r\n\r\nexport class MockDeviceApi implements DeviceApi {\r\n private readonly venusApi: VenusAPI\r\n\r\n constructor(venusApi: VenusAPI) {\r\n this.venusApi = venusApi\r\n }\r\n\r\n getDevice(): DeviceInfo {\r\n const width = typeof window !== 'undefined' ? window.innerWidth : 400\r\n const height = typeof window !== 'undefined' ? window.innerHeight : 800\r\n \r\n return {\r\n screenSize: { width, height },\r\n viewportSize: { \r\n width: width - 20, // account for safe area\r\n height: height - 20 \r\n },\r\n orientation: width > height ? 'landscape' : 'portrait',\r\n pixelRatio: typeof window !== 'undefined' ? (window.devicePixelRatio || 1) : 1,\r\n fontScale: 1,\r\n deviceType: width > 768 ? 'tablet' : 'phone',\r\n hapticsEnabled: false,\r\n haptics: { supported: false, enabled: false },\r\n }\r\n }\r\n}\r\n\r\n","import { EnvironmentApi, EnvironmentInfo } from './EnvironmentApi'\r\nimport { VenusAPI } from '../venus-api/types'\r\n\r\nexport class HostEnvironmentApi implements EnvironmentApi {\r\n private readonly venusApi: VenusAPI\r\n\r\n constructor(venusApi: VenusAPI) {\r\n this.venusApi = venusApi\r\n }\r\n\r\n getEnvironment(): EnvironmentInfo {\r\n const environment = this.venusApi._environmentData\r\n \r\n if (!environment) {\r\n throw new Error(\r\n '[Venus SDK] Environment info not available. You must await VenusAPI.initializeAsync() before calling getEnvironment(). INIT_SDK has not completed.',\r\n )\r\n }\r\n\r\n return environment\r\n }\r\n}\r\n\r\n","import { EnvironmentApi, EnvironmentInfo } from './EnvironmentApi'\r\nimport { VenusAPI } from '../venus-api/types'\r\n\r\nexport class MockEnvironmentApi implements EnvironmentApi {\r\n private readonly venusApi: VenusAPI\r\n\r\n constructor(venusApi: VenusAPI) {\r\n this.venusApi = venusApi\r\n }\r\n\r\n getEnvironment(): EnvironmentInfo {\r\n const getBrowser = (): string => {\r\n if (typeof navigator === 'undefined') return 'unknown'\r\n const userAgent = navigator.userAgent\r\n if (/chrome|chromium|crios/i.test(userAgent)) return 'chrome'\r\n if (/firefox|fxios/i.test(userAgent)) return 'firefox'\r\n if (/safari/i.test(userAgent)) return 'safari'\r\n if (/edg/i.test(userAgent)) return 'edge'\r\n if (/opera|opr/i.test(userAgent)) return 'opera'\r\n return 'unknown'\r\n }\r\n\r\n return {\r\n isDevelopment: true,\r\n platform: 'web',\r\n platformVersion: 'mock-1.0',\r\n browserInfo: {\r\n browser: getBrowser(),\r\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : 'mock-agent',\r\n isMobile: typeof navigator !== 'undefined' ? /Mobi|Android/i.test(navigator.userAgent) : false,\r\n isTablet: typeof navigator !== 'undefined' ? /iPad|Tablet|Pad/i.test(navigator.userAgent) : false,\r\n language: typeof navigator !== 'undefined' ? (navigator.language || 'en-US') : 'en-US',\r\n },\r\n }\r\n }\r\n}\r\n\r\n","import { SystemApi } from './SystemApi'\r\nimport { DeviceInfo, DeviceApi } from '../device'\r\nimport { EnvironmentInfo, EnvironmentApi } from '../environment'\r\nimport { SafeArea } from '../Host'\r\nimport { VenusAPI } from '../venus-api/types'\r\n\r\n/**\r\n * Host implementation of SystemApi that delegates to device and environment APIs.\r\n * Acts as a facade combining both system-level information sources.\r\n */\r\nexport class HostSystemApi implements SystemApi {\r\n private readonly deviceApi: DeviceApi\r\n private readonly environmentApi: EnvironmentApi\r\n private readonly venusApi: VenusAPI\r\n\r\n constructor(\r\n deviceApi: DeviceApi,\r\n environmentApi: EnvironmentApi,\r\n venusApi: VenusAPI,\r\n ) {\r\n this.deviceApi = deviceApi\r\n this.environmentApi = environmentApi\r\n this.venusApi = venusApi\r\n }\r\n\r\n getDevice(): DeviceInfo {\r\n return this.deviceApi.getDevice()\r\n }\r\n\r\n getEnvironment(): EnvironmentInfo {\r\n return this.environmentApi.getEnvironment()\r\n }\r\n\r\n getSafeArea(): SafeArea {\r\n // Stored during initialization in RemoteHost\r\n const safeArea = this.venusApi._safeAreaData\r\n\r\n if (!safeArea) {\r\n throw new Error(\r\n '[Venus SDK] getSafeArea() called before initialization. ' +\r\n 'Call VenusAPI.initializeAsync() first.',\r\n )\r\n }\r\n\r\n // Return a copy to prevent mutation\r\n return { ...safeArea }\r\n }\r\n\r\n isMobile(): boolean {\r\n const environment = this.environmentApi.getEnvironment()\r\n\r\n // Check if platform is mobile\r\n if (environment.platform === 'ios' || environment.platform === 'android') {\r\n return true\r\n }\r\n\r\n // On web, check browserInfo\r\n if (environment.browserInfo) {\r\n return environment.browserInfo.isMobile\r\n }\r\n\r\n // Default to true (conservative - most games are mobile)\r\n return true\r\n }\r\n\r\n isWeb(): boolean {\r\n const environment = this.environmentApi.getEnvironment()\r\n\r\n // Web platform\r\n if (environment.platform === 'web') {\r\n return true\r\n }\r\n\r\n // Check if browser indicates desktop web\r\n if (environment.browserInfo && !environment.browserInfo.isMobile) {\r\n return true\r\n }\r\n\r\n return false\r\n }\r\n}\r\n\r\n","import { SystemApi } from './SystemApi'\r\nimport { DeviceInfo, DeviceApi } from '../device'\r\nimport { EnvironmentInfo, EnvironmentApi } from '../environment'\r\nimport { SafeArea } from '../Host'\r\nimport { VenusAPI } from '../venus-api/types'\r\n\r\n/**\r\n * Mock implementation of SystemApi for local development.\r\n * Delegates to mock device and environment APIs.\r\n */\r\nexport class MockSystemApi implements SystemApi {\r\n private readonly deviceApi: DeviceApi\r\n private readonly environmentApi: EnvironmentApi\r\n private readonly venusApi: VenusAPI\r\n\r\n constructor(deviceApi: DeviceApi, environmentApi: EnvironmentApi, venusApi: VenusAPI) {\r\n this.deviceApi = deviceApi\r\n this.environmentApi = environmentApi\r\n this.venusApi = venusApi\r\n }\r\n\r\n getDevice(): DeviceInfo {\r\n return this.deviceApi.getDevice()\r\n }\r\n\r\n getEnvironment(): EnvironmentInfo {\r\n return this.environmentApi.getEnvironment()\r\n }\r\n\r\n getSafeArea(): SafeArea {\r\n // Return mock safe area from stored data or fallback to defaults\r\n const safeArea = this.venusApi._safeAreaData\r\n \r\n if (!safeArea) {\r\n // Fallback to default mock values\r\n // Note: top is 0 because toolbar handles device notch positioning\r\n return {\r\n top: 0,\r\n right: 0,\r\n bottom: 34,\r\n left: 0\r\n }\r\n }\r\n \r\n // Return a copy to prevent mutation\r\n return { ...safeArea }\r\n }\r\n\r\n isMobile(): boolean {\r\n const environment = this.environmentApi.getEnvironment()\r\n \r\n // Check if platform is mobile\r\n if (environment.platform === 'ios' || environment.platform === 'android') {\r\n return true\r\n }\r\n \r\n // On web, check browserInfo\r\n if (environment.browserInfo) {\r\n return environment.browserInfo.isMobile\r\n }\r\n \r\n return true\r\n }\r\n\r\n isWeb(): boolean {\r\n const environment = this.environmentApi.getEnvironment()\r\n \r\n // Web platform\r\n if (environment.platform === 'web') {\r\n return true\r\n }\r\n \r\n // Check if browser indicates desktop web\r\n if (environment.browserInfo && !environment.browserInfo.isMobile) {\r\n return true\r\n }\r\n \r\n return false\r\n }\r\n}\r\n\r\n","import { VenusAPI } from '../venus-api/types'\r\nimport { Host } from '../Host'\r\n\r\nexport * from './SystemApi'\r\nexport * from './HostSystemApi'\r\nexport * from './MockSystemApi'\r\nexport type { SafeArea } from '../Host'\r\n\r\nexport function initializeSystem(venusApi: VenusAPI, host: Host) {\r\n // Add system namespace to VenusAPI - this is the ONLY way to access system APIs\r\n venusApi.system = host.system\r\n \r\n // Add deprecated top-level platform detection methods (redirect to system)\r\n venusApi.isMobile = () => {\r\n console.warn(\r\n '[Venus SDK] DEPRECATED: VenusAPI.isMobile() is deprecated. ' +\r\n 'Use VenusAPI.system.isMobile() instead.'\r\n )\r\n return host.system.isMobile()\r\n }\r\n \r\n venusApi.isWeb = () => {\r\n console.warn(\r\n '[Venus SDK] DEPRECATED: VenusAPI.isWeb() is deprecated. ' +\r\n 'Use VenusAPI.system.isWeb() instead.'\r\n )\r\n return host.system.isWeb()\r\n }\r\n}\r\n\r\n","import { Experiment, FeaturesApi } from './FeaturesApi'\r\nimport { RpcClient } from '../rpc'\r\nimport { VenusMessageId } from '../VenusMessageId'\r\n\r\nexport class RpcFeaturesApi implements FeaturesApi {\r\n private readonly rpcClient: RpcClient\r\n\r\n constructor(rcpClient: RpcClient) {\r\n this.rpcClient = rcpClient\r\n }\r\n\r\n async getExperiment(experimentName: string): Promise<Experiment | null> {\r\n console.log('[Venus] Getting Experiment', experimentName)\r\n return await this.rpcClient.call(VenusMessageId.GET_EXPERIMENT, {\r\n experimentName: experimentName,\r\n })\r\n }\r\n\r\n async getFeatureFlag(flagName: string): Promise<boolean> {\r\n console.log('[Venus] Getting Feature Flag', flagName)\r\n return await this.rpcClient.call(VenusMessageId.GET_FEATURE_FLAG, {\r\n flagName: flagName,\r\n })\r\n }\r\n\r\n async getFeatureGate(gateName: string): Promise<boolean> {\r\n console.log('[Venus] Getting Feature Gate', gateName)\r\n return await this.rpcClient.call(VenusMessageId.GET_FEATURE_GATE, {\r\n gateName: gateName,\r\n })\r\n }\r\n}\r\n","import { Experiment, FeaturesApi } from './FeaturesApi'\r\n\r\nexport class MockFeaturesApi implements FeaturesApi {\r\n async getExperiment(experimentName: string): Promise<Experiment | null> {\r\n return null\r\n }\r\n\r\n async getFeatureFlag(flagName: string): Promise<boolean> {\r\n return Promise.resolve(false)\r\n }\r\n\r\n getFeatureGate(gateName: string): Promise<boolean> {\r\n return Promise.resolve(false)\r\n }\r\n}\r\n","import { VenusAPI } from '../venus-api/types'\r\nimport { Host } from '../Host'\r\n\r\nexport * from './FeaturesApi'\r\nexport * from './RpcFeaturesApi'\r\nexport * from './MockFeaturesApi'\r\n\r\nexport function initializeFeaturesApi(venusApi: VenusAPI, host: Host) {\r\n venusApi.getExperiment = (options) => {\r\n return host.features.getExperiment(options.experimentName)\r\n }\r\n\r\n venusApi.getFeatureGate = (options) => {\r\n return host.features.getFeatureGate(options.gateName)\r\n }\r\n\r\n venusApi.getFeatureFlag = (options) => {\r\n return host.features.getFeatureFlag(options.flagName)\r\n }\r\n}\r\n","export enum HapticFeedbackStyle {\r\n Light = 'light',\r\n Medium = 'medium',\r\n Heavy = 'heavy',\r\n Success = 'success',\r\n Warning = 'warning',\r\n Error = 'error',\r\n}\r\nexport interface HapticsApi {\r\n triggerHapticAsync(style: HapticFeedbackStyle): Promise<void>\r\n}\r\n","import { HapticFeedbackStyle, HapticsApi } from './HapticsApi'\r\nimport { RpcClient } from '../rpc'\r\nimport { VenusMessageId } from '../VenusMessageId'\r\n\r\nexport class RpcHapticsApi implements HapticsApi {\r\n private readonly rpcClient: RpcClient\r\n\r\n constructor(rpcClient: RpcClient) {\r\n this.rpcClient = rpcClient\r\n }\r\n\r\n async triggerHapticAsync(style: HapticFeedbackStyle): Promise<void> {\r\n await this.rpcClient.call(VenusMessageId.TRIGGER_HAPTIC, {\r\n style: style,\r\n })\r\n }\r\n}\r\n","import { HapticFeedbackStyle, HapticsApi } from './HapticsApi'\r\nimport { VenusAPI } from '../venus-api/types'\r\n\r\nexport class MockHapticsApi implements HapticsApi {\r\n private readonly venusApi: VenusAPI\r\n\r\n constructor(venusApi: VenusAPI) {\r\n this.venusApi = venusApi\r\n }\r\n\r\n async triggerHapticAsync(style: HapticFeedbackStyle): Promise<void> {\r\n const venusApi = this.venusApi\r\n // Check if device supports haptics\r\n if (!venusApi._mock.device.supportsHaptics) {\r\n return\r\n }\r\n }\r\n}\r\n","import { VenusAPI } from '../venus-api/types'\r\nimport { Host } from '../Host'\r\n\r\nexport * from './HapticsApi'\r\nexport * from './RpcHapticsApi'\r\nexport * from './MockHapticsApi'\r\n\r\nexport function initializeHaptics(venusApi: VenusAPI, host: Host) {\r\n venusApi.triggerHapticAsync = (style) => {\r\n return host.haptics.triggerHapticAsync(style)\r\n }\r\n}\r\n","// packages/api/src/iap/RpcIapApi.ts\r\nimport { IapApi, SpendCurrencyOptions } from './IapApi'\r\nimport { RpcClient } from '../rpc'\r\nimport { VenusMessageId } from '../VenusMessageId'\r\nimport { LoadEmbeddedAssetsResponse } from '../shared-assets/RpcSharedAssetsApi'\r\n\r\nexport class RpcIapApi implements IapApi {\r\n private readonly rpcClient: RpcClient\r\n\r\n constructor(rpcClient: RpcClient) {\r\n this.rpcClient = rpcClient\r\n }\r\n\r\n async getHardCurrencyBalance(): Promise<number> {\r\n const response = await this.rpcClient.call<number>(\r\n VenusMessageId.H5_IAP_GET_WALLET,\r\n )\r\n return response\r\n }\r\n\r\n async spendCurrency(\r\n productId: string,\r\n cost: number,\r\n options?: SpendCurrencyOptions,\r\n ): Promise<void> {\r\n const result = await this.rpcClient.callT<\r\n IapSpendCurrencyRequest,\r\n IapSpendCurrencyResult\r\n >(VenusMessageId.H5_IAP_SPEND_CURRENCY, {\r\n amount: cost,\r\n productId: productId,\r\n screenName: options?.screenName,\r\n })\r\n if (!result.success) {\r\n throw new Error(result.error)\r\n }\r\n }\r\n\r\n async openStore(): Promise<void> {\r\n await this.rpcClient.call(VenusMessageId.H5_IAP_OPEN_STORE)\r\n }\r\n\r\n async getCurrencyIcon(): Promise<LoadEmbeddedAssetsResponse> {\r\n return await this.rpcClient.call(VenusMessageId.H5_IAP_GET_CURRENCY_ICON)\r\n }\r\n}\r\n\r\ninterface IapSpendCurrencyRequest {\r\n amount: number // Required: amount to spend\r\n productId: string // Required: unique identifier for the item being purchased\r\n screenName?: string // Optional: screen/route name where purchase occurred\r\n}\r\n\r\ninterface IapSpendCurrencyResult {\r\n success?: boolean\r\n error?: string\r\n}\r\n","export const mockCurrencyIconBase64 = \"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\";\r\n","import { LoadEmbeddedAssetsResponse } from '../shared-assets'\r\nimport { IapApi, SpendCurrencyOptions } from './IapApi'\r\nimport { mockCurrencyIconBase64 } from './MockCurrencyIcon'\r\n\r\nexport class MockIapApi implements IapApi {\r\n private _hardCurrency: number = 100\r\n\r\n get hardCurrency(): number {\r\n return this._hardCurrency\r\n }\r\n\r\n set hardCurrency(value: number) {\r\n this._hardCurrency = value\r\n }\r\n\r\n async spendCurrency(\r\n productId: string,\r\n cost: number,\r\n options?: SpendCurrencyOptions,\r\n ): Promise<void> {\r\n console.log(`[Mock IAP] Spending ${cost} on ${productId})`)\r\n const remainingHardCurrency = this._hardCurrency - cost\r\n if (remainingHardCurrency < 0) {\r\n throw new Error(\r\n `Not enough hard currency. Expected ${cost}, found ${this._hardCurrency}`,\r\n )\r\n }\r\n this._hardCurrency = remainingHardCurrency\r\n }\r\n\r\n async getHardCurrencyBalance(): Promise<number> {\r\n console.log('[Mock IAP] get hard currency called')\r\n return this._hardCurrency\r\n }\r\n\r\n async openStore(): Promise<void> {\r\n console.log('[Mock IAP] open store called')\r\n }\r\n\r\n async getCurrencyIcon(): Promise<LoadEmbeddedAssetsResponse> {\r\n console.log('[Mock IAP] get currency icon called')\r\n return {\r\n base64Data: mockCurrencyIconBase64,\r\n }\r\n }\r\n}\r\n","import { VenusAPI } from '../venus-api/types.ts'\r\nimport { Host } from '../Host.ts'\r\n\r\nexport * from './IapApi'\r\nexport * from './RpcIapApi'\r\nexport * from './MockIapApi'\r\n\r\nexport function initializeIap(venusApiInstance: VenusAPI, host: Host) {\r\n venusApiInstance.iap = host.iap\r\n}\r\n","import {\r\n AwakeCallback,\r\n QuitCallback,\r\n LifecycleApi,\r\n PauseCallback,\r\n ResumeCallback,\r\n SleepCallback,\r\n} from './LifecycleApi'\r\nimport { Subscription } from '../rpc'\r\n\r\nexport class MockLifecycleApi implements LifecycleApi {\r\n private pauseCallbacks: Set<PauseCallback> = new Set<PauseCallback>()\r\n private resumeCallbacks: Set<ResumeCallback> = new Set<PauseCallback>()\r\n private awakeCallbacks = new Set<AwakeCallback>()\r\n private sleepCallbacks = new Set<SleepCallback>()\r\n private quitCallbacks = new Set<QuitCallback>()\r\n\r\n onSleep(callback: SleepCallback): Subscription {\r\n this.sleepCallbacks.add(callback)\r\n return {\r\n unsubscribe: () => {\r\n this.sleepCallbacks.delete(callback)\r\n },\r\n }\r\n }\r\n\r\n onAwake(callback: AwakeCallback): Subscription {\r\n this.awakeCallbacks.add(callback)\r\n return {\r\n unsubscribe: () => {\r\n this.awakeCallbacks.delete(callback)\r\n },\r\n }\r\n }\r\n\r\n onPause(callback: PauseCallback): Subscription {\r\n this.pauseCallbacks.add(callback)\r\n return {\r\n unsubscribe: () => {\r\n this.pauseCallbacks.delete(callback)\r\n },\r\n }\r\n }\r\n\r\n onResume(callback: ResumeCallback): Subscription {\r\n this.resumeCallbacks.add(callback)\r\n return {\r\n unsubscribe: () => {\r\n this.resumeCallbacks.delete(callback)\r\n },\r\n }\r\n }\r\n\r\n onQuit(callback: QuitCallback): Subscription {\r\n this.quitCallbacks.add(callback)\r\n return {\r\n unsubscribe: () => {\r\n this.quitCallbacks.delete(callback)\r\n },\r\n }\r\n }\r\n\r\n triggerPauseCallbacks() {\r\n for (const callback of this.pauseCallbacks) {\r\n callback()\r\n }\r\n }\r\n\r\n triggerResumeCallbacks() {\r\n for (const callback of this.resumeCallbacks) {\r\n callback()\r\n }\r\n }\r\n\r\n triggerAwakeCallbacks() {\r\n for (const callback of this.awakeCallbacks) {\r\n callback()\r\n }\r\n }\r\n\r\n triggerSleepCallbacks() {\r\n for (const callback of this.sleepCallbacks) {\r\n callback()\r\n }\r\n }\r\n\r\n triggerQuitCallbacks() {\r\n for (const callback of this.quitCallbacks) {\r\n callback()\r\n }\r\n }\r\n}\r\n","import {\r\n AwakeCallback,\r\n LifecycleApi,\r\n PauseCallback,\r\n QuitCallback,\r\n ResumeCallback,\r\n SleepCallback,\r\n} from './LifecycleApi'\r\nimport { VenusMessageId } from '../VenusMessageId'\r\nimport { RpcClient, Subscription } from '../rpc'\r\n\r\nexport class RpcLifecycleApi implements LifecycleApi {\r\n private readonly rpcClient: RpcClient\r\n\r\n constructor(rpcClient: RpcClient) {\r\n this.rpcClient = rpcClient\r\n }\r\n\r\n onQuit(callback: QuitCallback): Subscription {\r\n return this.rpcClient.onNotification(VenusMessageId.QUIT, callback)\r\n }\r\n\r\n onSleep(callback: SleepCallback): Subscription {\r\n return this.rpcClient.onNotification(VenusMessageId.SLEEP, callback)\r\n }\r\n\r\n onAwake(callback: AwakeCallback): Subscription {\r\n return this.rpcClient.onNotification(VenusMessageId.AWAKE, callback)\r\n }\r\n\r\n onResume(callback: ResumeCallback): Subscription {\r\n return this.rpcClient.onNotification(VenusMessageId.RESUME, callback)\r\n }\r\n\r\n onPause(callback: PauseCallback): Subscription {\r\n return this.rpcClient.onNotification(VenusMessageId.PAUSE, callback)\r\n }\r\n}\r\n","import { VenusAPI } from '../venus-api/types'\r\nimport { Host } from '../Host'\r\n\r\nexport * from './LifecycleApi'\r\nexport * from './MockLifecycleApi'\r\nexport * from './RpcLifecycleApi'\r\n\r\nexport function initializeLifecycleApi(venusApi: VenusAPI, host: Host) {\r\n venusApi.lifecycles = host.lifecycle\r\n}\r\n","import { LoggingApi } from './LoggingApi'\r\n\r\nexport class MockLoggingApi implements LoggingApi {\r\n logDebug(message?: any, ...args: any[]): void {\r\n console.log(`[Venus Mock] ${message}`, ...args)\r\n }\r\n\r\n logError(message: string, ...args: any[]): void {\r\n console.error(`[Venus Mock] ${message}`, ...args)\r\n }\r\n}\r\n","import { LoggingApi } from './LoggingApi'\r\nimport { RpcClient } from '../rpc'\r\nimport { VenusMessageId } from '../VenusMessageId'\r\nimport { Host } from '../Host'\r\n\r\nexport class RpcLoggingApi implements LoggingApi {\r\n private readonly host: Host\r\n private readonly rpcClient: RpcClient\r\n\r\n constructor(host: Host, rpcClient: RpcClient) {\r\n this.host = host\r\n this.rpcClient = rpcClient\r\n }\r\n\r\n logDebug(message: string, ...args: any[]): void {\r\n if (!this.host.isInitialized) {\r\n console.log(message, args)\r\n } else {\r\n message = this.buildMessage(message, ...args)\r\n this.rpcClient.call(VenusMessageId.DEBUG, { level: 'log', message })\r\n }\r\n }\r\n\r\n logError(message: string, ...args: any[]): void {\r\n if (!this.host.isInitialized) {\r\n console.log(message, ...args)\r\n } else {\r\n message = this.buildMessage(message, ...args)\r\n this.rpcClient.call(VenusMessageId.DEBUG, {\r\n level: 'error',\r\n message,\r\n })\r\n }\r\n }\r\n\r\n private buildMessage(message: string, ...args: any[]): string {\r\n // Handle multiple parameters like console.error\r\n if (args && args.length > 0) {\r\n const stringArgs: string[] = []\r\n for (const arg of args) {\r\n const argAsString = this.toStringArg(arg)\r\n if (argAsString) {\r\n stringArgs.push(argAsString)\r\n }\r\n }\r\n message += stringArgs.join(' ')\r\n }\r\n return message\r\n }\r\n\r\n private toStringArg(arg: any) {\r\n if (arg instanceof Error) {\r\n return `${arg.name}: ${arg.message}`\r\n }\r\n if (arg) {\r\n if (typeof arg === 'object') {\r\n try {\r\n return JSON.stringify(arg)\r\n } catch (e) {\r\n return String(arg)\r\n }\r\n }\r\n return String(arg)\r\n }\r\n return undefined\r\n }\r\n}\r\n","import { Host } from '../Host'\r\nimport { VenusAPI } from '../venus-api/types'\r\n\r\nexport * from './LoggingApi'\r\nexport * from './MockLoggingApi'\r\nexport * from './RpcLoggingApi'\r\n\r\nexport function initializeLoggingApi(venusApi: VenusAPI, host: Host): void {\r\n venusApi.log = (message, ...args: any[]) => {\r\n return host.logging.logDebug(message, ...args)\r\n }\r\n\r\n venusApi.error = (message, ...args: any[]) => {\r\n return host.logging.logError(message, ...args)\r\n }\r\n}\r\n","import {\r\n NavigationApi,\r\n NavigationStackInfo,\r\n PushAppOptions,\r\n QuitOptions,\r\n} from './NavigationApi'\r\nimport { VenusAPI } from '../venus-api/types'\r\nimport { createMockDelay, MOCK_DELAYS } from '../venus-api/systems/core'\r\n\r\nexport class MockNavigationApi implements NavigationApi {\r\n private readonly venusApi: VenusAPI\r\n\r\n constructor(venusApi: VenusAPI) {\r\n this.venusApi = venusApi\r\n }\r\n async requestPopOrQuit(options?: QuitOptions): Promise<boolean> {\r\n return true\r\n }\r\n\r\n getStackInfo(): NavigationStackInfo {\r\n const venusApi = this.venusApi\r\n const info: NavigationStackInfo = {\r\n isInStack: venusApi._mock.stackState.isInStack,\r\n stackPosition: venusApi._mock.stackState.stackPosition,\r\n isTopOfStack: venusApi._mock.stackState.isTopOfStack,\r\n stackDepth: venusApi._mock.stackState.stackDepth,\r\n parentInstanceId: venusApi._mock.stackState.parentInstanceId,\r\n }\r\n return info\r\n }\r\n\r\n async popApp(): Promise<void> {\r\n const venusApi = this.venusApi\r\n // Check if we can pop\r\n if (venusApi._mock.stackState.stackDepth <= 1) {\r\n console.warn('[Venus Mock] Cannot pop - at base of stack or not in stack')\r\n return\r\n }\r\n\r\n // Simulate delay\r\n await createMockDelay(MOCK_DELAYS.short)\r\n\r\n // Pop from history\r\n const poppedApp = venusApi._mock.stackState.stackHistory.pop()\r\n venusApi._mock.stackState.stackDepth--\r\n venusApi._mock.stackState.stackPosition = Math.max(\r\n 0,\r\n venusApi._mock.stackState.stackDepth - 1,\r\n )\r\n\r\n // Update stack state\r\n if (venusApi._mock.stackState.stackDepth === 0) {\r\n venusApi._mock.stackState.isInStack = false\r\n venusApi._mock.stackState.isTopOfStack = false\r\n venusApi._mock.stackState.parentInstanceId = null\r\n }\r\n\r\n this.log('App popped: ', poppedApp)\r\n }\r\n\r\n async pushApp(appId: string, options?: PushAppOptions): Promise<void> {\r\n const venusApi = this.venusApi\r\n\r\n // Simulate delay for mock\r\n await createMockDelay(MOCK_DELAYS.medium)\r\n\r\n // Update mock stack state\r\n venusApi._mock.stackState.stackHistory.push({\r\n appId,\r\n pushedAt: Date.now(),\r\n contextData: options?.contextData,\r\n appParams: options?.appParams,\r\n })\r\n\r\n venusApi._mock.stackState.isInStack = true\r\n venusApi._mock.stackState.stackDepth++\r\n venusApi._mock.stackState.stackPosition =\r\n venusApi._mock.stackState.stackDepth - 1\r\n venusApi._mock.stackState.isTopOfStack = true\r\n\r\n const pushedInstanceId = `mock-stack-${appId}-${Date.now()}`\r\n this.log('PushedInstanceId: ', pushedInstanceId)\r\n }\r\n\r\n private log(message: string, ...args: any[]) {\r\n console.log(`[Venus Mock] ${message}`, ...args)\r\n }\r\n}\r\n","import {\r\n NavigationApi,\r\n NavigationStackInfo,\r\n PushAppOptions,\r\n QuitOptions,\r\n} from './NavigationApi'\r\nimport { RpcClient } from '../rpc'\r\nimport { VenusMessageId } from '../VenusMessageId'\r\nimport { VenusAPI } from '../venus-api/types'\r\n\r\nexport class RpcNavigationApi implements NavigationApi {\r\n private readonly venusApi: VenusAPI\r\n private readonly rpcClient: RpcClient\r\n\r\n constructor(rpcClient: RpcClient, venusApi: VenusAPI) {\r\n this.rpcClient = rpcClient\r\n this.venusApi = venusApi\r\n }\r\n async requestPopOrQuit(options?: QuitOptions): Promise<boolean> {\r\n const result = await this.rpcClient.call<PopOrQuitResponse>(\r\n VenusMessageId.QUIT,\r\n options,\r\n )\r\n return result.success\r\n }\r\n\r\n getStackInfo(): NavigationStackInfo {\r\n const venusApi = this.venusApi\r\n console.log('[Venus] getStackInfo called')\r\n const config = window.venus._config\r\n const stackInfo = config.context?.stack || {\r\n isInStack: false,\r\n stackPosition: 0,\r\n parentInstanceId: null,\r\n appType: 'standalone',\r\n }\r\n return stackInfo\r\n }\r\n\r\n popApp(): Promise<void> {\r\n const rpcClient = this.rpcClient\r\n console.log('[Venus] popAppAsync called')\r\n return rpcClient.call(VenusMessageId.H5_STACK_POP_REQUEST)\r\n }\r\n\r\n pushApp(appId: string, options?: PushAppOptions): Promise<void> {\r\n const rpcClient = this.rpcClient\r\n console.log('[Venus] pushAppAsync called', { appId, options })\r\n return rpcClient.call(VenusMessageId.H5_STACK_PUSH_REQUEST, {\r\n targetAppId: appId,\r\n contextData: options?.contextData,\r\n appParams: options?.appParams,\r\n })\r\n }\r\n}\r\n\r\ninterface PopOrQuitResponse {\r\n success: boolean\r\n action: 'popped_from_stack'\r\n quitReason: string\r\n timestamp: number\r\n}\r\n","import { VenusAPI } from '../venus-api/types'\r\nimport { Host } from '../Host'\r\n\r\nexport * from './NavigationApi'\r\nexport * from './MockNavigationApi'\r\nexport * from './RpcNavigationApi'\r\n\r\nexport function initializeStackNavigation(venusApi: VenusAPI, host: Host) {\r\n venusApi._mock.stackState = {\r\n isInStack: false,\r\n stackPosition: 0,\r\n stackDepth: 0,\r\n isTopOfStack: false,\r\n parentInstanceId: null,\r\n stackHistory: [], // Track navigation history for mock\r\n }\r\n\r\n venusApi.pushAppAsync = host.navigation.pushApp.bind(host.navigation)\r\n venusApi.popAppAsync = host.navigation.popApp.bind(host.navigation)\r\n venusApi.getStackInfo = host.navigation.getStackInfo.bind(host.navigation)\r\n venusApi.requestPopOrQuit = (options) => {\r\n return host.navigation.requestPopOrQuit(options)\r\n }\r\n}\r\n","import {\r\n NotificationsApi,\r\n ScheduleLocalNotification,\r\n ScheduleNotificationOptions,\r\n} from './NotificationsApi'\r\nimport {\r\n createMockDelay,\r\n isWebPlatform,\r\n MOCK_DELAYS,\r\n} from '../venus-api/systems/core'\r\nimport { VenusAPI } from '../venus-api/types'\r\n\r\nexport class MockNotificationsApi implements NotificationsApi {\r\n private readonly venusApi: VenusAPI\r\n\r\n constructor(venusApi: VenusAPI) {\r\n this.venusApi = venusApi\r\n }\r\n\r\n async cancelNotification(notificationId: string): Promise<boolean> {\r\n const venusApi = this.venusApi\r\n\r\n // Check if notifications are supported on this platform\r\n if (isWebPlatform()) {\r\n return true\r\n }\r\n\r\n // Simulate a delay\r\n await createMockDelay(MOCK_DELAYS.short)\r\n\r\n // Remove from mock storage\r\n if (\r\n venusApi._mock.scheduledNotifications &&\r\n venusApi._mock.scheduledNotifications[notificationId]\r\n ) {\r\n delete venusApi._mock.scheduledNotifications[notificationId]\r\n return true\r\n }\r\n\r\n return false\r\n }\r\n\r\n async getAllScheduledLocalNotifications(): Promise<\r\n ScheduleLocalNotification[]\r\n > {\r\n // Check if notifications are supported on this platform\r\n if (isWebPlatform()) {\r\n // Return direct array (not wrapped in success object)\r\n return []\r\n }\r\n\r\n // Simulate a delay\r\n await createMockDelay(MOCK_DELAYS.short)\r\n\r\n const venusApi = this.venusApi\r\n\r\n // Return direct array of notifications (not wrapped in success object)\r\n const notifications = venusApi._mock.scheduledNotifications || {}\r\n return Object.values(notifications)\r\n }\r\n\r\n async isLocalNotificationsEnabled(): Promise<boolean> {\r\n // Check if notifications are supported on this platform\r\n if (isWebPlatform()) {\r\n // Return direct boolean (not wrapped in success object)\r\n return false\r\n }\r\n\r\n // Simulate a delay\r\n await createMockDelay(MOCK_DELAYS.short)\r\n\r\n const venusApi = this.venusApi\r\n // Return direct boolean (not wrapped in success object)\r\n const isEnabled = venusApi._mock.notificationsEnabled !== false\r\n return isEnabled\r\n }\r\n\r\n async scheduleAsync(\r\n title: string,\r\n body: string,\r\n seconds: number,\r\n notificationId?: string,\r\n options?: ScheduleNotificationOptions\r\n ): Promise<string | null> {\r\n const { priority = 50, groupId, payload } = options || {}\r\n \r\n // Check if notifications are supported on this platform\r\n if (isWebPlatform()) {\r\n // Provide helpful feedback to developers\r\n console.info(\r\n '🔔 [Venus Mock] Notification would be scheduled:',\r\n title || 'Untitled',\r\n '\\n Body:',\r\n body || 'No body',\r\n '\\n This is a simulation - real notifications require a native platform.',\r\n )\r\n\r\n // Return direct mock ID (not wrapped in success object)\r\n const mockId = `mock-web-notification-${Date.now()}`\r\n return mockId\r\n }\r\n\r\n const venusApi = this.venusApi\r\n // Initialize pendingRequests if it doesn't exist\r\n if (!venusApi._mock.pendingRequests) {\r\n venusApi._mock.pendingRequests = {}\r\n }\r\n\r\n const requestId = Date.now().toString()\r\n\r\n return new Promise((resolve) => {\r\n venusApi._mock.pendingRequests[requestId] = { resolve }\r\n\r\n // Generate a mock notification ID\r\n const id = notificationId || `mock-notification-${Date.now()}`\r\n\r\n // Store this notification in mock storage for later retrieval\r\n if (!venusApi._mock.scheduledNotifications) {\r\n venusApi._mock.scheduledNotifications = {}\r\n }\r\n\r\n venusApi._mock.scheduledNotifications[id] = {\r\n id,\r\n title,\r\n body,\r\n payload,\r\n seconds,\r\n }\r\n\r\n // Simulate a delay using standard timing\r\n setTimeout(() => {\r\n // Return direct notification ID (not wrapped in success object)\r\n resolve(id)\r\n }, MOCK_DELAYS.short)\r\n })\r\n }\r\n\r\n async setLocalNotificationsEnabled(enabled: boolean): Promise<boolean> {\r\n const venusApi = this.venusApi\r\n\r\n // Check if notifications are supported on this platform\r\n if (isWebPlatform()) {\r\n // Return void for successful setting (like the real API)\r\n return true\r\n }\r\n\r\n // Simulate a delay\r\n await createMockDelay(MOCK_DELAYS.short)\r\n\r\n // Update mock storage\r\n venusApi._mock.notificationsEnabled = enabled\r\n return enabled\r\n }\r\n}\r\n","import {\r\n NotificationsApi,\r\n ScheduleLocalNotification,\r\n ScheduleNotificationOptions,\r\n NotificationTriggerInput,\r\n} from './NotificationsApi'\r\nimport { RpcClient } from '../rpc'\r\nimport { VenusMessageId } from '../VenusMessageId'\r\n\r\nexport class RpcNotificationsApi implements NotificationsApi {\r\n private readonly rpcClient: RpcClient\r\n\r\n constructor(rpcClient: RpcClient) {\r\n this.rpcClient = rpcClient\r\n }\r\n\r\n async scheduleAsync(\r\n title: string,\r\n body: string,\r\n seconds: number,\r\n notificationId?: string,\r\n options?: ScheduleNotificationOptions\r\n ): Promise<string | null> {\r\n const { priority = 50, groupId, payload } = options || {}\r\n \r\n const request: ScheduleLocalNotificationRequest = {\r\n title,\r\n body,\r\n priority,\r\n key: groupId,\r\n data: payload,\r\n seconds,\r\n notificationId,\r\n }\r\n const response =\r\n await this.rpcClient.call<ScheduleLocalNotificationResponse>(\r\n VenusMessageId.SCHEDULE_LOCAL_NOTIFICATION,\r\n request,\r\n )\r\n\r\n if (response.scheduled) {\r\n return response.id\r\n }\r\n return null\r\n }\r\n\r\n async cancelNotification(id: string): Promise<boolean> {\r\n const result = await this.rpcClient.call<CancelLocalNotificationResult>(\r\n VenusMessageId.CANCEL_LOCAL_NOTIFICATION,\r\n {\r\n id: id,\r\n },\r\n )\r\n return result.canceled\r\n }\r\n\r\n async getAllScheduledLocalNotifications(): Promise<\r\n ScheduleLocalNotification[]\r\n > {\r\n const response =\r\n await this.rpcClient.call<GetAllLocalNotificationsResponse>(\r\n VenusMessageId.GET_ALL_SCHEDULED_LOCAL_NOTIFICATIONS,\r\n {},\r\n )\r\n\r\n const notifications: ScheduleLocalNotification[] =\r\n response.notifications.map((notif) => {\r\n return {\r\n id: notif.identifier,\r\n title: notif.content.title,\r\n body: notif.content.body,\r\n payload: notif.content.data,\r\n trigger: notif.trigger,\r\n }\r\n })\r\n\r\n return notifications\r\n }\r\n\r\n async isLocalNotificationsEnabled(): Promise<boolean> {\r\n const response =\r\n await this.rpcClient.call<IsLocalNotificationsEnabledResponse>(\r\n VenusMessageId.IS_LOCAL_NOTIFICATIONS_ENABLED,\r\n {},\r\n )\r\n return response.enabled\r\n }\r\n\r\n async setLocalNotificationsEnabled(enabled: boolean): Promise<boolean> {\r\n const response =\r\n await this.rpcClient.call<SetLocalNotificationsEnabledResponse>(\r\n VenusMessageId.SET_LOCAL_NOTIFICATIONS_ENABLED,\r\n {\r\n enabled: enabled,\r\n },\r\n )\r\n return response.enabled\r\n }\r\n}\r\n\r\ninterface CancelLocalNotificationResult {\r\n id: string\r\n canceled: boolean\r\n}\r\n\r\ninterface ScheduleLocalNotificationRequest {\r\n title: string\r\n body: string\r\n priority: number\r\n key?: string // Optional key for grouping related notifications\r\n data?: Record<string, any>\r\n seconds?: number\r\n notificationId?: string\r\n}\r\n\r\ninterface ScheduleLocalNotificationResponse {\r\n id: string\r\n scheduled: boolean\r\n trigger?: NotificationTriggerInput\r\n}\r\n\r\ninterface IsLocalNotificationsEnabledResponse {\r\n enabled: boolean\r\n}\r\n\r\ninterface SetLocalNotificationsEnabledResponse {\r\n enabled: boolean\r\n}\r\n\r\ninterface GetAllLocalNotificationsResponse {\r\n notifications: NotificationRequest[]\r\n count: number\r\n}\r\n\r\ninterface NotificationRequest {\r\n identifier: string\r\n content: NotificationContent\r\n trigger?: NotificationTriggerInput\r\n}\r\n\r\nexport type NotificationContent = {\r\n title: string | null\r\n subtitle: string | null\r\n body: string | null\r\n data?: Record<string, any>\r\n}\r\n","import { VenusAPI } from '../venus-api/types'\r\nimport { Host } from '../Host'\r\n\r\nexport * from './NotificationsApi'\r\nexport * from './MockNotificationsApi'\r\nexport * from './RpcNotificationsApi'\r\n\r\nexport function initializeLocalNotifications(venusApi: VenusAPI, host: Host) {\r\n venusApi.notifications = host.notifications\r\n}\r\n","import { PopupsApi, ShowToastOptions } from './PopupsApi'\r\nimport { VenusMessageId } from '../VenusMessageId'\r\nimport { RpcClient } from '../rpc'\r\n\r\nexport class RpcPopupsApi implements PopupsApi {\r\n private readonly rpcClient: RpcClient\r\n\r\n constructor(rpcClient: RpcClient) {\r\n this.rpcClient = rpcClient\r\n }\r\n\r\n async showToast(\r\n message: string,\r\n options?: ShowToastOptions,\r\n ): Promise<boolean> {\r\n const duration = options?.duration ?? 3000\r\n const variant = options?.variant ?? 'info'\r\n const response = await this.rpcClient.call<ShowToastResponse>(\r\n VenusMessageId.TOAST,\r\n {\r\n message,\r\n duration,\r\n variant,\r\n action: options?.action,\r\n },\r\n duration + 2000,\r\n )\r\n return response.actionTriggered\r\n }\r\n}\r\n\r\nexport interface ShowToastResponse {\r\n shown: boolean\r\n actionTriggered: boolean\r\n}\r\n","import { PopupsApi, ShowToastOptions } from './PopupsApi'\r\nimport { MockOverlay } from '../MockOverlay'\r\n\r\nexport class MockPopupsApi implements PopupsApi {\r\n private readonly overlay: MockOverlay\r\n\r\n constructor(override: MockOverlay) {\r\n this.overlay = override\r\n }\r\n\r\n async showToast(\r\n message: string,\r\n options?: ShowToastOptions,\r\n ): Promise<boolean> {\r\n const variant = options?.variant ?? 'info'\r\n const duration = options?.duration ?? 3000\r\n const action = options?.action\r\n\r\n console.log('[Venus Mock] Toast:', message, {\r\n variant,\r\n duration,\r\n hasAction: !!action,\r\n })\r\n\r\n if (action) {\r\n const actionResult = window.confirm(\r\n `${message}\\n\\n[${action.label}] or [Cancel]`,\r\n )\r\n\r\n if (actionResult) {\r\n console.log('[Venus Mock] Toast action triggered:', action.label)\r\n return true\r\n }\r\n }\r\n return false\r\n }\r\n}\r\n","import { VenusAPI } from '../venus-api/types'\r\nimport { Host } from '../Host'\r\n\r\nexport * from './PopupsApi'\r\nexport * from './RpcPopupsApi'\r\nexport * from './MockPopupsApi'\r\n\r\nexport function initializePopups(venusApi: VenusAPI, host: Host) {\r\n venusApi.popups = host.popups\r\n}\r\n","import { ProfileApi } from './ProfileApi'\r\nimport { Profile } from '../venus-api/types'\r\nimport { VenusAPI } from '../venus-api/types'\r\n\r\nexport class HostProfileApi implements ProfileApi {\r\n private readonly venusApi: VenusAPI\r\n\r\n constructor(venusApi: VenusAPI) {\r\n this.venusApi = venusApi\r\n }\r\n\r\n getCurrentProfile(): Profile {\r\n const profile = this.venusApi._profileData\r\n \r\n if (!profile) {\r\n throw new Error(\r\n '[Venus SDK] Profile not available. You must await VenusAPI.initializeAsync() before calling getProfile(). INIT_SDK has not completed.',\r\n )\r\n }\r\n\r\n // Profile is already sanitized by RemoteHost.initialize()\r\n // Validate required fields\r\n if (!profile.id || !profile.username) {\r\n throw new Error(\r\n '[Venus SDK] INIT_SDK returned an incomplete profile (missing id/username). The host must supply valid profile data.',\r\n )\r\n }\r\n\r\n return {\r\n id: profile.id,\r\n username: profile.username,\r\n avatarUrl: profile.avatarUrl,\r\n isAnonymous: profile.isAnonymous,\r\n }\r\n }\r\n}\r\n","import { ProfileApi } from './ProfileApi'\r\nimport { Profile } from '../venus-api/types'\r\nimport { VenusAPI } from '../venus-api/types'\r\n\r\nexport class MockProfileApi implements ProfileApi {\r\n private readonly venusApi: VenusAPI\r\n\r\n constructor(venusApi: VenusAPI) {\r\n this.venusApi = venusApi\r\n }\r\n\r\n getCurrentProfile(): Profile {\r\n return {\r\n id: 'mock_profile_123',\r\n name: 'Mock User',\r\n username: 'mockuser',\r\n isAnonymous: false,\r\n }\r\n }\r\n}\r\n","import { VenusAPI } from '../venus-api/types.ts'\r\nimport { Host } from '../Host'\r\n\r\nexport * from './ProfileApi'\r\nexport * from './HostProfileApi'\r\nexport * from './MockProfileApi'\r\n\r\nexport function initializeProfile(venusApi: VenusAPI, host: Host) {\r\n // New API\r\n venusApi.getProfile = () => {\r\n return host.profile.getCurrentProfile()\r\n }\r\n \r\n // Deprecated API - kept for backwards compatibility\r\n venusApi.getCurrentProfile = () => {\r\n console.warn(\r\n '[Venus SDK] DEPRECATED: VenusAPI.getCurrentProfile() is deprecated. ' +\r\n 'Use VenusAPI.getProfile() instead. ' +\r\n 'See migration guide: https://docs.venus.com/migration/profile-api'\r\n )\r\n return host.profile.getCurrentProfile()\r\n }\r\n}\r\n","export const ROOM_GAME_PHASES = ['waiting', 'playing', 'ended'] as const\r\nexport type RoomGamePhase = (typeof ROOM_GAME_PHASES)[number]\r\n\r\nexport interface VenusRoomRulesGameState extends Record<string, unknown> {\r\n phase?: RoomGamePhase\r\n currentPlayer?: string | null\r\n turnOrder?: string[]\r\n turnCount?: number\r\n turnBased?: boolean\r\n playerStates?: Record<string, unknown>\r\n startParams?: {\r\n gameConfig: Record<string, unknown>\r\n turnOrder?: string[] | null\r\n startedBy: string\r\n startedAt: unknown\r\n }\r\n}\r\n\r\nexport interface VenusRoomRules extends Record<string, unknown> {\r\n hostProfileId?: string\r\n minPlayers?: number\r\n maxPlayers?: number\r\n turnBased?: boolean\r\n gameState?: VenusRoomRulesGameState\r\n}\r\n\r\nexport interface VenusRoomCustomMetadata extends Record<string, unknown> {\r\n rules?: VenusRoomRules\r\n}\r\n\r\nexport interface VenusRoomPayload extends Record<string, unknown> {\r\n id: string\r\n name?: string\r\n currentPlayers?: string[]\r\n maxPlayers?: number\r\n gameType?: string\r\n appId?: string\r\n type?: string\r\n createdBy?: string\r\n createdAt?: number\r\n updatedAt?: number\r\n isPrivate?: boolean\r\n status?: string\r\n customMetadata?: VenusRoomCustomMetadata\r\n admins?: string[]\r\n roomCode?: string\r\n description?: string\r\n data?: Record<string, unknown>\r\n version?: number\r\n}\r\n\r\nexport class VenusRoom {\r\n public readonly id: string\r\n public name?: string\r\n public players: string[]\r\n public maxPlayers?: number\r\n public gameType?: string\r\n public appId?: string\r\n public type?: string\r\n public createdBy?: string\r\n public createdAt?: number\r\n public updatedAt?: number\r\n public isPrivate?: boolean\r\n public status?: string\r\n public customMetadata: VenusRoomCustomMetadata\r\n public admins: string[]\r\n public roomCode?: string\r\n public description?: string\r\n public data: Record<string, unknown>\r\n public version?: number\r\n\r\n constructor(roomData: VenusRoomPayload) {\r\n this.id = roomData.id\r\n this.name = roomData.name\r\n this.players = Array.isArray(roomData.currentPlayers)\r\n ? [...roomData.currentPlayers]\r\n : []\r\n this.maxPlayers = roomData.maxPlayers\r\n this.gameType = roomData.gameType\r\n this.appId = roomData.appId\r\n this.type = roomData.type\r\n this.createdBy = roomData.createdBy\r\n this.createdAt = roomData.createdAt\r\n this.updatedAt = roomData.updatedAt\r\n this.isPrivate = roomData.isPrivate\r\n this.status = roomData.status\r\n this.customMetadata = roomData.customMetadata || {}\r\n this.admins = Array.isArray(roomData.admins) ? [...roomData.admins] : []\r\n this.roomCode = roomData.roomCode\r\n this.description = roomData.description\r\n this.data = roomData.data || {}\r\n this.version = roomData.version\r\n }\r\n}\r\n","import {\r\n RoomDataUpdate,\r\n RoomMessageEvent,\r\n ProposedMoveEvent,\r\n} from './RoomsApi'\r\nimport { VenusTransport, VenusMessage } from '../VenusTransport'\r\nimport { Subscription } from '../rpc'\r\n\r\n// Subscription state management shared between RoomsApi and notification routing\r\nexport interface RoomNotificationSubscriptionState {\r\n data: Record<string, Array<(event: RoomDataUpdate) => void>>\r\n messages: Record<string, Array<(event: RoomMessageEvent) => void>>\r\n gameEvents: Record<string, Array<(event: ProposedMoveEvent) => void>>\r\n}\r\n\r\n/**\r\n * Invoke callbacks with error handling. Logs and rethrows to fail loudly.\r\n */\r\nfunction invokeCallbacks<T>(\r\n callbacks: Array<(event: T) => void>,\r\n event: T,\r\n context: string,\r\n): void {\r\n callbacks.forEach((callback) => {\r\n try {\r\n callback(event)\r\n } catch (error) {\r\n console.error(`[Venus SDK] Error in ${context} callback:`, error)\r\n throw error\r\n }\r\n })\r\n}\r\n\r\n// Raw payloads delivered through the transport channel (without 'type' field)\r\ntype RawRoomDataNotification = Omit<RoomDataUpdate, 'type'>\r\ntype RawRoomMessageNotification = Omit<RoomMessageEvent, 'type'>\r\ntype RawProposedMoveNotification = Omit<ProposedMoveEvent, 'type'>\r\n\r\n/**\r\n * Set up room notification listeners using the transport's onVenusMessage hook.\r\n * This routes host-sent room notifications (H5_ROOM_DATA_UPDATED, etc.) to the\r\n * callbacks registered in the RoomsApi instance.\r\n * @param transport The Venus transport to listen for messages\r\n * @param getSubscriptions Function to retrieve subscription state from RoomsApi\r\n */\r\nexport function setupRoomNotifications(\r\n transport: VenusTransport,\r\n getSubscriptions: () => RoomNotificationSubscriptionState,\r\n): Subscription {\r\n return transport.onVenusMessage((message: VenusMessage) => {\r\n const subscriptions = getSubscriptions()\r\n if (!subscriptions) {\r\n return\r\n }\r\n\r\n // Route H5_ROOM_DATA_UPDATED notifications to data callbacks\r\n if (message.type === 'H5_ROOM_DATA_UPDATED') {\r\n const messageData = message.data as RawRoomDataNotification\r\n const { roomId, roomData } = messageData\r\n if (!roomId) return\r\n\r\n const callbacks = subscriptions.data[roomId] || []\r\n const event: RoomDataUpdate = {\r\n type: 'H5_ROOM_DATA_UPDATED',\r\n roomId,\r\n roomData,\r\n timestamp: messageData.timestamp,\r\n }\r\n\r\n invokeCallbacks(callbacks, event, 'room data')\r\n }\r\n\r\n // Route H5_ROOM_MESSAGE_* notifications to message callbacks\r\n if (\r\n message.type === 'H5_ROOM_MESSAGE_RECEIVED' ||\r\n message.type === 'H5_ROOM_MESSAGE_UPDATED' ||\r\n message.type === 'H5_ROOM_MESSAGE_DELETED'\r\n ) {\r\n const messageData = message.data as RawRoomMessageNotification\r\n const { roomId } = messageData\r\n if (!roomId) return\r\n\r\n const callbacks = subscriptions.messages[roomId] || []\r\n const event: RoomMessageEvent = {\r\n type: message.type as RoomMessageEvent['type'],\r\n roomId,\r\n message: messageData.message,\r\n timestamp: messageData.timestamp,\r\n }\r\n\r\n invokeCallbacks(callbacks, event, 'room message')\r\n }\r\n\r\n // Route H5_PROPOSED_MOVE_VALIDATION_UPDATED to game event callbacks\r\n if (message.type === 'app:h5:proposedMoveValidationUpdated') {\r\n const messageData = message.data as RawProposedMoveNotification\r\n const { roomId } = messageData\r\n if (!roomId) return\r\n\r\n const callbacks = subscriptions.gameEvents[roomId] || []\r\n const event: ProposedMoveEvent = {\r\n type: 'app:h5:proposedMoveValidationUpdated',\r\n roomId,\r\n proposedMoveData: messageData.proposedMoveData,\r\n proposedMoveId: messageData.proposedMoveId,\r\n changeType: messageData.changeType,\r\n timestamp: messageData.timestamp,\r\n }\r\n\r\n invokeCallbacks(callbacks, event, 'game event')\r\n }\r\n })\r\n}\r\n\r\n","import {\r\n RoomsApi,\r\n CreateRoomOptions,\r\n JoinOrCreateRoomOptions,\r\n JoinOrCreateResult,\r\n ListRoomsOptions,\r\n RoomSubscriptionOptions,\r\n RoomDataUpdate,\r\n RoomMessageEvent,\r\n ProposedMoveEvent,\r\n ProposeMoveRequest,\r\n ProposeMoveResult,\r\n ValidateMoveVerdict,\r\n ValidateMoveResult,\r\n UpdateRoomDataOptions,\r\n RoomMessageRequest,\r\n StartRoomGameOptions,\r\n} from './RoomsApi'\r\nimport { RpcClient } from '../rpc'\r\nimport { VenusMessageId } from '../VenusMessageId'\r\nimport { VenusTransport } from '../VenusTransport'\r\nimport type { VenusRoomPayload } from './VenusRoom'\r\nimport { VenusRoom } from './VenusRoom'\r\nimport {\r\n setupRoomNotifications,\r\n type RoomNotificationSubscriptionState,\r\n} from './setupRoomNotifications'\r\n\r\n/**\r\n * Host return formats (canonical):\r\n * - createRoomAsync -> VenusRoomPayload\r\n * - joinOrCreateRoomAsync -> { action, roomData, playersJoined }\r\n * - joinRoomByCodeAsync -> VenusRoomPayload\r\n * - getUserRoomsAsync -> { rooms: VenusRoomPayload[] }\r\n * - getRoomDataAsync -> Record<string, unknown>\r\n * - sendRoomMessageAsync -> string (messageId)\r\n * - proposeMoveAsync -> { proposedMoveId }\r\n */\r\ninterface JoinOrCreateRoomResultPayload {\r\n action: 'created' | 'joined'\r\n roomData: VenusRoomPayload\r\n playersJoined: number\r\n}\r\n\r\ninterface GetUserRoomsResponse {\r\n rooms: VenusRoomPayload[]\r\n}\r\n\r\nexport class RpcRoomsApi implements RoomsApi {\r\n private readonly rpcClient: RpcClient\r\n private readonly subscriptions: RoomNotificationSubscriptionState\r\n\r\n constructor(rpcClient: RpcClient) {\r\n this.rpcClient = rpcClient\r\n this.subscriptions = {\r\n data: {},\r\n messages: {},\r\n gameEvents: {},\r\n }\r\n }\r\n\r\n /**\r\n * Get the subscription state for external access (used by setupRoomNotifications)\r\n */\r\n getSubscriptions(): RoomNotificationSubscriptionState {\r\n return this.subscriptions\r\n }\r\n\r\n /**\r\n * Set up room notification routing from the transport\r\n */\r\n setupNotifications(transport: VenusTransport): void {\r\n setupRoomNotifications(transport, () => this.getSubscriptions())\r\n }\r\n\r\n async createRoomAsync(options: CreateRoomOptions): Promise<VenusRoom> {\r\n const roomData = await this.rpcClient.call<VenusRoomPayload>(\r\n VenusMessageId.H5_ROOM_CREATE,\r\n {\r\n options: options,\r\n },\r\n )\r\n const room = new VenusRoom(roomData)\r\n return room\r\n }\r\n\r\n async joinOrCreateRoomAsync(\r\n options: JoinOrCreateRoomOptions,\r\n ): Promise<JoinOrCreateResult> {\r\n const response = await this.rpcClient.call<JoinOrCreateRoomResultPayload>(\r\n VenusMessageId.H5_ROOM_JOIN_OR_CREATE,\r\n {\r\n options: options,\r\n },\r\n )\r\n const room = new VenusRoom(response.roomData)\r\n\r\n return {\r\n action: response.action,\r\n room: room,\r\n playersJoined: response.playersJoined,\r\n }\r\n }\r\n\r\n async joinRoomByCodeAsync(roomCode: string): Promise<VenusRoom> {\r\n const roomData = await this.rpcClient.call<VenusRoomPayload>(\r\n VenusMessageId.H5_ROOM_JOIN_BY_CODE,\r\n {\r\n roomCode: roomCode,\r\n },\r\n )\r\n const room = new VenusRoom(roomData)\r\n return room\r\n }\r\n\r\n // Get user's rooms with optional filtering\r\n async getUserRoomsAsync(options: ListRoomsOptions = {}): Promise<VenusRoom[]> {\r\n const response = await this.rpcClient.call<GetUserRoomsResponse>(\r\n VenusMessageId.H5_ROOM_GET_USER_ROOMS,\r\n {\r\n includeArchived: options.includeArchived ?? false,\r\n },\r\n )\r\n\r\n // Convert raw room data to VenusRoom objects and filter out corrupted entries\r\n const venusRooms: VenusRoom[] = []\r\n\r\n for (const roomData of response.rooms) {\r\n // Skip rooms with missing canonical ID\r\n if (!roomData.id) {\r\n console.warn('[Venus SDK] getUserRooms: Skipping room with missing ID:', roomData)\r\n continue\r\n }\r\n\r\n try {\r\n const venusRoom = new VenusRoom(roomData)\r\n venusRooms.push(venusRoom)\r\n } catch (error) {\r\n console.warn(\r\n '[Venus SDK] getUserRooms: Failed to create VenusRoom object:',\r\n error,\r\n roomData,\r\n )\r\n // Continue processing other rooms\r\n }\r\n }\r\n\r\n return venusRooms\r\n }\r\n\r\n /**\r\n * @deprecated Prefer server-authoritative flows (e.g. `proposeMoveAsync` / `startRoomGameAsync`)\r\n * and treat `customMetadata.rules.gameState` as the canonical room lifecycle state.\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 await this.rpcClient.call<void>(\r\n VenusMessageId.H5_ROOM_UPDATE_DATA,\r\n {\r\n roomId: room.id,\r\n updates,\r\n merge: options.merge ?? true,\r\n },\r\n )\r\n }\r\n\r\n async getRoomDataAsync(room: VenusRoom): Promise<Record<string, unknown>> {\r\n const data = await this.rpcClient.call<Record<string, unknown>>(\r\n VenusMessageId.H5_ROOM_GET_DATA,\r\n {\r\n roomId: room.id,\r\n },\r\n )\r\n return data\r\n }\r\n\r\n async sendRoomMessageAsync(\r\n venusRoom: VenusRoom,\r\n request: RoomMessageRequest,\r\n ): Promise<string> {\r\n const messageId = await this.rpcClient.call<string>(\r\n VenusMessageId.H5_ROOM_SEND_MESSAGE,\r\n {\r\n roomId: venusRoom.id,\r\n message: request.message,\r\n metadata: request.metadata,\r\n },\r\n )\r\n return messageId\r\n }\r\n\r\n async leaveRoomAsync(room: VenusRoom): Promise<void> {\r\n await this.rpcClient.call<void>(\r\n VenusMessageId.H5_ROOM_LEAVE,\r\n {\r\n roomId: room.id,\r\n },\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 const args: Record<string, unknown> = {\r\n roomId: room.id,\r\n targetProfileId,\r\n }\r\n\r\n // Avoid sending `undefined` optional fields (Firestore cannot store `undefined`)\r\n if (options.reason !== undefined) {\r\n args.reason = options.reason\r\n }\r\n\r\n await this.rpcClient.call<void>(VenusMessageId.H5_ROOM_KICK_PLAYER, args)\r\n }\r\n\r\n async startRoomGameAsync(\r\n room: VenusRoom,\r\n options: StartRoomGameOptions = {},\r\n ): Promise<void> {\r\n await this.rpcClient.call<void>(\r\n VenusMessageId.H5_ROOM_START_GAME,\r\n {\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 async proposeMoveAsync(\r\n room: VenusRoom,\r\n proposalPayload: ProposeMoveRequest,\r\n ): Promise<ProposeMoveResult> {\r\n const args: Record<string, unknown> = {\r\n roomId: room.id,\r\n gameSpecificState: proposalPayload.gameSpecificState,\r\n moveType: proposalPayload.moveType,\r\n }\r\n\r\n // Avoid sending `undefined` optional fields (Firestore cannot store `undefined`)\r\n if (proposalPayload.clientContext !== undefined) {\r\n args.clientContext = proposalPayload.clientContext\r\n }\r\n\r\n if (proposalPayload.clientProposalId !== undefined) {\r\n args.clientProposalId = proposalPayload.clientProposalId\r\n }\r\n\r\n const data = await this.rpcClient.call<ProposeMoveResult>(\r\n VenusMessageId.H5_ROOM_PROPOSE_MOVE,\r\n args,\r\n )\r\n return data\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 // TODO: Implement actual validation logic when peer validation is added\r\n // For now, just return success to maintain compatibility\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 async subscribeAsync(\r\n room: VenusRoom,\r\n options: RoomSubscriptionOptions = {},\r\n ): Promise<() => void> {\r\n const roomId = room.id\r\n\r\n const existingData = this.subscriptions.data[roomId]\r\n const existingMessages = this.subscriptions.messages[roomId]\r\n const existingGameEvents = this.subscriptions.gameEvents[roomId]\r\n\r\n const subscribeToData =\r\n Boolean(options.onData) && (existingData?.length ?? 0) === 0\r\n const subscribeToMessages =\r\n Boolean(options.onMessages) && (existingMessages?.length ?? 0) === 0\r\n const subscribeToProposedMoves =\r\n Boolean(options.onGameEvents) &&\r\n (existingGameEvents?.length ?? 0) === 0\r\n\r\n if (subscribeToData || subscribeToMessages || subscribeToProposedMoves) {\r\n try {\r\n await this.rpcClient.call(VenusMessageId.H5_ROOM_SUBSCRIBE, {\r\n roomId,\r\n subscribeToData,\r\n subscribeToMessages,\r\n subscribeToProposedMoves,\r\n })\r\n } catch (error) {\r\n console.error('[Venus SDK] Failed to set up room subscription:', error)\r\n throw error\r\n }\r\n }\r\n\r\n if (options.onData) {\r\n if (!this.subscriptions.data[roomId]) {\r\n this.subscriptions.data[roomId] = []\r\n }\r\n this.subscriptions.data[roomId].push(options.onData)\r\n }\r\n\r\n if (options.onMessages) {\r\n if (!this.subscriptions.messages[roomId]) {\r\n this.subscriptions.messages[roomId] = []\r\n }\r\n this.subscriptions.messages[roomId].push(options.onMessages)\r\n }\r\n\r\n if (options.onGameEvents) {\r\n if (!this.subscriptions.gameEvents[roomId]) {\r\n this.subscriptions.gameEvents[roomId] = []\r\n }\r\n this.subscriptions.gameEvents[roomId].push(options.onGameEvents)\r\n }\r\n\r\n let disposed = false\r\n return () => {\r\n if (disposed) return\r\n disposed = true\r\n\r\n if (options.onData) {\r\n const callbacks = this.subscriptions.data[roomId]\r\n if (callbacks) {\r\n const index = callbacks.indexOf(options.onData)\r\n if (index > -1) {\r\n callbacks.splice(index, 1)\r\n }\r\n }\r\n }\r\n\r\n if (options.onMessages) {\r\n const callbacks = this.subscriptions.messages[roomId]\r\n if (callbacks) {\r\n const index = callbacks.indexOf(options.onMessages)\r\n if (index > -1) {\r\n callbacks.splice(index, 1)\r\n }\r\n }\r\n }\r\n\r\n if (options.onGameEvents) {\r\n const callbacks = this.subscriptions.gameEvents[roomId]\r\n if (callbacks) {\r\n const index = callbacks.indexOf(options.onGameEvents)\r\n if (index > -1) {\r\n callbacks.splice(index, 1)\r\n }\r\n }\r\n }\r\n\r\n const hasAnySubscriptions =\r\n (this.subscriptions.data[roomId]?.length ?? 0) > 0 ||\r\n (this.subscriptions.messages[roomId]?.length ?? 0) > 0 ||\r\n (this.subscriptions.gameEvents[roomId]?.length ?? 0) > 0\r\n\r\n if (!hasAnySubscriptions) {\r\n this.rpcClient\r\n .call(VenusMessageId.H5_ROOM_UNSUBSCRIBE, {\r\n roomId,\r\n })\r\n .catch((error) => {\r\n console.error('[Venus SDK] Failed to clean up room subscription:', error)\r\n })\r\n }\r\n }\r\n }\r\n}\r\n","import { VenusAPI } from '../venus-api/types'\r\nimport { Host } from '../Host'\r\nimport { RoomsApi } from './RoomsApi'\r\n\r\nexport * from './RoomsApi'\r\nexport * from './VenusRoom'\r\nexport * from './RpcRoomsApi'\r\nexport * from './setupRoomNotifications'\r\n// HttpRoomsApi, FirestoreRoomsApi, CompositeRemoteRoomsApi are intentionally NOT exported here.\r\n// They depend on Firebase (via callRemoteFunction) and should only be imported by SandboxHost.\r\n// This prevents Firebase from being bundled in production builds.\r\n\r\ntype MutableVenusApi = VenusAPI & Record<string, any>\r\ntype MutableRoomsApi = RoomsApi & Record<string, any>\r\n\r\nfunction bindMethod(\r\n target: Record<string, any>,\r\n targetKey: string,\r\n source: MutableRoomsApi,\r\n sourceKey?: string,\r\n) {\r\n const key = sourceKey ?? targetKey\r\n const fn = source?.[key]\r\n if (typeof fn === 'function') {\r\n target[targetKey] = fn.bind(source)\r\n return true\r\n }\r\n return false\r\n}\r\n\r\nexport function initializeRoomsApi(venusApi: VenusAPI, host: Host) {\r\n const roomsApi = host?.rooms as MutableRoomsApi | undefined\r\n if (!roomsApi) {\r\n console.warn(\r\n '[Venus SDK] Host did not provide a rooms implementation. Rooms API will be unavailable.',\r\n )\r\n return\r\n }\r\n\r\n const venus = venusApi as MutableVenusApi\r\n const existingNamespace = (venus.rooms || {}) as Record<string, any>\r\n const roomsNamespace: Record<string, any> = Object.assign({}, existingNamespace)\r\n\r\n const namespaceBindings: Array<[string, string?]> = [\r\n ['createRoomAsync'],\r\n ['joinOrCreateRoomAsync'],\r\n ['joinRoomByCodeAsync'],\r\n ['getUserRoomsAsync'],\r\n ['subscribeAsync'],\r\n ['updateRoomDataAsync'],\r\n ['getRoomDataAsync'],\r\n ['sendRoomMessageAsync'],\r\n ['leaveRoomAsync'],\r\n ['kickPlayerAsync'],\r\n ['startRoomGameAsync'],\r\n ['proposeMoveAsync'],\r\n ['validateMoveAsync'],\r\n ]\r\n\r\n namespaceBindings.forEach(([targetKey, sourceKey]) => {\r\n bindMethod(roomsNamespace, targetKey, roomsApi, sourceKey)\r\n })\r\n\r\n venus.rooms = roomsNamespace as any\r\n}\r\n","import { StorageApi } from './StorageApi.ts'\r\n\r\nexport type StorageType = 'globalStorage' | 'deviceCache' | 'appStorage'\r\n\r\nconst STORAGE_PREFIXES: Record<StorageType, string> = {\r\n globalStorage: 'venus:global',\r\n deviceCache: 'venus:deviceCache',\r\n appStorage: 'venus:appStorage',\r\n}\r\n\r\nexport function createMockStorageApi(\r\n storageType: StorageType,\r\n appUrl?: string,\r\n) {\r\n const appIdentifier = appUrl ? generateAppIdentifier(appUrl) : null\r\n\r\n let prefix = STORAGE_PREFIXES[storageType]\r\n let syncDelay = 0 // Simulate sync delay for cloud storage\r\n\r\n switch (storageType) {\r\n case 'deviceCache':\r\n syncDelay = 0 // No sync delay\r\n break\r\n case 'appStorage':\r\n syncDelay = 100 // Simulate cloud sync delay\r\n break\r\n case 'globalStorage':\r\n syncDelay = 100 // Simulate cloud sync delay\r\n break\r\n default:\r\n throw new Error(`Unknown storage type: ${storageType}`)\r\n }\r\n\r\n prefix =\r\n storageType === 'globalStorage' || !appIdentifier\r\n ? `${prefix}:`\r\n : `${prefix}:${appIdentifier}:`\r\n\r\n return new MockStorageApi(prefix, syncDelay)\r\n}\r\n\r\nexport class MockStorageApi implements StorageApi {\r\n private readonly prefix: string\r\n private readonly syncDelay: number\r\n private readonly orderStorageKey: string\r\n\r\n constructor(prefix: string, syncDelay: number) {\r\n this.prefix = prefix\r\n this.syncDelay = syncDelay\r\n this.orderStorageKey = `${prefix}__order__`\r\n }\r\n\r\n async clear(): Promise<void> {\r\n const keysToRemove: string[] = []\r\n const fullLength = localStorage.length\r\n for (let i = 0; i < fullLength; i++) {\r\n const fullKey = localStorage.key(i)\r\n if (!fullKey || fullKey === this.orderStorageKey) {\r\n continue\r\n }\r\n if (fullKey.startsWith(this.prefix)) {\r\n keysToRemove.push(fullKey)\r\n }\r\n }\r\n for (const key of keysToRemove) {\r\n localStorage.removeItem(key)\r\n }\r\n this.clearOrder()\r\n await this.simulateSyncDelay()\r\n }\r\n\r\n async getAllItems(): Promise<string[]> {\r\n const items = new Array<string>()\r\n const orderedKeys = this.keys()\r\n for (const key of orderedKeys) {\r\n const value = localStorage.getItem(this.buildKey(key))\r\n if (value !== null) {\r\n items.push(value)\r\n } else {\r\n this.removeFromOrder(key)\r\n }\r\n }\r\n return items\r\n }\r\n\r\n async getAllData(): Promise<Record<string, string>> {\r\n const result: Record<string, string> = {}\r\n const orderedKeys = this.keys()\r\n for (const key of orderedKeys) {\r\n const value = localStorage.getItem(this.buildKey(key))\r\n if (value !== null) {\r\n result[key] = value\r\n } else {\r\n this.removeFromOrder(key)\r\n }\r\n }\r\n return result\r\n }\r\n\r\n async getItem(key: string): Promise<string | null> {\r\n const fullKey = this.buildKey(key)\r\n await this.simulateSyncDelay()\r\n return localStorage.getItem(fullKey)\r\n }\r\n\r\n async key(index: number): Promise<string | null> {\r\n const keys = this.keys()\r\n if (index < 0 || index >= keys.length) {\r\n return null\r\n }\r\n await this.simulateSyncDelay()\r\n return keys[index]\r\n }\r\n\r\n async length(): Promise<number> {\r\n return this.keys().length\r\n }\r\n\r\n async removeItem(key: string): Promise<void> {\r\n const fullKey = this.buildKey(key)\r\n await this.simulateSyncDelay()\r\n localStorage.removeItem(fullKey)\r\n this.removeFromOrder(key)\r\n }\r\n\r\n async setItem(key: string, item: string): Promise<void> {\r\n const fullKey = this.buildKey(key)\r\n await this.simulateSyncDelay()\r\n localStorage.setItem(fullKey, item)\r\n this.upsertOrder(key)\r\n }\r\n\r\n async setMultipleItems(\r\n entries: { key: string; value: string }[],\r\n ): Promise<void> {\r\n for (const entry of entries) {\r\n const fullKey = this.buildKey(entry.key)\r\n localStorage.setItem(fullKey, entry.value)\r\n }\r\n await this.simulateSyncDelay()\r\n this.bulkUpsertOrder(entries.map((entry) => entry.key))\r\n }\r\n\r\n async removeMultipleItems(keys: string[]): Promise<void> {\r\n for (const key of keys) {\r\n const fullKey = this.buildKey(key)\r\n localStorage.removeItem(fullKey)\r\n }\r\n await this.simulateSyncDelay()\r\n this.bulkRemoveFromOrder(keys)\r\n }\r\n\r\n private buildKey(key: string): string {\r\n const prefix = this.prefix\r\n return `${prefix}${key}`\r\n }\r\n\r\n private extractKey(fullKey: string): string {\r\n const prefix = this.prefix\r\n return fullKey.substring(prefix.length)\r\n }\r\n\r\n private keys(): string[] {\r\n const order = this.readOrder()\r\n return [...order]\r\n }\r\n\r\n private async simulateSyncDelay() {\r\n const syncDelay = this.syncDelay\r\n if (syncDelay > 0) {\r\n await new Promise((resolve) => setTimeout(resolve, syncDelay))\r\n }\r\n }\r\n\r\n private readOrder(): string[] {\r\n const raw = localStorage.getItem(this.orderStorageKey)\r\n if (!raw) {\r\n return this.rebuildOrderFromStorage()\r\n }\r\n try {\r\n const parsed = JSON.parse(raw)\r\n if (Array.isArray(parsed)) {\r\n return this.normalizeOrder(parsed)\r\n }\r\n } catch {\r\n // Fall through to rebuild order below\r\n }\r\n return this.rebuildOrderFromStorage()\r\n }\r\n\r\n private normalizeOrder(order: unknown[]): string[] {\r\n const seen = new Set<string>()\r\n const normalized: string[] = []\r\n let changed = false\r\n\r\n for (const entry of order) {\r\n if (typeof entry !== 'string') {\r\n changed = true\r\n continue\r\n }\r\n if (seen.has(entry)) {\r\n changed = true\r\n continue\r\n }\r\n const fullKey = this.buildKey(entry)\r\n if (localStorage.getItem(fullKey) === null) {\r\n changed = true\r\n continue\r\n }\r\n seen.add(entry)\r\n normalized.push(entry)\r\n }\r\n\r\n if (changed) {\r\n this.writeOrder(normalized)\r\n }\r\n\r\n return normalized\r\n }\r\n\r\n private rebuildOrderFromStorage(): string[] {\r\n const keys: string[] = []\r\n const total = localStorage.length\r\n for (let i = 0; i < total; i++) {\r\n const fullKey = localStorage.key(i)\r\n if (!fullKey) continue\r\n if (fullKey === this.orderStorageKey) continue\r\n if (fullKey.startsWith(this.prefix)) {\r\n keys.push(this.extractKey(fullKey))\r\n }\r\n }\r\n this.writeOrder(keys)\r\n return keys\r\n }\r\n\r\n private upsertOrder(key: string) {\r\n const order = this.readOrder()\r\n const index = order.indexOf(key)\r\n if (index !== -1) {\r\n order.splice(index, 1)\r\n }\r\n order.push(key)\r\n this.writeOrder(order)\r\n }\r\n\r\n private bulkUpsertOrder(keys: string[]) {\r\n const dedupedKeys = this.dedupeKeys(keys)\r\n if (dedupedKeys.length === 0) {\r\n return\r\n }\r\n const order = this.readOrder()\r\n const keysSet = new Set(dedupedKeys)\r\n const filtered = order.filter((entry) => !keysSet.has(entry))\r\n for (const key of dedupedKeys) {\r\n filtered.push(key)\r\n }\r\n this.writeOrder(filtered)\r\n }\r\n\r\n private removeFromOrder(key: string) {\r\n const order = this.readOrder()\r\n const index = order.indexOf(key)\r\n if (index !== -1) {\r\n order.splice(index, 1)\r\n this.writeOrder(order)\r\n }\r\n }\r\n\r\n private bulkRemoveFromOrder(keys: string[]) {\r\n const dedupedKeys = this.dedupeKeys(keys)\r\n if (dedupedKeys.length === 0) {\r\n return\r\n }\r\n const order = this.readOrder()\r\n const keysSet = new Set(dedupedKeys)\r\n const filtered = order.filter((entry) => !keysSet.has(entry))\r\n if (filtered.length !== order.length) {\r\n this.writeOrder(filtered)\r\n }\r\n }\r\n\r\n private writeOrder(order: string[]) {\r\n if (order.length === 0) {\r\n localStorage.removeItem(this.orderStorageKey)\r\n return\r\n }\r\n localStorage.setItem(this.orderStorageKey, JSON.stringify(order))\r\n }\r\n\r\n private clearOrder() {\r\n localStorage.removeItem(this.orderStorageKey)\r\n }\r\n\r\n private dedupeKeys(keys: string[]): string[] {\r\n const result: string[] = []\r\n const seen = new Set<string>()\r\n for (const key of keys) {\r\n if (typeof key !== 'string') {\r\n continue\r\n }\r\n if (seen.has(key)) {\r\n continue\r\n }\r\n seen.add(key)\r\n result.push(key)\r\n }\r\n return result\r\n }\r\n}\r\n\r\nfunction generateAppIdentifier(appUrl?: string) {\r\n if (!appUrl) appUrl = ''\r\n\r\n // First normalize to ensure we're hashing the same identifier regardless of format\r\n const normalizedId = normalizeAppIdentifier(appUrl)\r\n // Generating hash for normalized ID\r\n\r\n let hash = 0\r\n for (let i = 0; i < normalizedId.length; i++) {\r\n const char = normalizedId.charCodeAt(i)\r\n hash = (hash << 5) - hash + char // Same as real API - djb2 hash algorithm\r\n hash |= 0 // Convert to 32bit integer\r\n }\r\n\r\n // Convert to hex\r\n // Generated app identifier\r\n return Math.abs(hash).toString(16)\r\n}\r\n\r\nfunction normalizeAppIdentifier(input: string) {\r\n // Normalizing app identifier input\r\n\r\n // Handle full URLs\r\n if (input.startsWith('http')) {\r\n try {\r\n // For URLs like http://127.0.0.1:5000/H5/bird-flap/index.html?cacheBust=12345678\r\n // Extract the app ID part (bird-flap)\r\n const url = new URL(input)\r\n const pathParts = url.pathname.split('/')\r\n\r\n // Find the part after 'H5' in the path\r\n const h5Index = pathParts.findIndex((part) => part === 'H5')\r\n if (h5Index !== -1 && h5Index < pathParts.length - 1) {\r\n const appId = pathParts[h5Index + 1]\r\n // Extracted app ID from full URL path\r\n return appId\r\n }\r\n\r\n // If we couldn't extract from path, use the hostname as fallback\r\n // Could not extract app ID from URL path, using hostname\r\n return url.hostname\r\n } catch (error) {\r\n console.error(`[Venus Mock] Error parsing URL: ${error}`, { input })\r\n // If URL parsing fails, treat as a raw ID\r\n return input\r\n }\r\n }\r\n\r\n // Handle path-based URLs like '/H5/bird-flap/index.html'\r\n if (input.includes('/H5/')) {\r\n try {\r\n const pathParts = input.split('/')\r\n // Find the part after 'H5' in the path\r\n const h5Index = pathParts.findIndex((part) => part === 'H5')\r\n if (h5Index !== -1 && h5Index < pathParts.length - 1) {\r\n const appId = pathParts[h5Index + 1]\r\n // Extracted app ID from path-based URL\r\n return appId\r\n }\r\n } catch (error) {\r\n console.error(`[Venus Mock] Error parsing path-based URL: ${error}`, {\r\n input,\r\n })\r\n }\r\n }\r\n\r\n // Not a URL, just return as is\r\n // Input is not a URL, treating as raw app ID\r\n return input\r\n}\r\n","import { RpcClient } from '../rpc'\r\nimport { StorageApi } from './StorageApi.ts'\r\n\r\nexport interface MethodIds {\r\n clear: string\r\n getItem: string\r\n getKey: string\r\n length: string\r\n removeItem: string\r\n setItem: string\r\n getAllItems?: string\r\n removeMultipleItems?: string\r\n setMultipleItems?: string\r\n}\r\n\r\nexport class RpcStorageApi implements StorageApi {\r\n private readonly rpcClient: RpcClient\r\n private readonly methodIds: MethodIds\r\n\r\n constructor(rpcClient: RpcClient, methodIds: MethodIds) {\r\n this.rpcClient = rpcClient\r\n this.methodIds = methodIds\r\n }\r\n\r\n clear(): Promise<void> {\r\n return this.rpcClient.call(this.methodIds.clear)\r\n }\r\n\r\n getItem(key: string): Promise<string | null> {\r\n return this.rpcClient.call(this.methodIds.getItem, {\r\n key: key,\r\n })\r\n }\r\n\r\n setItem(key: string, value: string): Promise<void> {\r\n return this.rpcClient.call(this.methodIds.setItem, {\r\n key: key,\r\n value: value,\r\n })\r\n }\r\n\r\n key(index: number): Promise<string | null> {\r\n return this.rpcClient.call(this.methodIds.getKey, {\r\n index: index,\r\n })\r\n }\r\n\r\n length(): Promise<number> {\r\n return this.rpcClient.call(this.methodIds.length)\r\n }\r\n\r\n removeItem(key: string): Promise<void> {\r\n return this.rpcClient.call(this.methodIds.removeItem, {\r\n key: key,\r\n })\r\n }\r\n\r\n removeMultipleItems(keys: string[]): Promise<void> {\r\n if (!this.methodIds.removeMultipleItems) {\r\n throw new Error('Method not implemented')\r\n }\r\n return this.rpcClient.call(this.methodIds.removeMultipleItems, {\r\n keys: keys,\r\n })\r\n }\r\n\r\n getAllItems(): Promise<string[]> {\r\n if (!this.methodIds.getAllItems) {\r\n throw new Error('Method not implemented')\r\n }\r\n return this.rpcClient.call(this.methodIds.getAllItems)\r\n }\r\n\r\n async getAllData(): Promise<Record<string, string>> {\r\n // Build from existing methods - get all keys then fetch values\r\n const result: Record<string, string> = {}\r\n const len = await this.length()\r\n\r\n for (let i = 0; i < len; i++) {\r\n const key = await this.key(i)\r\n if (key !== null) {\r\n const value = await this.getItem(key)\r\n if (value !== null) {\r\n result[key] = value\r\n }\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n setMultipleItems(items: { key: string; value: string }[]): Promise<void> {\r\n if (!this.methodIds.setMultipleItems) {\r\n throw new Error('Method not implemented')\r\n }\r\n return this.rpcClient.call(this.methodIds.setMultipleItems, {\r\n items: items,\r\n })\r\n }\r\n}\r\n","import { VenusAPI } from '../venus-api/types.ts'\r\nimport { Host } from '../Host.ts'\r\n\r\nexport * from './StorageApi'\r\nexport * from './MockStorageApi'\r\nexport * from './RpcStorageApi'\r\n// FirestoreStorageApi is intentionally NOT exported here.\r\n// It depends on Firebase and should only be imported by SandboxHost via direct import.\r\n// This prevents Firebase from being bundled in production builds.\r\n\r\nexport function initializeStorage(venusApiInstance: VenusAPI, host: Host) {\r\n venusApiInstance.deviceCache = host.deviceCache\r\n venusApiInstance.appStorage = host.appStorage\r\n venusApiInstance.globalStorage = host.globalStorage\r\n}\r\n","export function isPacificDaylightTime(date: Date) {\r\n // US DST rules: Starts second Sunday in March, ends first Sunday in November\r\n const year = date.getFullYear()\r\n\r\n // Calculate second Sunday in March\r\n const marchStart = new Date(year, 2, 8) // March 8th\r\n const daysUntilSundayInMarch = (7 - marchStart.getDay()) % 7\r\n const dstStart = new Date(year, 2, 8 + daysUntilSundayInMarch)\r\n dstStart.setHours(2, 0, 0, 0) // 2am local time\r\n\r\n // Calculate first Sunday in November\r\n const novemberStart = new Date(year, 10, 1) // November 1st\r\n const daysUntilSundayInNov = (7 - novemberStart.getDay()) % 7\r\n const dstEnd = new Date(year, 10, 1 + daysUntilSundayInNov)\r\n dstEnd.setHours(2, 0, 0, 0) // 2am local time\r\n\r\n // Compare with current date\r\n return date >= dstStart && date < dstEnd\r\n}\r\n","import { GetFutureTimeOptions, ServerTimeData, TimeApi } from './TimeApi'\r\nimport { RpcClient } from '../rpc'\r\nimport { VenusMessageId } from '../VenusMessageId'\r\nimport { isPacificDaylightTime } from './utils'\r\nimport { VenusAPI } from '../venus-api/types'\r\n\r\nexport class HostTimeApi implements TimeApi {\r\n private readonly rpcClient: RpcClient\r\n private readonly venusApi: VenusAPI\r\n\r\n constructor(rpcClient: RpcClient, venusApi: VenusAPI) {\r\n this.rpcClient = rpcClient\r\n this.venusApi = venusApi\r\n }\r\n\r\n async requestTimeAsync(): Promise<ServerTimeData> {\r\n const response = await this.rpcClient.call<ServerTimeData>(\r\n VenusMessageId.REQUEST_SERVER_TIME,\r\n {},\r\n )\r\n return response\r\n }\r\n\r\n formatTime(timestamp: number, options?: any): string {\r\n const locale = this.venusApi.getLocale()\r\n\r\n // Create a Date object from the timestamp\r\n const date = new Date(timestamp)\r\n\r\n // Format options\r\n const dateTimeOptions = {\r\n dateStyle: options.dateStyle || 'medium',\r\n timeStyle: options.timeStyle || 'medium',\r\n hour12: options.hour12 !== undefined ? options.hour12 : true,\r\n ...options,\r\n }\r\n\r\n return date.toLocaleString(locale, dateTimeOptions)\r\n }\r\n\r\n formatNumber(value: number, options?: Intl.NumberFormatOptions): string {\r\n try {\r\n const locale = this.venusApi.getLocale()\r\n\r\n // Format options\r\n const numberOptions = {\r\n style: options?.style || 'decimal',\r\n minimumFractionDigits: options?.minimumFractionDigits || 0,\r\n maximumFractionDigits: options?.maximumFractionDigits || 2,\r\n ...options,\r\n }\r\n\r\n return value.toLocaleString(locale, numberOptions)\r\n } catch (error) {\r\n console.error('[Venus] Error formatting number:', error)\r\n // Fallback to basic formatting\r\n return String(value)\r\n }\r\n }\r\n\r\n async getFutureTimeAsync(options?: GetFutureTimeOptions): Promise<number> {\r\n // Get the current server time first\r\n const timeInfo = await this.requestTimeAsync()\r\n\r\n // Start with the server time\r\n const serverTime = new Date(timeInfo.serverTime)\r\n const result = new Date(serverTime)\r\n\r\n // Add days, hours, and minutes if specified\r\n if (options?.days) {\r\n result.setDate(result.getDate() + options.days)\r\n }\r\n\r\n if (options?.hours) {\r\n result.setHours(result.getHours() + options.hours)\r\n }\r\n\r\n if (options?.minutes) {\r\n result.setMinutes(result.getMinutes() + options.minutes)\r\n }\r\n\r\n // Set specific time of day if requested\r\n if (options?.timeOfDay) {\r\n const { hour = 0, minute = 0, second = 0 } = options.timeOfDay\r\n\r\n // If we're setting the time of day, we do it in the user's local timezone\r\n // Get timezone offset in minutes\r\n const timezoneOffset =\r\n timeInfo.timezoneOffset || new Date().getTimezoneOffset()\r\n\r\n // First set the UTC time that corresponds to the local time\r\n const localHour = hour\r\n\r\n // Reset hours, minutes, seconds\r\n result.setHours(localHour, minute, second, 0)\r\n }\r\n\r\n // For specific timezones, we need to convert\r\n if (options?.timezone) {\r\n switch (options.timezone.toUpperCase()) {\r\n case 'PT':\r\n case 'PST':\r\n case 'PDT': {\r\n // Handle Pacific Time conversion\r\n // First determine if date is in PDT\r\n const isPDT = isPacificDaylightTime(result)\r\n const ptOffset = isPDT ? -7 : -8 // PDT is UTC-7, PST is UTC-8\r\n\r\n // Reset time to midnight UTC\r\n result.setUTCHours(0, 0, 0, 0)\r\n\r\n // Add the specific time in PT (converting to UTC)\r\n const { hour = 0, minute = 0, second = 0 } = options.timeOfDay || {}\r\n\r\n // Convert PT time to UTC time\r\n // e.g., 9am PT = 16:00 or 17:00 UTC\r\n const utcHour = (hour - ptOffset) % 24\r\n result.setUTCHours(utcHour, minute, second, 0)\r\n break\r\n }\r\n // Add other timezone cases as needed\r\n default:\r\n console.warn(\r\n '[Venus] Timezone ' +\r\n options.timezone +\r\n ' not supported, using local time',\r\n )\r\n }\r\n }\r\n\r\n // Return direct timestamp number\r\n return result.getTime()\r\n }\r\n}\r\n","import { GetFutureTimeOptions, ServerTimeData, TimeApi } from './TimeApi'\r\nimport { createMockDelay, MOCK_DELAYS } from '../venus-api/systems/core'\r\nimport { VenusAPI } from '../venus-api/types'\r\nimport { isPacificDaylightTime } from './utils'\r\n\r\nexport class MockTimeApi implements TimeApi {\r\n private readonly venusApi: VenusAPI\r\n\r\n constructor(venusApi: VenusAPI) {\r\n this.venusApi = venusApi\r\n }\r\n\r\n formatNumber(value: number, options?: Intl.NumberFormatOptions): string {\r\n const locale = this.venusApi.getLocale()\r\n\r\n // Format options\r\n const numberOptions = {\r\n style: options?.style || 'decimal',\r\n minimumFractionDigits: options?.minimumFractionDigits || 0,\r\n maximumFractionDigits: options?.maximumFractionDigits || 2,\r\n ...options,\r\n }\r\n\r\n return value.toLocaleString(locale, numberOptions)\r\n }\r\n\r\n formatTime(timestamp: number, options?: any): string {\r\n const locale = this.venusApi.getLocale()\r\n\r\n // Create a Date object from the timestamp\r\n const date = new Date(timestamp)\r\n\r\n // Format options\r\n const dateTimeOptions = {\r\n dateStyle: options.dateStyle || 'medium',\r\n timeStyle: options.timeStyle || 'medium',\r\n hour12: options.hour12 !== undefined ? options.hour12 : true,\r\n ...options,\r\n }\r\n\r\n return date.toLocaleString(locale, dateTimeOptions)\r\n }\r\n\r\n async getFutureTimeAsync(options?: GetFutureTimeOptions): Promise<number> {\r\n // Get the current server time first - now returns direct TimeInfo object\r\n const timeInfo = await this.requestTimeAsync()\r\n\r\n // Start with the server time\r\n const serverTime = new Date(timeInfo.serverTime)\r\n const result = new Date(serverTime)\r\n\r\n // Add days, hours, and minutes if specified\r\n if (options?.days) {\r\n result.setDate(result.getDate() + options.days)\r\n }\r\n\r\n if (options?.hours) {\r\n result.setHours(result.getHours() + options.hours)\r\n }\r\n\r\n if (options?.minutes) {\r\n result.setMinutes(result.getMinutes() + options.minutes)\r\n }\r\n\r\n // Set specific time of day if requested\r\n if (options?.timeOfDay) {\r\n const { hour = 0, minute = 0, second = 0 } = options.timeOfDay\r\n\r\n // If we're setting the time of day, we do it in the user's local timezone\r\n // Get timezone offset in minutes\r\n const timezoneOffset =\r\n timeInfo.timezoneOffset || new Date().getTimezoneOffset()\r\n\r\n // First set the UTC time that corresponds to the local time\r\n const localHour = hour\r\n\r\n // Reset hours, minutes, seconds\r\n result.setHours(localHour, minute, second, 0)\r\n }\r\n\r\n // For specific timezones, we need to convert\r\n if (options?.timezone) {\r\n switch (options?.timezone.toUpperCase()) {\r\n case 'PT':\r\n case 'PST':\r\n case 'PDT': {\r\n // Handle Pacific Time conversion\r\n // First determine if date is in PDT\r\n const isPDT = isPacificDaylightTime(result)\r\n const ptOffset = isPDT ? -7 : -8 // PDT is UTC-7, PST is UTC-8\r\n\r\n // Reset time to midnight UTC\r\n const utcDay = result.getUTCDate()\r\n const utcMonth = result.getUTCMonth()\r\n const utcYear = result.getUTCFullYear()\r\n result.setUTCHours(0, 0, 0, 0)\r\n\r\n // Add the specific time in PT (converting to UTC)\r\n const { hour = 0, minute = 0, second = 0 } = options.timeOfDay || {}\r\n\r\n // Convert PT time to UTC time\r\n // e.g., 9am PT = 16:00 or 17:00 UTC\r\n const utcHour = (hour - ptOffset) % 24\r\n result.setUTCHours(utcHour, minute, second, 0)\r\n break\r\n }\r\n // Add other timezone cases as needed\r\n default:\r\n console.warn(\r\n `[Venus Mock] Timezone ${options.timezone} not supported, using local time`,\r\n )\r\n }\r\n }\r\n\r\n // Return direct timestamp number to match real API\r\n return result.getTime()\r\n }\r\n\r\n async requestTimeAsync(): Promise<ServerTimeData> {\r\n await createMockDelay(MOCK_DELAYS.short)\r\n\r\n const venusApi = this.venusApi\r\n\r\n // In the mock, we'll simulate server-client time offset\r\n // This helps developers test time sync behavior\r\n\r\n // Simulate a small offset between server and client time\r\n // In production, this could be seconds or even minutes\r\n const mockOffset = venusApi._mock.serverTimeOffset || 2500 // Default 2.5 second offset\r\n const mockServerTime = Date.now() + mockOffset\r\n\r\n // Get timezone offset in minutes (positive for west of UTC, negative for east)\r\n const timezoneOffset = new Date().getTimezoneOffset()\r\n\r\n // Convert server time (UTC) to local time\r\n // Note: getTimezoneOffset() returns minutes WEST of UTC with reversed sign convention:\r\n // - For UTC-5 (e.g., Eastern Time): Returns +300 minutes (positive)\r\n // - For UTC+3 (e.g., Moscow): Returns -180 minutes (negative)\r\n // So we subtract the offset (which adds time for eastern timezones and subtracts for western)\r\n const localTime = mockServerTime - timezoneOffset * 60000\r\n\r\n // Return direct TimeInfo object (not wrapped in success object)\r\n const timeInfo = {\r\n serverTime: mockServerTime,\r\n localTime,\r\n timezoneOffset: timezoneOffset,\r\n formattedTime: new Date(localTime).toISOString(),\r\n locale: venusApi._mock.user?.locale || 'en-US',\r\n }\r\n\r\n return timeInfo\r\n }\r\n}\r\n","import { VenusAPI } from '../venus-api/types'\r\nimport { Host } from '../Host'\r\n\r\nexport * from './TimeApi'\r\nexport * from './HostTimeApi'\r\nexport * from './utils'\r\nexport * from './MockTimeApi'\r\n\r\nexport function initializeTime(venusApi: VenusAPI, host: Host) {\r\n venusApi.requestTimeAsync = () => {\r\n return host.time.requestTimeAsync()\r\n }\r\n\r\n venusApi.getFutureTimeAsync = (options?: {\r\n days?: number\r\n hours?: number\r\n minutes?: number\r\n timeOfDay?: any\r\n timezone?: string\r\n }) => {\r\n return host.time.getFutureTimeAsync(options)\r\n }\r\n\r\n venusApi.formatTime = (timestamp, options) => {\r\n return host.time.formatTime(timestamp, options)\r\n }\r\n\r\n venusApi.formatNumber = (value, options) => {\r\n return host.time.formatNumber(value, options)\r\n }\r\n}\r\n","/**\r\n * Base64 encoding/decoding utilities for embedded assets and libraries.\r\n * \r\n * These utilities handle base64 data received from the Venus host via RPC,\r\n * converting it to ArrayBuffer or UTF-8 strings with appropriate fallbacks\r\n * for different JavaScript environments.\r\n */\r\n\r\n/**\r\n * Convert base64 string to ArrayBuffer.\r\n * Uses native atob() when available for best performance.\r\n */\r\nexport function base64ToArrayBuffer(base64: string): ArrayBuffer {\r\n // Decode base64 to raw binary string\r\n const binaryString = atob(base64)\r\n\r\n // Create a buffer with the same length\r\n const len = binaryString.length\r\n const bytes = new Uint8Array(len)\r\n\r\n // Fill the buffer with the char codes\r\n for (let i = 0; i < len; i++) {\r\n bytes[i] = binaryString.charCodeAt(i)\r\n }\r\n\r\n // Return the ArrayBuffer\r\n return bytes.buffer\r\n}\r\n\r\n/**\r\n * Convert base64 string to UTF-8 string.\r\n * Tries multiple decoding strategies for maximum compatibility.\r\n */\r\nexport function base64ToUtf8(base64: string): string {\r\n if (typeof TextDecoder !== 'undefined') {\r\n const decoder = new TextDecoder('utf-8')\r\n const buffer = base64ToArrayBuffer(base64)\r\n return decoder.decode(new Uint8Array(buffer))\r\n }\r\n\r\n if (\r\n typeof globalThis !== 'undefined' &&\r\n typeof (globalThis as any).Buffer !== 'undefined'\r\n ) {\r\n const BufferCtor = (globalThis as any).Buffer\r\n return BufferCtor.from(base64, 'base64').toString('utf-8')\r\n }\r\n\r\n // Fallback for very old environments\r\n const binaryString = atob(base64)\r\n let result = ''\r\n for (let i = 0; i < binaryString.length; i++) {\r\n result += String.fromCharCode(binaryString.charCodeAt(i))\r\n }\r\n return decodeURIComponent(escape(result))\r\n}\r\n\r\n","import { SharedAssetsApi } from './SharedAssetsApi'\r\nimport { RpcClient } from '../rpc'\r\nimport { VenusMessageId } from '../VenusMessageId'\r\nimport { VenusAPI } from '../venus-api'\r\nimport { base64ToArrayBuffer } from './base64Utils'\r\n\r\nexport class RpcSharedAssetsApi implements SharedAssetsApi {\r\n private readonly venusApi: VenusAPI\r\n private readonly rpcClient: RpcClient\r\n\r\n constructor(rpcClient: RpcClient, venusApi: VenusAPI) {\r\n this.rpcClient = rpcClient\r\n this.venusApi = venusApi\r\n }\r\n\r\n async loadAssetsBundle(game: string, bundleKey: string, fileType: string = 'stow'): Promise<ArrayBuffer> {\r\n try {\r\n const response = await this.rpcClient.callT<\r\n LoadEmbeddedAssetsRequest,\r\n LoadEmbeddedAssetsResponse\r\n >(VenusMessageId.H5_LOAD_EMBEDDED_ASSET, {\r\n assetKey: bundleKey,\r\n })\r\n return base64ToArrayBuffer(response.base64Data)\r\n } catch (err) {\r\n try {\r\n const blob = await this.venusApi.cdn.fetchBlob(`${game}/${bundleKey}.${fileType}`)\r\n return await blob.arrayBuffer()\r\n } catch (e) {\r\n throw new Error(`Failed to load ${bundleKey}`)\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport interface LoadEmbeddedAssetsRequest {\r\n assetKey: string\r\n}\r\n\r\nexport interface LoadEmbeddedAssetsResponse {\r\n base64Data: string\r\n}\r\n","import { SharedAssetsApi } from './SharedAssetsApi'\r\nimport { VenusAPI } from '../venus-api/types'\r\n\r\nexport class MockSharedAssetsApi implements SharedAssetsApi {\r\n private readonly venusApi: VenusAPI\r\n\r\n constructor(venusApi: VenusAPI) {\r\n this.venusApi = venusApi\r\n }\r\n\r\n async loadAssetsBundle(game: string, bundleKey: string, fileType: string = 'stow'): Promise<ArrayBuffer> {\r\n const blob = await this.venusApi.cdn.fetchBlob(`${game}/${bundleKey}.${fileType}`)\r\n return await blob.arrayBuffer()\r\n }\r\n}\r\n","export type ModuleSpecifierMatch = 'exact' | 'prefix';\r\n\r\nexport interface ModuleSpecifierConfig {\r\n match: ModuleSpecifierMatch;\r\n value: string;\r\n behavior?:\r\n | 'default'\r\n | 'react-jsx-runtime'\r\n | 'react-jsx-dev-runtime'\r\n | 'namespace';\r\n}\r\n\r\nexport interface EmbeddedLibraryDefinition {\r\n libraryKey: string;\r\n assetKey: string;\r\n packageName: string;\r\n version: string;\r\n globalVar: string;\r\n cdnPath: string;\r\n moduleSpecifiers: ModuleSpecifierConfig[];\r\n loadStage: number; // Load order: 0 first, then 1, etc. Enables parallel loading within stages\r\n enabled: boolean; // Whether this library is ready for use\r\n}\r\n\r\nexport const DEFAULT_SHARED_LIB_CDN_BASE =\r\n 'https://venus-static-01293ak.web.app/libs';\r\n\r\nexport const EMBEDDED_LIBRARIES: EmbeddedLibraryDefinition[] = [\r\n {\r\n libraryKey: 'phaser@3.90.0',\r\n assetKey: 'library:phaser@3.90.0',\r\n packageName: 'phaser',\r\n version: '3.90.0',\r\n globalVar: 'Phaser',\r\n cdnPath: 'phaser/3.90.0/phaser.min.js',\r\n moduleSpecifiers: [{ match: 'exact', value: 'phaser' }],\r\n loadStage: 0,\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'react@18.3.1',\r\n assetKey: 'library:react@18.3.1',\r\n packageName: 'react',\r\n version: '18.3.1',\r\n globalVar: 'React',\r\n cdnPath: 'react/18.3.1/react.production.min.js',\r\n moduleSpecifiers: [\r\n { match: 'exact', value: 'react', behavior: 'namespace' },\r\n { match: 'exact', value: 'react/jsx-runtime', behavior: 'react-jsx-runtime' },\r\n {\r\n match: 'exact',\r\n value: 'react/jsx-dev-runtime',\r\n behavior: 'react-jsx-dev-runtime',\r\n },\r\n ],\r\n loadStage: 0, // Must load before ReactDOM\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'react-dom@18.3.1',\r\n assetKey: 'library:react-dom@18.3.1',\r\n packageName: 'react-dom',\r\n version: '18.3.1',\r\n globalVar: 'ReactDOM',\r\n cdnPath: 'react-dom/18.3.1/react-dom.production.min.js',\r\n moduleSpecifiers: [\r\n { match: 'exact', value: 'react-dom', behavior: 'namespace' },\r\n { match: 'exact', value: 'react-dom/client', behavior: 'namespace' },\r\n ],\r\n loadStage: 1, // Depends on React (stage 0)\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'three@0.170.0',\r\n assetKey: 'library:three@0.170.0',\r\n packageName: 'three',\r\n version: '0.170.0',\r\n globalVar: 'THREE',\r\n cdnPath: 'three/r170/three.min.js',\r\n moduleSpecifiers: [\r\n { match: 'exact', value: 'three', behavior: 'namespace' },\r\n ],\r\n loadStage: 0,\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'matter-js@0.19.0',\r\n assetKey: 'library:matter-js@0.19.0',\r\n packageName: 'matter-js',\r\n version: '0.19.0',\r\n globalVar: 'Matter',\r\n cdnPath: 'matter-js/0.19.0/matter.min.js',\r\n moduleSpecifiers: [{ match: 'exact', value: 'matter-js' }],\r\n loadStage: 0,\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'inkjs@2.2.0',\r\n assetKey: 'library:inkjs@2.2.0',\r\n packageName: 'inkjs',\r\n version: '2.2.0',\r\n globalVar: 'inkjs',\r\n cdnPath: 'inkjs/2.2.0/ink.min.js',\r\n moduleSpecifiers: [{ match: 'exact', value: 'inkjs' }],\r\n loadStage: 0,\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'zustand@5.0.3',\r\n assetKey: 'library:zustand@5.0.3',\r\n packageName: 'zustand',\r\n version: '5.0.3',\r\n globalVar: 'zustand',\r\n cdnPath: 'zustand/5.0.3/zustand.min.js',\r\n moduleSpecifiers: [\r\n { match: 'exact', value: 'zustand' },\r\n { match: 'exact', value: 'zustand/middleware' },\r\n ],\r\n loadStage: 1, // Depends on React (stage 0)\r\n enabled: true,\r\n },\r\n {\r\n libraryKey: 'ammo.js@2024.11',\r\n assetKey: 'library:ammo.js@2024.11',\r\n packageName: 'ammo.js',\r\n version: '2024.11',\r\n globalVar: 'Ammo',\r\n cdnPath: 'ammo/2024.11/ammo.js',\r\n moduleSpecifiers: [\r\n { match: 'exact', value: 'ammo.js' },\r\n { match: 'exact', value: 'ammo.js/builds/ammo.wasm.js' },\r\n ],\r\n loadStage: 0,\r\n enabled: false, // Not ready yet - WASM loading needs additional work\r\n },\r\n];\r\n\r\nexport const EMBEDDED_LIBRARY_BY_KEY: Record<string, EmbeddedLibraryDefinition> =\r\n EMBEDDED_LIBRARIES.reduce(\r\n (acc, lib) => {\r\n acc[lib.libraryKey] = lib;\r\n return acc;\r\n },\r\n {} as Record<string, EmbeddedLibraryDefinition>,\r\n );\r\n\r\nexport const MODULE_TO_LIBRARY_SPECIFIERS = EMBEDDED_LIBRARIES.filter(\r\n (lib) => lib.enabled,\r\n).flatMap((lib) =>\r\n lib.moduleSpecifiers.map((specifier) => ({\r\n ...specifier,\r\n libraryKey: lib.libraryKey,\r\n })),\r\n);\r\n\r\n/**\r\n * Get library definition by key, throwing if not found.\r\n * @param libraryKey - Library key (e.g., 'phaser@3.90.0')\r\n * @returns Library definition\r\n * @throws Error if library key is not found\r\n */\r\nexport function getLibraryDefinition(\r\n libraryKey: string,\r\n): EmbeddedLibraryDefinition {\r\n const definition = EMBEDDED_LIBRARY_BY_KEY[libraryKey]\r\n if (!definition) {\r\n const availableKeys = Object.keys(EMBEDDED_LIBRARY_BY_KEY).join(', ')\r\n throw new Error(\r\n `Unsupported embedded library: ${libraryKey}. Available libraries: ${availableKeys}`,\r\n )\r\n }\r\n return definition\r\n}\r\n","import { PreloaderApi } from \"./PreloaderApi\"\r\n\r\nexport class MockPreloaderApi implements PreloaderApi {\r\n async showLoadScreen(): Promise<void> {\r\n console.log('showLoadScreen')\r\n }\r\n\r\n async hideLoadScreen(): Promise<void> {\r\n console.log('hideLoadScreen')\r\n }\r\n\r\n async setLoaderText(text: string): Promise<void> {\r\n console.log('setLoaderText', text)\r\n }\r\n\r\n async setLoaderProgress(progress: number): Promise<void> {\r\n console.log('setLoaderProgress', progress)\r\n }\r\n}","import { PreloaderApi } from './PreloaderApi'\r\nimport { RpcClient } from '../rpc'\r\nimport { VenusMessageId } from '../VenusMessageId'\r\n\r\nexport class RpcPreloaderApi implements PreloaderApi {\r\n private readonly rpcClient: RpcClient\r\n\r\n constructor(rpcClient: RpcClient) {\r\n this.rpcClient = rpcClient\r\n }\r\n\r\n async showLoadScreen(): Promise<void> {\r\n await this.rpcClient.call(VenusMessageId.H5_SHOW_LOAD_SCREEN)\r\n }\r\n\r\n async hideLoadScreen(): Promise<void> {\r\n await this.rpcClient.call(VenusMessageId.H5_HIDE_LOAD_SCREEN)\r\n }\r\n\r\n async setLoaderText(text: string): Promise<void> {\r\n await this.rpcClient.call(VenusMessageId.H5_SET_LOADER_TEXT, { text })\r\n }\r\n\r\n async setLoaderProgress(progress: number): Promise<void> {\r\n await this.rpcClient.call(VenusMessageId.H5_SET_LOADER_PROGRESS, { progress })\r\n }\r\n}","import { VenusAPI } from '../venus-api/types'\r\nimport { Host } from '../Host'\r\n\r\nexport * from './PreloaderApi'\r\nexport * from './MockPreloaderApi'\r\nexport * from './RpcPreloaderApi'\r\n\r\nexport function initializePreloader(venusApi: VenusAPI, host: Host) {\r\n venusApi.preloader = host.preloader\r\n}","import {\r\n QRCodeResult,\r\n ShareLinkResult,\r\n SocialApi,\r\n SocialQRCodeOptions,\r\n} from './SocialApi';\r\n\r\nconst MOCK_QR_CODE =\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';\r\n\r\nexport class MockSocialApi implements SocialApi {\r\n async shareLinkAsync(options: {\r\n launchParams: Record<string, string>;\r\n }): Promise<ShareLinkResult> {\r\n const shareUrl = this.createMockUrl(options.launchParams);\r\n\r\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\r\n try {\r\n await navigator.clipboard.writeText(shareUrl);\r\n console.log('[Venus SDK] (mock) Copied share URL to clipboard');\r\n } catch (error) {\r\n console.warn(\r\n '[Venus SDK] (mock) Failed to copy share URL to clipboard',\r\n error,\r\n );\r\n }\r\n }\r\n\r\n return { shareUrl };\r\n }\r\n\r\n async createQRCodeAsync(options: {\r\n launchParams: Record<string, string>;\r\n qrOptions?: SocialQRCodeOptions;\r\n }): Promise<QRCodeResult> {\r\n const shareUrl = this.createMockUrl(options.launchParams);\r\n\r\n return {\r\n shareUrl,\r\n qrCode: MOCK_QR_CODE,\r\n };\r\n }\r\n\r\n private createMockUrl(launchParams: Record<string, string>): string {\r\n const params = new URLSearchParams(launchParams);\r\n return `https://mock-share.venus.test/share?${params.toString()}`;\r\n }\r\n}\r\n","/**\r\n * Sandbox configuration helpers.\r\n *\r\n * Sandbox mode enables H5 apps to run in browser (via Vite) while communicating\r\n * with the real Firebase backend.\r\n *\r\n * Authentication flow:\r\n * 1. Vite plugin reads game.config.json and CLI config for environment\r\n * 2. Firebase config is injected into page via window.__VENUS_SANDBOX__\r\n * 3. User signs in with Google once (persisted in IndexedDB)\r\n * 4. All API calls use Firebase Auth session automatically\r\n */\r\n\r\nexport type SandboxTarget = 'local' | 'dev' | 'staging'\r\n\r\n/**\r\n * Firebase configuration for a specific environment.\r\n */\r\nexport interface SandboxFirebaseConfig {\r\n apiKey: string\r\n authDomain: string\r\n projectId: string\r\n appId?: string\r\n storageBucket?: string\r\n messagingSenderId?: string\r\n measurementId?: string\r\n}\r\n\r\n/**\r\n * Configuration injected by the Vite dev server for sandbox mode.\r\n */\r\nexport interface SandboxConfig {\r\n /** Whether sandbox mode is enabled */\r\n enabled: boolean\r\n /** Target environment: local (emulator), dev, or staging */\r\n target: SandboxTarget\r\n /** Game/App ID from game.config.json */\r\n gameId: string\r\n\r\n /** Firebase configuration for the target environment */\r\n firebaseConfig?: SandboxFirebaseConfig\r\n /** Cloud Functions region */\r\n functionsRegion?: string\r\n\r\n /**\r\n * Base URL for backend RPC calls.\r\n * For local: http://localhost:5001/{projectId}/{region}\r\n * For dev/staging: Cloud Run proxy URL from CLI config\r\n */\r\n backendUrl?: string\r\n\r\n /** Emulator hosts for local development */\r\n functionsEmulatorHost?: string\r\n firestoreEmulatorHost?: string\r\n authEmulatorHost?: string\r\n\r\n /** RPC configuration */\r\n pollingInterval?: number\r\n rpcMaxRetries?: number\r\n rpcRetryDelayMs?: number\r\n}\r\n\r\n/**\r\n * Global interface for sandbox config injected by Vite\r\n */\r\ndeclare global {\r\n interface Window {\r\n __VENUS_SANDBOX__?: SandboxConfig\r\n __VENUS_SANDBOX_SIGN_IN__?: () => Promise<void>\r\n __VENUS_SANDBOX_SIGN_OUT__?: () => Promise<void>\r\n }\r\n}\r\n\r\n/**\r\n * Read sandbox configuration from the global object.\r\n * Vite injects the config into `window.__VENUS_SANDBOX__` during dev builds.\r\n */\r\nexport function getSandboxConfig(): SandboxConfig | null {\r\n if (typeof globalThis === 'undefined') {\r\n return null\r\n }\r\n\r\n const config = (globalThis as { __VENUS_SANDBOX__?: SandboxConfig }).__VENUS_SANDBOX__\r\n if (!config?.enabled) {\r\n return null\r\n }\r\n\r\n return config\r\n}\r\n\r\n/**\r\n * Check if sandbox mode is enabled.\r\n */\r\nexport function isSandboxEnabled(): boolean {\r\n const config = getSandboxConfig()\r\n return config?.enabled === true\r\n}\r\n\r\n/**\r\n * The proxy path used to route requests through Vite dev server.\r\n * Must match VENUS_API_PROXY_PATH in venusSandboxPlugin.ts.\r\n */\r\nconst VENUS_API_PROXY_PATH = '/__venusapi'\r\n\r\n/**\r\n * Build the base URL for Cloud Functions calls.\r\n *\r\n * For local (emulator): Direct URL to emulator (no CORS issues)\r\n * For dev/staging: Uses Vite proxy path to avoid CORS issues\r\n */\r\nexport function buildFunctionsBaseUrl(config: SandboxConfig): string {\r\n // If explicit backendUrl is provided, use it\r\n if (config.backendUrl) {\r\n return config.backendUrl.replace(/\\/$/, '')\r\n }\r\n\r\n // For local with emulator - direct connection (no CORS issues)\r\n if (config.target === 'local' && config.functionsEmulatorHost && config.firebaseConfig?.projectId) {\r\n const region = config.functionsRegion || 'us-central1'\r\n return `http://${config.functionsEmulatorHost}/${config.firebaseConfig.projectId}/${region}`\r\n }\r\n\r\n // For dev/staging in browser - use Vite proxy to avoid CORS\r\n // The proxy is configured by venusSandboxPlugin to forward to Cloud Functions\r\n if (config.target !== 'local' && typeof window !== 'undefined') {\r\n return VENUS_API_PROXY_PATH\r\n }\r\n\r\n // Fallback: construct direct URL (for non-browser contexts)\r\n if (config.firebaseConfig?.projectId && config.functionsRegion) {\r\n return `https://${config.functionsRegion}-${config.firebaseConfig.projectId}.cloudfunctions.net`\r\n }\r\n\r\n throw new Error(\r\n `[Venus SDK] Cannot determine backend URL for target \"${config.target}\". ` +\r\n `Either provide backendUrl or configure Firebase project settings.`\r\n )\r\n}\r\n\r\n/**\r\n * Parse a value that might be a number or string into a number.\r\n */\r\nexport function parseSandboxNumber(value: unknown): number | undefined {\r\n if (typeof value === 'number' && Number.isFinite(value)) {\r\n return value\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim()\r\n if (trimmed.length === 0) {\r\n return undefined\r\n }\r\n const parsed = Number(trimmed)\r\n return Number.isFinite(parsed) ? parsed : undefined\r\n }\r\n\r\n return undefined\r\n}\r\n"]}