@series-inc/venus-sdk 3.4.2-beta.2 → 3.4.2

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/utils/idGenerator.ts","../src/rpc/RpcClient.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/simulation/RpcSimulationApi.ts","../src/simulation/index.ts","../src/time/utils.ts","../src/time/HostTimeApi.ts","../src/time/MockTimeApi.ts","../src/time/index.ts","../src/version.ts","../src/shared-assets/base64Utils.ts","../src/shared-assets/RpcSharedAssetsApi.ts","../src/shared-assets/MockSharedAssetsApi.ts","../src/shared-assets/embeddedLibrariesManifest.ts","../src/leaderboard/utils.ts","../src/leaderboard/RpcLeaderboardApi.ts","../src/leaderboard/MockLeaderboardApi.ts","../src/leaderboard/index.ts","../src/game-preloader/MockPreloaderApi.ts","../src/game-preloader/RpcPreloaderApi.ts","../src/game-preloader/index.ts","../src/social/MockSocialApi.ts","../src/social/RpcSocialApi.ts","../src/VenusTransport.ts","../src/RemoteHost.ts","../src/MockHost.ts","../src/Host.ts","../src/social/index.ts"],"names":["VenusMessageId","selectedAsset","HapticFeedbackStyle","submittedAt","entry","modeEntries","inserted"],"mappings":"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","file":"chunk-W74ZI2H3.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_ELIMINATE_PLAYER = 'H5_ROOM_ELIMINATE_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","/**\r\n * Generate a unique ID using timestamp and random component\r\n */\r\nexport function generateId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`\r\n}\r\n","import { RpcRequest } from './RpcRequest.ts'\r\nimport { RpcResponse } from './RpcResponse.ts'\r\nimport { RpcTransport } from './RpcTransport.ts'\r\nimport { RpcNotification } from './RpcNotification'\r\nimport { generateId } from '../utils/idGenerator'\r\n\r\ninterface PendingCall {\r\n id: string\r\n resolve: (value: any) => void\r\n reject: (error: any) => void\r\n}\r\n\r\nexport interface Subscription {\r\n unsubscribe: () => void\r\n}\r\n\r\nexport class RpcClient {\r\n private readonly pendingCalls = new Map<string, PendingCall>()\r\n private readonly notificationCallbacks = new Map<string, Function>()\r\n\r\n private onResponseSub: Subscription | null = null\r\n private onNotificationSub: Subscription | null = null\r\n private transport: RpcTransport | null = null\r\n\r\n start(transport: RpcTransport) {\r\n this.transport = transport\r\n this.onResponseSub = transport.onResponse(async (response) => {\r\n return this.handleRpcResponse(response)\r\n })\r\n this.onNotificationSub = transport.onNotification(async (notification) => {\r\n return this.handleRpcNotification(notification)\r\n })\r\n }\r\n\r\n stop() {\r\n if (this.onResponseSub) {\r\n this.onResponseSub.unsubscribe()\r\n this.onResponseSub = null\r\n }\r\n\r\n if (this.onNotificationSub) {\r\n this.onNotificationSub.unsubscribe()\r\n this.onNotificationSub = null\r\n }\r\n\r\n this.transport = null\r\n }\r\n\r\n onNotification<TPayload>(\r\n id: string,\r\n callback: (payload: TPayload) => void,\r\n ): Subscription {\r\n this.notificationCallbacks.set(id, callback)\r\n return {\r\n unsubscribe: () => {\r\n this.notificationCallbacks.delete(id)\r\n },\r\n }\r\n }\r\n\r\n callT<TArgs, TResult>(\r\n method: string,\r\n args: TArgs,\r\n timeout: number = 5000,\r\n ): Promise<TResult> {\r\n return this.call(method, args, timeout)\r\n }\r\n\r\n async call<TResponse>(\r\n method: string,\r\n args?: any,\r\n timeout: number = 5000,\r\n ): Promise<TResponse> {\r\n // NOTE(Zee): Make this into options?\r\n return new Promise((resolve, reject) => {\r\n const id = generateId()\r\n this.addPendingCall(id, resolve, reject)\r\n\r\n const request: RpcRequest = {\r\n type: 'rpc-request',\r\n id,\r\n method,\r\n args: args,\r\n }\r\n\r\n if (this.transport) {\r\n this.transport.sendRequest(request)\r\n }\r\n\r\n // NOTE(Zee): This is dangerous. We REALLY need to rely on the host to send back a response, otherwise we may permanently hang here...\r\n if (timeout > 0) {\r\n setTimeout(() => {\r\n if (this.hasPendingCall(id)) {\r\n this.removePendingCall(id)\r\n reject(new Error(`RPC call ${method} timed out`))\r\n }\r\n }, timeout)\r\n }\r\n })\r\n }\r\n\r\n private hasPendingCall(id: string): boolean {\r\n return this.pendingCalls.has(id)\r\n }\r\n\r\n private addPendingCall(\r\n id: string,\r\n resolve: (v: any) => void,\r\n reject: (e: any) => void,\r\n ) {\r\n this.pendingCalls.set(id, {\r\n id: id,\r\n resolve: resolve,\r\n reject: reject,\r\n })\r\n }\r\n\r\n private removePendingCall(id: string) {\r\n this.pendingCalls.delete(id)\r\n }\r\n\r\n private getPendingCall(id: string) {\r\n return this.pendingCalls.get(id)\r\n }\r\n\r\n private handleRpcResponse(response: RpcResponse): boolean {\r\n const pending = this.getPendingCall(response.id)\r\n if (!pending) {\r\n return false\r\n }\r\n this.removePendingCall(response.id)\r\n\r\n if (response.error) {\r\n pending.reject(new Error(response.error.message))\r\n return true\r\n }\r\n\r\n pending.resolve(response.result)\r\n return true\r\n }\r\n\r\n private handleRpcNotification(notification: RpcNotification): void {\r\n const callback = this.notificationCallbacks.get(notification.id)\r\n if (callback) {\r\n callback(notification.payload)\r\n }\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 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\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 ['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 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 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\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","import {\r\n CollectRecipeResult,\r\n ExecuteRecipeOptions,\r\n ExecuteRecipeResponse,\r\n ExecuteScopedRecipeResult,\r\n ExecuteScopedRecipeOptions,\r\n GetActiveRunsOptions,\r\n GetAvailableRecipesOptions,\r\n GetAvailableRecipesResult,\r\n GetBatchRecipeRequirements,\r\n Recipe,\r\n SimulationApi,\r\n SimulationAvailableItem,\r\n SimulationAssignment,\r\n SimulationBatchOperation,\r\n SimulationBatchOperationsResult,\r\n SimulationPowerPreview,\r\n SimulationRunSummary,\r\n SimulationSlotMutationResult,\r\n SimulationSlotValidationResult,\r\n SimulationSlotContainer,\r\n SimulationState,\r\n SimulationPersonalState,\r\n SimulationRoomState,\r\n TriggerRecipeChainOptions,\r\n} from './SimulationApi'\r\nimport { RpcClient } from '../rpc'\r\nimport { VenusMessageId } from '../VenusMessageId'\r\nimport {\r\n RecipeRequirementResult,\r\n VenusSimulationConfig,\r\n SimulationSubscribeOptions,\r\n SimulationUpdateData,\r\n} from '../venus-api/types'\r\nimport { generateId } from '../utils/idGenerator'\r\n\r\ninterface ResolveFieldValueResponse {\r\n value: unknown\r\n}\r\n\r\ninterface SimulationUpdateNotification {\r\n subscriptionId: string\r\n updates: SimulationUpdateData\r\n}\r\n\r\ninterface StateResponseExtension {\r\n configuration?: VenusSimulationConfig\r\n}\r\n\r\ninterface PersonalStateResponse extends SimulationPersonalState, StateResponseExtension {}\r\n\r\ninterface RoomStateResponse extends SimulationRoomState, StateResponseExtension {}\r\n\r\ntype GetStateResponse = PersonalStateResponse | RoomStateResponse\r\n\r\nexport class RpcSimulationApi implements SimulationApi {\r\n private readonly rpcClient: RpcClient\r\n private _simulationConfig: VenusSimulationConfig | null = null\r\n private readonly subscriptionCallbacks = new Map<\r\n string,\r\n (data: SimulationUpdateData) => void\r\n >()\r\n\r\n constructor(rpcClient: RpcClient) {\r\n this.rpcClient = rpcClient\r\n this.rpcClient.onNotification(\r\n VenusMessageId.H5_SIMULATION_UPDATE,\r\n this.handleSimulationUpdate.bind(this),\r\n )\r\n }\r\n\r\n isEnabled(): boolean {\r\n return true\r\n }\r\n\r\n async validateSlotAssignmentAsync(\r\n containerId: string,\r\n slotId: string,\r\n itemId: string,\r\n ): Promise<SimulationSlotValidationResult> {\r\n return this.rpcClient.call<SimulationSlotValidationResult>(\r\n VenusMessageId.H5_SIMULATION_VALIDATE_ASSIGNMENT,\r\n {\r\n containerId,\r\n slotId,\r\n itemId,\r\n },\r\n )\r\n }\r\n\r\n async subscribeAsync(\r\n options: SimulationSubscribeOptions,\r\n ): Promise<() => void> {\r\n this.ensureValidSubscribeOptions(options)\r\n\r\n const subscriptionId = generateId()\r\n this.subscriptionCallbacks.set(subscriptionId, options.onUpdate)\r\n\r\n try {\r\n await this.rpcClient.call(VenusMessageId.H5_SIMULATION_SUBSCRIBE, {\r\n subscriptionId,\r\n entities: options.entities,\r\n tags: options.tags,\r\n activeRuns: options.activeRuns,\r\n roomId: options.roomId,\r\n })\r\n } catch (error) {\r\n this.subscriptionCallbacks.delete(subscriptionId)\r\n throw error\r\n }\r\n\r\n let unsubscribed = false\r\n return () => {\r\n if (unsubscribed) {\r\n return\r\n }\r\n unsubscribed = true\r\n\r\n this.subscriptionCallbacks.delete(subscriptionId)\r\n\r\n void this.rpcClient\r\n .call(VenusMessageId.H5_SIMULATION_UNSUBSCRIBE, {\r\n subscriptionId,\r\n })\r\n .catch((error) => {\r\n console.error(\r\n '[Venus SDK] Failed to unsubscribe simulation listener',\r\n error,\r\n )\r\n })\r\n }\r\n }\r\n\r\n executeBatchOperationsAsync(\r\n operations: Array<SimulationBatchOperation>,\r\n validateOnly?: boolean,\r\n ): Promise<SimulationBatchOperationsResult> {\r\n return this.rpcClient.call<SimulationBatchOperationsResult>(\r\n VenusMessageId.H5_SIMULATION_BATCH_OPERATIONS,\r\n {\r\n operations,\r\n validateOnly,\r\n },\r\n )\r\n }\r\n async getAvailableItemsAsync(\r\n containerId: string,\r\n slotId: string,\r\n ): Promise<SimulationAvailableItem[]> {\r\n const response = await this.rpcClient.call<{\r\n availableItems?: SimulationAvailableItem[]\r\n }>(\r\n VenusMessageId.H5_SIMULATION_GET_AVAILABLE_ITEMS,\r\n {\r\n containerId,\r\n slotId,\r\n },\r\n )\r\n return response.availableItems || []\r\n }\r\n calculatePowerPreviewAsync(\r\n containerId: string,\r\n slotId: string,\r\n candidateItemId: string,\r\n ): Promise<SimulationPowerPreview> {\r\n return this.rpcClient.call<SimulationPowerPreview>(\r\n VenusMessageId.H5_SIMULATION_CALCULATE_POWER_PREVIEW,\r\n {\r\n containerId,\r\n slotId,\r\n candidateItemId,\r\n },\r\n )\r\n }\r\n assignItemToSlotAsync(\r\n containerId: string,\r\n slotId: string,\r\n itemId: string,\r\n ): Promise<SimulationSlotMutationResult> {\r\n return this.rpcClient.call<SimulationSlotMutationResult>(\r\n VenusMessageId.H5_SIMULATION_ASSIGN_ITEM,\r\n {\r\n containerId,\r\n slotId,\r\n itemId,\r\n },\r\n )\r\n }\r\n\r\n removeItemFromSlotAsync(\r\n containerId: string,\r\n slotId: string,\r\n ): Promise<SimulationSlotMutationResult> {\r\n return this.rpcClient.call<SimulationSlotMutationResult>(\r\n VenusMessageId.H5_SIMULATION_REMOVE_ITEM,\r\n {\r\n containerId,\r\n slotId,\r\n },\r\n )\r\n }\r\n\r\n async getSlotContainersAsync(): Promise<SimulationSlotContainer[]> {\r\n const response = await this.rpcClient.call<{\r\n containers?: SimulationSlotContainer[]\r\n }>(\r\n VenusMessageId.H5_SIMULATION_GET_CONTAINERS,\r\n {},\r\n )\r\n return response.containers || []\r\n }\r\n\r\n async getSlotAssignmentsAsync(\r\n containerId: string,\r\n ): Promise<SimulationAssignment[]> {\r\n const response = await this.rpcClient.call<\r\n SimulationAssignment[] | { assignments?: SimulationAssignment[] }\r\n >(\r\n VenusMessageId.H5_SIMULATION_GET_ASSIGNMENTS,\r\n {\r\n containerId,\r\n },\r\n )\r\n // Server returns raw array, not wrapped in .assignments property\r\n return Array.isArray(response)\r\n ? response\r\n : response.assignments || []\r\n }\r\n\r\n async getStateAsync(roomId?: string): Promise<SimulationState> {\r\n const response = await this.rpcClient.call<GetStateResponse>(\r\n VenusMessageId.H5_SIMULATION_GET_STATE,\r\n {\r\n roomId: roomId,\r\n },\r\n )\r\n\r\n // Cache configuration if included in response\r\n if (response.configuration) {\r\n this._simulationConfig = response.configuration\r\n }\r\n return response\r\n }\r\n\r\n async getConfigAsync(roomId?: string): Promise<VenusSimulationConfig> {\r\n if (this._simulationConfig) {\r\n return this._simulationConfig\r\n }\r\n\r\n // Fetch configuration directly\r\n const config = await this.rpcClient.call<VenusSimulationConfig>(\r\n VenusMessageId.H5_SIMULATION_GET_CONFIG,\r\n {\r\n roomId,\r\n },\r\n )\r\n if (config) {\r\n this._simulationConfig = config\r\n return config\r\n }\r\n\r\n throw new Error('No simulation configuration available')\r\n }\r\n\r\n executeRecipeAsync(\r\n recipeId: string,\r\n inputs?: Record<string, unknown>,\r\n options?: ExecuteRecipeOptions,\r\n ): Promise<ExecuteRecipeResponse> {\r\n return this.rpcClient.call<ExecuteRecipeResponse>(\r\n VenusMessageId.H5_SIMULATION_EXECUTE_RECIPE,\r\n {\r\n recipeId: recipeId,\r\n inputs: inputs,\r\n roomId: options?.roomId,\r\n batchAmount: options?.batchAmount,\r\n allowPartialBatch: options?.allowPartialBatch,\r\n entity: options?.entity,\r\n },\r\n )\r\n }\r\n\r\n collectRecipeAsync(runId: string): Promise<CollectRecipeResult> {\r\n return this.rpcClient.call(VenusMessageId.H5_SIMULATION_COLLECT_RECIPE, {\r\n runId: runId,\r\n })\r\n }\r\n\r\n getActiveRunsAsync(\r\n options?: GetActiveRunsOptions,\r\n ): Promise<SimulationRunSummary[]> {\r\n return this.rpcClient.call<SimulationRunSummary[]>(\r\n VenusMessageId.H5_SIMULATION_GET_ACTIVE_RUNS,\r\n {\r\n roomId: options?.roomId,\r\n },\r\n )\r\n }\r\n\r\n executeScopedRecipeAsync(\r\n recipeId: string,\r\n entity: string,\r\n inputs?: Record<string, unknown>,\r\n options?: ExecuteScopedRecipeOptions,\r\n ): Promise<ExecuteScopedRecipeResult> {\r\n return this.rpcClient.call(\r\n VenusMessageId.H5_SIMULATION_EXECUTE_SCOPED_RECIPE,\r\n {\r\n recipeId: recipeId,\r\n entity: entity,\r\n inputs: inputs,\r\n roomId: options?.roomId ?? null,\r\n options,\r\n },\r\n )\r\n }\r\n\r\n getAvailableRecipesAsync(\r\n options?: GetAvailableRecipesOptions,\r\n ): Promise<GetAvailableRecipesResult> {\r\n return this.rpcClient.call(\r\n VenusMessageId.H5_SIMULATION_GET_AVAILABLE_RECIPES,\r\n {\r\n roomId: options?.roomId || null,\r\n includeActorRecipes: options?.includeActorRecipes || false,\r\n },\r\n )\r\n }\r\n\r\n getRecipeRequirementsAsync(\r\n recipe: Recipe,\r\n ): Promise<RecipeRequirementResult> {\r\n return this.rpcClient.call<RecipeRequirementResult>(\r\n VenusMessageId.H5_SIMULATION_GET_RECIPE_REQUIREMENTS,\r\n {\r\n recipeId: recipe.recipeId,\r\n entity: recipe.entity,\r\n batchAmount: recipe.batchAmount,\r\n },\r\n )\r\n }\r\n\r\n getBatchRecipeRequirementsAsync(\r\n recipes: Recipe[],\r\n ): Promise<GetBatchRecipeRequirements> {\r\n return this.rpcClient.call<GetBatchRecipeRequirements>(\r\n VenusMessageId.H5_SIMULATION_GET_BATCH_RECIPE_REQUIREMENTS,\r\n {\r\n recipes,\r\n },\r\n )\r\n }\r\n\r\n triggerRecipeChainAsync(\r\n recipeId: string,\r\n options?: TriggerRecipeChainOptions,\r\n ): Promise<ExecuteRecipeResponse> {\r\n return this.rpcClient.call<ExecuteRecipeResponse>(\r\n VenusMessageId.H5_SIMULATION_TRIGGER_RECIPE_CHAIN,\r\n {\r\n triggerRecipeId: recipeId,\r\n context: options?.context,\r\n roomId: options?.roomId,\r\n },\r\n )\r\n }\r\n\r\n getEntityMetadataAsync(\r\n entityId: string,\r\n ): Promise<Record<string, unknown>> {\r\n return this.rpcClient.call<Record<string, unknown>>(\r\n VenusMessageId.H5_SIMULATION_GET_ENTITY_METADATA,\r\n {\r\n entityId,\r\n },\r\n )\r\n }\r\n\r\n async resolveFieldValueAsync(\r\n entityId: string,\r\n fieldPath: string,\r\n entity?: string,\r\n ): Promise<unknown> {\r\n const response = await this.rpcClient.call<ResolveFieldValueResponse>(\r\n VenusMessageId.H5_SIMULATION_RESOLVE_VALUE,\r\n {\r\n entityId,\r\n fieldPath,\r\n entity,\r\n },\r\n )\r\n // Extract primitive value from server response wrapper\r\n return response.value\r\n }\r\n\r\n private handleSimulationUpdate(\r\n notification: SimulationUpdateNotification,\r\n ): void {\r\n if (!notification || !notification.subscriptionId) {\r\n console.warn('[Venus SDK] Received malformed simulation update')\r\n return\r\n }\r\n\r\n const callback = this.subscriptionCallbacks.get(notification.subscriptionId)\r\n if (!callback) {\r\n console.warn(\r\n '[Venus SDK] Received update for unknown subscription:',\r\n notification.subscriptionId,\r\n )\r\n return\r\n }\r\n\r\n try {\r\n callback(notification.updates)\r\n } catch (error) {\r\n console.error('[Venus SDK] Error in simulation subscription callback', error)\r\n }\r\n }\r\n\r\n private ensureValidSubscribeOptions(\r\n options: unknown,\r\n ): asserts options is SimulationSubscribeOptions {\r\n if (typeof options !== 'object' || options === null) {\r\n throw new Error('Simulation subscribe requires an options object')\r\n }\r\n\r\n const opts = options as Record<string, unknown>\r\n\r\n if (typeof opts.onUpdate !== 'function') {\r\n throw new Error('Simulation subscribe requires an onUpdate callback')\r\n }\r\n\r\n const hasFilter =\r\n (Array.isArray(opts.entities) && opts.entities.length > 0) ||\r\n (Array.isArray(opts.tags) && opts.tags.length > 0) ||\r\n Boolean(opts.activeRuns)\r\n\r\n if (!hasFilter) {\r\n throw new Error(\r\n 'Simulation subscribe requires at least one filter (entities, tags, activeRuns)',\r\n )\r\n }\r\n }\r\n}\r\n","import { VenusAPI, SimulationSubscribeOptions } from '../venus-api/types'\r\nimport { Host } from '../Host'\r\nimport {\r\n SimulationApi,\r\n ExecuteScopedRecipeOptions,\r\n TriggerRecipeChainOptions,\r\n GetAvailableRecipesOptions,\r\n Recipe,\r\n} from './SimulationApi'\r\n\r\nexport * from './SimulationApi'\r\nexport * from './RpcSimulationApi'\r\n\r\nexport function initializeSimulation(venusApi: VenusAPI, host: Host) {\r\n venusApi.simulation = {\r\n isEnabled: () => true,\r\n } as SimulationApi\r\n\r\n venusApi.simulation.getConfigAsync = () => {\r\n return host.simulation.getConfigAsync()\r\n }\r\n\r\n venusApi.simulation.getStateAsync = (roomId) => {\r\n return host.simulation.getStateAsync(roomId)\r\n }\r\n\r\n venusApi.simulation.executeRecipeAsync = (recipeId, inputs, options) => {\r\n return host.simulation.executeRecipeAsync(recipeId, inputs, options)\r\n }\r\n\r\n venusApi.simulation.getActiveRunsAsync = () => {\r\n return host.simulation.getActiveRunsAsync()\r\n }\r\n\r\n venusApi.simulation.collectRecipeAsync = (runId: string) => {\r\n return host.simulation.collectRecipeAsync(runId)\r\n }\r\n\r\n venusApi.simulation.executeScopedRecipeAsync = (\r\n recipeId: string,\r\n entity: string,\r\n inputs?: Record<string, unknown>,\r\n options?: ExecuteScopedRecipeOptions,\r\n ) => {\r\n return host.simulation.executeScopedRecipeAsync(recipeId, entity, inputs, options)\r\n }\r\n\r\n venusApi.simulation.triggerRecipeChainAsync = (\r\n recipeId: string,\r\n options?: TriggerRecipeChainOptions,\r\n ) => {\r\n return host.simulation.triggerRecipeChainAsync(recipeId, options)\r\n }\r\n\r\n venusApi.simulation.getAvailableRecipesAsync = async (\r\n options?: GetAvailableRecipesOptions,\r\n ) => {\r\n return host.simulation.getAvailableRecipesAsync(options)\r\n }\r\n\r\n venusApi.simulation.getRecipeRequirementsAsync = (recipe: Recipe) => {\r\n return host.simulation.getRecipeRequirementsAsync(recipe)\r\n }\r\n\r\n venusApi.simulation.getBatchRecipeRequirementsAsync = (recipes) => {\r\n return host.simulation.getBatchRecipeRequirementsAsync(recipes)\r\n }\r\n\r\n venusApi.simulation.resolveFieldValueAsync = (\r\n entityId,\r\n fieldPath,\r\n entity,\r\n ) => {\r\n return host.simulation.resolveFieldValueAsync(entityId, fieldPath, entity)\r\n }\r\n\r\n venusApi.simulation.getEntityMetadataAsync = (entityId) => {\r\n return host.simulation.getEntityMetadataAsync(entityId)\r\n }\r\n\r\n venusApi.simulation.getSlotAssignmentsAsync = (containerId) => {\r\n return host.simulation.getSlotAssignmentsAsync(containerId)\r\n }\r\n\r\n venusApi.simulation.getSlotContainersAsync = () => {\r\n return host.simulation.getSlotContainersAsync()\r\n }\r\n\r\n venusApi.simulation.assignItemToSlotAsync = (containerId, slotId, itemId) => {\r\n return host.simulation.assignItemToSlotAsync(containerId, slotId, itemId)\r\n }\r\n\r\n venusApi.simulation.removeItemFromSlotAsync = (containerId, slotId) => {\r\n return host.simulation.removeItemFromSlotAsync(containerId, slotId)\r\n }\r\n\r\n venusApi.simulation.getAvailableItemsAsync = (containerId, slotId) => {\r\n return host.simulation.getAvailableItemsAsync(containerId, slotId)\r\n }\r\n\r\n venusApi.simulation.calculatePowerPreviewAsync = (\r\n containerId: string,\r\n slotId: string,\r\n candidateItemId: string,\r\n ) => {\r\n return host.simulation.calculatePowerPreviewAsync(\r\n containerId,\r\n slotId,\r\n candidateItemId,\r\n )\r\n }\r\n\r\n venusApi.simulation.executeBatchOperationsAsync = (\r\n operations,\r\n validateOnly,\r\n ) => {\r\n return host.simulation.executeBatchOperationsAsync(operations, validateOnly)\r\n }\r\n\r\n venusApi.simulation.validateSlotAssignmentAsync = (\r\n containerId,\r\n slotId,\r\n itemId,\r\n ) => {\r\n return host.simulation.validateSlotAssignmentAsync(\r\n containerId,\r\n slotId,\r\n itemId,\r\n )\r\n }\r\n\r\n // ===== REAL-TIME SUBSCRIPTIONS =====\r\n venusApi.simulation.subscribeAsync = (options: SimulationSubscribeOptions) => {\r\n return host.simulation.subscribeAsync(options)\r\n }\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","declare const __SDK_VERSION__: string\r\nexport const SDK_VERSION = __SDK_VERSION__\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","/**\r\n * Hash algorithm used for score sealing\r\n */\r\nexport const HASH_ALGORITHM_WEB_CRYPTO = 'SHA-256'\r\nexport const HASH_ALGORITHM_NODE = 'sha256'\r\n\r\n/**\r\n * Compute HMAC-SHA256 hash for score sealing.\r\n * Hash always includes: score, duration, token\r\n * Matches server-side hash computation exactly.\r\n *\r\n * @param score - The score value\r\n * @param duration - Duration in seconds\r\n * @param token - Score token\r\n * @param sealingNonce - One-time nonce for this submission\r\n * @param sealingSecret - Secret key for HMAC\r\n * @returns Hex-encoded hash string\r\n */\r\nexport async function computeScoreHash(\r\n score: number,\r\n duration: number,\r\n token: string,\r\n sealingNonce: string,\r\n sealingSecret: string,\r\n): Promise<string> {\r\n // Build payload: score:value|duration:value|token:value\r\n const payload = `score:${score}|duration:${duration}|token:${token}`\r\n const fullPayload = `${payload}|nonce:${sealingNonce}`\r\n\r\n // HMAC-SHA256 using Web Crypto API\r\n const encoder = new TextEncoder()\r\n const keyData = encoder.encode(sealingSecret)\r\n const messageData = encoder.encode(fullPayload)\r\n\r\n const cryptoKey = await crypto.subtle.importKey(\r\n 'raw',\r\n keyData,\r\n { name: 'HMAC', hash: HASH_ALGORITHM_WEB_CRYPTO },\r\n false,\r\n ['sign'],\r\n )\r\n\r\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, messageData)\r\n\r\n // Convert to hex string\r\n return Array.from(new Uint8Array(signature))\r\n .map((b) => b.toString(16).padStart(2, '0'))\r\n .join('')\r\n}\r\n\r\n","import { RpcClient } from '../rpc'\r\nimport { VenusMessageId } from '../VenusMessageId'\r\nimport {\r\n GetPagedScoresOptions,\r\n LeaderboardApi,\r\n PagedScoresResponse,\r\n GetPodiumScoresOptions,\r\n PodiumScoresResponse,\r\n PlayerRankResult,\r\n PlayerRankOptions,\r\n ScoreToken,\r\n SubmitScoreParams,\r\n SubmitScoreResult,\r\n} from './LeaderboardApi'\r\nimport { computeScoreHash } from './utils'\r\n\r\nexport class RpcLeaderboardApi implements LeaderboardApi {\r\n private readonly rpcClient: RpcClient\r\n /** Cache of score tokens for automatic hash computation */\r\n private tokenCache: Map<string, ScoreToken> = new Map()\r\n\r\n constructor(rpcClient: RpcClient) {\r\n this.rpcClient = rpcClient\r\n }\r\n\r\n /**\r\n * Create a score token for submitting a score.\r\n * Token is cached for automatic hash computation if score sealing is enabled.\r\n *\r\n * @param mode - Optional game mode\r\n * @returns Score token with sealing data if enabled\r\n */\r\n async createScoreToken(mode?: string): Promise<ScoreToken> {\r\n const token = await this.rpcClient.call<ScoreToken>(\r\n VenusMessageId.H5_LEADERBOARD_CREATE_SCORE_TOKEN,\r\n mode ? { mode } : {},\r\n )\r\n\r\n // Cache token with sealing data for auto-hash computation\r\n this.tokenCache.set(token.token, token)\r\n\r\n return token\r\n }\r\n\r\n /**\r\n * Submit a score to the leaderboard.\r\n * Automatically computes hash if score sealing is enabled and token was created via createScoreToken().\r\n *\r\n * @param params - Score submission parameters\r\n * @returns Submission result with acceptance status and rank\r\n * @throws Error if token not found in cache\r\n */\r\n async submitScore(params: SubmitScoreParams): Promise<SubmitScoreResult> {\r\n let hash: string | undefined\r\n\r\n // If token provided, check if sealing is enabled and auto-compute hash\r\n if (params.token) {\r\n const cachedToken = this.tokenCache.get(params.token)\r\n\r\n if (!cachedToken) {\r\n throw new Error(\r\n 'Invalid token: not found in cache. Did you call createScoreToken() first?'\r\n )\r\n }\r\n\r\n // Auto-compute hash if sealing enabled (token has nonce and secret)\r\n if (cachedToken.sealingNonce && cachedToken.sealingSecret) {\r\n hash = await computeScoreHash(\r\n params.score,\r\n params.duration,\r\n params.token,\r\n cachedToken.sealingNonce,\r\n cachedToken.sealingSecret,\r\n )\r\n }\r\n\r\n // Clean up used token from cache\r\n this.tokenCache.delete(params.token)\r\n }\r\n\r\n // Send to host/server (includes hash if sealing enabled)\r\n return this.rpcClient.call<SubmitScoreResult>(\r\n VenusMessageId.H5_LEADERBOARD_SUBMIT_SCORE,\r\n {\r\n token: params.token,\r\n score: params.score,\r\n duration: params.duration,\r\n mode: params.mode,\r\n telemetry: params.telemetry,\r\n metadata: params.metadata,\r\n hash, // undefined if no sealing, computed if sealing enabled\r\n },\r\n )\r\n }\r\n\r\n getPagedScores(options?: GetPagedScoresOptions): Promise<PagedScoresResponse> {\r\n return this.rpcClient.call<PagedScoresResponse>(\r\n VenusMessageId.H5_LEADERBOARD_GET_PAGED_SCORES,\r\n options ?? {},\r\n )\r\n }\r\n\r\n getMyRank(options?: PlayerRankOptions): Promise<PlayerRankResult> {\r\n return this.rpcClient.call<PlayerRankResult>(\r\n VenusMessageId.H5_LEADERBOARD_GET_MY_RANK,\r\n options ?? {},\r\n )\r\n }\r\n\r\n getPodiumScores(options?: GetPodiumScoresOptions): Promise<PodiumScoresResponse> {\r\n return this.rpcClient.call<PodiumScoresResponse>(\r\n VenusMessageId.H5_LEADERBOARD_GET_PODIUM_SCORES,\r\n options ?? {},\r\n )\r\n }\r\n}\r\n","import {\r\n GetPagedScoresOptions,\r\n LeaderboardApi,\r\n LeaderboardEntry,\r\n PagedScoresResponse,\r\n GetPodiumScoresOptions,\r\n PodiumScoresResponse,\r\n PlayerRankResult,\r\n PlayerRankOptions,\r\n ScoreToken,\r\n SubmitScoreParams,\r\n SubmitScoreResult,\r\n} from './LeaderboardApi'\r\nimport { computeScoreHash } from './utils'\r\n\r\ninterface MockScoreToken {\r\n id: string\r\n expiresAt: number\r\n mode: string\r\n sealingNonce: string | null\r\n used: boolean\r\n}\r\n\r\nexport class MockLeaderboardApi implements LeaderboardApi {\r\n private tokens: Map<string, MockScoreToken> = new Map()\r\n /** Cache of score tokens for automatic hash computation */\r\n private tokenCache: Map<string, ScoreToken> = new Map()\r\n private entriesByMode: Map<string, LeaderboardEntry[]> = new Map()\r\n private tokenCounter = 0\r\n private enableScoreSealing = false\r\n private scoreSealingSecret = 'mock-leaderboard-secret-key'\r\n\r\n constructor(options?: { enableScoreSealing?: boolean; scoreSealingSecret?: string }) {\r\n if (options?.enableScoreSealing) {\r\n this.enableScoreSealing = true\r\n }\r\n if (options?.scoreSealingSecret) {\r\n this.scoreSealingSecret = options.scoreSealingSecret\r\n }\r\n }\r\n\r\n /**\r\n * Configure mock leaderboard settings\r\n *\r\n * @param options - Configuration options\r\n */\r\n configure(options: { enableScoreSealing?: boolean; scoreSealingSecret?: string }): void {\r\n if (typeof options.enableScoreSealing === 'boolean') {\r\n this.enableScoreSealing = options.enableScoreSealing\r\n }\r\n if (options.scoreSealingSecret) {\r\n this.scoreSealingSecret = options.scoreSealingSecret\r\n }\r\n }\r\n\r\n private generateNonce(): string {\r\n return (\r\n Math.random().toString(36).slice(2) +\r\n Math.random().toString(36).slice(2)\r\n ).slice(0, 64)\r\n }\r\n\r\n private getModeKey(mode: string): string {\r\n const normalizedMode = mode || 'default'\r\n return `${normalizedMode}`\r\n }\r\n\r\n private getEntriesForMode(mode: string): LeaderboardEntry[] {\r\n const key = this.getModeKey(mode)\r\n if (!this.entriesByMode.has(key)) {\r\n this.entriesByMode.set(key, [])\r\n }\r\n return this.entriesByMode.get(key)!\r\n }\r\n\r\n /**\r\n * Create a mock score token for testing.\r\n * Token is cached for automatic hash computation if score sealing is enabled.\r\n *\r\n * @param mode - Optional game mode\r\n * @returns Score token with sealing data if enabled\r\n */\r\n async createScoreToken(mode?: string): Promise<ScoreToken> {\r\n const token = `mock_token_${++this.tokenCounter}`\r\n const startTime = Date.now()\r\n const expiresAt = startTime + 3_600_000\r\n const resolvedMode = mode || 'default'\r\n const sealingNonce = this.enableScoreSealing ? this.generateNonce() : null\r\n const sealingSecret = this.enableScoreSealing ? this.scoreSealingSecret : null\r\n\r\n this.tokens.set(token, {\r\n id: token,\r\n expiresAt,\r\n mode: resolvedMode,\r\n sealingNonce,\r\n used: false,\r\n })\r\n\r\n const result = {\r\n token,\r\n startTime,\r\n expiresAt,\r\n sealingNonce,\r\n sealingSecret,\r\n mode: resolvedMode,\r\n }\r\n\r\n // Cache for auto-hash computation\r\n this.tokenCache.set(token, result)\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * Submit a mock score to the leaderboard.\r\n * Automatically computes hash if score sealing is enabled and token was created via createScoreToken().\r\n *\r\n * @param params - Score submission parameters\r\n * @returns Submission result with acceptance status and rank\r\n * @throws Error if token not found in cache or validation fails\r\n */\r\n async submitScore(params: SubmitScoreParams): Promise<SubmitScoreResult> {\r\n let hash: string | undefined\r\n\r\n // Auto-compute hash if token has sealing data\r\n if (params.token) {\r\n const cachedToken = this.tokenCache.get(params.token)\r\n\r\n if (!cachedToken) {\r\n throw new Error(\r\n 'Invalid token: not found in cache. Did you call createScoreToken() first?'\r\n )\r\n }\r\n\r\n if (cachedToken.sealingNonce && cachedToken.sealingSecret) {\r\n hash = await computeScoreHash(\r\n params.score,\r\n params.duration,\r\n params.token,\r\n cachedToken.sealingNonce,\r\n cachedToken.sealingSecret,\r\n )\r\n }\r\n }\r\n\r\n // Simple mode (no token)\r\n if (!params.token) {\r\n const mode = params.mode || 'default';\r\n const submittedAt = Date.now();\r\n \r\n const entry: LeaderboardEntry = {\r\n profileId: `mock_profile`,\r\n username: 'Mock Player',\r\n avatarUrl: null,\r\n score: params.score,\r\n duration: params.duration,\r\n submittedAt,\r\n token: 'simple-mode',\r\n rank: null,\r\n zScore: null,\r\n isAnomaly: false,\r\n trustScore: 50,\r\n metadata: params.metadata ?? null,\r\n isSeed: false,\r\n };\r\n \r\n const modeEntries = this.getEntriesForMode(mode);\r\n modeEntries.push(entry);\r\n modeEntries.sort((a, b) => {\r\n if (b.score !== a.score) return b.score - a.score;\r\n return a.submittedAt - b.submittedAt;\r\n });\r\n \r\n modeEntries.forEach((e, index) => {\r\n modeEntries[index] = { ...e, rank: index + 1 };\r\n });\r\n \r\n const inserted = modeEntries.find((e) => e.submittedAt === submittedAt);\r\n return {\r\n accepted: true,\r\n rank: inserted?.rank ?? null,\r\n };\r\n }\r\n \r\n // Token mode\r\n const scoreToken = this.tokens.get(params.token);\r\n if (!scoreToken) {\r\n throw new Error('Invalid score token');\r\n }\r\n\r\n if (scoreToken.expiresAt < Date.now()) {\r\n throw new Error('Invalid or expired score token');\r\n }\r\n\r\n if (scoreToken.used) {\r\n throw new Error('Score token already used');\r\n }\r\n\r\n if (params.mode && params.mode !== scoreToken.mode) {\r\n throw new Error('Submission mode does not match token mode');\r\n }\r\n\r\n // Verify hash if sealing enabled\r\n if (scoreToken.sealingNonce && !hash) {\r\n throw new Error('Score hash required when score sealing is enabled');\r\n }\r\n\r\n const submittedAt = Date.now();\r\n const entry: LeaderboardEntry = {\r\n profileId: `mock_profile`,\r\n username: 'Mock Player',\r\n avatarUrl: null,\r\n score: params.score,\r\n duration: params.duration,\r\n submittedAt,\r\n token: params.token,\r\n rank: null,\r\n zScore: null,\r\n isAnomaly: false,\r\n trustScore: 50,\r\n metadata: params.metadata ?? null,\r\n isSeed: false,\r\n };\r\n\r\n const modeEntries = this.getEntriesForMode(scoreToken.mode);\r\n modeEntries.push(entry);\r\n modeEntries.sort((a, b) => {\r\n if (b.score !== a.score) return b.score - a.score;\r\n return a.submittedAt - b.submittedAt;\r\n });\r\n\r\n modeEntries.forEach((e, index) => {\r\n modeEntries[index] = { ...e, rank: index + 1 };\r\n });\r\n\r\n scoreToken.used = true;\r\n scoreToken.sealingNonce = null;\r\n\r\n // Clean up cache\r\n this.tokenCache.delete(params.token)\r\n\r\n const inserted = modeEntries.find((e) => e.token === params.token && e.submittedAt === submittedAt);\r\n\r\n return {\r\n accepted: true,\r\n rank: inserted?.rank ?? null,\r\n };\r\n }\r\n\r\n async getPagedScores(options?: GetPagedScoresOptions): Promise<PagedScoresResponse> {\r\n const limit = options?.limit ?? 10\r\n const mode = options?.mode ?? 'default'\r\n const modeEntries = [...this.getEntriesForMode(mode)]\r\n\r\n const entries = modeEntries.slice(0, limit).map((entry) => ({\r\n ...entry,\r\n }))\r\n\r\n return {\r\n variant: 'standard',\r\n entries,\r\n totalEntries: modeEntries.length,\r\n nextCursor: null,\r\n playerRank: null,\r\n periodInstance: options?.period ?? 'alltime',\r\n }\r\n }\r\n\r\n async getMyRank(_options?: PlayerRankOptions): Promise<PlayerRankResult> {\r\n const mode = _options?.mode ?? 'default'\r\n const modeEntries = this.getEntriesForMode(mode)\r\n const playerEntry = modeEntries[0] ?? null\r\n\r\n return {\r\n rank: playerEntry?.rank ?? null,\r\n score: playerEntry?.score,\r\n totalPlayers: modeEntries.length,\r\n percentile: playerEntry\r\n ? Math.max(0, 1 - ((playerEntry.rank ?? 1) - 1) / Math.max(modeEntries.length, 1))\r\n : undefined,\r\n trustScore: 50,\r\n periodInstance: _options?.period ?? 'alltime',\r\n }\r\n }\r\n\r\n async getPodiumScores(options?: GetPodiumScoresOptions): Promise<PodiumScoresResponse> {\r\n const mode = options?.mode ?? 'default'\r\n const modeEntries = [...this.getEntriesForMode(mode)]\r\n\r\n const topCount = Math.max(1, Math.min(options?.topCount ?? 3, 10))\r\n const aheadCount = Math.max(0, Math.min(options?.contextAhead ?? 4, 10))\r\n const behindCount = Math.max(0, Math.min(options?.contextBehind ?? 2, 10))\r\n\r\n const topEntries = modeEntries.slice(0, topCount)\r\n const playerEntry = modeEntries[0] ?? null\r\n const totalEntries = modeEntries.length\r\n\r\n let playerRank = playerEntry?.rank ?? null\r\n let beforePlayer: LeaderboardEntry[] = []\r\n let afterPlayer: LeaderboardEntry[] = []\r\n let totalBefore = playerRank ? playerRank - 1 : 0\r\n let totalAfter = playerRank ? Math.max(totalEntries - playerRank, 0) : 0\r\n let omittedBefore = totalBefore\r\n let omittedAfter = totalAfter\r\n\r\n if (playerRank && playerRank > 0) {\r\n const beforeStart = Math.max(playerRank - aheadCount - 1, 0)\r\n beforePlayer = modeEntries.slice(beforeStart, playerRank - 1)\r\n const afterEnd = Math.min(playerRank + behindCount, totalEntries)\r\n afterPlayer = modeEntries.slice(playerRank, afterEnd)\r\n\r\n const shownTopAhead = topEntries.filter((entry) => (entry.rank ?? 0) > 0 && (entry.rank ?? 0) < playerRank!).length\r\n omittedBefore = Math.max(totalBefore - (beforePlayer.length + shownTopAhead), 0)\r\n omittedAfter = Math.max(totalAfter - afterPlayer.length, 0)\r\n }\r\n\r\n return {\r\n variant: 'highlight',\r\n entries: topEntries,\r\n totalEntries,\r\n nextCursor: null,\r\n playerRank: playerRank ?? null,\r\n periodInstance: options?.period ?? 'alltime',\r\n context: {\r\n topEntries,\r\n beforePlayer,\r\n playerEntry: playerEntry ?? null,\r\n afterPlayer,\r\n totalBefore,\r\n totalAfter,\r\n omittedBefore,\r\n omittedAfter,\r\n },\r\n }\r\n }\r\n}\r\n","import { Host } from '../Host'\r\nimport { VenusAPI } from '../venus-api/types'\r\n\r\nexport * from './LeaderboardApi'\r\nexport { RpcLeaderboardApi } from './RpcLeaderboardApi'\r\nexport { MockLeaderboardApi } from './MockLeaderboardApi'\r\nexport * from './utils'\r\n\r\nexport function initializeLeaderboard(venusApiInstance: VenusAPI, host: Host) {\r\n venusApiInstance.leaderboard = host.leaderboard\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","import { RpcClient } from '../rpc';\r\nimport { VenusMessageId } from '../VenusMessageId';\r\nimport {\r\n QRCodeResult,\r\n ShareLinkResult,\r\n ShareMetadata,\r\n SocialApi,\r\n SocialQRCodeOptions,\r\n} from './SocialApi';\r\n\r\nexport class RpcSocialApi implements SocialApi {\r\n constructor(private readonly rpcClient: RpcClient) {}\r\n\r\n async shareLinkAsync(options: {\r\n launchParams: Record<string, string>;\r\n metadata?: ShareMetadata;\r\n }): Promise<ShareLinkResult> {\r\n const result = (await this.rpcClient.call(VenusMessageId.SHARE_LINK, {\r\n launchParams: options.launchParams,\r\n metadata: options.metadata ?? {},\r\n })) as { shareUrl: string };\r\n\r\n return {\r\n shareUrl: result.shareUrl,\r\n };\r\n }\r\n\r\n async createQRCodeAsync(options: {\r\n launchParams: Record<string, string>;\r\n metadata?: ShareMetadata;\r\n qrOptions?: SocialQRCodeOptions;\r\n }): Promise<QRCodeResult> {\r\n const result = (await this.rpcClient.call(\r\n VenusMessageId.CREATE_SHARE_QRCODE,\r\n {\r\n launchParams: options.launchParams,\r\n metadata: options.metadata ?? {},\r\n qrOptions: options.qrOptions ?? {},\r\n },\r\n )) as { shareUrl: string; qrCode: string };\r\n\r\n return {\r\n shareUrl: result.shareUrl,\r\n qrCode: result.qrCode,\r\n };\r\n }\r\n}\r\n","import {\r\n OnNotificationCallback,\r\n OnRequestCallback,\r\n OnResponseCallback,\r\n RpcNotification,\r\n RpcRequest,\r\n RpcResponse,\r\n RpcTransport,\r\n Subscription,\r\n} from './rpc'\r\nimport { VenusMessageId } from './VenusMessageId'\r\n\r\nexport interface VenusMessage {\r\n type: string\r\n direction: string\r\n data?: {\r\n requestId?: string\r\n success?: boolean\r\n\r\n //NOTE(Zee): Some things send 'value' others send 'data'\r\n value?: any\r\n data?: any\r\n\r\n error?: string\r\n\r\n script?: string\r\n }\r\n instanceId: string\r\n timestamp: number\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n _venusInitState?: {\r\n poolId: string\r\n apiInjected: boolean\r\n gameInitialized: boolean\r\n }\r\n ReactNativeWebView?: {\r\n postMessage(message: string): void\r\n }\r\n venus: {\r\n _config: {\r\n locale: string\r\n instanceId: string\r\n context?: any\r\n profile?: {\r\n id?: string\r\n username?: string\r\n name?: string\r\n displayName?: string\r\n avatarUrl?: string | null\r\n isAnonymous?: boolean\r\n }\r\n environment: {\r\n browserInfo?: {\r\n language: string\r\n }\r\n }\r\n _handlers: Record<string, any>\r\n }\r\n profile?: {\r\n id?: string\r\n username?: string\r\n avatarUrl?: string | null\r\n name?: string\r\n displayName?: string\r\n isAnonymous?: boolean\r\n } | null\r\n _fetchFromCdn: (url: string) => Promise<string>\r\n }\r\n }\r\n}\r\n\r\nexport type OnVenusMessageCallback = (message: VenusMessage) => void\r\n\r\nexport class VenusTransport implements RpcTransport {\r\n private readonly messageHandler: (event: MessageEvent) => void\r\n\r\n private readonly onNotificationCallbacks: OnNotificationCallback[] = []\r\n private readonly onNotificationCallbacksToRemove: OnNotificationCallback[] =\r\n []\r\n\r\n private readonly onVenusMessageCallbacks: OnVenusMessageCallback[] = []\r\n private readonly onResponseCallbacks: OnResponseCallback[] = []\r\n private readonly onResponseCallbacksToRemove: OnResponseCallback[] = []\r\n\r\n private _instanceId: string | null = null\r\n private isStarted: boolean = false\r\n private isProcessingMessage: boolean = false\r\n\r\n constructor() {\r\n this.messageHandler = async (event) => {\r\n this.isProcessingMessage = true\r\n\r\n let message: VenusMessage\r\n if (typeof event.data === 'string') {\r\n //this.log(`Message is a string. Parsing...`)\r\n message = JSON.parse(event.data)\r\n } else {\r\n message = event.data as VenusMessage\r\n }\r\n\r\n if (!message) {\r\n this.logInfo('No message found. Ignoring message...')\r\n return\r\n }\r\n\r\n //this.logInfo(`message received:\\n${JSON.stringify(message, null, 2)}`)\r\n\r\n this.notifyVenusMessageReceived(message)\r\n\r\n if (\r\n message.type === VenusMessageId.PAUSE ||\r\n message.type === VenusMessageId.RESUME ||\r\n message.type === VenusMessageId.AWAKE ||\r\n message.type === VenusMessageId.SLEEP ||\r\n message.type === VenusMessageId.QUIT\r\n ) {\r\n const notification: RpcNotification = {\r\n type: 'rpc-notification',\r\n id: message.type,\r\n payload: message.data,\r\n }\r\n this.handleNotification(notification)\r\n\r\n // NOTE(Zee): This early return is dangerous here. we have to make sure isProcessingMessage is set to false!\r\n this.isProcessingMessage = false\r\n return\r\n }\r\n\r\n const messageData = message.data\r\n if (!messageData) {\r\n this.logWarn('No data found. Ignoring message...')\r\n this.isProcessingMessage = false\r\n return\r\n }\r\n\r\n if (message.type === VenusMessageId.H5_SIMULATION_UPDATE) {\r\n const notification: RpcNotification = {\r\n type: 'rpc-notification',\r\n id: message.type,\r\n payload: message.data,\r\n }\r\n this.handleNotification(notification)\r\n this.isProcessingMessage = false\r\n return\r\n }\r\n\r\n const requestId = messageData.requestId\r\n if (!requestId) {\r\n this.logWarn('No requestId. Ignoring message...')\r\n this.isProcessingMessage = false\r\n return\r\n }\r\n\r\n if (message.type !== VenusMessageId.H5_RESPONSE) {\r\n this.logWarn(`Ignoring unknown message type: ${message.type}`)\r\n this.isProcessingMessage = false\r\n return\r\n }\r\n\r\n const success = messageData.success\r\n let error = undefined\r\n if (!success) {\r\n error = {\r\n message: messageData.error || 'Unknown error',\r\n }\r\n }\r\n\r\n // Result can be either inside value or data\r\n let result = messageData.value\r\n if (result === undefined) {\r\n result = messageData.data\r\n }\r\n\r\n const response: RpcResponse = {\r\n type: 'rpc-response',\r\n id: requestId,\r\n result: result,\r\n method: message.type,\r\n error: error,\r\n }\r\n\r\n await this.handleResponse(response)\r\n this.isProcessingMessage = false\r\n }\r\n }\r\n onNotification(callback: OnNotificationCallback): Subscription {\r\n this.onNotificationCallbacks.push(callback)\r\n return {\r\n unsubscribe: () => {\r\n if (this.isProcessingMessage) {\r\n this.onNotificationCallbacks.push(callback)\r\n } else {\r\n this.removeOnNotificationCallback(callback)\r\n }\r\n },\r\n }\r\n }\r\n\r\n onRequest(callback: OnRequestCallback): Subscription {\r\n throw new Error('Method not implemented.')\r\n }\r\n\r\n onResponse(callback: OnResponseCallback): Subscription {\r\n this.onResponseCallbacks.push(callback)\r\n return {\r\n unsubscribe: () => {\r\n if (this.isProcessingMessage) {\r\n this.onResponseCallbacksToRemove.push(callback)\r\n } else {\r\n this.removeOnResponseCallback(callback)\r\n }\r\n },\r\n }\r\n }\r\n\r\n public get instanceId(): string | null {\r\n return this._instanceId\r\n }\r\n\r\n public set instanceId(instanceId: string) {\r\n this._instanceId = instanceId\r\n }\r\n\r\n sendRequest(request: RpcRequest): void {\r\n const instanceId = this.instanceId || 'unknown'\r\n const method = request.method\r\n const message: VenusMessage = {\r\n type: method,\r\n direction: 'H5_TO_APP',\r\n data: {\r\n ...request.args,\r\n requestId: request.id,\r\n },\r\n instanceId: instanceId,\r\n timestamp: Date.now(),\r\n }\r\n this.sendVenusMessage(message)\r\n }\r\n\r\n sendVenusMessage(message: VenusMessage): void {\r\n const messageAsString = JSON.stringify(message, null, 2)\r\n //this.logInfo(`Sending message:\\n${messageAsString}`)\r\n const reactNativeWebView = window.ReactNativeWebView\r\n if (reactNativeWebView) {\r\n reactNativeWebView.postMessage(messageAsString)\r\n } else {\r\n window.parent.postMessage(messageAsString, '*')\r\n }\r\n }\r\n\r\n sendResponse(response: RpcResponse): void {\r\n throw new Error('Method not implemented.')\r\n }\r\n\r\n start() {\r\n if (this.isStarted) {\r\n return\r\n }\r\n this.isStarted = true\r\n window.addEventListener('message', this.messageHandler, true)\r\n this.logInfo(`Started`)\r\n }\r\n\r\n stop() {\r\n if (!this.isStarted) {\r\n return\r\n }\r\n this.isStarted = false\r\n window.removeEventListener('message', this.messageHandler)\r\n this.logInfo(`Stopped`)\r\n }\r\n\r\n private handleNotification(notification: RpcNotification): void {\r\n //this.logInfo('Notification received: ', notification.id)\r\n for (const callback of this.onNotificationCallbacks) {\r\n callback(notification)\r\n }\r\n\r\n for (const callback of this.onNotificationCallbacksToRemove) {\r\n this.removeOnNotificationCallback(callback)\r\n }\r\n this.onNotificationCallbacksToRemove.length = 0\r\n }\r\n\r\n private async handleResponse(response: RpcResponse): Promise<void> {\r\n for (const callback of this.onResponseCallbacks) {\r\n const consumed = await callback(response)\r\n if (consumed) {\r\n break\r\n }\r\n }\r\n\r\n for (const callback of this.onResponseCallbacksToRemove) {\r\n this.removeOnResponseCallback(callback)\r\n }\r\n this.onResponseCallbacksToRemove.length = 0\r\n }\r\n\r\n private removeOnResponseCallback(callback: OnResponseCallback): void {\r\n this.onResponseCallbacks.splice(\r\n this.onResponseCallbacks.indexOf(callback),\r\n 1,\r\n )\r\n }\r\n\r\n private removeOnNotificationCallback(callback: OnNotificationCallback): void {\r\n this.onNotificationCallbacks.splice(\r\n this.onNotificationCallbacks.indexOf(callback),\r\n 1,\r\n )\r\n }\r\n\r\n private logInfo(message: string, ...params: any[]) {\r\n console.log(`[Venus Transport] ${message}`, ...params)\r\n }\r\n\r\n private logWarn(message: string, ...params: any[]) {\r\n console.warn(`[Venus Transport] ${message}`, ...params)\r\n }\r\n\r\n onVenusMessage(callback: OnVenusMessageCallback): Subscription {\r\n this.onVenusMessageCallbacks.push(callback)\r\n return {\r\n unsubscribe: () => {\r\n this.onVenusMessageCallbacks.splice(\r\n this.onVenusMessageCallbacks.indexOf(callback),\r\n 1,\r\n )\r\n },\r\n }\r\n }\r\n\r\n private notifyVenusMessageReceived(message: VenusMessage) {\r\n for (const callback of this.onVenusMessageCallbacks) {\r\n callback(message)\r\n }\r\n }\r\n}\r\n","import {\r\n Host,\r\n InitializationContext,\r\n SafeArea,\r\n InitializationOptions,\r\n} from './Host.ts'\r\nimport { RpcClient } from './rpc'\r\nimport { VenusTransport } from './VenusTransport.ts'\r\nimport { AnalyticsApi, RpcAnalyticsApi } from './analytics'\r\nimport { AdsApi, RpcAdsApi } from './ads'\r\nimport { RpcStorageApi, StorageApi } from './storage'\r\nimport { VenusMessageId } from './VenusMessageId.ts'\r\nimport { Avatar3dApi, RpcAvatarApi } from './avatar3d'\r\nimport { VenusAPI } from './venus-api/types.ts'\r\nimport { NavigationApi, RpcNavigationApi } from './navigation'\r\nimport { NotificationsApi } from './notifications'\r\nimport { RpcNotificationsApi } from './notifications/RpcNotificationsApi'\r\nimport { PopupsApi, RpcPopupsApi } from './popups'\r\nimport { HostProfileApi, ProfileApi } from './profile'\r\nimport { SystemApi, HostSystemApi } from './system'\r\nimport { HostDeviceApi, DeviceInfo } from './device'\r\nimport { HostEnvironmentApi, EnvironmentInfo } from './environment'\r\nimport { CdnApi, HostCdnApi } from './cdn'\r\nimport { HostTimeApi, TimeApi } from './time'\r\nimport { AiApi, RpcAiApi } from './ai'\r\nimport { HapticsApi, RpcHapticsApi } from './haptics'\r\nimport { FeaturesApi, RpcFeaturesApi } from './features'\r\nimport { LifecycleApi, RpcLifecycleApi } from './lifecycles'\r\nimport { RpcSimulationApi, SimulationApi } from './simulation'\r\nimport { RoomsApi, initializeRoomsApi } from './rooms'\r\nimport { RpcRoomsApi } from './rooms/RpcRoomsApi'\r\nimport { LoggingApi, RpcLoggingApi } from './logging'\r\nimport { IapApi, RpcIapApi } from './iap'\r\nimport { RpcSharedAssetsApi } from './shared-assets'\r\nimport { LeaderboardApi, RpcLeaderboardApi } from './leaderboard'\r\nimport { PreloaderApi, RpcPreloaderApi } from './game-preloader'\r\nimport { SocialApi } from './social/SocialApi'\r\nimport { RpcSocialApi } from './social/RpcSocialApi'\r\n\r\nconst getCdnBaseUrl = (): string => {\r\n return 'https://venus-static-01293ak.web.app/'\r\n}\r\n\r\nexport class RemoteHost implements Host {\r\n readonly ads: AdsApi\r\n readonly analytics: AnalyticsApi\r\n readonly deviceCache: StorageApi\r\n readonly appStorage: StorageApi\r\n readonly globalStorage: StorageApi\r\n readonly avatar3d: Avatar3dApi\r\n readonly navigation: NavigationApi\r\n readonly notifications: NotificationsApi\r\n readonly popups: PopupsApi\r\n readonly profile: ProfileApi\r\n readonly system: SystemApi\r\n readonly cdn: CdnApi\r\n readonly time: TimeApi\r\n readonly ai: AiApi\r\n readonly haptics: HapticsApi\r\n readonly features: FeaturesApi\r\n readonly lifecycle: LifecycleApi\r\n readonly simulation: SimulationApi\r\n readonly rooms: RoomsApi\r\n readonly logging: LoggingApi\r\n readonly iap: IapApi\r\n readonly leaderboard: LeaderboardApi\r\n readonly preloader: PreloaderApi\r\n readonly social: SocialApi\r\n\r\n context?: InitializationContext\r\n\r\n get isInitialized() {\r\n return this._isInitialized\r\n }\r\n\r\n private readonly venusApi: VenusAPI\r\n private readonly rpcClient: RpcClient\r\n private _isInitialized: boolean = false\r\n\r\n constructor(venusApi: VenusAPI) {\r\n this.venusApi = venusApi\r\n const rpcClient = new RpcClient()\r\n this.rpcClient = rpcClient\r\n\r\n this.ads = new RpcAdsApi(rpcClient)\r\n this.analytics = new RpcAnalyticsApi(rpcClient)\r\n this.deviceCache = new RpcStorageApi(rpcClient, {\r\n clear: VenusMessageId.DEVICE_CACHE_CLEAR,\r\n getItem: VenusMessageId.DEVICE_CACHE_GET_ITEM,\r\n getKey: VenusMessageId.DEVICE_CACHE_KEY,\r\n length: VenusMessageId.DEVICE_CACHE_LENGTH,\r\n removeItem: VenusMessageId.DEVICE_CACHE_REMOVE_ITEM,\r\n setItem: VenusMessageId.DEVICE_CACHE_SET_ITEM,\r\n })\r\n this.appStorage = new RpcStorageApi(rpcClient, {\r\n clear: VenusMessageId.APP_STORAGE_CLEAR,\r\n getItem: VenusMessageId.APP_STORAGE_GET_ITEM,\r\n getKey: VenusMessageId.APP_STORAGE_KEY,\r\n length: VenusMessageId.APP_STORAGE_LENGTH,\r\n removeItem: VenusMessageId.APP_STORAGE_REMOVE_ITEM,\r\n setItem: VenusMessageId.APP_STORAGE_SET_ITEM,\r\n getAllItems: VenusMessageId.APP_STORAGE_GET_ALL_ITEMS,\r\n setMultipleItems: VenusMessageId.APP_STORAGE_SET_ITEM,\r\n removeMultipleItems: VenusMessageId.APP_STORAGE_REMOVE_ITEM,\r\n })\r\n this.globalStorage = new RpcStorageApi(rpcClient, {\r\n clear: VenusMessageId.GLOBAL_STORAGE_CLEAR,\r\n getItem: VenusMessageId.GLOBAL_STORAGE_GET_ITEM,\r\n getKey: VenusMessageId.GLOBAL_STORAGE_KEY,\r\n length: VenusMessageId.GLOBAL_STORAGE_LENGTH,\r\n removeItem: VenusMessageId.GLOBAL_STORAGE_REMOVE_ITEM,\r\n setItem: VenusMessageId.GLOBAL_STORAGE_SET_ITEM,\r\n getAllItems: VenusMessageId.GLOBAL_STORAGE_GET_ALL_ITEMS,\r\n setMultipleItems: VenusMessageId.GLOBAL_STORAGE_SET_MULTIPLE_ITEMS,\r\n removeMultipleItems: VenusMessageId.GLOBAL_STORAGE_REMOVE_MULTIPLE_ITEMS,\r\n })\r\n\r\n this.avatar3d = new RpcAvatarApi(rpcClient, venusApi)\r\n this.navigation = new RpcNavigationApi(rpcClient, venusApi)\r\n this.notifications = new RpcNotificationsApi(rpcClient)\r\n this.popups = new RpcPopupsApi(rpcClient)\r\n this.profile = new HostProfileApi(venusApi)\r\n\r\n // Create device and environment APIs and combine into system namespace\r\n const deviceApi = new HostDeviceApi(venusApi)\r\n const environmentApi = new HostEnvironmentApi(venusApi)\r\n this.system = new HostSystemApi(deviceApi, environmentApi, venusApi)\r\n\r\n this.cdn = new HostCdnApi(getCdnBaseUrl())\r\n this.time = new HostTimeApi(rpcClient, venusApi)\r\n this.ai = new RpcAiApi(rpcClient)\r\n this.haptics = new RpcHapticsApi(rpcClient)\r\n this.features = new RpcFeaturesApi(rpcClient)\r\n this.lifecycle = new RpcLifecycleApi(rpcClient)\r\n this.simulation = new RpcSimulationApi(rpcClient)\r\n this.rooms = new RpcRoomsApi(rpcClient)\r\n this.logging = new RpcLoggingApi(this, rpcClient)\r\n this.iap = new RpcIapApi(rpcClient)\r\n this.leaderboard = new RpcLeaderboardApi(rpcClient)\r\n this.preloader = new RpcPreloaderApi(rpcClient)\r\n this.social = new RpcSocialApi(rpcClient)\r\n venusApi.isMock = () => false\r\n this.venusApi.sharedAssets = new RpcSharedAssetsApi(rpcClient, venusApi)\r\n\r\n initializeRoomsApi(this.venusApi, this)\r\n }\r\n\r\n async initialize(\r\n options?: InitializationOptions,\r\n ): Promise<InitializationContext> {\r\n this.log('Initializing Remote Host...')\r\n\r\n const transport = new VenusTransport()\r\n transport.start()\r\n this.rpcClient.start(transport)\r\n\r\n // Set up room notification routing in RpcRoomsApi\r\n const roomsApi = this.rooms as RpcRoomsApi\r\n roomsApi.setupNotifications(transport)\r\n\r\n const response = await this.rpcClient.call<InitResponse>(\r\n VenusMessageId.INIT_SDK,\r\n {},\r\n 5000,\r\n )\r\n\r\n transport.instanceId = response.instanceId\r\n this.log(`Remote Host Initialized with id: ${transport.instanceId}`)\r\n\r\n // Store data on VenusAPI instance (not global window.venus)\r\n // Profile, device, and environment are all required in InitResponse\r\n const profile = response.profile\r\n const sanitizedProfile = {\r\n id: profile.id,\r\n username: profile.username,\r\n avatarUrl: profile.avatarUrl ?? null,\r\n isAnonymous: Boolean(profile.isAnonymous),\r\n }\r\n this.venusApi._profileData = sanitizedProfile\r\n this.venusApi._deviceData = response.device\r\n this.venusApi._environmentData = response.environment\r\n this.venusApi._localeData = response.locale\r\n this.venusApi._languageCodeData = response.languageCode\r\n\r\n this._isInitialized = true\r\n\r\n // Set launchParams directly on VenusAPI instance\r\n this.venusApi.launchParams = response.launchParams\r\n\r\n await this.rpcClient.call(VenusMessageId.READY, {})\r\n\r\n const safeArea = response.safeArea\r\n if (safeArea) {\r\n // Store internally for system.getSafeArea()\r\n this.venusApi._safeAreaData = safeArea\r\n }\r\n\r\n this.context = {\r\n safeArea: safeArea,\r\n initializeAsleep: response.initializeAsleep,\r\n }\r\n\r\n return this.context\r\n }\r\n\r\n private log(message: string) {\r\n console.log(`[Venus SDK] [Remote Host] ${message}`)\r\n }\r\n}\r\n\r\nexport interface InitResponse {\r\n initializeAsleep: boolean\r\n instanceId: string\r\n profile: {\r\n id: string\r\n username: string\r\n avatarUrl?: string | null\r\n isAnonymous?: boolean\r\n }\r\n safeArea?: SafeArea\r\n launchParams: Record<string, string>\r\n environment: EnvironmentInfo\r\n device: DeviceInfo\r\n locale: string\r\n languageCode: string\r\n rooms?: {\r\n gameType?: string\r\n rulesPreset?: string\r\n matchmaking?: Record<string, any>\r\n createOptions?: Record<string, any>\r\n privateMatchDefaults?: Record<string, any>\r\n [key: string]: any\r\n }\r\n}\r\n","import { AnalyticsApi, MockAnalyticsApi } from './analytics'\r\nimport { Host, InitializationContext, InitializationOptions } from './Host.ts'\r\nimport { AdsApi, MockAdsApi } from './ads'\r\nimport { createMockStorageApi, StorageApi } from './storage'\r\nimport { Avatar3dApi, MockAvatarApi } from './avatar3d'\r\nimport { VenusAPI } from './venus-api/types.ts'\r\nimport { MockNavigationApi, NavigationApi } from './navigation'\r\nimport { MockNotificationsApi, NotificationsApi } from './notifications'\r\nimport { MockPopupsApi, PopupsApi } from './popups'\r\nimport { MockProfileApi, ProfileApi } from './profile'\r\nimport { SystemApi, MockSystemApi } from './system'\r\nimport { MockDeviceApi } from './device'\r\nimport { MockEnvironmentApi } from './environment'\r\nimport { CdnApi, MockCdnApi } from './cdn'\r\nimport { MockTimeApi, TimeApi } from './time'\r\nimport { AiApi, MockAiApi } from './ai'\r\nimport { HapticsApi, MockHapticsApi } from './haptics'\r\nimport { FeaturesApi, MockFeaturesApi } from './features'\r\nimport { LifecycleApi, MockLifecycleApi } from './lifecycles'\r\nimport { SimulationApi } from './simulation'\r\nimport { RoomsApi, initializeRoomsApi } from './rooms'\r\nimport { LoggingApi, MockLoggingApi } from './logging'\r\nimport { IapApi, MockIapApi } from './iap'\r\nimport { VenusMessageId } from './VenusMessageId'\r\nimport {\r\n MockOverlay,\r\n OverlayElements,\r\n MockActionSheetItem,\r\n MockActionSheetOptions,\r\n} from './MockOverlay'\r\nimport { MockSharedAssetsApi, RpcSharedAssetsApi } from './shared-assets'\r\nimport { LeaderboardApi, MockLeaderboardApi } from './leaderboard'\r\nimport { MockPreloaderApi, PreloaderApi } from './game-preloader'\r\nimport { SocialApi } from './social/SocialApi'\r\nimport { MockSocialApi } from './social/MockSocialApi'\r\n\r\nconst ROOMS_UNAVAILABLE_MESSAGE =\r\n '[Venus SDK] Rooms API is only available when running inside the Venus host environment.'\r\n\r\nfunction createUnavailableRoomsApi(): RoomsApi {\r\n const roomsUnavailableError = (): Error => new Error(ROOMS_UNAVAILABLE_MESSAGE)\r\n\r\n return {\r\n async createRoomAsync(): Promise<never> {\r\n throw roomsUnavailableError()\r\n },\r\n async joinOrCreateRoomAsync(): Promise<never> {\r\n throw roomsUnavailableError()\r\n },\r\n async joinRoomByCodeAsync(): Promise<never> {\r\n throw roomsUnavailableError()\r\n },\r\n async getUserRoomsAsync(): Promise<never> {\r\n throw roomsUnavailableError()\r\n },\r\n async subscribeAsync(): Promise<never> {\r\n throw roomsUnavailableError()\r\n },\r\n async updateRoomDataAsync(): Promise<never> {\r\n throw roomsUnavailableError()\r\n },\r\n async getRoomDataAsync(): Promise<never> {\r\n throw roomsUnavailableError()\r\n },\r\n async sendRoomMessageAsync(): Promise<never> {\r\n throw roomsUnavailableError()\r\n },\r\n async leaveRoomAsync(): Promise<never> {\r\n throw roomsUnavailableError()\r\n },\r\n async startRoomGameAsync(): Promise<never> {\r\n throw roomsUnavailableError()\r\n },\r\n async proposeMoveAsync(): Promise<never> {\r\n throw roomsUnavailableError()\r\n },\r\n async validateMoveAsync(): Promise<never> {\r\n throw roomsUnavailableError()\r\n },\r\n }\r\n}\r\n\r\nconst SIMULATION_UNAVAILABLE_MESSAGE =\r\n '[Venus SDK] Simulation API is only available when running inside the Venus host environment.'\r\n\r\nfunction createUnavailableSimulationApi(): SimulationApi {\r\n const simulationUnavailableError = (): Error => new Error(SIMULATION_UNAVAILABLE_MESSAGE)\r\n\r\n return {\r\n isEnabled(): boolean {\r\n return false\r\n },\r\n async getStateAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async getConfigAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async executeRecipeAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async getActiveRunsAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async collectRecipeAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async executeScopedRecipeAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async triggerRecipeChainAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async getAvailableRecipesAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async getRecipeRequirementsAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async getBatchRecipeRequirementsAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async resolveFieldValueAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async getEntityMetadataAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async getSlotContainersAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async getSlotAssignmentsAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async assignItemToSlotAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async removeItemFromSlotAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async getAvailableItemsAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async calculatePowerPreviewAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async validateSlotAssignmentAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async executeBatchOperationsAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n async subscribeAsync(): Promise<never> {\r\n throw simulationUnavailableError()\r\n },\r\n }\r\n}\r\n\r\nenum MockHostState {\r\n PLAYING,\r\n PAUSED,\r\n SLEEPING,\r\n TERMINATED,\r\n}\r\n\r\nexport class MockHost implements Host {\r\n readonly ads: AdsApi\r\n readonly analytics: AnalyticsApi\r\n readonly deviceCache: StorageApi\r\n readonly appStorage: StorageApi\r\n readonly globalStorage: StorageApi\r\n readonly avatar3d: Avatar3dApi\r\n readonly navigation: NavigationApi\r\n readonly notifications: NotificationsApi\r\n readonly popups: PopupsApi\r\n readonly profile: ProfileApi\r\n readonly system: SystemApi\r\n readonly cdn: CdnApi\r\n readonly time: TimeApi\r\n readonly ai: AiApi\r\n readonly haptics: HapticsApi\r\n readonly features: FeaturesApi\r\n readonly lifecycle: LifecycleApi\r\n readonly simulation: SimulationApi\r\n readonly rooms: RoomsApi\r\n readonly logging: LoggingApi\r\n readonly iap: IapApi\r\n readonly leaderboard: LeaderboardApi\r\n readonly preloader: PreloaderApi\r\n readonly social: SocialApi\r\n\r\n context?: InitializationContext\r\n\r\n private state: MockHostState = MockHostState.PLAYING\r\n\r\n get isInitialized() {\r\n return this._isInitialized\r\n }\r\n\r\n private readonly venusApi: VenusAPI\r\n private _isInitialized: boolean = false\r\n private readonly _overlay: MockOverlay\r\n\r\n private readonly _mockLifecyclesApi: MockLifecycleApi\r\n private readonly _mockAdsApi: MockAdsApi\r\n\r\n constructor(venusApi: VenusAPI) {\r\n this.venusApi = venusApi\r\n this._overlay = this.createOverlay()\r\n this._mockAdsApi = new MockAdsApi(this._overlay)\r\n this._mockLifecyclesApi = new MockLifecycleApi()\r\n\r\n this.ads = this._mockAdsApi\r\n this.analytics = new MockAnalyticsApi()\r\n const appUrl = typeof window !== 'undefined' ? window.location.href : ''\r\n this.deviceCache = createMockStorageApi('deviceCache', appUrl)\r\n this.appStorage = createMockStorageApi('appStorage', appUrl)\r\n this.globalStorage = createMockStorageApi('globalStorage')\r\n this.avatar3d = new MockAvatarApi(venusApi)\r\n this.navigation = new MockNavigationApi(venusApi)\r\n this.notifications = new MockNotificationsApi(venusApi)\r\n this.popups = new MockPopupsApi(this._overlay)\r\n this.profile = new MockProfileApi(venusApi)\r\n \r\n // Create device and environment APIs and combine into system namespace\r\n const deviceApi = new MockDeviceApi(venusApi)\r\n const environmentApi = new MockEnvironmentApi(venusApi)\r\n this.system = new MockSystemApi(deviceApi, environmentApi, venusApi)\r\n \r\n // MockCdnApi reads configuration from venusApi._mock at runtime\r\n this.cdn = new MockCdnApi(venusApi)\r\n this.time = new MockTimeApi(venusApi)\r\n this.ai = new MockAiApi()\r\n this.haptics = new MockHapticsApi(venusApi)\r\n this.features = new MockFeaturesApi()\r\n this.lifecycle = this._mockLifecyclesApi\r\n this.simulation = createUnavailableSimulationApi()\r\n this.rooms = createUnavailableRoomsApi()\r\n this.logging = new MockLoggingApi()\r\n this.iap = new MockIapApi()\r\n this.social = new MockSocialApi()\r\n this.leaderboard = new MockLeaderboardApi()\r\n\r\n initializeRoomsApi(this.venusApi, this)\r\n\r\n this.preloader = new MockPreloaderApi()\r\n venusApi.isMock = () => true\r\n this.venusApi.sharedAssets = new MockSharedAssetsApi(this.venusApi)\r\n }\r\n\r\n initialize(options?: InitializationOptions): Promise<InitializationContext> {\r\n this._isInitialized = true\r\n\r\n // Populate system data on VenusAPI instance (same as RemoteHost)\r\n this.venusApi._profileData = this.profile.getCurrentProfile()\r\n this.venusApi._deviceData = this.system.getDevice()\r\n this.venusApi._environmentData = this.system.getEnvironment()\r\n \r\n // Populate locale data (added for ph-strip-sdk-config-static-data branch)\r\n this.venusApi._localeData = this.venusApi._mock?.locale || 'en-US'\r\n this.venusApi._languageCodeData = this.venusApi._mock?.languageCode || 'en'\r\n\r\n this.context = {\r\n initializeAsleep: false,\r\n safeArea: this.venusApi._safeAreaData,\r\n }\r\n\r\n return Promise.resolve(this.context)\r\n }\r\n\r\n private createOverlay(): MockOverlay {\r\n // Create overlay container\r\n const overlayContainer = document.createElement('div')\r\n overlayContainer.id = 'venus-mock-overlay'\r\n overlayContainer.style.cssText = `\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n pointer-events: none;\r\n z-index: 10000;\r\n `\r\n document.body.appendChild(overlayContainer)\r\n\r\n // Create close button with hardcoded position\r\n const menuButton = this.createOverlayButton(\r\n 'close',\r\n 'Menu',\r\n { x: window.innerWidth - 48, y: 16, width: 32, height: 32 },\r\n () => {\r\n this.handleMenuButtonClicked()\r\n },\r\n 'rgba(59, 130, 246, 0.7)', // Blue background instead of black\r\n '#FFFFFF',\r\n )\r\n overlayContainer.appendChild(menuButton)\r\n\r\n // Setup ad overlay container\r\n const adOverlay = this.setupAdOverlay()\r\n\r\n // Setup action sheet overlay container\r\n const actionSheet = this.setupActionSheetOverlay()\r\n\r\n // Handle window resize\r\n window.addEventListener('resize', () => {\r\n this.updateOverlayLayout()\r\n })\r\n\r\n return {\r\n container: overlayContainer,\r\n elements: {\r\n menuButton: menuButton,\r\n },\r\n appVisibilityState: 'visible',\r\n actionSheetOverlay: actionSheet,\r\n adOverlay: adOverlay,\r\n showAdOverlay: () => {\r\n return this.showAdOverlay('REWARDED VIDEO AD')\r\n },\r\n showActionSheet: (items, options) => {\r\n return this.showActionSheetOverlay(items, options)\r\n },\r\n }\r\n }\r\n\r\n private async handleMenuButtonClicked() {\r\n\r\n if (this.state === MockHostState.PLAYING) {\r\n this.triggerLifecycleEvent(VenusMessageId.PAUSE)\r\n this.state = MockHostState.PAUSED\r\n }\r\n\r\n const actionSheetItems: MockActionSheetItem[] = []\r\n\r\n const awakeAction: MockActionSheetItem = {\r\n label: '⏰ Awake',\r\n id: 'awakeAction',\r\n }\r\n\r\n const sleepAction: MockActionSheetItem = {\r\n label: '💤 Sleep',\r\n id: 'sleepAction',\r\n }\r\n\r\n const quitAction: MockActionSheetItem = {\r\n label: '🛑 Quit',\r\n id: 'quitAction',\r\n }\r\n\r\n const playAction: MockActionSheetItem = {\r\n label: '▶️ Play',\r\n id: 'playAction',\r\n }\r\n\r\n if (this.state === MockHostState.PAUSED) {\r\n // Only add sleep action if we are paused\r\n actionSheetItems.push(sleepAction)\r\n } else if (this.state === MockHostState.SLEEPING) {\r\n // Only add awake action if we are sleeping\r\n actionSheetItems.push(awakeAction)\r\n }\r\n\r\n if (this.state !== MockHostState.TERMINATED) {\r\n // Add quit action if the game has not been terminated yet\r\n actionSheetItems.push(quitAction)\r\n } else if (this.state === MockHostState.TERMINATED) {\r\n // Add play action only if the game is terminated\r\n actionSheetItems.push(playAction)\r\n }\r\n\r\n const action = await this.showActionSheetOverlay(actionSheetItems)\r\n\r\n if (action === awakeAction.id) {\r\n this.tryAwake()\r\n } else if (action === sleepAction.id) {\r\n this.trySleep()\r\n } else if (action === playAction.id) {\r\n this.tryPlay()\r\n } else if (action === quitAction.id) {\r\n this.tryQuit()\r\n } else {\r\n this.tryResume()\r\n }\r\n }\r\n\r\n private tryAwake() {\r\n if (this.state === MockHostState.SLEEPING) {\r\n this.triggerLifecycleEvent(VenusMessageId.AWAKE)\r\n this.state = MockHostState.PAUSED\r\n }\r\n }\r\n\r\n private trySleep() {\r\n if (this.state === MockHostState.PAUSED) {\r\n this.triggerLifecycleEvent(VenusMessageId.SLEEP)\r\n this.state = MockHostState.SLEEPING\r\n }\r\n }\r\n\r\n private tryPlay() {\r\n if (this.state === MockHostState.TERMINATED) {\r\n this.triggerLifecycleEvent(VenusMessageId.AWAKE)\r\n this.state = MockHostState.PAUSED\r\n this.triggerLifecycleEvent(VenusMessageId.RESUME)\r\n this.state = MockHostState.PLAYING\r\n }\r\n }\r\n\r\n private tryQuit() {\r\n if (this.state === MockHostState.PLAYING) {\r\n this.triggerLifecycleEvent(VenusMessageId.PAUSE)\r\n this.state = MockHostState.PAUSED\r\n }\r\n\r\n if (this.state === MockHostState.PAUSED) {\r\n this.triggerLifecycleEvent(VenusMessageId.SLEEP)\r\n this.state = MockHostState.SLEEPING\r\n }\r\n\r\n if (this.state === MockHostState.SLEEPING){\r\n this.triggerLifecycleEvent(VenusMessageId.QUIT)\r\n this.state = MockHostState.TERMINATED\r\n }\r\n }\r\n\r\n private tryResume() {\r\n if (this.state === MockHostState.PAUSED) {\r\n this.triggerLifecycleEvent(VenusMessageId.RESUME)\r\n this.state = MockHostState.PLAYING\r\n }\r\n }\r\n\r\n private async showAdOverlay(type: any): Promise<boolean> {\r\n return new Promise((resolve, reject) => {\r\n const overlay = this._overlay\r\n const adOverlay = overlay.adOverlay\r\n\r\n // Clear any existing content\r\n overlay.adOverlay.innerHTML = ''\r\n\r\n // Add ad type heading\r\n const heading = document.createElement('h1')\r\n heading.style.cssText = `\r\n font-size: 24px;\r\n margin-bottom: 20px;\r\n text-align: center;\r\n `\r\n heading.innerText =\r\n type === 'interstitial' ? 'INTERSTITIAL AD' : 'REWARDED VIDEO AD'\r\n overlay.adOverlay.appendChild(heading)\r\n\r\n // Add mock ad content\r\n const content = document.createElement('div')\r\n content.style.cssText = `\r\n width: 300px;\r\n height: 250px;\r\n background-color: #1e40af;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n margin-bottom: 20px;\r\n border-radius: 8px;\r\n `\r\n content.innerText = 'Mock Ad Content'\r\n adOverlay.appendChild(content)\r\n\r\n // Add timer text\r\n const timer = document.createElement('p')\r\n timer.style.cssText = `\r\n margin-bottom: 20px;\r\n font-size: 16px;\r\n `\r\n timer.innerText = 'Normally ads would have a timer...'\r\n adOverlay.appendChild(timer)\r\n\r\n // Add OK button\r\n const okButton = document.createElement('button')\r\n okButton.style.cssText = `\r\n padding: 10px 40px;\r\n background-color: #2563eb;\r\n color: white;\r\n border: none;\r\n border-radius: 4px;\r\n font-size: 16px;\r\n cursor: pointer;\r\n `\r\n okButton.innerText = 'Close Ad'\r\n adOverlay.appendChild(okButton)\r\n\r\n // Show the overlay\r\n adOverlay.style.display = 'flex'\r\n\r\n okButton.onclick = () => {\r\n this.hideAdOverlay()\r\n resolve(true)\r\n }\r\n })\r\n }\r\n\r\n private hideAdOverlay() {\r\n const overlay = this._overlay\r\n if (overlay.adOverlay) {\r\n overlay.adOverlay.style.display = 'none'\r\n }\r\n }\r\n\r\n private setupActionSheetOverlay() {\r\n const actionSheetOverlay = document.createElement('div')\r\n actionSheetOverlay.id = 'venus-action-sheet-overlay'\r\n actionSheetOverlay.style.cssText = `\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background-color: rgba(0, 0, 0, 0.5);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 10600;\r\n font-family: sans-serif;\r\n display: none;\r\n `\r\n document.body.appendChild(actionSheetOverlay)\r\n return actionSheetOverlay\r\n }\r\n\r\n private createOverlayButton(\r\n id: string,\r\n text: string,\r\n position: { x: number; y: number; width: number; height: number },\r\n onClick: () => void,\r\n background: string,\r\n color: string,\r\n ) {\r\n const button = document.createElement('button')\r\n button.id = `venus-mock-${id}-button`\r\n button.innerText = text\r\n button.style.cssText = `\r\n position: absolute;\r\n left: ${position.x}px;\r\n top: ${position.y}px;\r\n width: ${position.width}px;\r\n min-width: ${position.width}px;\r\n height: ${position.height}px;\r\n background: ${background};\r\n color: ${color};\r\n border: none;\r\n border-radius: 8px;\r\n font-family: sans-serif;\r\n font-weight: bold;\r\n font-size: ${Math.min(position.width, position.height) / 3}px;\r\n cursor: pointer;\r\n pointer-events: auto;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n opacity: 0.9;\r\n transition: opacity 0.2s;\r\n `\r\n button.addEventListener('click', onClick)\r\n button.addEventListener('mouseover', () => {\r\n button.style.opacity = '1'\r\n })\r\n button.addEventListener('mouseout', () => {\r\n button.style.opacity = '0.9'\r\n })\r\n\r\n return button\r\n }\r\n\r\n private updateOverlayLayout() {\r\n const overlay = this._overlay\r\n const menuBtn = overlay.elements.menuButton\r\n\r\n menuBtn.style.left = `${window.innerWidth - 48}px`\r\n menuBtn.style.top = '16px'\r\n menuBtn.style.width = '32px'\r\n menuBtn.style.minWidth = '32px'\r\n menuBtn.style.height = '32px'\r\n }\r\n\r\n private triggerLifecycleEvent(name: string) {\r\n console.log('Trigger Lifecycle Event: ', name)\r\n\r\n if (name == VenusMessageId.PAUSE) {\r\n this._mockLifecyclesApi.triggerPauseCallbacks()\r\n } else if (name == VenusMessageId.RESUME) {\r\n this._mockLifecyclesApi.triggerResumeCallbacks()\r\n } else if (name == VenusMessageId.QUIT) {\r\n this._mockLifecyclesApi.triggerQuitCallbacks()\r\n } else if (name == VenusMessageId.AWAKE) {\r\n this._mockLifecyclesApi.triggerAwakeCallbacks()\r\n } else if (name == VenusMessageId.SLEEP) {\r\n this._mockLifecyclesApi.triggerSleepCallbacks()\r\n }\r\n }\r\n\r\n private setOverlayElementVisibility(\r\n element: keyof OverlayElements,\r\n visible: boolean,\r\n ) {\r\n const overlay = this._overlay\r\n const elements = overlay.elements\r\n if (elements[element]) {\r\n elements[element].style.display = visible ? 'flex' : 'none'\r\n }\r\n }\r\n\r\n private setupAdOverlay() {\r\n const adOverlay = document.createElement('div')\r\n adOverlay.id = 'venus-ad-overlay'\r\n adOverlay.style.cssText = `\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background-color: rgba(37, 99, 235, 0.9);\r\n color: white;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 10500;\r\n font-family: sans-serif;\r\n display: none;\r\n `\r\n document.body.appendChild(adOverlay)\r\n return adOverlay\r\n }\r\n\r\n private log(msg: string, ...args: any[]) {\r\n console.log(`[Venus Mock] ${msg}`, ...args)\r\n }\r\n\r\n private showActionSheetOverlay(\r\n items: MockActionSheetItem[],\r\n options?: MockActionSheetOptions,\r\n ): Promise<string | number | null> {\r\n this.log('Showing ActionSheetOverlay...')\r\n\r\n return new Promise((resolve, reject) => {\r\n const overlay = this._overlay\r\n // Clear any existing content and event listeners\r\n overlay.actionSheetOverlay.innerHTML = ''\r\n overlay.actionSheetOverlay.style.display = 'flex'\r\n\r\n // Create action sheet container\r\n const actionSheet = document.createElement('div')\r\n actionSheet.className = 'venus-action-sheet'\r\n actionSheet.style.cssText = `\r\n background-color: white;\r\n border-radius: 8px;\r\n width: 80%;\r\n max-width: 400px;\r\n max-height: 80%;\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n color: black;\r\n `\r\n\r\n // Add title if provided\r\n if (options?.title) {\r\n const titleContainer = document.createElement('div')\r\n titleContainer.style.cssText = `\r\n padding: 16px;\r\n border-bottom: 1px solid #eaeaea;\r\n font-weight: bold;\r\n font-size: 18px;\r\n text-align: center;\r\n color: black;\r\n `\r\n titleContainer.innerText = options.title\r\n actionSheet.appendChild(titleContainer)\r\n }\r\n\r\n // Add message if provided\r\n if (options?.message) {\r\n const messageContainer = document.createElement('div')\r\n messageContainer.style.cssText = `\r\n padding: 8px 16px;\r\n color: #666;\r\n font-size: 14px;\r\n text-align: center;\r\n `\r\n messageContainer.innerText = options.message\r\n actionSheet.appendChild(messageContainer)\r\n }\r\n\r\n // Add options\r\n const optionsContainer = document.createElement('div')\r\n optionsContainer.style.cssText = `\r\n overflow-y: auto;\r\n max-height: 300px;\r\n `\r\n\r\n items.forEach((item, index) => {\r\n const optionItem = document.createElement('div')\r\n optionItem.style.cssText = `\r\n padding: 12px 16px;\r\n border-bottom: 1px solid #eaeaea;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n transition: background-color 0.2s;\r\n color: black;\r\n `\r\n\r\n // Add hover effect\r\n optionItem.addEventListener('mouseover', () => {\r\n optionItem.style.backgroundColor = '#f5f5f5'\r\n })\r\n\r\n optionItem.addEventListener('mouseout', () => {\r\n optionItem.style.backgroundColor = 'white'\r\n })\r\n\r\n // Add icon if provided\r\n if (item.icon) {\r\n const iconSpan = document.createElement('span')\r\n iconSpan.style.cssText = `\r\n margin-right: 12px;\r\n font-size: 16px;\r\n `\r\n iconSpan.innerText = item.icon\r\n optionItem.appendChild(iconSpan)\r\n }\r\n\r\n // Add label\r\n const labelSpan = document.createElement('span')\r\n labelSpan.style.cssText = `\r\n color: black;\r\n `\r\n labelSpan.innerText = item.label\r\n optionItem.appendChild(labelSpan)\r\n\r\n // Handle click\r\n optionItem.addEventListener('click', () => {\r\n this.hideActionSheetOverlay()\r\n const optionId = item.id !== undefined ? item.id : index\r\n resolve(optionId)\r\n })\r\n\r\n optionsContainer.appendChild(optionItem)\r\n })\r\n\r\n actionSheet.appendChild(optionsContainer)\r\n\r\n // Add cancel button only if cancel is not disabled\r\n if (!options?.disableCancel) {\r\n const cancelButton = document.createElement('div')\r\n cancelButton.style.cssText = `\r\n padding: 14px 16px;\r\n text-align: center;\r\n font-weight: bold;\r\n cursor: pointer;\r\n color: #3b82f6;\r\n border-top: 1px solid #eaeaea;\r\n `\r\n cancelButton.innerText = options?.cancelButtonText || 'Cancel'\r\n cancelButton.addEventListener('click', () => {\r\n this.hideActionSheetOverlay()\r\n resolve(null)\r\n })\r\n\r\n actionSheet.appendChild(cancelButton)\r\n }\r\n\r\n // Add close button (X) in the top-right corner only if cancel is not disabled\r\n if (!options?.disableCancel) {\r\n const closeButton = document.createElement('div')\r\n closeButton.style.cssText = `\r\n position: absolute;\r\n top: 8px;\r\n right: 8px;\r\n width: 24px;\r\n height: 24px;\r\n border-radius: 12px;\r\n background-color: rgba(0,0,0,0.1);\r\n color: #666;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n font-size: 14px;\r\n `\r\n closeButton.innerText = '✕'\r\n closeButton.addEventListener('click', () => {\r\n this.hideActionSheetOverlay()\r\n resolve(null)\r\n })\r\n\r\n actionSheet.appendChild(closeButton)\r\n overlay.actionSheetOverlay.appendChild(actionSheet)\r\n }\r\n })\r\n }\r\n\r\n hideActionSheetOverlay() {\r\n const overlay = this._overlay\r\n if (overlay.actionSheetOverlay) {\r\n overlay.actionSheetOverlay.style.display = 'none'\r\n }\r\n }\r\n}\r\n","import { MockHost } from './MockHost.ts'\r\nimport { RemoteHost } from './RemoteHost.ts'\r\nimport { AnalyticsApi } from './analytics'\r\nimport { AdsApi } from './ads'\r\nimport { StorageApi } from './storage'\r\nimport { Avatar3dApi } from './avatar3d'\r\nimport { VenusAPI } from './venus-api/types.ts'\r\nimport { NavigationApi } from './navigation'\r\nimport { NotificationsApi } from './notifications'\r\nimport { PopupsApi } from './popups'\r\nimport { ProfileApi } from './profile'\r\nimport { SystemApi } from './system'\r\nimport { CdnApi } from './cdn'\r\nimport { TimeApi } from './time'\r\nimport { AiApi } from './ai'\r\nimport { HapticsApi } from './haptics'\r\nimport { FeaturesApi } from './features'\r\nimport { LifecycleApi } from './lifecycles'\r\nimport { SimulationApi } from './simulation'\r\nimport { RoomsApi } from './rooms'\r\nimport { LoggingApi } from './logging'\r\nimport { IapApi } from './iap'\r\nimport { LeaderboardApi } from './leaderboard'\r\nimport { PreloaderApi } from './game-preloader'\r\nimport { SocialApi } from './social'\r\n\r\n/**\r\n * Safe area insets representing padding needed to avoid device notches and host UI.\r\n * Includes toolbar/feedHeader height + device safe areas.\r\n */\r\nexport interface SafeArea {\r\n left: number\r\n top: number\r\n right: number\r\n bottom: number\r\n}\r\n\r\n/**\r\n * @deprecated Use SafeArea instead. Will be removed in v4.0.0\r\n */\r\nexport type HudInsets = SafeArea\r\n\r\nexport interface InitializationOptions {\r\n helpText?: string\r\n hardDisableMock?: boolean\r\n mock?: Record<string, any>\r\n usePreloader?: boolean\r\n}\r\n\r\nexport interface InitializationContext {\r\n /**\r\n * Safe area insets from INIT_SDK response.\r\n * @deprecated Use VenusAPI.system.getSafeArea() instead. Will be removed in v4.0.0\r\n */\r\n safeArea?: SafeArea\r\n initializeAsleep: boolean\r\n}\r\n\r\nexport interface Host {\r\n readonly ads: AdsApi\r\n readonly analytics: AnalyticsApi\r\n readonly deviceCache: StorageApi\r\n readonly appStorage: StorageApi\r\n readonly globalStorage: StorageApi\r\n readonly avatar3d: Avatar3dApi\r\n readonly navigation: NavigationApi\r\n readonly notifications: NotificationsApi\r\n readonly popups: PopupsApi\r\n readonly profile: ProfileApi\r\n readonly system: SystemApi\r\n readonly cdn: CdnApi\r\n readonly time: TimeApi\r\n readonly ai: AiApi\r\n readonly haptics: HapticsApi\r\n readonly features: FeaturesApi\r\n readonly lifecycle: LifecycleApi\r\n readonly simulation: SimulationApi\r\n readonly rooms: RoomsApi\r\n readonly logging: LoggingApi\r\n readonly leaderboard: LeaderboardApi\r\n readonly preloader: PreloaderApi\r\n readonly social: SocialApi\r\n readonly isInitialized: boolean\r\n readonly iap: IapApi\r\n\r\n readonly context?: InitializationContext\r\n\r\n initialize(options?: InitializationOptions): Promise<InitializationContext>\r\n}\r\n\r\nexport function createHost(venusApi: VenusAPI, isMock: boolean): Host {\r\n if (isMock) {\r\n return new MockHost(venusApi)\r\n } else {\r\n return new RemoteHost(venusApi)\r\n }\r\n}\r\n","import { Host } from '../Host';\r\nimport { VenusAPI } from '../venus-api/types';\r\n\r\nexport * from './SocialApi';\r\nexport * from './RpcSocialApi';\r\nexport * from './MockSocialApi';\r\n\r\nexport function initializeSocial(venusApi: VenusAPI, host: Host): void {\r\n venusApi.social = host.social;\r\n\r\n // Provide getter method for launch parameters\r\n venusApi.getLaunchParams = () => {\r\n return venusApi.launchParams || {};\r\n };\r\n}\r\n"]}