@series-inc/rundot-game-sdk 5.14.3-beta.migration-test → 5.14.3-beta.migration-test-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.
@@ -358,13 +358,38 @@ interface TimeApi {
358
358
  getFutureTimeAsync(options?: GetFutureTimeOptions): Promise<number>;
359
359
  }
360
360
 
361
+ type AiTextContent = {
362
+ type: 'text';
363
+ text: string;
364
+ };
365
+ /** Image referenced by URL. OpenAI/DeepSeek accept directly; the proxy fetches and base64-encodes for Anthropic. */
366
+ type AiImageUrlContent = {
367
+ type: 'image_url';
368
+ image_url: {
369
+ /** http(s):// URL or data:image/<type>;base64,<data> URI. */
370
+ url: string;
371
+ /** Optional hint for vision models that support it. */
372
+ detail?: 'low' | 'high' | 'auto';
373
+ };
374
+ };
375
+ /** Image as raw base64 data. */
376
+ type AiImageContent = {
377
+ type: 'image';
378
+ image: {
379
+ format: 'jpeg' | 'png' | 'gif' | 'webp';
380
+ /** Base64-encoded image bytes (no `data:` prefix). */
381
+ data: string;
382
+ };
383
+ };
384
+ type AiContentBlock = AiTextContent | AiImageUrlContent | AiImageContent;
361
385
  interface AiMessage {
362
386
  /**
363
387
  * Depends on the model you are using. Most common is user, system, and assistant.
364
388
  * If you are unsure, look up the specific model you are using.
365
389
  */
366
390
  role: string;
367
- content: string;
391
+ /** Either a plain string or an array of content blocks (text + image) for multimodal messages. */
392
+ content: string | AiContentBlock[];
368
393
  }
369
394
  type AiChatCompletionRequest = {
370
395
  /** Model identifier (e.g., 'gpt-4o', 'claude-3-5-sonnet-20241022') */
@@ -2722,4 +2747,4 @@ interface AdsApi {
2722
2747
  showInterstitialAd(options?: ShowInterstitialAdOptions): Promise<boolean>;
2723
2748
  }
2724
2749
 
2725
- export { type GetFutureTimeOptions as $, type AnalyticsApi as A, type BatchRecipeRequirementsResult as B, type NotificationsApi as C, type ScheduleLocalNotification as D, type ScheduleNotificationOptions as E, type PopupsApi as F, type ShowToastOptions as G, type Host as H, type ShowInterstitialAdOptions as I, type ShowRewardedAdOptions as J, type ProfileApi as K, type DeviceApi as L, type DeviceInfo as M, type NavigationApi as N, type EnvironmentApi as O, type Profile as P, type QuitOptions as Q, type RundotGameAPI as R, type SimulationActiveRunsUpdate as S, type EnvironmentInfo as T, type SystemApi as U, type SafeArea as V, type CdnApi as W, type FetchFromCdnOptions as X, type AssetUrlResult as Y, type TimeApi as Z, type ServerTimeData as _, type RecipeRequirementQuery as a, type OpenStoreResult as a$, type AiApi as a0, type AiChatCompletionRequest as a1, type AiChatCompletionData as a2, type HapticsApi as a3, HapticFeedbackStyle as a4, type FeaturesApi as a5, type Experiment as a6, type LifecycleApi as a7, type SleepCallback as a8, type Subscription as a9, type GetBatchRecipeRequirements as aA, type TriggerRecipeChainOptions as aB, type RoomDataUpdate as aC, type RoomMessageEvent as aD, type ProposedMoveEvent as aE, RundotGameTransport as aF, type RoomsApi as aG, type CreateRoomOptions as aH, type JoinOrCreateRoomOptions as aI, type JoinOrCreateResult as aJ, type ListRoomsOptions as aK, type UpdateRoomDataOptions as aL, type RoomMessageRequest as aM, type StartRoomGameOptions as aN, type ProposeMoveRequest as aO, type ProposeMoveResult as aP, type ValidateMoveVerdict as aQ, type ValidateMoveResult as aR, type RoomSubscriptionOptions as aS, type LoggingApi as aT, type IapApi as aU, type SpendCurrencyOptions as aV, type SpendCurrencyResult as aW, type SubscriptionTier as aX, type RunSubscriptionsResponse as aY, type SubscriptionInterval as aZ, type PurchaseSubscriptionResponse as a_, type AwakeCallback as aa, type PauseCallback as ab, type ResumeCallback as ac, type QuitCallback as ad, type BackButtonCallback as ae, type SimulationApi as af, type SimulationSlotValidationResult as ag, type SimulationBatchOperation as ah, type SimulationBatchOperationsResult as ai, type SimulationAvailableItem as aj, type SimulationPowerPreview as ak, type SimulationSlotMutationResult as al, type SimulationSlotContainer as am, type SimulationAssignment as an, type SimulationState as ao, type ExecuteRecipeOptions as ap, type ExecuteRecipeResponse as aq, type CollectRecipeResult as ar, type ResetStateOptions as as, type ResetStateResult as at, type GetActiveRunsOptions as au, type ExecuteScopedRecipeOptions as av, type ExecuteScopedRecipeResult as aw, type GetAvailableRecipesOptions as ax, type GetAvailableRecipesResult as ay, type Recipe as az, type RecipeRequirementResult as b, type Asset as b$, type LoadEmbeddedAssetsResponse as b0, type SharedAssetsApi as b1, type LeaderboardApi as b2, type ScoreToken as b3, type SubmitScoreParams as b4, type SubmitScoreResult as b5, type GetPagedScoresOptions as b6, type PagedScoresResponse as b7, type PlayerRankOptions as b8, type PlayerRankResult as b9, type AppRole as bA, type AdminUgcBrowseParams as bB, type AdminUgcBrowseResponse as bC, type AdminUgcListReportsParams as bD, type AdminUgcListReportsResponse as bE, type AdminUgcResolveAction as bF, type AdminImageGenBrowseParams as bG, type AdminImageGenBrowseResponse as bH, type AdminImageGenListReportsParams as bI, type AdminImageGenListReportsResponse as bJ, type AdminImageGenResolveAction as bK, type Avatar3dApi as bL, type AssetManifest as bM, type Avatar3dConfig as bN, type ShowEditorOptions as bO, type Avatar3dEdits as bP, type AdsApi as bQ, type ImageGenParams as bR, type ImageGenResult as bS, type SharedStorageHostApi as bT, type MultiplayerApi as bU, type AttributionApi as bV, type InitializationContext as bW, type InitializationOptions as bX, AccessDeniedError as bY, type AdminUgcEntry as bZ, type AiMessage as b_, type GetPodiumScoresOptions as ba, type PodiumScoresResponse as bb, type PreloaderApi as bc, type SocialApi as bd, type ShareMetadata as be, type ShareLinkResult as bf, type SocialQRCodeOptions as bg, type QRCodeResult as bh, type ShareClickData as bi, type EntitlementApi as bj, type Entitlement as bk, type LedgerEntry as bl, type ShopApi as bm, type StorefrontResponse as bn, type StorefrontItem as bo, type ShopPurchaseResponse as bp, type ShopOrderHistoryResponse as bq, type PromptLoginResult as br, type AccessTier as bs, type AccessGateApi as bt, type ImageGenApi as bu, type UgcApi as bv, type VideoApi as bw, type AppApi as bx, type AdminUgcApi as by, type AdminImageGenApi as bz, type RundotGameAvailableRecipe as c, type Category as c0, type ConnectionState as c1, type GetSubscriptionsForTierRequest as c2, type HudInsets as c3, type ImageGenEntry as c4, type ImageGenModel as c5, type ImageGenReport as c6, type InboundForKeyEntry as c7, type InboundMethodIds as c8, type InboundStorageApi as c9, type RoomMessagePayload as cA, type RoomsEnvelopeResponse as cB, RpcInboundStorageApi as cC, RpcSharedAssetsApi as cD, type RpcTransport as cE, type RunSubscription as cF, type RundotGameRoomCustomMetadata as cG, type RundotGameRoomPayload as cH, type RundotGameRoomRules as cI, type RundotGameRoomRulesGameState as cJ, type ServerPlayer as cK, type ServerRoom as cL, type ShopOrder as cM, type SimulationBatchOperationAssign as cN, type SimulationBatchOperationRemove as cO, type SimulationBatchOperationResult as cP, type SimulationPersonalState as cQ, type SimulationRoomActiveRecipe as cR, type SimulationRoomState as cS, type StorefrontCollection as cT, type StorefrontCollectionItem as cU, type SubPath as cV, type TimeIntervalTriggerInput as cW, type UgcReport as cX, createHost as cY, resolveCollectionItemPrice as cZ, type IsPlayerSubscribedRequest as ca, type JoinOrCreateRoomEnvelopeResponse as cb, type JoinRoomMatchCriteria as cc, type LeaderboardAntiCheatConfig as cd, type LeaderboardConfig as ce, type LeaderboardDisplaySettings as cf, type LeaderboardEntry as cg, type LeaderboardModeConfig as ch, type LeaderboardPeriodConfig as ci, type LeaderboardPeriodType as cj, type LoadEmbeddedAssetsRequest as ck, MockAvatarApi as cl, type NotificationTriggerInput as cm, type OnNotificationCallback as cn, type OnRequestCallback as co, type OnResponseCallback as cp, type PodiumScoresContext as cq, type ProposedMovePayload as cr, type Protocol as cs, type PurchaseSubscriptionRequest as ct, ROOM_GAME_PHASES as cu, type RecipeInfo as cv, type RoomEnvelopeResponse as cw, type RoomEvents as cx, type RoomGamePhase as cy, type RoomMessageEventType as cz, type RundotGameCollectRecipeResult as d, type RundotGameExecuteRecipeOptions as e, type RundotGameExecuteRecipeResult as f, type RundotGameExecuteScopedRecipeOptions as g, RundotGameRoom as h, type RundotGameSimulationConfig as i, type RundotGameSimulationEffect as j, type RundotGameSimulationRecipe as k, type RundotGameSimulationStateResponse as l, type SimulationEntityUpdate as m, type SimulationRunSummary as n, type SimulationSnapshotUpdate as o, type SimulationSubscribeOptions as p, type SimulationUpdateData as q, type SimulationUpdateType as r, type RpcRequest as s, type RpcResponse as t, type RpcNotification as u, RpcClient as v, type StorageApi as w, type NavigationStackInfo as x, type PushAppOptions as y, type NavigateToGameOptions as z };
2750
+ export { type GetFutureTimeOptions as $, type AnalyticsApi as A, type BatchRecipeRequirementsResult as B, type NotificationsApi as C, type ScheduleLocalNotification as D, type ScheduleNotificationOptions as E, type PopupsApi as F, type ShowToastOptions as G, type Host as H, type ShowInterstitialAdOptions as I, type ShowRewardedAdOptions as J, type ProfileApi as K, type DeviceApi as L, type DeviceInfo as M, type NavigationApi as N, type EnvironmentApi as O, type Profile as P, type QuitOptions as Q, type RundotGameAPI as R, type SimulationActiveRunsUpdate as S, type EnvironmentInfo as T, type SystemApi as U, type SafeArea as V, type CdnApi as W, type FetchFromCdnOptions as X, type AssetUrlResult as Y, type TimeApi as Z, type ServerTimeData as _, type RecipeRequirementQuery as a, type OpenStoreResult as a$, type AiApi as a0, type AiChatCompletionRequest as a1, type AiChatCompletionData as a2, type HapticsApi as a3, HapticFeedbackStyle as a4, type FeaturesApi as a5, type Experiment as a6, type LifecycleApi as a7, type SleepCallback as a8, type Subscription as a9, type GetBatchRecipeRequirements as aA, type TriggerRecipeChainOptions as aB, type RoomDataUpdate as aC, type RoomMessageEvent as aD, type ProposedMoveEvent as aE, RundotGameTransport as aF, type RoomsApi as aG, type CreateRoomOptions as aH, type JoinOrCreateRoomOptions as aI, type JoinOrCreateResult as aJ, type ListRoomsOptions as aK, type UpdateRoomDataOptions as aL, type RoomMessageRequest as aM, type StartRoomGameOptions as aN, type ProposeMoveRequest as aO, type ProposeMoveResult as aP, type ValidateMoveVerdict as aQ, type ValidateMoveResult as aR, type RoomSubscriptionOptions as aS, type LoggingApi as aT, type IapApi as aU, type SpendCurrencyOptions as aV, type SpendCurrencyResult as aW, type SubscriptionTier as aX, type RunSubscriptionsResponse as aY, type SubscriptionInterval as aZ, type PurchaseSubscriptionResponse as a_, type AwakeCallback as aa, type PauseCallback as ab, type ResumeCallback as ac, type QuitCallback as ad, type BackButtonCallback as ae, type SimulationApi as af, type SimulationSlotValidationResult as ag, type SimulationBatchOperation as ah, type SimulationBatchOperationsResult as ai, type SimulationAvailableItem as aj, type SimulationPowerPreview as ak, type SimulationSlotMutationResult as al, type SimulationSlotContainer as am, type SimulationAssignment as an, type SimulationState as ao, type ExecuteRecipeOptions as ap, type ExecuteRecipeResponse as aq, type CollectRecipeResult as ar, type ResetStateOptions as as, type ResetStateResult as at, type GetActiveRunsOptions as au, type ExecuteScopedRecipeOptions as av, type ExecuteScopedRecipeResult as aw, type GetAvailableRecipesOptions as ax, type GetAvailableRecipesResult as ay, type Recipe as az, type RecipeRequirementResult as b, type AiImageContent as b$, type LoadEmbeddedAssetsResponse as b0, type SharedAssetsApi as b1, type LeaderboardApi as b2, type ScoreToken as b3, type SubmitScoreParams as b4, type SubmitScoreResult as b5, type GetPagedScoresOptions as b6, type PagedScoresResponse as b7, type PlayerRankOptions as b8, type PlayerRankResult as b9, type AppRole as bA, type AdminUgcBrowseParams as bB, type AdminUgcBrowseResponse as bC, type AdminUgcListReportsParams as bD, type AdminUgcListReportsResponse as bE, type AdminUgcResolveAction as bF, type AdminImageGenBrowseParams as bG, type AdminImageGenBrowseResponse as bH, type AdminImageGenListReportsParams as bI, type AdminImageGenListReportsResponse as bJ, type AdminImageGenResolveAction as bK, type Avatar3dApi as bL, type AssetManifest as bM, type Avatar3dConfig as bN, type ShowEditorOptions as bO, type Avatar3dEdits as bP, type AdsApi as bQ, type ImageGenParams as bR, type ImageGenResult as bS, type SharedStorageHostApi as bT, type MultiplayerApi as bU, type AttributionApi as bV, type InitializationContext as bW, type InitializationOptions as bX, AccessDeniedError as bY, type AdminUgcEntry as bZ, type AiContentBlock as b_, type GetPodiumScoresOptions as ba, type PodiumScoresResponse as bb, type PreloaderApi as bc, type SocialApi as bd, type ShareMetadata as be, type ShareLinkResult as bf, type SocialQRCodeOptions as bg, type QRCodeResult as bh, type ShareClickData as bi, type EntitlementApi as bj, type Entitlement as bk, type LedgerEntry as bl, type ShopApi as bm, type StorefrontResponse as bn, type StorefrontItem as bo, type ShopPurchaseResponse as bp, type ShopOrderHistoryResponse as bq, type PromptLoginResult as br, type AccessTier as bs, type AccessGateApi as bt, type ImageGenApi as bu, type UgcApi as bv, type VideoApi as bw, type AppApi as bx, type AdminUgcApi as by, type AdminImageGenApi as bz, type RundotGameAvailableRecipe as c, type UgcReport as c$, type AiImageUrlContent as c0, type AiMessage as c1, type AiTextContent as c2, type Asset as c3, type Category as c4, type ConnectionState as c5, type GetSubscriptionsForTierRequest as c6, type HudInsets as c7, type ImageGenEntry as c8, type ImageGenModel as c9, type RoomEnvelopeResponse as cA, type RoomEvents as cB, type RoomGamePhase as cC, type RoomMessageEventType as cD, type RoomMessagePayload as cE, type RoomsEnvelopeResponse as cF, RpcInboundStorageApi as cG, RpcSharedAssetsApi as cH, type RpcTransport as cI, type RunSubscription as cJ, type RundotGameRoomCustomMetadata as cK, type RundotGameRoomPayload as cL, type RundotGameRoomRules as cM, type RundotGameRoomRulesGameState as cN, type ServerPlayer as cO, type ServerRoom as cP, type ShopOrder as cQ, type SimulationBatchOperationAssign as cR, type SimulationBatchOperationRemove as cS, type SimulationBatchOperationResult as cT, type SimulationPersonalState as cU, type SimulationRoomActiveRecipe as cV, type SimulationRoomState as cW, type StorefrontCollection as cX, type StorefrontCollectionItem as cY, type SubPath as cZ, type TimeIntervalTriggerInput as c_, type ImageGenReport as ca, type InboundForKeyEntry as cb, type InboundMethodIds as cc, type InboundStorageApi as cd, type IsPlayerSubscribedRequest as ce, type JoinOrCreateRoomEnvelopeResponse as cf, type JoinRoomMatchCriteria as cg, type LeaderboardAntiCheatConfig as ch, type LeaderboardConfig as ci, type LeaderboardDisplaySettings as cj, type LeaderboardEntry as ck, type LeaderboardModeConfig as cl, type LeaderboardPeriodConfig as cm, type LeaderboardPeriodType as cn, type LoadEmbeddedAssetsRequest as co, MockAvatarApi as cp, type NotificationTriggerInput as cq, type OnNotificationCallback as cr, type OnRequestCallback as cs, type OnResponseCallback as ct, type PodiumScoresContext as cu, type ProposedMovePayload as cv, type Protocol as cw, type PurchaseSubscriptionRequest as cx, ROOM_GAME_PHASES as cy, type RecipeInfo as cz, type RundotGameCollectRecipeResult as d, createHost as d0, resolveCollectionItemPrice as d1, type RundotGameExecuteRecipeOptions as e, type RundotGameExecuteRecipeResult as f, type RundotGameExecuteScopedRecipeOptions as g, RundotGameRoom as h, type RundotGameSimulationConfig as i, type RundotGameSimulationEffect as j, type RundotGameSimulationRecipe as k, type RundotGameSimulationStateResponse as l, type SimulationEntityUpdate as m, type SimulationRunSummary as n, type SimulationSnapshotUpdate as o, type SimulationSubscribeOptions as p, type SimulationUpdateData as q, type SimulationUpdateType as r, type RpcRequest as s, type RpcResponse as t, type RpcNotification as u, RpcClient as v, type StorageApi as w, type NavigationStackInfo as x, type PushAppOptions as y, type NavigateToGameOptions as z };
@@ -603,7 +603,7 @@ function initializeSimulation(rundotGameApi, host) {
603
603
  }
604
604
 
605
605
  // src/version.ts
606
- var SDK_VERSION = "5.14.3-beta.migration-test";
606
+ var SDK_VERSION = "5.14.3-beta.migration-test-2";
607
607
 
608
608
  // src/leaderboard/utils.ts
609
609
  var HASH_ALGORITHM_WEB_CRYPTO = "SHA-256";
@@ -2487,5 +2487,5 @@ function initializeSocial(rundotGameApi, host) {
2487
2487
  }
2488
2488
 
2489
2489
  export { HASH_ALGORITHM_NODE, HASH_ALGORITHM_WEB_CRYPTO, MockAiApi, MockAppApi, MockImageGenApi, MockLeaderboardApi, MockSocialApi, RemoteHost, RpcAdminImageGenApi, RpcAdminUgcApi, RpcAiApi, RpcAppApi, RpcClient, RpcImageGenApi, RpcLeaderboardApi, RpcSimulationApi, RpcSocialApi, SDK_VERSION, computeScoreHash, createHost, initializeAi, initializeApp, initializeAttribution, initializeImageGen, initializeLeaderboard, initializeSimulation, initializeSocial, initializeUgc };
2490
- //# sourceMappingURL=chunk-BQPNVJYG.js.map
2491
- //# sourceMappingURL=chunk-BQPNVJYG.js.map
2490
+ //# sourceMappingURL=chunk-5JCPCAB6.js.map
2491
+ //# sourceMappingURL=chunk-5JCPCAB6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ai/RpcAiApi.ts","../src/ai/MockAiApi.ts","../src/ai/index.ts","../src/rpc/RpcClient.ts","../src/imageGen/RpcImageGenApi.ts","../src/imageGen/MockImageGenApi.ts","../src/imageGen/index.ts","../src/simulation/RpcSimulationApi.ts","../src/simulation/index.ts","../src/version.ts","../src/leaderboard/utils.ts","../src/leaderboard/RpcLeaderboardApi.ts","../src/leaderboard/MockLeaderboardApi.ts","../src/leaderboard/index.ts","../src/ugc/RpcUgcApi.ts","../src/ugc/MockUgcApi.ts","../src/ugc/index.ts","../src/social/MockSocialApi.ts","../src/app/RpcAdminUgcApi.ts","../src/app/RpcAdminImageGenApi.ts","../src/app/RpcAppApi.ts","../src/app/MockAppApi.ts","../src/app/index.ts","../src/attribution/RpcAttributionApi.ts","../src/attribution/MockAttributionApi.ts","../src/attribution/index.ts","../src/social/RpcSocialApi.ts","../src/RundotGameTransport.ts","../src/RemoteHost.ts","../src/MockHost.ts","../src/Host.ts","../src/social/index.ts"],"names":["submittedAt","entry","modeEntries","existingIndex","inserted"],"mappings":"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","file":"chunk-BQPNVJYG.js","sourcesContent":["import { AiApi, AiChatCompletionRequest, AiChatCompletionData } from './AiApi'\nimport { RpcClient } from '../rpc'\nimport { RundotGameMessageId } from '../RundotGameMessageId'\n\nexport class RpcAiApi implements AiApi {\n private readonly rpcClient: RpcClient\n\n constructor(rpcClient: RpcClient) {\n this.rpcClient = rpcClient\n }\n\n async requestChatCompletionAsync(\n request: AiChatCompletionRequest,\n ): Promise<AiChatCompletionData> {\n const response = await this.rpcClient.call<AiChatCompletionData>(\n RundotGameMessageId.AI_CHAT_COMPLETION,\n {\n request: (() => {\n const { apiKey, ...requestWithoutApiKey } = request\n return requestWithoutApiKey\n })(),\n },\n -1\n )\n // Return direct response data\n return response\n }\n\n async getAvailableCompletionModels(): Promise<Array<string>> {\n const response = await this.rpcClient.call<Array<string>>(\n RundotGameMessageId.AI_GET_AVAILABLE_MODELS,\n {},\n -1\n )\n return response\n }\n}\n","import { AiApi, AiChatCompletionData, AiChatCompletionRequest } from './AiApi'\n\nexport class MockAiApi implements AiApi {\n async requestChatCompletionAsync(_request: AiChatCompletionRequest): Promise<AiChatCompletionData> {\n console.warn('[RUN] AI completion API not available in mock mode')\n throw new Error('AI completion API requires backend connection')\n }\n\n async getAvailableCompletionModels(): Promise<Array<string>> {\n console.warn('[RUN] AI models API not available in mock mode')\n throw new Error('AI models API requires backend connection')\n }\n}\n","import { Host } from '../Host'\nimport { RundotGameAPI } from '../rundot-game-api/types'\nimport { AiChatCompletionRequest } from './AiApi'\n\nexport * from './AiApi'\nexport * from './RpcAiApi'\nexport * from './MockAiApi'\n\nexport function initializeAi(rundotGameApi: RundotGameAPI, host: Host) {\n rundotGameApi.ai = host.ai\n}\n","import { RpcRequest } from './RpcRequest.ts'\nimport { RpcResponse } from './RpcResponse.ts'\nimport { RpcTransport } from './RpcTransport.ts'\nimport { RpcNotification } from './RpcNotification'\nimport { generateId } from '../utils/idGenerator'\n\ninterface PendingCall {\n id: string\n resolve: (value: unknown) => void\n reject: (error: unknown) => void\n}\n\nexport interface Subscription {\n unsubscribe: () => void\n}\n\nexport class RpcClient {\n private readonly pendingCalls = new Map<string, PendingCall>()\n private readonly notificationCallbacks = new Map<string, Function>()\n\n private onResponseSub: Subscription | null = null\n private onNotificationSub: Subscription | null = null\n private transport: RpcTransport | null = null\n\n start(transport: RpcTransport): void {\n this.transport = transport\n this.onResponseSub = transport.onResponse(async (response) => {\n return this.handleRpcResponse(response)\n })\n this.onNotificationSub = transport.onNotification(async (notification) => {\n return this.handleRpcNotification(notification)\n })\n }\n\n stop(): void {\n if (this.onResponseSub) {\n this.onResponseSub.unsubscribe()\n this.onResponseSub = null\n }\n\n if (this.onNotificationSub) {\n this.onNotificationSub.unsubscribe()\n this.onNotificationSub = null\n }\n\n this.transport = null\n }\n\n onNotification<TPayload>(\n id: string,\n callback: (payload: TPayload) => void,\n ): Subscription {\n this.notificationCallbacks.set(id, callback)\n return {\n unsubscribe: () => {\n this.notificationCallbacks.delete(id)\n },\n }\n }\n\n callT<TArgs, TResult>(\n method: string,\n args?: TArgs,\n timeout: number = 30000,\n ): Promise<TResult> {\n return this.call(method, args, timeout)\n }\n\n async call<TResponse>(\n method: string,\n args?: unknown,\n timeout: number = 30000,\n ): Promise<TResponse> {\n // NOTE(Zee): Make this into options?\n return new Promise((resolve, reject) => {\n const id = generateId()\n this.addPendingCall(\n id,\n (value: unknown) => resolve(value as TResponse),\n (error: unknown) => reject(error),\n )\n\n const request: RpcRequest = {\n type: 'rpc-request',\n id,\n method,\n args: args,\n }\n\n if (this.transport) {\n this.transport.sendRequest(request)\n }\n\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...\n if (timeout > 0) {\n const startTime = Date.now()\n setTimeout(() => {\n if (this.hasPendingCall(id)) {\n this.removePendingCall(id)\n const elapsed = Date.now() - startTime\n console.error(\n `[RpcClient] TIMEOUT: ${method} after ${elapsed}ms (limit: ${timeout}ms)`,\n {\n method,\n id,\n args: this.safeStringifyArgs(args).substring(0, 500),\n timeout,\n elapsed,\n timestamp: new Date().toISOString(),\n },\n )\n reject(new Error(`RPC call ${method} timed out after ${elapsed}ms`))\n }\n }, timeout)\n }\n })\n }\n\n /**\n * Send a fire-and-forget RPC request.\n *\n * Unlike `call()`, `notify()`:\n * - does NOT register a pending call,\n * - does NOT arm a timeout,\n * - does NOT await or surface the host's response.\n *\n * Use this for telemetry / cleanup RPCs where the caller does not care about\n * the result and does not want spurious timeout errors when the iframe is\n * throttled (e.g. backgrounded tab) or the host's response is otherwise\n * late. Host-side errors are NOT surfaced to the caller.\n *\n * The wire format is identical to `call()` (an `rpc-request` with a\n * generated id), so any late response from the host is harmlessly dropped\n * by `handleRpcResponse` — there is no entry in `pendingCalls` to match.\n */\n notify(method: string, args?: unknown): void {\n const id = generateId()\n\n const request: RpcRequest = {\n type: 'rpc-request',\n id,\n method,\n args: args,\n }\n\n if (this.transport) {\n this.transport.sendRequest(request)\n }\n }\n\n private hasPendingCall(id: string): boolean {\n return this.pendingCalls.has(id)\n }\n\n private safeStringifyArgs(args: unknown): string {\n if (args === undefined) {\n return 'undefined'\n }\n if (args === null) {\n return 'null'\n }\n try {\n const serialized = JSON.stringify(args)\n if (serialized === undefined) {\n return 'undefined'\n }\n return serialized\n } catch (error) {\n return `[unserializable args: ${String(error)}]`\n }\n }\n\n private addPendingCall(\n id: string,\n resolve: (v: unknown) => void,\n reject: (e: unknown) => void,\n ): void {\n this.pendingCalls.set(id, {\n id: id,\n resolve: resolve,\n reject: reject,\n })\n }\n\n private removePendingCall(id: string): void {\n this.pendingCalls.delete(id)\n }\n\n private getPendingCall(id: string): PendingCall | undefined {\n return this.pendingCalls.get(id)\n }\n\n private handleRpcResponse(response: RpcResponse): boolean {\n const pending = this.getPendingCall(response.id)\n if (!pending) {\n return false\n }\n this.removePendingCall(response.id)\n\n if (response.error) {\n pending.reject(new Error(response.error.message))\n return true\n }\n\n pending.resolve(response.result)\n return true\n }\n\n private handleRpcNotification(notification: RpcNotification): void {\n const callback = this.notificationCallbacks.get(notification.id)\n if (callback) {\n callback(notification.payload)\n }\n }\n}\n","import { ImageGenApi, ImageGenParams, ImageGenResult } from './ImageGenApi';\nimport { RpcClient } from '../rpc';\nimport { RundotGameMessageId } from '../RundotGameMessageId';\n\nexport class RpcImageGenApi implements ImageGenApi {\n constructor(private readonly rpcClient: RpcClient) {}\n\n async generate(params: ImageGenParams): Promise<ImageGenResult> {\n // Use infinite timeout (-1) like AI API - image generation can be slow\n return this.rpcClient.call<ImageGenResult>(\n RundotGameMessageId.H5_IMAGE_GEN_GENERATE,\n params,\n -1, // Infinite timeout, matching RpcAiApi pattern\n );\n }\n}\n","import { ImageGenApi, ImageGenParams, ImageGenResult } from './ImageGenApi';\n\nexport class MockImageGenApi implements ImageGenApi {\n async generate(_params: ImageGenParams): Promise<ImageGenResult> {\n console.warn('[RUN] Image generation API not available in mock mode');\n throw new Error('Image generation API requires backend connection');\n }\n}\n","import type { Host } from '../Host';\nimport type { RundotGameAPI } from '../rundot-game-api/types';\n\nexport * from './ImageGenApi';\nexport { RpcImageGenApi } from './RpcImageGenApi';\nexport { MockImageGenApi } from './MockImageGenApi';\n// HttpImageGenApi is intentionally NOT exported here.\n// It depends on Firebase and should only be imported by SandboxHost.\n// This prevents Firebase from being bundled in production builds.\n\nexport function initializeImageGen(rundotGameApi: RundotGameAPI, host: Host): void {\n rundotGameApi.imageGen = host.imageGen;\n}\n","import {\n CollectRecipeResult,\n ExecuteRecipeOptions,\n ExecuteRecipeResponse,\n ExecuteScopedRecipeResult,\n ExecuteScopedRecipeOptions,\n GetActiveRunsOptions,\n GetAvailableRecipesOptions,\n GetAvailableRecipesResult,\n GetBatchRecipeRequirements,\n Recipe,\n SimulationApi,\n SimulationAvailableItem,\n SimulationAssignment,\n SimulationBatchOperation,\n SimulationBatchOperationsResult,\n SimulationPowerPreview,\n SimulationRunSummary,\n SimulationSlotMutationResult,\n SimulationSlotValidationResult,\n SimulationSlotContainer,\n SimulationState,\n SimulationPersonalState,\n SimulationRoomState,\n TriggerRecipeChainOptions,\n ResetStateOptions,\n ResetStateResult,\n} from './SimulationApi'\nimport { RpcClient } from '../rpc'\nimport { RundotGameMessageId } from '../RundotGameMessageId'\nimport {\n RecipeRequirementResult,\n RundotGameSimulationConfig,\n SimulationSubscribeOptions,\n SimulationUpdateData,\n} from '../rundot-game-api/types'\nimport { generateId } from '../utils/idGenerator'\n\ninterface ResolveFieldValueResponse {\n value: unknown\n}\n\ninterface SimulationUpdateNotification {\n subscriptionId: string\n updates: SimulationUpdateData\n}\n\ninterface StateResponseExtension {\n configuration?: RundotGameSimulationConfig\n}\n\ninterface PersonalStateResponse extends SimulationPersonalState, StateResponseExtension {}\n\ninterface RoomStateResponse extends SimulationRoomState, StateResponseExtension {}\n\ntype GetStateResponse = PersonalStateResponse | RoomStateResponse\n\nexport class RpcSimulationApi implements SimulationApi {\n private readonly rpcClient: RpcClient\n private _simulationConfig: RundotGameSimulationConfig | null = null\n private readonly subscriptionCallbacks = new Map<\n string,\n (data: SimulationUpdateData) => void\n >()\n\n constructor(rpcClient: RpcClient) {\n this.rpcClient = rpcClient\n this.rpcClient.onNotification(\n RundotGameMessageId.H5_SIMULATION_UPDATE,\n this.handleSimulationUpdate.bind(this),\n )\n }\n\n isEnabled(): boolean {\n return true\n }\n\n async validateSlotAssignmentAsync(\n containerId: string,\n slotId: string,\n itemId: string,\n ): Promise<SimulationSlotValidationResult> {\n return this.rpcClient.call<SimulationSlotValidationResult>(\n RundotGameMessageId.H5_SIMULATION_VALIDATE_ASSIGNMENT,\n {\n containerId,\n slotId,\n itemId,\n },\n )\n }\n\n async subscribeAsync(\n options: SimulationSubscribeOptions,\n ): Promise<() => void> {\n this.ensureValidSubscribeOptions(options)\n\n const subscriptionId = generateId()\n this.subscriptionCallbacks.set(subscriptionId, options.onUpdate)\n\n try {\n await this.rpcClient.call(RundotGameMessageId.H5_SIMULATION_SUBSCRIBE, {\n subscriptionId,\n entities: options.entities,\n tags: options.tags,\n activeRuns: options.activeRuns,\n roomId: options.roomId,\n })\n } catch (error) {\n this.subscriptionCallbacks.delete(subscriptionId)\n throw error\n }\n\n let unsubscribed = false\n return () => {\n if (unsubscribed) {\n return\n }\n unsubscribed = true\n\n this.subscriptionCallbacks.delete(subscriptionId)\n\n // Fire-and-forget cleanup: the SDK does not need (and cannot\n // meaningfully recover from) an unsubscribe response. Using\n // notify() avoids spurious 30s timeout errors when the iframe is\n // throttled (e.g. backgrounded tab) and the host's response is\n // late.\n this.rpcClient.notify(RundotGameMessageId.H5_SIMULATION_UNSUBSCRIBE, {\n subscriptionId,\n })\n }\n }\n\n executeBatchOperationsAsync(\n operations: Array<SimulationBatchOperation>,\n validateOnly?: boolean,\n ): Promise<SimulationBatchOperationsResult> {\n return this.rpcClient.call<SimulationBatchOperationsResult>(\n RundotGameMessageId.H5_SIMULATION_BATCH_OPERATIONS,\n {\n operations,\n validateOnly,\n },\n )\n }\n async getAvailableItemsAsync(\n containerId: string,\n slotId: string,\n ): Promise<SimulationAvailableItem[]> {\n const response = await this.rpcClient.call<{\n availableItems?: SimulationAvailableItem[]\n }>(\n RundotGameMessageId.H5_SIMULATION_GET_AVAILABLE_ITEMS,\n {\n containerId,\n slotId,\n },\n )\n return response.availableItems || []\n }\n calculatePowerPreviewAsync(\n containerId: string,\n slotId: string,\n candidateItemId: string,\n ): Promise<SimulationPowerPreview> {\n return this.rpcClient.call<SimulationPowerPreview>(\n RundotGameMessageId.H5_SIMULATION_CALCULATE_POWER_PREVIEW,\n {\n containerId,\n slotId,\n candidateItemId,\n },\n )\n }\n assignItemToSlotAsync(\n containerId: string,\n slotId: string,\n itemId: string,\n ): Promise<SimulationSlotMutationResult> {\n return this.rpcClient.call<SimulationSlotMutationResult>(\n RundotGameMessageId.H5_SIMULATION_ASSIGN_ITEM,\n {\n containerId,\n slotId,\n itemId,\n },\n )\n }\n\n removeItemFromSlotAsync(\n containerId: string,\n slotId: string,\n ): Promise<SimulationSlotMutationResult> {\n return this.rpcClient.call<SimulationSlotMutationResult>(\n RundotGameMessageId.H5_SIMULATION_REMOVE_ITEM,\n {\n containerId,\n slotId,\n },\n )\n }\n\n async getSlotContainersAsync(): Promise<SimulationSlotContainer[]> {\n const response = await this.rpcClient.call<{\n containers?: SimulationSlotContainer[]\n }>(\n RundotGameMessageId.H5_SIMULATION_GET_CONTAINERS,\n {},\n )\n return response.containers || []\n }\n\n async getSlotAssignmentsAsync(\n containerId: string,\n ): Promise<SimulationAssignment[]> {\n const response = await this.rpcClient.call<\n SimulationAssignment[] | { assignments?: SimulationAssignment[] }\n >(\n RundotGameMessageId.H5_SIMULATION_GET_ASSIGNMENTS,\n {\n containerId,\n },\n )\n // Server returns raw array, not wrapped in .assignments property\n return Array.isArray(response)\n ? response\n : response.assignments || []\n }\n\n async getStateAsync(roomId?: string): Promise<SimulationState> {\n const response = await this.rpcClient.call<GetStateResponse>(\n RundotGameMessageId.H5_SIMULATION_GET_STATE,\n {\n roomId: roomId,\n },\n )\n\n // Cache configuration if included in response\n if (response.configuration) {\n this._simulationConfig = response.configuration\n }\n return response\n }\n\n async getConfigAsync(roomId?: string): Promise<RundotGameSimulationConfig> {\n if (this._simulationConfig) {\n return this._simulationConfig\n }\n\n // Fetch configuration directly\n const config = await this.rpcClient.call<RundotGameSimulationConfig>(\n RundotGameMessageId.H5_SIMULATION_GET_CONFIG,\n {\n roomId,\n },\n )\n if (config) {\n this._simulationConfig = config\n return config\n }\n\n throw new Error('No simulation configuration available')\n }\n\n executeRecipeAsync(\n recipeId: string,\n inputs?: Record<string, unknown>,\n options?: ExecuteRecipeOptions,\n ): Promise<ExecuteRecipeResponse> {\n return this.rpcClient.call<ExecuteRecipeResponse>(\n RundotGameMessageId.H5_SIMULATION_EXECUTE_RECIPE,\n {\n recipeId: recipeId,\n inputs: inputs,\n roomId: options?.roomId,\n batchAmount: options?.batchAmount,\n allowPartialBatch: options?.allowPartialBatch,\n entity: options?.entity,\n nonce: options?.nonce,\n },\n )\n }\n\n collectRecipeAsync(runId: string): Promise<CollectRecipeResult> {\n return this.rpcClient.call(RundotGameMessageId.H5_SIMULATION_COLLECT_RECIPE, {\n runId: runId,\n })\n }\n\n resetStateAsync(options?: ResetStateOptions): Promise<ResetStateResult> {\n return this.rpcClient.call<ResetStateResult>(\n RundotGameMessageId.H5_SIMULATION_RESET_STATE,\n {\n initializeRecipe: options?.initializeRecipe,\n },\n )\n }\n\n getActiveRunsAsync(\n options?: GetActiveRunsOptions,\n ): Promise<SimulationRunSummary[]> {\n return this.rpcClient.call<SimulationRunSummary[]>(\n RundotGameMessageId.H5_SIMULATION_GET_ACTIVE_RUNS,\n {\n roomId: options?.roomId,\n },\n )\n }\n\n executeScopedRecipeAsync(\n recipeId: string,\n entity: string,\n inputs?: Record<string, unknown>,\n options?: ExecuteScopedRecipeOptions,\n ): Promise<ExecuteScopedRecipeResult> {\n return this.rpcClient.call(\n RundotGameMessageId.H5_SIMULATION_EXECUTE_SCOPED_RECIPE,\n {\n recipeId: recipeId,\n entity: entity,\n inputs: inputs,\n roomId: options?.roomId ?? null,\n options,\n },\n )\n }\n\n getAvailableRecipesAsync(\n options?: GetAvailableRecipesOptions,\n ): Promise<GetAvailableRecipesResult> {\n return this.rpcClient.call(\n RundotGameMessageId.H5_SIMULATION_GET_AVAILABLE_RECIPES,\n {\n roomId: options?.roomId || null,\n includeActorRecipes: options?.includeActorRecipes || false,\n },\n )\n }\n\n getRecipeRequirementsAsync(\n recipe: Recipe,\n ): Promise<RecipeRequirementResult> {\n return this.rpcClient.call<RecipeRequirementResult>(\n RundotGameMessageId.H5_SIMULATION_GET_RECIPE_REQUIREMENTS,\n {\n recipeId: recipe.recipeId,\n nonce: recipe.nonce,\n entity: recipe.entity,\n batchAmount: recipe.batchAmount,\n },\n )\n }\n\n getBatchRecipeRequirementsAsync(\n recipes: Recipe[],\n ): Promise<GetBatchRecipeRequirements> {\n return this.rpcClient.call<GetBatchRecipeRequirements>(\n RundotGameMessageId.H5_SIMULATION_GET_BATCH_RECIPE_REQUIREMENTS,\n {\n recipes,\n },\n )\n }\n\n triggerRecipeChainAsync(\n recipeId: string,\n options?: TriggerRecipeChainOptions,\n ): Promise<ExecuteRecipeResponse> {\n return this.rpcClient.call<ExecuteRecipeResponse>(\n RundotGameMessageId.H5_SIMULATION_TRIGGER_RECIPE_CHAIN,\n {\n triggerRecipeId: recipeId,\n context: options?.context,\n roomId: options?.roomId,\n },\n )\n }\n\n getEntityMetadataAsync(\n entityId: string,\n ): Promise<Record<string, unknown>> {\n return this.rpcClient.call<Record<string, unknown>>(\n RundotGameMessageId.H5_SIMULATION_GET_ENTITY_METADATA,\n {\n entityId,\n },\n )\n }\n\n async resolveFieldValueAsync(\n entityId: string,\n fieldPath: string,\n entity?: string,\n ): Promise<unknown> {\n const response = await this.rpcClient.call<ResolveFieldValueResponse>(\n RundotGameMessageId.H5_SIMULATION_RESOLVE_VALUE,\n {\n entityId,\n fieldPath,\n entity,\n },\n )\n // Extract primitive value from server response wrapper\n return response.value\n }\n\n private handleSimulationUpdate(\n notification: SimulationUpdateNotification,\n ): void {\n if (!notification || !notification.subscriptionId) {\n console.warn('[RUN] Received malformed simulation update')\n return\n }\n\n const callback = this.subscriptionCallbacks.get(notification.subscriptionId)\n if (!callback) {\n console.warn(\n '[RUN] Received update for unknown subscription:',\n notification.subscriptionId,\n )\n return\n }\n\n try {\n callback(notification.updates)\n } catch (error) {\n console.error('[RUN] Error in simulation subscription callback', error)\n }\n }\n\n private ensureValidSubscribeOptions(\n options: unknown,\n ): asserts options is SimulationSubscribeOptions {\n if (typeof options !== 'object' || options === null) {\n throw new Error('Simulation subscribe requires an options object')\n }\n\n const opts = options as Record<string, unknown>\n\n if (typeof opts.onUpdate !== 'function') {\n throw new Error('Simulation subscribe requires an onUpdate callback')\n }\n\n const hasFilter =\n (Array.isArray(opts.entities) && opts.entities.length > 0) ||\n (Array.isArray(opts.tags) && opts.tags.length > 0) ||\n Boolean(opts.activeRuns)\n\n if (!hasFilter) {\n throw new Error(\n 'Simulation subscribe requires at least one filter (entities, tags, activeRuns)',\n )\n }\n }\n}\n","import { RundotGameAPI, SimulationSubscribeOptions } from '../rundot-game-api/types'\nimport { Host } from '../Host'\nimport {\n SimulationApi,\n ExecuteScopedRecipeOptions,\n TriggerRecipeChainOptions,\n GetAvailableRecipesOptions,\n Recipe,\n ResetStateOptions,\n} from './SimulationApi'\n\nexport * from './SimulationApi'\nexport * from './RpcSimulationApi'\n// HttpSimulationApi is intentionally NOT exported here.\n// It depends on Firebase and should only be imported by SandboxHost via direct import.\n// This prevents Firebase from being bundled in production builds.\n\nexport function initializeSimulation(rundotGameApi: RundotGameAPI, host: Host) {\n rundotGameApi.simulation = {\n isEnabled: () => true,\n } as SimulationApi\n\n rundotGameApi.simulation.getConfigAsync = () => {\n return host.simulation.getConfigAsync()\n }\n\n rundotGameApi.simulation.getStateAsync = (roomId) => {\n return host.simulation.getStateAsync(roomId)\n }\n\n rundotGameApi.simulation.executeRecipeAsync = (recipeId, inputs, options) => {\n return host.simulation.executeRecipeAsync(recipeId, inputs, options)\n }\n\n rundotGameApi.simulation.getActiveRunsAsync = () => {\n return host.simulation.getActiveRunsAsync()\n }\n\n rundotGameApi.simulation.collectRecipeAsync = (runId: string) => {\n return host.simulation.collectRecipeAsync(runId)\n }\n\n rundotGameApi.simulation.executeScopedRecipeAsync = (\n recipeId: string,\n entity: string,\n inputs?: Record<string, unknown>,\n options?: ExecuteScopedRecipeOptions,\n ) => {\n return host.simulation.executeScopedRecipeAsync(recipeId, entity, inputs, options)\n }\n\n rundotGameApi.simulation.triggerRecipeChainAsync = (\n recipeId: string,\n options?: TriggerRecipeChainOptions,\n ) => {\n return host.simulation.triggerRecipeChainAsync(recipeId, options)\n }\n\n rundotGameApi.simulation.getAvailableRecipesAsync = async (\n options?: GetAvailableRecipesOptions,\n ) => {\n return host.simulation.getAvailableRecipesAsync(options)\n }\n\n rundotGameApi.simulation.getRecipeRequirementsAsync = (recipe: Recipe) => {\n return host.simulation.getRecipeRequirementsAsync(recipe)\n }\n\n rundotGameApi.simulation.getBatchRecipeRequirementsAsync = (recipes) => {\n return host.simulation.getBatchRecipeRequirementsAsync(recipes)\n }\n\n rundotGameApi.simulation.resolveFieldValueAsync = (\n entityId,\n fieldPath,\n entity,\n ) => {\n return host.simulation.resolveFieldValueAsync(entityId, fieldPath, entity)\n }\n\n rundotGameApi.simulation.getEntityMetadataAsync = (entityId) => {\n return host.simulation.getEntityMetadataAsync(entityId)\n }\n\n rundotGameApi.simulation.getSlotAssignmentsAsync = (containerId) => {\n return host.simulation.getSlotAssignmentsAsync(containerId)\n }\n\n rundotGameApi.simulation.getSlotContainersAsync = () => {\n return host.simulation.getSlotContainersAsync()\n }\n\n rundotGameApi.simulation.assignItemToSlotAsync = (containerId, slotId, itemId) => {\n return host.simulation.assignItemToSlotAsync(containerId, slotId, itemId)\n }\n\n rundotGameApi.simulation.removeItemFromSlotAsync = (containerId, slotId) => {\n return host.simulation.removeItemFromSlotAsync(containerId, slotId)\n }\n\n rundotGameApi.simulation.getAvailableItemsAsync = (containerId, slotId) => {\n return host.simulation.getAvailableItemsAsync(containerId, slotId)\n }\n\n rundotGameApi.simulation.calculatePowerPreviewAsync = (\n containerId: string,\n slotId: string,\n candidateItemId: string,\n ) => {\n return host.simulation.calculatePowerPreviewAsync(\n containerId,\n slotId,\n candidateItemId,\n )\n }\n\n rundotGameApi.simulation.executeBatchOperationsAsync = (\n operations,\n validateOnly,\n ) => {\n return host.simulation.executeBatchOperationsAsync(operations, validateOnly)\n }\n\n rundotGameApi.simulation.validateSlotAssignmentAsync = (\n containerId,\n slotId,\n itemId,\n ) => {\n return host.simulation.validateSlotAssignmentAsync(\n containerId,\n slotId,\n itemId,\n )\n }\n\n // ===== REAL-TIME SUBSCRIPTIONS =====\n rundotGameApi.simulation.subscribeAsync = (options: SimulationSubscribeOptions) => {\n return host.simulation.subscribeAsync(options)\n }\n\n // ===== STATE MANAGEMENT =====\n rundotGameApi.simulation.resetStateAsync = (options?: ResetStateOptions) => {\n return host.simulation.resetStateAsync(options)\n }\n}\n","declare const __SDK_VERSION__: string\nexport const SDK_VERSION = __SDK_VERSION__\n","/**\n * Hash algorithm used for score sealing\n */\nexport const HASH_ALGORITHM_WEB_CRYPTO = 'SHA-256'\nexport const HASH_ALGORITHM_NODE = 'sha256'\n\n/**\n * Compute HMAC-SHA256 hash for score sealing.\n * Hash always includes: score, duration, token\n * Matches server-side hash computation exactly.\n *\n * @param score - The score value\n * @param duration - Duration in seconds\n * @param token - Score token\n * @param sealingNonce - One-time nonce for this submission\n * @param sealingSecret - Secret key for HMAC\n * @returns Hex-encoded hash string\n */\nexport async function computeScoreHash(\n score: number,\n duration: number,\n token: string,\n sealingNonce: string,\n sealingSecret: string,\n): Promise<string> {\n // Build payload: score:value|duration:value|token:value\n const payload = `score:${score}|duration:${duration}|token:${token}`\n const fullPayload = `${payload}|nonce:${sealingNonce}`\n\n // HMAC-SHA256 using Web Crypto API\n const encoder = new TextEncoder()\n const keyData = encoder.encode(sealingSecret)\n const messageData = encoder.encode(fullPayload)\n\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: HASH_ALGORITHM_WEB_CRYPTO },\n false,\n ['sign'],\n )\n\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, messageData)\n\n // Convert to hex string\n return Array.from(new Uint8Array(signature))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n}\n\n","import { RpcClient } from '../rpc'\nimport { RundotGameMessageId } from '../RundotGameMessageId'\nimport {\n GetPagedScoresOptions,\n LeaderboardApi,\n PagedScoresResponse,\n GetPodiumScoresOptions,\n PodiumScoresResponse,\n PlayerRankResult,\n PlayerRankOptions,\n ScoreToken,\n SubmitScoreParams,\n SubmitScoreResult,\n} from './LeaderboardApi'\nimport { computeScoreHash } from './utils'\n\nexport class RpcLeaderboardApi implements LeaderboardApi {\n private readonly rpcClient: RpcClient\n /** Cache of score tokens for automatic hash computation */\n private tokenCache: Map<string, ScoreToken> = new Map()\n\n constructor(rpcClient: RpcClient) {\n this.rpcClient = rpcClient\n }\n\n /**\n * Create a score token for submitting a score.\n * Token is cached for automatic hash computation if score sealing is enabled.\n *\n * @param mode - Optional game mode\n * @returns Score token with sealing data if enabled\n */\n async createScoreToken(mode?: string): Promise<ScoreToken> {\n const token = await this.rpcClient.call<ScoreToken>(\n RundotGameMessageId.H5_LEADERBOARD_CREATE_SCORE_TOKEN,\n mode ? { mode } : {},\n )\n\n // Cache token with sealing data for auto-hash computation\n this.tokenCache.set(token.token, token)\n\n return token\n }\n\n /**\n * Submit a score to the leaderboard.\n * Automatically computes hash if score sealing is enabled and token was created via createScoreToken().\n *\n * @param params - Score submission parameters\n * @returns Submission result with acceptance status and rank\n * @throws Error if token not found in cache\n */\n async submitScore(params: SubmitScoreParams): Promise<SubmitScoreResult> {\n let hash: string | undefined\n\n // If token provided, check if sealing is enabled and auto-compute hash\n if (params.token) {\n const cachedToken = this.tokenCache.get(params.token)\n\n if (!cachedToken) {\n throw new Error(\n 'Invalid token: not found in cache. Did you call createScoreToken() first?'\n )\n }\n\n // Auto-compute hash if sealing enabled (token has nonce and secret)\n if (cachedToken.sealingNonce && cachedToken.sealingSecret) {\n hash = await computeScoreHash(\n params.score,\n params.duration,\n params.token,\n cachedToken.sealingNonce,\n cachedToken.sealingSecret,\n )\n }\n\n // Clean up used token from cache\n this.tokenCache.delete(params.token)\n }\n\n // Send to host/server (includes hash if sealing enabled)\n return this.rpcClient.call<SubmitScoreResult>(\n RundotGameMessageId.H5_LEADERBOARD_SUBMIT_SCORE,\n {\n token: params.token,\n score: params.score,\n duration: params.duration,\n mode: params.mode,\n period: params.period,\n telemetry: params.telemetry,\n metadata: params.metadata,\n hash, // undefined if no sealing, computed if sealing enabled\n },\n )\n }\n\n getPagedScores(options?: GetPagedScoresOptions): Promise<PagedScoresResponse> {\n return this.rpcClient.call<PagedScoresResponse>(\n RundotGameMessageId.H5_LEADERBOARD_GET_PAGED_SCORES,\n options ?? {},\n )\n }\n\n getMyRank(options?: PlayerRankOptions): Promise<PlayerRankResult> {\n return this.rpcClient.call<PlayerRankResult>(\n RundotGameMessageId.H5_LEADERBOARD_GET_MY_RANK,\n options ?? {},\n )\n }\n\n getPodiumScores(options?: GetPodiumScoresOptions): Promise<PodiumScoresResponse> {\n return this.rpcClient.call<PodiumScoresResponse>(\n RundotGameMessageId.H5_LEADERBOARD_GET_PODIUM_SCORES,\n options ?? {},\n )\n }\n}\n","import {\n GetPagedScoresOptions,\n LeaderboardApi,\n LeaderboardEntry,\n PagedScoresResponse,\n GetPodiumScoresOptions,\n PodiumScoresResponse,\n PlayerRankResult,\n PlayerRankOptions,\n ScoreToken,\n SubmitScoreParams,\n SubmitScoreResult,\n} from './LeaderboardApi'\nimport { computeScoreHash } from './utils'\n\ninterface MockScoreToken {\n id: string\n expiresAt: number\n mode: string\n sealingNonce: string | null\n used: boolean\n}\n\nexport class MockLeaderboardApi implements LeaderboardApi {\n private tokens: Map<string, MockScoreToken> = new Map()\n /** Cache of score tokens for automatic hash computation */\n private tokenCache: Map<string, ScoreToken> = new Map()\n private entriesByMode: Map<string, LeaderboardEntry[]> = new Map()\n private tokenCounter = 0\n private enableScoreSealing = false\n private scoreSealingSecret = 'mock-leaderboard-secret-key'\n\n constructor(options?: { enableScoreSealing?: boolean; scoreSealingSecret?: string }) {\n if (options?.enableScoreSealing) {\n this.enableScoreSealing = true\n }\n if (options?.scoreSealingSecret) {\n this.scoreSealingSecret = options.scoreSealingSecret\n }\n }\n\n /**\n * Configure mock leaderboard settings\n *\n * @param options - Configuration options\n */\n configure(options: { enableScoreSealing?: boolean; scoreSealingSecret?: string }): void {\n if (typeof options.enableScoreSealing === 'boolean') {\n this.enableScoreSealing = options.enableScoreSealing\n }\n if (options.scoreSealingSecret) {\n this.scoreSealingSecret = options.scoreSealingSecret\n }\n }\n\n private generateNonce(): string {\n return (\n Math.random().toString(36).slice(2) +\n Math.random().toString(36).slice(2)\n ).slice(0, 64)\n }\n\n private getModeKey(mode: string): string {\n const normalizedMode = mode || 'default'\n return `${normalizedMode}`\n }\n\n private getEntriesForMode(mode: string): LeaderboardEntry[] {\n const key = this.getModeKey(mode)\n if (!this.entriesByMode.has(key)) {\n this.entriesByMode.set(key, [])\n }\n return this.entriesByMode.get(key)!\n }\n\n /**\n * Create a mock score token for testing.\n * Token is cached for automatic hash computation if score sealing is enabled.\n *\n * @param mode - Optional game mode\n * @returns Score token with sealing data if enabled\n */\n async createScoreToken(mode?: string): Promise<ScoreToken> {\n const token = `mock_token_${++this.tokenCounter}`\n const startTime = Date.now()\n const expiresAt = startTime + 3_600_000\n const resolvedMode = mode || 'default'\n const sealingNonce = this.enableScoreSealing ? this.generateNonce() : null\n const sealingSecret = this.enableScoreSealing ? this.scoreSealingSecret : null\n\n this.tokens.set(token, {\n id: token,\n expiresAt,\n mode: resolvedMode,\n sealingNonce,\n used: false,\n })\n\n const result = {\n token,\n startTime,\n expiresAt,\n sealingNonce,\n sealingSecret,\n mode: resolvedMode,\n }\n\n // Cache for auto-hash computation\n this.tokenCache.set(token, result)\n\n return result\n }\n\n /**\n * Submit a mock score to the leaderboard.\n * Automatically computes hash if score sealing is enabled and token was created via createScoreToken().\n *\n * @param params - Score submission parameters\n * @returns Submission result with acceptance status and rank\n * @throws Error if token not found in cache or validation fails\n */\n async submitScore(params: SubmitScoreParams): Promise<SubmitScoreResult> {\n let hash: string | undefined\n\n // Auto-compute hash if token has sealing data\n if (params.token) {\n const cachedToken = this.tokenCache.get(params.token)\n\n if (!cachedToken) {\n throw new Error(\n 'Invalid token: not found in cache. Did you call createScoreToken() first?'\n )\n }\n\n if (cachedToken.sealingNonce && cachedToken.sealingSecret) {\n hash = await computeScoreHash(\n params.score,\n params.duration,\n params.token,\n cachedToken.sealingNonce,\n cachedToken.sealingSecret,\n )\n }\n }\n\n // Simple mode (no token)\n if (!params.token) {\n const mode = params.mode || 'default';\n const submittedAt = Date.now();\n\n const entry: LeaderboardEntry = {\n profileId: `mock_profile`,\n username: 'Mock Player',\n avatarUrl: null,\n score: params.score,\n duration: params.duration,\n submittedAt,\n token: 'simple-mode',\n rank: null,\n zScore: null,\n isAnomaly: false,\n trustScore: 50,\n metadata: params.metadata ?? null,\n isSeed: false,\n };\n\n const modeEntries = this.getEntriesForMode(mode);\n\n // Keep-best: only replace if new score is better (highest wins by default)\n const existingIndex = modeEntries.findIndex((e) => e.profileId === entry.profileId);\n if (existingIndex !== -1) {\n const existingScore = modeEntries[existingIndex].score;\n if (params.score <= existingScore) {\n // Score not better — reject\n return {\n accepted: false,\n rank: null,\n };\n }\n modeEntries.splice(existingIndex, 1);\n }\n\n modeEntries.push(entry);\n modeEntries.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return a.submittedAt - b.submittedAt;\n });\n\n modeEntries.forEach((e, index) => {\n modeEntries[index] = { ...e, rank: index + 1 };\n });\n\n const inserted = modeEntries.find((e) => e.submittedAt === submittedAt);\n return {\n accepted: true,\n rank: inserted?.rank ?? null,\n };\n }\n \n // Token mode\n const scoreToken = this.tokens.get(params.token);\n if (!scoreToken) {\n throw new Error('Invalid score token');\n }\n\n if (scoreToken.expiresAt < Date.now()) {\n throw new Error('Invalid or expired score token');\n }\n\n if (scoreToken.used) {\n throw new Error('Score token already used');\n }\n\n if (params.mode && params.mode !== scoreToken.mode) {\n throw new Error('Submission mode does not match token mode');\n }\n\n // Verify hash if sealing enabled\n if (scoreToken.sealingNonce && !hash) {\n throw new Error('Score hash required when score sealing is enabled');\n }\n\n const submittedAt = Date.now();\n const entry: LeaderboardEntry = {\n profileId: `mock_profile`,\n username: 'Mock Player',\n avatarUrl: null,\n score: params.score,\n duration: params.duration,\n submittedAt,\n token: params.token,\n rank: null,\n zScore: null,\n isAnomaly: false,\n trustScore: 50,\n metadata: params.metadata ?? null,\n isSeed: false,\n };\n\n const modeEntries = this.getEntriesForMode(scoreToken.mode);\n\n // Keep-best: only replace if new score is better (highest wins by default)\n const existingIndex = modeEntries.findIndex((e) => e.profileId === entry.profileId);\n let scoreAccepted = true;\n if (existingIndex !== -1) {\n const existingScore = modeEntries[existingIndex].score;\n if (params.score <= existingScore) {\n scoreAccepted = false;\n } else {\n modeEntries.splice(existingIndex, 1);\n }\n }\n\n if (scoreAccepted) {\n modeEntries.push(entry);\n modeEntries.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return a.submittedAt - b.submittedAt;\n });\n\n modeEntries.forEach((e, index) => {\n modeEntries[index] = { ...e, rank: index + 1 };\n });\n }\n\n // Token is always consumed regardless of score acceptance\n scoreToken.used = true;\n scoreToken.sealingNonce = null;\n\n // Clean up cache\n this.tokenCache.delete(params.token)\n\n const inserted = scoreAccepted\n ? modeEntries.find((e) => e.token === params.token && e.submittedAt === submittedAt)\n : null;\n\n return {\n accepted: scoreAccepted,\n rank: inserted?.rank ?? null,\n };\n }\n\n async getPagedScores(options?: GetPagedScoresOptions): Promise<PagedScoresResponse> {\n const limit = options?.limit ?? 10\n const mode = options?.mode ?? 'default'\n const modeEntries = [...this.getEntriesForMode(mode)]\n\n const entries = modeEntries.slice(0, limit).map((entry) => ({\n ...entry,\n }))\n\n return {\n variant: 'standard',\n entries,\n totalEntries: modeEntries.length,\n nextCursor: null,\n playerRank: null,\n periodInstance: options?.period ?? 'alltime',\n }\n }\n\n async getMyRank(_options?: PlayerRankOptions): Promise<PlayerRankResult> {\n const mode = _options?.mode ?? 'default'\n const modeEntries = this.getEntriesForMode(mode)\n const playerEntry = modeEntries[0] ?? null\n\n return {\n rank: playerEntry?.rank ?? null,\n score: playerEntry?.score,\n totalPlayers: modeEntries.length,\n percentile: playerEntry\n ? Math.max(0, 1 - ((playerEntry.rank ?? 1) - 1) / Math.max(modeEntries.length, 1))\n : undefined,\n trustScore: 50,\n periodInstance: _options?.period ?? 'alltime',\n }\n }\n\n async getPodiumScores(options?: GetPodiumScoresOptions): Promise<PodiumScoresResponse> {\n const mode = options?.mode ?? 'default'\n const modeEntries = [...this.getEntriesForMode(mode)]\n\n const topCount = Math.max(1, Math.min(options?.topCount ?? 3, 10))\n const aheadCount = Math.max(0, Math.min(options?.contextAhead ?? 4, 10))\n const behindCount = Math.max(0, Math.min(options?.contextBehind ?? 2, 10))\n\n const topEntries = modeEntries.slice(0, topCount)\n const playerEntry = modeEntries[0] ?? null\n const totalEntries = modeEntries.length\n\n let playerRank = playerEntry?.rank ?? null\n let beforePlayer: LeaderboardEntry[] = []\n let afterPlayer: LeaderboardEntry[] = []\n let totalBefore = playerRank ? playerRank - 1 : 0\n let totalAfter = playerRank ? Math.max(totalEntries - playerRank, 0) : 0\n let omittedBefore = totalBefore\n let omittedAfter = totalAfter\n\n if (playerRank && playerRank > 0) {\n const beforeStart = Math.max(playerRank - aheadCount - 1, 0)\n beforePlayer = modeEntries.slice(beforeStart, playerRank - 1)\n const afterEnd = Math.min(playerRank + behindCount, totalEntries)\n afterPlayer = modeEntries.slice(playerRank, afterEnd)\n\n const shownTopAhead = topEntries.filter((entry) => (entry.rank ?? 0) > 0 && (entry.rank ?? 0) < playerRank!).length\n omittedBefore = Math.max(totalBefore - (beforePlayer.length + shownTopAhead), 0)\n omittedAfter = Math.max(totalAfter - afterPlayer.length, 0)\n }\n\n return {\n variant: 'highlight',\n entries: topEntries,\n totalEntries,\n nextCursor: null,\n playerRank: playerRank ?? null,\n periodInstance: options?.period ?? 'alltime',\n context: {\n topEntries,\n beforePlayer,\n playerEntry: playerEntry ?? null,\n afterPlayer,\n totalBefore,\n totalAfter,\n omittedBefore,\n omittedAfter,\n },\n }\n }\n}\n","import { Host } from '../Host'\nimport { RundotGameAPI } from '../rundot-game-api/types'\n\nexport * from './LeaderboardApi'\nexport { RpcLeaderboardApi } from './RpcLeaderboardApi'\nexport { MockLeaderboardApi } from './MockLeaderboardApi'\n// HttpLeaderboardApi is intentionally NOT exported here.\n// It depends on Firebase (via callRemoteFunction) and should only be imported by SandboxHost.\n// This prevents Firebase from being bundled in production builds.\nexport * from './utils'\n\nexport function initializeLeaderboard(rundotGameApiInstance: RundotGameAPI, host: Host) {\n rundotGameApiInstance.leaderboard = host.leaderboard\n}\n","/**\n * RPC-backed UGC API implementation for RemoteHost\n *\n * All operations are forwarded to the React Native host via RPC messages.\n */\nimport { RpcClient } from '../rpc'\nimport { RundotGameMessageId } from '../RundotGameMessageId'\nimport {\n UgcApi,\n UgcEntry,\n UgcCreateParams,\n UgcUpdateParams,\n UgcListParams,\n UgcListResponse,\n UgcBrowseParams,\n UgcBrowseResponse,\n UgcGetManyParams,\n UgcGetManyResponse,\n UgcReportParams,\n UgcCountParams,\n UgcFollowCounts,\n} from './UgcApi'\n\nexport class RpcUgcApi implements UgcApi {\n private readonly rpcClient: RpcClient\n\n constructor(rpcClient: RpcClient) {\n this.rpcClient = rpcClient\n }\n\n async create(params: UgcCreateParams): Promise<UgcEntry> {\n return this.rpcClient.call<UgcEntry>(RundotGameMessageId.H5_UGC_CREATE, params)\n }\n\n async update(params: UgcUpdateParams): Promise<UgcEntry> {\n return this.rpcClient.call<UgcEntry>(RundotGameMessageId.H5_UGC_UPDATE, params)\n }\n\n async delete(id: string): Promise<void> {\n await this.rpcClient.call<void>(RundotGameMessageId.H5_UGC_DELETE, { id })\n }\n\n async get(id: string): Promise<UgcEntry | null> {\n return this.rpcClient.call<UgcEntry | null>(RundotGameMessageId.H5_UGC_GET, { id })\n }\n\n async listMine(params?: UgcListParams): Promise<UgcListResponse> {\n return this.rpcClient.call<UgcListResponse>(\n RundotGameMessageId.H5_UGC_LIST_MINE,\n params ?? {},\n )\n }\n\n async browse(params?: UgcBrowseParams): Promise<UgcBrowseResponse> {\n return this.rpcClient.call<UgcBrowseResponse>(\n RundotGameMessageId.H5_UGC_BROWSE,\n params ?? {},\n )\n }\n\n async getMany(params: UgcGetManyParams): Promise<UgcGetManyResponse> {\n return this.rpcClient.call<UgcGetManyResponse>(\n RundotGameMessageId.H5_UGC_GET_MANY,\n params,\n )\n }\n\n // Phase 2: Engagement methods\n\n async like(id: string): Promise<{ likeCount: number }> {\n return this.rpcClient.call<{ likeCount: number }>(\n RundotGameMessageId.H5_UGC_LIKE,\n { id },\n )\n }\n\n async unlike(id: string): Promise<{ likeCount: number }> {\n return this.rpcClient.call<{ likeCount: number }>(\n RundotGameMessageId.H5_UGC_UNLIKE,\n { id },\n )\n }\n\n async recordUse(id: string): Promise<{ useCount: number }> {\n return this.rpcClient.call<{ useCount: number }>(\n RundotGameMessageId.H5_UGC_RECORD_USE,\n { id },\n )\n }\n\n async report(params: UgcReportParams): Promise<void> {\n await this.rpcClient.call<void>(RundotGameMessageId.H5_UGC_REPORT, params)\n }\n\n async count(params?: UgcCountParams): Promise<{ count: number }> {\n return this.rpcClient.call<{ count: number }>(\n RundotGameMessageId.H5_UGC_COUNT,\n params ?? {},\n )\n }\n\n // Creator following\n\n async follow(targetProfileId: string): Promise<void> {\n await this.rpcClient.call<void>(\n RundotGameMessageId.H5_UGC_FOLLOW,\n { targetProfileId },\n )\n }\n\n async unfollow(targetProfileId: string): Promise<void> {\n await this.rpcClient.call<void>(\n RundotGameMessageId.H5_UGC_UNFOLLOW,\n { targetProfileId },\n )\n }\n\n async isFollowing(targetProfileId: string): Promise<{ isFollowing: boolean }> {\n return this.rpcClient.call<{ isFollowing: boolean }>(\n RundotGameMessageId.H5_UGC_IS_FOLLOWING,\n { targetProfileId },\n )\n }\n\n async getFollowCounts(targetProfileId: string): Promise<UgcFollowCounts> {\n return this.rpcClient.call<UgcFollowCounts>(\n RundotGameMessageId.H5_UGC_GET_FOLLOW_COUNTS,\n { targetProfileId },\n )\n }\n}\n","/**\n * Mock UGC API implementation\n *\n * Returns empty results for reads and throws errors for writes.\n * UGC requires a backend connection to function properly.\n */\nimport {\n UgcApi,\n UgcEntry,\n UgcCreateParams,\n UgcUpdateParams,\n UgcListParams,\n UgcListResponse,\n UgcBrowseParams,\n UgcBrowseResponse,\n UgcGetManyParams,\n UgcGetManyResponse,\n UgcReportParams,\n UgcCountParams,\n UgcFollowCounts,\n} from './UgcApi'\n\nexport class MockUgcApi implements UgcApi {\n async create(_params: UgcCreateParams): Promise<UgcEntry> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async update(_params: UgcUpdateParams): Promise<UgcEntry> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async delete(_id: string): Promise<void> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async get(_id: string): Promise<UgcEntry | null> {\n return null\n }\n\n async listMine(_params?: UgcListParams): Promise<UgcListResponse> {\n return { entries: [], nextCursor: undefined }\n }\n\n async browse(_params?: UgcBrowseParams): Promise<UgcBrowseResponse> {\n return { entries: [], nextCursor: undefined }\n }\n\n async getMany(_params: UgcGetManyParams): Promise<UgcGetManyResponse> {\n return { entries: [] }\n }\n\n // Phase 2: Engagement methods\n\n async like(_id: string): Promise<{ likeCount: number }> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async unlike(_id: string): Promise<{ likeCount: number }> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async recordUse(_id: string): Promise<{ useCount: number }> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async report(_params: UgcReportParams): Promise<void> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async count(_params?: UgcCountParams): Promise<{ count: number }> {\n return { count: 0 }\n }\n\n // Creator following\n\n async follow(_targetProfileId: string): Promise<void> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async unfollow(_targetProfileId: string): Promise<void> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async isFollowing(_targetProfileId: string): Promise<{ isFollowing: boolean }> {\n return { isFollowing: false }\n }\n\n async getFollowCounts(_targetProfileId: string): Promise<UgcFollowCounts> {\n return { followerCount: 0, followingCount: 0 }\n }\n}\n","import { Host } from '../Host'\nimport { RundotGameAPI } from '../rundot-game-api/types'\n\nexport * from './UgcApi'\nexport { RpcUgcApi } from './RpcUgcApi'\nexport { MockUgcApi } from './MockUgcApi'\n// HttpUgcApi is intentionally NOT exported here.\n// It depends on Firebase (via callRemoteFunction) and should only be imported by SandboxHost.\n// This prevents Firebase from being bundled in production builds.\n\nexport function initializeUgc(rundotGameApiInstance: RundotGameAPI, host: Host): void {\n rundotGameApiInstance.ugc = host.ugc\n}\n","import {\n QRCodeResult,\n ShareClickData,\n ShareLinkResult,\n SocialApi,\n SocialQRCodeOptions,\n} from './SocialApi';\n\nconst MOCK_QR_CODE =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';\n\nconst MOCK_SHARE_LINK_ID = 'mock-share-id';\n\nexport class MockSocialApi implements SocialApi {\n async shareLinkAsync(options: {\n shareParams: Record<string, string>;\n }): Promise<ShareLinkResult> {\n const shareUrl = this.createMockUrl(options.shareParams);\n\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n try {\n await navigator.clipboard.writeText(shareUrl);\n } catch (error) {\n console.warn(\n '[RUN:mock] Failed to copy share URL to clipboard',\n error,\n );\n }\n }\n\n return { shareUrl, shareLinkId: MOCK_SHARE_LINK_ID };\n }\n\n async createQRCodeAsync(options: {\n shareParams: Record<string, string>;\n qrOptions?: SocialQRCodeOptions;\n }): Promise<QRCodeResult> {\n const shareUrl = this.createMockUrl(options.shareParams);\n\n return {\n shareUrl,\n qrCode: MOCK_QR_CODE,\n shareLinkId: MOCK_SHARE_LINK_ID,\n };\n }\n\n async addShareClickDataAsync(options: {\n shareLinkId: string;\n metadata: Record<string, string>;\n }): Promise<void> {\n }\n\n async getShareClicksAsync(options: {\n shareLinkId: string;\n }): Promise<{ clicks: ShareClickData[]; truncated: boolean }> {\n return { clicks: [], truncated: false };\n }\n\n async getMyShareClickDataAsync(options: {\n shareLinkId: string;\n }): Promise<ShareClickData | null> {\n return null;\n }\n\n private createMockUrl(_shareParams: Record<string, string>): string {\n console.warn('[RUN:mock] Share params are stored online — mock URL is just a template')\n console.warn('[RUN:mock] Actual share URL looks like: https://mock-share-url.com/97dt/mock-share-id')\n return `https://mock-share-url.com/97dt/mock-share-id`;\n }\n}\n","import { RpcClient } from '../rpc'\nimport { RundotGameMessageId } from '../RundotGameMessageId'\nimport type {\n AdminUgcApi,\n AdminUgcBrowseParams,\n AdminUgcBrowseResponse,\n AdminUgcListReportsParams,\n AdminUgcListReportsResponse,\n AdminUgcResolveAction,\n} from './AppApi'\n\nexport class RpcAdminUgcApi implements AdminUgcApi {\n private readonly rpcClient: RpcClient\n\n constructor(rpcClient: RpcClient) {\n this.rpcClient = rpcClient\n }\n\n async browse(\n params?: AdminUgcBrowseParams,\n ): Promise<AdminUgcBrowseResponse> {\n return this.rpcClient.call<AdminUgcBrowseResponse>(\n RundotGameMessageId.H5_APP_ADMIN_UGC_BROWSE,\n params ?? {},\n )\n }\n\n async removeEntry(entryId: string): Promise<void> {\n await this.rpcClient.call<void>(\n RundotGameMessageId.H5_APP_ADMIN_UGC_REMOVE_ENTRY,\n { entryId },\n )\n }\n\n async listReports(\n params?: AdminUgcListReportsParams,\n ): Promise<AdminUgcListReportsResponse> {\n return this.rpcClient.call<AdminUgcListReportsResponse>(\n RundotGameMessageId.H5_APP_ADMIN_UGC_LIST_REPORTS,\n params ?? {},\n )\n }\n\n async resolveReport(\n reportId: string,\n action: AdminUgcResolveAction,\n ): Promise<void> {\n await this.rpcClient.call<void>(\n RundotGameMessageId.H5_APP_ADMIN_UGC_RESOLVE_REPORT,\n { reportId, action },\n )\n }\n}\n","import { RpcClient } from '../rpc'\nimport { RundotGameMessageId } from '../RundotGameMessageId'\nimport type {\n AdminImageGenApi,\n AdminImageGenBrowseParams,\n AdminImageGenBrowseResponse,\n AdminImageGenListReportsParams,\n AdminImageGenListReportsResponse,\n AdminImageGenResolveAction,\n} from './AppApi'\n\nexport class RpcAdminImageGenApi implements AdminImageGenApi {\n private readonly rpcClient: RpcClient\n\n constructor(rpcClient: RpcClient) {\n this.rpcClient = rpcClient\n }\n\n async browse(\n params?: AdminImageGenBrowseParams,\n ): Promise<AdminImageGenBrowseResponse> {\n return this.rpcClient.call<AdminImageGenBrowseResponse>(\n RundotGameMessageId.H5_APP_ADMIN_IMAGEGEN_BROWSE,\n params ?? {},\n )\n }\n\n async removeEntry(generationId: string): Promise<void> {\n await this.rpcClient.call<void>(\n RundotGameMessageId.H5_APP_ADMIN_IMAGEGEN_REMOVE_ENTRY,\n { generationId },\n )\n }\n\n async listReports(\n params?: AdminImageGenListReportsParams,\n ): Promise<AdminImageGenListReportsResponse> {\n return this.rpcClient.call<AdminImageGenListReportsResponse>(\n RundotGameMessageId.H5_APP_ADMIN_IMAGEGEN_LIST_REPORTS,\n params ?? {},\n )\n }\n\n async resolveReport(\n reportId: string,\n action: AdminImageGenResolveAction,\n ): Promise<void> {\n await this.rpcClient.call<void>(\n RundotGameMessageId.H5_APP_ADMIN_IMAGEGEN_RESOLVE_REPORT,\n { reportId, action },\n )\n }\n}\n","import { RpcClient } from '../rpc'\nimport { RundotGameMessageId } from '../RundotGameMessageId'\nimport type { AppApi, AppRole, AdminUgcApi, AdminImageGenApi } from './AppApi'\nimport { RpcAdminUgcApi } from './RpcAdminUgcApi'\nimport { RpcAdminImageGenApi } from './RpcAdminImageGenApi'\n\nexport class RpcAppApi implements AppApi {\n private readonly rpcClient: RpcClient\n readonly adminUgc: AdminUgcApi\n readonly adminImageGen: AdminImageGenApi\n\n constructor(rpcClient: RpcClient) {\n this.rpcClient = rpcClient\n this.adminUgc = new RpcAdminUgcApi(rpcClient)\n this.adminImageGen = new RpcAdminImageGenApi(rpcClient)\n }\n\n async getMyRole(): Promise<AppRole> {\n const result = await this.rpcClient.call<{ role: AppRole }>(\n RundotGameMessageId.H5_APP_GET_MY_ROLE,\n {},\n )\n return result.role\n }\n}\n","import type { AppApi, AppRole, AdminUgcApi, AdminImageGenApi } from './AppApi'\nimport type { RundotGameAPI } from '../rundot-game-api/types'\nimport { MockAdminUgcApi } from './MockAdminUgcApi'\nimport { MockAdminImageGenApi } from './MockAdminImageGenApi'\n\nexport class MockAppApi implements AppApi {\n readonly adminUgc: AdminUgcApi\n readonly adminImageGen: AdminImageGenApi\n\n constructor(private readonly rundotGameApi: RundotGameAPI) {\n this.adminUgc = new MockAdminUgcApi()\n this.adminImageGen = new MockAdminImageGenApi()\n }\n\n async getMyRole(): Promise<AppRole> {\n const mockRole = (\n this.rundotGameApi._mock as Record<string, Record<string, unknown>>\n )?.app?.role as string | undefined\n if (mockRole === 'owner' || mockRole === 'editor' || mockRole === 'none') {\n console.warn(\n `[RUN:mock] app.getMyRole() returning mock role: '${mockRole}'`,\n )\n return mockRole\n }\n console.warn(\n \"[RUN:mock] app.getMyRole() returning 'none'. Set _mock.app.role to 'owner', 'editor', or 'none' to control.\",\n )\n return 'none'\n }\n}\n","import type { Host } from '../Host'\nimport type { RundotGameAPI } from '../rundot-game-api/types'\n\nexport * from './AppApi'\nexport { RpcAppApi } from './RpcAppApi'\nexport { MockAppApi } from './MockAppApi'\nexport { RpcAdminUgcApi } from './RpcAdminUgcApi'\nexport { RpcAdminImageGenApi } from './RpcAdminImageGenApi'\nexport { MockAdminUgcApi } from './MockAdminUgcApi'\nexport { MockAdminImageGenApi } from './MockAdminImageGenApi'\nexport { SandboxAppApi, setStoredAppRole } from './SandboxAppApi'\n\nexport function initializeApp(\n rundotGameApiInstance: RundotGameAPI,\n host: Host,\n): void {\n rundotGameApiInstance.app = host.app\n}\n","import { RpcClient } from '../rpc'\nimport { RundotGameMessageId } from '../RundotGameMessageId'\nimport type { AttributionApi, CampaignParams } from './AttributionApi'\n\nexport class RpcAttributionApi implements AttributionApi {\n constructor(private readonly rpcClient: RpcClient) {}\n\n async getAttributionParams(): Promise<CampaignParams | null> {\n return this.rpcClient.call<CampaignParams | null>(\n RundotGameMessageId.H5_GET_ATTRIBUTION_PARAMS,\n {},\n )\n }\n}\n","import type { AttributionApi, CampaignParams } from './AttributionApi'\n\nexport class MockAttributionApi implements AttributionApi {\n async getAttributionParams(): Promise<CampaignParams | null> {\n return {\n utm_source: 'mock_source',\n utm_medium: 'mock_medium',\n utm_campaign: 'mock_campaign',\n utm_content: null,\n utm_term: null,\n fbclid: null,\n gclid: null,\n }\n }\n}\n","import type { Host } from '../Host'\nimport type { RundotGameAPI } from '../rundot-game-api/types'\n\nexport * from './AttributionApi'\nexport { RpcAttributionApi } from './RpcAttributionApi'\nexport { MockAttributionApi } from './MockAttributionApi'\n\nexport function initializeAttribution(\n rundotGameApiInstance: RundotGameAPI,\n host: Host,\n): void {\n rundotGameApiInstance.attribution = host.attribution\n}\n","import { RpcClient } from '../rpc';\nimport { RundotGameMessageId } from '../RundotGameMessageId';\nimport {\n QRCodeResult,\n ShareClickData,\n ShareLinkResult,\n ShareMetadata,\n SocialApi,\n SocialQRCodeOptions,\n} from './SocialApi';\n\nexport class RpcSocialApi implements SocialApi {\n constructor(private readonly rpcClient: RpcClient) {}\n\n async shareLinkAsync(options: {\n shareParams: Record<string, string>;\n metadata?: ShareMetadata;\n }): Promise<ShareLinkResult> {\n const result = (await this.rpcClient.call(RundotGameMessageId.SHARE_LINK, {\n shareParams: options.shareParams,\n metadata: options.metadata ?? {},\n })) as { shareUrl: string; shareLinkId: string };\n\n return {\n shareUrl: result.shareUrl,\n shareLinkId: result.shareLinkId,\n };\n }\n\n async createQRCodeAsync(options: {\n shareParams: Record<string, string>;\n metadata?: ShareMetadata;\n qrOptions?: SocialQRCodeOptions;\n }): Promise<QRCodeResult> {\n const result = (await this.rpcClient.call(\n RundotGameMessageId.CREATE_SHARE_QRCODE,\n {\n shareParams: options.shareParams,\n metadata: options.metadata ?? {},\n qrOptions: options.qrOptions ?? {},\n },\n )) as { shareUrl: string; qrCode: string; shareLinkId: string };\n\n return {\n shareUrl: result.shareUrl,\n qrCode: result.qrCode,\n shareLinkId: result.shareLinkId,\n };\n }\n\n async addShareClickDataAsync(options: {\n shareLinkId: string;\n metadata: Record<string, string>;\n }): Promise<void> {\n await this.rpcClient.call(RundotGameMessageId.SHARE_ADD_CLICK_DATA, {\n shareLinkId: options.shareLinkId,\n metadata: options.metadata,\n });\n }\n\n async getShareClicksAsync(options: {\n shareLinkId: string;\n }): Promise<{ clicks: ShareClickData[]; truncated: boolean }> {\n const result = (await this.rpcClient.call(\n RundotGameMessageId.SHARE_GET_CLICKS,\n { shareLinkId: options.shareLinkId },\n )) as { clicks: ShareClickData[]; truncated: boolean };\n\n return result;\n }\n\n async getMyShareClickDataAsync(options: {\n shareLinkId: string;\n }): Promise<ShareClickData | null> {\n const result = (await this.rpcClient.call(\n RundotGameMessageId.SHARE_GET_MY_CLICK_DATA,\n { shareLinkId: options.shareLinkId },\n )) as ShareClickData | null;\n\n return result;\n }\n}\n","import {\n OnNotificationCallback,\n OnRequestCallback,\n OnResponseCallback,\n RpcNotification,\n RpcRequest,\n RpcResponse,\n RpcTransport,\n Subscription,\n} from './rpc'\nimport { RundotGameMessageId } from './RundotGameMessageId'\n\nexport interface RundotGameMessage {\n type: string\n direction: string\n data?: {\n /**\n * Internal RPC correlation ID for request/response matching.\n *\n * ⚠️ WIRE PROTOCOL STABILITY WARNING ⚠️\n * This field name is part of the wire protocol between the SDK (H5 games) and the\n * host app (venus client). Both sides MUST agree on this field name.\n *\n * DO NOT RENAME THIS FIELD without coordinating a synchronized release of:\n * 1. venus-sdk (this file)\n * 2. venus/client H5MessageBus.ts\n *\n * Renaming breaks RPC - responses will not correlate and all API calls will timeout.\n */\n requestId?: string\n success?: boolean\n\n //NOTE(Zee): Some things send 'value' others send 'data'\n value?: any\n data?: any\n\n error?: string\n\n script?: string\n }\n instanceId: string\n timestamp: number\n}\n\ndeclare global {\n interface Window {\n _rundotGameInitState?: {\n poolId: string\n apiInjected: boolean\n gameInitialized: boolean\n }\n ReactNativeWebView?: {\n postMessage(message: string): void\n }\n rundotGame: {\n _config: {\n locale: string\n instanceId: string\n context?: any\n profile?: {\n id?: string\n username?: string\n name?: string\n displayName?: string\n avatarUrl?: string | null\n isAnonymous?: boolean\n }\n environment: {\n browserInfo?: {\n language: string\n }\n }\n _handlers: Record<string, any>\n }\n profile?: {\n id?: string\n username?: string\n avatarUrl?: string | null\n name?: string\n displayName?: string\n isAnonymous?: boolean\n } | null\n _fetchFromCdn: (url: string) => Promise<string>\n }\n }\n}\n\nexport type OnRundotGameMessageCallback = (message: RundotGameMessage) => void\n\nexport class RundotGameTransport implements RpcTransport {\n private readonly messageHandler: (event: MessageEvent) => void\n\n private readonly onNotificationCallbacks: OnNotificationCallback[] = []\n private readonly onNotificationCallbacksToRemove: OnNotificationCallback[] =\n []\n\n private readonly onRundotGameMessageCallbacks: OnRundotGameMessageCallback[] = []\n private readonly onResponseCallbacks: OnResponseCallback[] = []\n private readonly onResponseCallbacksToRemove: OnResponseCallback[] = []\n\n private _instanceId: string | null = null\n private isStarted: boolean = false\n private isProcessingMessage: boolean = false\n\n constructor() {\n this.messageHandler = async (event) => {\n this.isProcessingMessage = true\n\n let message: RundotGameMessage\n if (typeof event.data === 'string') {\n //this.log(`Message is a string. Parsing...`)\n message = JSON.parse(event.data)\n } else {\n message = event.data as RundotGameMessage\n }\n\n if (!message) {\n this.logInfo('No message found. Ignoring message...')\n return\n }\n\n //this.logInfo(`message received:\\n${JSON.stringify(message, null, 2)}`)\n\n this.notifyRundotGameMessageReceived(message)\n\n if (\n message.type === RundotGameMessageId.PAUSE ||\n message.type === RundotGameMessageId.RESUME ||\n message.type === RundotGameMessageId.AWAKE ||\n message.type === RundotGameMessageId.SLEEP ||\n message.type === RundotGameMessageId.QUIT\n ) {\n const notification: RpcNotification = {\n type: 'rpc-notification',\n id: message.type,\n payload: message.data,\n }\n this.handleNotification(notification)\n\n // NOTE(Zee): This early return is dangerous here. we have to make sure isProcessingMessage is set to false!\n this.isProcessingMessage = false\n return\n }\n\n const messageData = message.data\n if (!messageData) {\n this.logWarn('No data found. Ignoring message...')\n this.isProcessingMessage = false\n return\n }\n\n if (message.type === RundotGameMessageId.H5_SIMULATION_UPDATE) {\n const notification: RpcNotification = {\n type: 'rpc-notification',\n id: message.type,\n payload: message.data,\n }\n this.handleNotification(notification)\n this.isProcessingMessage = false\n return\n }\n\n if (message.type === RundotGameMessageId.H5_VIDEO_RESUME_FROM_NATIVE_PLAYBACK) {\n const notification: RpcNotification = {\n type: 'rpc-notification',\n id: message.type,\n payload: message.data,\n }\n this.handleNotification(notification)\n this.isProcessingMessage = false\n return\n }\n\n const requestId = messageData.requestId\n if (!requestId) {\n this.logWarn('No requestId. Ignoring message...')\n this.isProcessingMessage = false\n return\n }\n\n if (message.type !== RundotGameMessageId.H5_RESPONSE) {\n this.logWarn(`Ignoring unknown message type: ${message.type}`)\n this.isProcessingMessage = false\n return\n }\n\n const success = messageData.success\n let error = undefined\n if (!success) {\n error = {\n message: messageData.error || 'Unknown error',\n }\n }\n\n // Result can be either inside value or data\n let result = messageData.value\n if (result === undefined) {\n result = messageData.data\n }\n\n const response: RpcResponse = {\n type: 'rpc-response',\n id: requestId,\n result: result,\n method: message.type,\n error: error,\n }\n\n await this.handleResponse(response)\n this.isProcessingMessage = false\n }\n }\n onNotification(callback: OnNotificationCallback): Subscription {\n this.onNotificationCallbacks.push(callback)\n return {\n unsubscribe: () => {\n if (this.isProcessingMessage) {\n this.onNotificationCallbacks.push(callback)\n } else {\n this.removeOnNotificationCallback(callback)\n }\n },\n }\n }\n\n onRequest(callback: OnRequestCallback): Subscription {\n throw new Error('Method not implemented.')\n }\n\n onResponse(callback: OnResponseCallback): Subscription {\n this.onResponseCallbacks.push(callback)\n return {\n unsubscribe: () => {\n if (this.isProcessingMessage) {\n this.onResponseCallbacksToRemove.push(callback)\n } else {\n this.removeOnResponseCallback(callback)\n }\n },\n }\n }\n\n public get instanceId(): string | null {\n return this._instanceId\n }\n\n public set instanceId(instanceId: string) {\n this._instanceId = instanceId\n }\n\n sendRequest(request: RpcRequest): void {\n const instanceId = this.instanceId || 'unknown'\n const method = request.method\n const args =\n request.args && typeof request.args === 'object'\n ? (request.args as Record<string, unknown>)\n : {}\n const message: RundotGameMessage = {\n type: method,\n direction: 'H5_TO_APP',\n data: {\n ...args,\n requestId: request.id,\n },\n instanceId: instanceId,\n timestamp: Date.now(),\n }\n this.sendRundotGameMessage(message)\n }\n\n sendRundotGameMessage(message: RundotGameMessage): void {\n const messageAsString = JSON.stringify(message, null, 2)\n //this.logInfo(`Sending message:\\n${messageAsString}`)\n const reactNativeWebView = window.ReactNativeWebView\n if (reactNativeWebView) {\n reactNativeWebView.postMessage(messageAsString)\n } else {\n window.parent.postMessage(messageAsString, '*')\n }\n }\n\n sendResponse(response: RpcResponse): void {\n throw new Error('Method not implemented.')\n }\n\n start() {\n if (this.isStarted) {\n return\n }\n this.isStarted = true\n window.addEventListener('message', this.messageHandler, true)\n this.logInfo(`Started`)\n }\n\n stop() {\n if (!this.isStarted) {\n return\n }\n this.isStarted = false\n window.removeEventListener('message', this.messageHandler)\n this.logInfo(`Stopped`)\n }\n\n private handleNotification(notification: RpcNotification): void {\n //this.logInfo('Notification received: ', notification.id)\n for (const callback of this.onNotificationCallbacks) {\n callback(notification)\n }\n\n for (const callback of this.onNotificationCallbacksToRemove) {\n this.removeOnNotificationCallback(callback)\n }\n this.onNotificationCallbacksToRemove.length = 0\n }\n\n private async handleResponse(response: RpcResponse): Promise<void> {\n for (const callback of this.onResponseCallbacks) {\n const consumed = await callback(response)\n if (consumed) {\n break\n }\n }\n\n for (const callback of this.onResponseCallbacksToRemove) {\n this.removeOnResponseCallback(callback)\n }\n this.onResponseCallbacksToRemove.length = 0\n }\n\n private removeOnResponseCallback(callback: OnResponseCallback): void {\n this.onResponseCallbacks.splice(\n this.onResponseCallbacks.indexOf(callback),\n 1,\n )\n }\n\n private removeOnNotificationCallback(callback: OnNotificationCallback): void {\n this.onNotificationCallbacks.splice(\n this.onNotificationCallbacks.indexOf(callback),\n 1,\n )\n }\n\n private logInfo(message: string, ...params: any[]) {}\n\n private logWarn(message: string, ...params: any[]) {\n console.warn(`[RUN:transport] ${message}`, ...params)\n }\n\n onRundotGameMessage(callback: OnRundotGameMessageCallback): Subscription {\n this.onRundotGameMessageCallbacks.push(callback)\n return {\n unsubscribe: () => {\n this.onRundotGameMessageCallbacks.splice(\n this.onRundotGameMessageCallbacks.indexOf(callback),\n 1,\n )\n },\n }\n }\n\n private notifyRundotGameMessageReceived(message: RundotGameMessage) {\n for (const callback of this.onRundotGameMessageCallbacks) {\n callback(message)\n }\n }\n}\n","import {\n Host,\n InitializationContext,\n SafeArea,\n InitializationOptions,\n SharedStorageHostApi,\n} from './Host.ts'\nimport { RpcClient } from './rpc'\nimport { RundotGameTransport } from './RundotGameTransport.ts'\nimport { AnalyticsApi, RpcAnalyticsApi } from './analytics'\nimport { AdsApi, RpcAdsApi } from './ads'\nimport { RpcStorageApi, StorageApi } from './storage'\nimport { DualEmitStorageApi } from './storage/DualEmitStorageApi'\nimport { RpcInboundStorageApi } from './storage/RpcInboundStorageApi'\nimport { RundotGameMessageId } from './RundotGameMessageId.ts'\nimport { Avatar3dApi, RpcAvatarApi } from './avatar3d'\nimport { RundotGameAPI } from './rundot-game-api/types.ts'\nimport { NavigationApi, RpcNavigationApi } from './navigation'\nimport { NotificationsApi } from './notifications'\nimport { RpcNotificationsApi } from './notifications/RpcNotificationsApi'\nimport { PopupsApi, RpcPopupsApi } from './popups'\nimport { HostProfileApi, ProfileApi } from './profile'\nimport { SystemApi, HostSystemApi } from './system'\nimport { HostDeviceApi, DeviceInfo } from './device'\nimport { HostEnvironmentApi, EnvironmentInfo } from './environment'\nimport { CdnApi, HostCdnApi } from './cdn'\nimport { HostTimeApi, TimeApi } from './time'\nimport { AiApi, RpcAiApi } from './ai'\nimport { HapticsApi, RpcHapticsApi } from './haptics'\nimport { FeaturesApi, RpcFeaturesApi } from './features'\nimport { LifecycleApi, RpcLifecycleApi } from './lifecycles'\nimport { RpcSimulationApi, SimulationApi } from './simulation'\nimport { RoomsApi, initializeRoomsApi } from './rooms'\nimport { RpcRoomsApi } from './rooms/RpcRoomsApi'\nimport { LoggingApi, RpcLoggingApi } from './logging'\nimport { IapApi, RpcIapApi } from './iap'\nimport { RpcSharedAssetsApi } from './shared-assets'\nimport { LeaderboardApi, RpcLeaderboardApi } from './leaderboard'\nimport { UgcApi, RpcUgcApi } from './ugc'\nimport { PreloaderApi, RpcPreloaderApi } from './game-preloader'\nimport { SocialApi } from './social/SocialApi'\nimport { RpcSocialApi } from './social/RpcSocialApi'\nimport { ImageGenApi, RpcImageGenApi } from './imageGen'\nimport { EntitlementApi, RpcEntitlementApi } from './entitlements'\nimport { ShopApi, RpcShopApi } from './shop'\nimport { AccessGateApi, RpcAccessGateApi, applyAccessGates } from './access-gate'\nimport type { MultiplayerApi } from './mp/client/MultiplayerApi'\nimport { WsMultiplayerApi } from './mp/client/WsMultiplayerApi'\nimport { VideoApi, RpcVideoApi } from './video'\nimport { AppApi, RpcAppApi } from './app'\nimport { AttributionApi, RpcAttributionApi } from './attribution'\n\nexport class RemoteHost implements Host {\n readonly ads: AdsApi\n readonly analytics: AnalyticsApi\n readonly deviceCache: StorageApi\n readonly appStorage: StorageApi\n readonly ownerStorage: StorageApi\n readonly sharedStorage: SharedStorageHostApi\n readonly avatar3d: Avatar3dApi\n readonly navigation: NavigationApi\n readonly notifications: NotificationsApi\n readonly popups: PopupsApi\n readonly profile: ProfileApi\n readonly system: SystemApi\n readonly cdn: CdnApi\n readonly time: TimeApi\n ai: AiApi\n readonly haptics: HapticsApi\n readonly features: FeaturesApi\n readonly lifecycle: LifecycleApi\n simulation: SimulationApi\n rooms: RoomsApi\n readonly logging: LoggingApi\n readonly iap: IapApi\n readonly leaderboard: LeaderboardApi\n ugc: UgcApi\n readonly preloader: PreloaderApi\n readonly social: SocialApi\n imageGen: ImageGenApi\n readonly entitlements: EntitlementApi\n readonly shop: ShopApi\n readonly accessGate: AccessGateApi\n readonly multiplayer: MultiplayerApi\n readonly video: VideoApi\n readonly app: AppApi\n readonly attribution: AttributionApi\n\n context?: InitializationContext\n instanceId: string = 'unknown'\n\n get isInitialized() {\n return this._isInitialized\n }\n\n private readonly rundotGameApi: RundotGameAPI\n private readonly rpcClient: RpcClient\n private _isInitialized: boolean = false\n private _roomServerUrl: string = ''\n\n constructor(rundotGameApi: RundotGameAPI) {\n this.rundotGameApi = rundotGameApi\n const rpcClient = new RpcClient()\n this.rpcClient = rpcClient\n\n this.ads = new RpcAdsApi(rpcClient)\n this.analytics = new RpcAnalyticsApi(rpcClient)\n this.deviceCache = new RpcStorageApi(rpcClient, {\n clear: RundotGameMessageId.DEVICE_CACHE_CLEAR,\n getItem: RundotGameMessageId.DEVICE_CACHE_GET_ITEM,\n getKey: RundotGameMessageId.DEVICE_CACHE_KEY,\n length: RundotGameMessageId.DEVICE_CACHE_LENGTH,\n removeItem: RundotGameMessageId.DEVICE_CACHE_REMOVE_ITEM,\n setItem: RundotGameMessageId.DEVICE_CACHE_SET_ITEM,\n })\n this.appStorage = new RpcStorageApi(rpcClient, {\n clear: RundotGameMessageId.APP_STORAGE_CLEAR,\n getItem: RundotGameMessageId.APP_STORAGE_GET_ITEM,\n getKey: RundotGameMessageId.APP_STORAGE_KEY,\n length: RundotGameMessageId.APP_STORAGE_LENGTH,\n removeItem: RundotGameMessageId.APP_STORAGE_REMOVE_ITEM,\n setItem: RundotGameMessageId.APP_STORAGE_SET_ITEM,\n getAllItems: RundotGameMessageId.APP_STORAGE_GET_ALL_ITEMS,\n getAllData: RundotGameMessageId.APP_STORAGE_GET_ALL_DATA,\n setMultipleItems: RundotGameMessageId.APP_STORAGE_SET_MULTIPLE_ITEMS,\n removeMultipleItems: RundotGameMessageId.APP_STORAGE_REMOVE_MULTIPLE_ITEMS,\n })\n this.ownerStorage = new RpcStorageApi(rpcClient, {\n clear: RundotGameMessageId.OWNER_STORAGE_CLEAR,\n getItem: RundotGameMessageId.OWNER_STORAGE_GET_ITEM,\n getKey: RundotGameMessageId.OWNER_STORAGE_KEY,\n length: RundotGameMessageId.OWNER_STORAGE_LENGTH,\n removeItem: RundotGameMessageId.OWNER_STORAGE_REMOVE_ITEM,\n setItem: RundotGameMessageId.OWNER_STORAGE_SET_ITEM,\n getAllItems: RundotGameMessageId.OWNER_STORAGE_GET_ALL_ITEMS,\n getAllData: RundotGameMessageId.OWNER_STORAGE_GET_ALL_DATA,\n setMultipleItems: RundotGameMessageId.OWNER_STORAGE_SET_MULTIPLE_ITEMS,\n removeMultipleItems: RundotGameMessageId.OWNER_STORAGE_REMOVE_MULTIPLE_ITEMS,\n })\n\n // Shared storage (M3). `open` and `read` return synchronous handles; the\n // first method call on each handle performs the server-side policy check.\n // Handles are lightweight and not cached — multiple opens on the same\n // (targetAppId, namespace) pair produce independent Rpc-bound instances.\n this.sharedStorage = {\n open: ({ appId, namespace }: { appId?: string; namespace: string }) => {\n if (appId === '') {\n throw new Error(\n 'sharedStorage.open: appId must be a non-empty string or omitted',\n )\n }\n return new DualEmitStorageApi(\n rpcClient,\n {\n clear: RundotGameMessageId.SHARED_STORAGE_CLEAR,\n getItem: RundotGameMessageId.SHARED_STORAGE_GET_ITEM,\n getKey: RundotGameMessageId.SHARED_STORAGE_KEY,\n length: RundotGameMessageId.SHARED_STORAGE_LENGTH,\n removeItem: RundotGameMessageId.SHARED_STORAGE_REMOVE_ITEM,\n setItem: RundotGameMessageId.SHARED_STORAGE_SET_ITEM,\n getAllItems: RundotGameMessageId.SHARED_STORAGE_GET_ALL_ITEMS,\n getAllData: RundotGameMessageId.SHARED_STORAGE_GET_ALL_DATA,\n setMultipleItems: RundotGameMessageId.SHARED_STORAGE_SET_MULTIPLE_ITEMS,\n removeMultipleItems: RundotGameMessageId.SHARED_STORAGE_REMOVE_MULTIPLE_ITEMS,\n },\n { targetAppId: appId, namespace },\n {\n clear: RundotGameMessageId.GLOBAL_STORAGE_CLEAR,\n getItem: RundotGameMessageId.GLOBAL_STORAGE_GET_ITEM,\n getKey: RundotGameMessageId.GLOBAL_STORAGE_KEY,\n length: RundotGameMessageId.GLOBAL_STORAGE_LENGTH,\n removeItem: RundotGameMessageId.GLOBAL_STORAGE_REMOVE_ITEM,\n setItem: RundotGameMessageId.GLOBAL_STORAGE_SET_ITEM,\n getAllItems: RundotGameMessageId.GLOBAL_STORAGE_GET_ALL_ITEMS,\n setMultipleItems: RundotGameMessageId.GLOBAL_STORAGE_SET_MULTIPLE_ITEMS,\n removeMultipleItems: RundotGameMessageId.GLOBAL_STORAGE_REMOVE_MULTIPLE_ITEMS,\n },\n )\n },\n read: ({ appId, namespace }: { appId?: string; namespace: string }) => {\n if (appId === '') {\n throw new Error(\n 'sharedStorage.read: appId must be a non-empty string or omitted',\n )\n }\n return new RpcInboundStorageApi(\n rpcClient,\n {\n listSources: RundotGameMessageId.SHARED_STORAGE_INBOUND_LIST_SOURCES,\n get: RundotGameMessageId.SHARED_STORAGE_INBOUND_GET,\n getAllFromSource:\n RundotGameMessageId.SHARED_STORAGE_INBOUND_GET_ALL_FROM_SOURCE,\n getAllForKey:\n RundotGameMessageId.SHARED_STORAGE_INBOUND_GET_ALL_FOR_KEY,\n },\n { targetAppId: appId, namespace },\n )\n },\n }\n\n this.avatar3d = new RpcAvatarApi(rpcClient, rundotGameApi)\n this.navigation = new RpcNavigationApi(rpcClient, rundotGameApi)\n this.notifications = new RpcNotificationsApi(rpcClient)\n this.popups = new RpcPopupsApi(rpcClient)\n this.profile = new HostProfileApi(rundotGameApi)\n\n // Create device and environment APIs and combine into system namespace\n const deviceApi = new HostDeviceApi(rundotGameApi)\n const environmentApi = new HostEnvironmentApi(rundotGameApi)\n this.system = new HostSystemApi(deviceApi, environmentApi, rundotGameApi)\n\n this.cdn = new HostCdnApi(rpcClient)\n this.time = new HostTimeApi(rpcClient, rundotGameApi)\n this.ai = new RpcAiApi(rpcClient)\n this.haptics = new RpcHapticsApi(rpcClient)\n this.features = new RpcFeaturesApi(rpcClient)\n this.lifecycle = new RpcLifecycleApi(rpcClient)\n this.simulation = new RpcSimulationApi(rpcClient)\n this.rooms = new RpcRoomsApi(rpcClient)\n this.logging = new RpcLoggingApi(this, rpcClient)\n this.iap = new RpcIapApi(rpcClient)\n this.leaderboard = new RpcLeaderboardApi(rpcClient)\n this.ugc = new RpcUgcApi(rpcClient)\n this.preloader = new RpcPreloaderApi(rpcClient)\n this.social = new RpcSocialApi(rpcClient)\n this.imageGen = new RpcImageGenApi(rpcClient)\n this.entitlements = new RpcEntitlementApi(rpcClient)\n this.shop = new RpcShopApi(rpcClient)\n this.video = new RpcVideoApi(rpcClient)\n this.app = new RpcAppApi(rpcClient)\n this.attribution = new RpcAttributionApi(rpcClient)\n rundotGameApi.isMock = () => false\n this.rundotGameApi.sharedAssets = new RpcSharedAssetsApi(rpcClient, rundotGameApi)\n\n initializeRoomsApi(this.rundotGameApi, this)\n\n this.accessGate = new RpcAccessGateApi(rpcClient, rundotGameApi)\n applyAccessGates(this)\n\n // Multiplayer API — gets join ticket via RPC to native host\n // serverUrl and gameId are resolved lazily after initialize() populates them from InitResponse\n this.multiplayer = new WsMultiplayerApi({\n serverUrl: () => this._roomServerUrl,\n getJoinTicket: async (req) => {\n const result = await rpcClient.call<{ ticket: string }>(\n RundotGameMessageId.H5_REQUEST_JOIN_TICKET,\n req,\n )\n return result.ticket\n },\n })\n }\n\n async initialize(\n options?: InitializationOptions,\n ): Promise<InitializationContext> {\n const transport = new RundotGameTransport()\n transport.start()\n this.rpcClient.start(transport)\n\n // Set up room notification routing in RpcRoomsApi\n const roomsApi = this.rooms as RpcRoomsApi\n roomsApi.setupNotifications(transport)\n\n const response = await this.rpcClient.call<InitResponse>(\n RundotGameMessageId.INIT_SDK,\n {},\n -1,\n )\n\n transport.instanceId = response.instanceId\n this.instanceId = response.instanceId\n this._roomServerUrl = response.roomServerUrl ?? ''\n // Store data on RundotGameAPI instance (not global window.rundotGameApi)\n // Profile, device, and environment are all required in InitResponse\n const profile = response.profile\n const sanitizedProfile = {\n id: profile.id,\n username: profile.username,\n avatarUrl: profile.avatarUrl ?? null,\n isAnonymous: Boolean(profile.isAnonymous),\n }\n this.rundotGameApi._profileData = sanitizedProfile\n this.rundotGameApi._deviceData = response.device\n this.rundotGameApi._environmentData = response.environment\n this.rundotGameApi._localeData = response.locale\n this.rundotGameApi._languageCodeData = response.languageCode\n\n this._isInitialized = true\n\n await this.rpcClient.call(RundotGameMessageId.READY, {})\n\n const safeArea = response.safeArea\n if (safeArea) {\n // Store internally for system.getSafeArea()\n this.rundotGameApi._safeAreaData = safeArea\n }\n\n // Extract G2G navigation context and strip it from launchParams so\n // launchParams stays a clean Record<string, string> for consumers.\n const { g2gLaunch, g2gReturn, ...launchParams } = response.launchParams ?? {}\n\n this.context = {\n safeArea: safeArea,\n initializeAsleep: response.initializeAsleep,\n launchParams,\n shareParams: response.shareParams,\n notificationParams: response.notificationParams,\n shareLinkId: response.shareLinkId,\n g2gLaunch,\n g2gReturn,\n }\n\n return this.context\n }\n\n}\n\nexport interface InitResponse {\n initializeAsleep: boolean\n instanceId: string\n /** Game ID — used by multiplayer API to connect to the correct room server */\n gameId?: string\n /** Room server URL for multiplayer WebSocket connections */\n roomServerUrl?: string\n profile: {\n id: string\n username: string\n avatarUrl?: string | null\n isAnonymous?: boolean\n }\n safeArea?: SafeArea\n launchParams: Record<string, string> & {\n /** Present when this game was launched via game-to-game navigation. The games (source and destination) define the contract. */\n g2gLaunch?: Record<string, any>\n g2gReturn?: Record<string, any>\n }\n shareParams: Record<string, string>\n notificationParams?: Record<string, string>\n shareLinkId?: string\n environment: EnvironmentInfo\n device: DeviceInfo\n locale: string\n languageCode: string\n rooms?: {\n gameType?: string\n rulesPreset?: string\n matchmaking?: Record<string, any>\n createOptions?: Record<string, any>\n privateMatchDefaults?: Record<string, any>\n [key: string]: any\n }\n}\n","import { AnalyticsApi, MockAnalyticsApi } from './analytics'\nimport {\n Host,\n InitializationContext,\n InitializationOptions,\n SharedStorageHostApi,\n} from './Host.ts'\nimport { AdsApi, MockAdsApi } from './ads'\nimport { createMockStorageApi, StorageApi } from './storage'\nimport { Avatar3dApi, MockAvatarApi } from './avatar3d'\nimport { RundotGameAPI } from './rundot-game-api/types.ts'\nimport { MockNavigationApi, NavigationApi } from './navigation'\nimport { MockNotificationsApi, NotificationsApi } from './notifications'\nimport { MockPopupsApi, PopupsApi } from './popups'\nimport { MockProfileApi, ProfileApi } from './profile'\nimport { SystemApi, MockSystemApi } from './system'\nimport { MockDeviceApi } from './device'\nimport { MockEnvironmentApi } from './environment'\nimport { CdnApi, MockCdnApi } from './cdn'\nimport { MockTimeApi, TimeApi } from './time'\nimport { AiApi, MockAiApi } from './ai'\nimport { HapticsApi, MockHapticsApi } from './haptics'\nimport { FeaturesApi, MockFeaturesApi } from './features'\nimport { LifecycleApi, MockLifecycleApi } from './lifecycles'\nimport { SimulationApi } from './simulation'\nimport { RoomsApi, initializeRoomsApi } from './rooms'\nimport { LoggingApi, MockLoggingApi } from './logging'\nimport { IapApi, MockIapApi } from './iap'\nimport { RundotGameMessageId } from './RundotGameMessageId.ts'\nimport {\n MockOverlay,\n OverlayElements,\n MockActionSheetItem,\n MockActionSheetOptions,\n} from './MockOverlay'\nimport { MockSharedAssetsApi } from './shared-assets'\nimport { LeaderboardApi, MockLeaderboardApi } from './leaderboard'\nimport { UgcApi, MockUgcApi } from './ugc'\nimport { MockPreloaderApi, PreloaderApi } from './game-preloader'\nimport { SocialApi } from './social/SocialApi'\nimport { MockSocialApi } from './social/MockSocialApi'\nimport { ImageGenApi, MockImageGenApi } from './imageGen'\nimport { EntitlementApi, MockEntitlementApi } from './entitlements'\nimport { ShopApi, MockShopApi } from './shop'\nimport { AccessGateApi, MockAccessGateApi, applyAccessGates } from './access-gate'\nimport type { MultiplayerApi } from './mp/client/MultiplayerApi'\nimport { MockMultiplayerApi } from './mp/client/MockMultiplayerApi'\nimport { VideoApi, MockVideoApi } from './video'\nimport { AppApi, MockAppApi } from './app'\nimport { AttributionApi, MockAttributionApi } from './attribution'\n\nconst ROOMS_UNAVAILABLE_MESSAGE =\n '[RUN] Rooms API is only available when running inside the RUN.game host environment.'\n\nfunction createUnavailableRoomsApi(): RoomsApi {\n const roomsUnavailableError = (): Error => new Error(ROOMS_UNAVAILABLE_MESSAGE)\n\n return {\n async createRoomAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async joinOrCreateRoomAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async joinRoomByCodeAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async getUserRoomsAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async subscribeAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async updateRoomDataAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async getRoomDataAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async sendRoomMessageAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async leaveRoomAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async kickPlayerAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async startRoomGameAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async proposeMoveAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async validateMoveAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n }\n}\n\nconst SIMULATION_UNAVAILABLE_MESSAGE =\n '[RUN] Simulation API is only available when running inside the RUN.game host environment.'\n\nfunction createUnavailableSimulationApi(): SimulationApi {\n const simulationUnavailableError = (): Error => new Error(SIMULATION_UNAVAILABLE_MESSAGE)\n\n return {\n isEnabled(): boolean {\n return false\n },\n async getStateAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getConfigAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async executeRecipeAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getActiveRunsAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async collectRecipeAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async executeScopedRecipeAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async triggerRecipeChainAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getAvailableRecipesAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getRecipeRequirementsAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getBatchRecipeRequirementsAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async resolveFieldValueAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getEntityMetadataAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getSlotContainersAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getSlotAssignmentsAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async assignItemToSlotAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async removeItemFromSlotAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getAvailableItemsAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async calculatePowerPreviewAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async validateSlotAssignmentAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async executeBatchOperationsAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async subscribeAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async resetStateAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n }\n}\n\nenum MockHostState {\n PLAYING,\n PAUSED,\n SLEEPING,\n TERMINATED,\n}\n\nexport class MockHost implements Host {\n readonly ads: AdsApi\n readonly analytics: AnalyticsApi\n readonly deviceCache: StorageApi\n readonly appStorage: StorageApi\n readonly ownerStorage: StorageApi\n readonly sharedStorage: SharedStorageHostApi\n readonly avatar3d: Avatar3dApi\n readonly navigation: NavigationApi\n readonly notifications: NotificationsApi\n readonly popups: PopupsApi\n readonly profile: ProfileApi\n readonly system: SystemApi\n readonly cdn: CdnApi\n readonly time: TimeApi\n ai: AiApi\n readonly haptics: HapticsApi\n readonly features: FeaturesApi\n readonly lifecycle: LifecycleApi\n simulation: SimulationApi\n rooms: RoomsApi\n readonly logging: LoggingApi\n readonly iap: IapApi\n readonly leaderboard: LeaderboardApi\n ugc: UgcApi\n readonly preloader: PreloaderApi\n readonly social: SocialApi\n readonly imageGen: ImageGenApi\n readonly entitlements: EntitlementApi\n readonly shop: ShopApi\n readonly accessGate: AccessGateApi\n readonly multiplayer: MultiplayerApi\n readonly video: VideoApi\n readonly app: AppApi\n readonly attribution: AttributionApi\n\n context?: InitializationContext\n readonly instanceId: string = 'mock'\n\n private state: MockHostState = MockHostState.PLAYING\n\n get isInitialized() {\n return this._isInitialized\n }\n\n private readonly rundotGameApi: RundotGameAPI\n private _isInitialized: boolean = false\n private readonly _overlay: MockOverlay\n\n private readonly _mockLifecyclesApi: MockLifecycleApi\n private readonly _mockAdsApi: MockAdsApi\n\n constructor(rundotGameApi: RundotGameAPI) {\n this.rundotGameApi = rundotGameApi\n this._overlay = this.createOverlay()\n this._mockAdsApi = new MockAdsApi(this._overlay)\n this._mockLifecyclesApi = new MockLifecycleApi()\n\n this.ads = this._mockAdsApi\n this.analytics = new MockAnalyticsApi()\n\n // Use local mock implementations (no backend connection)\n const appUrl = typeof window !== 'undefined' ? window.location.href : ''\n this.deviceCache = createMockStorageApi('deviceCache', appUrl)\n this.appStorage = createMockStorageApi('appStorage', appUrl)\n this.ownerStorage = createMockStorageApi('ownerStorage', appUrl)\n\n // Shared storage mock — writer handles reuse appStorage mock namespaced\n // by (appId, namespace); readers return empty for unknown targets. Good\n // enough for local testing without a real server; real access-control\n // checks only happen against the Cloud Run backend.\n //\n // NOTE: we intentionally do NOT embed `appUrl` here. `appUrl` is a full\n // http(s) URL in the browser, and `normalizeAppIdentifier` parses it via\n // `new URL(...)` and extracts only the pathname-based app ID, silently\n // dropping any `#shared/...` hash fragment. Different (appId, namespace)\n // scopes would then collide on the same localStorage prefix. Using a\n // non-URL prefix (like `SandboxHost`) passes through normalization\n // untouched and keeps each scope isolated.\n this.sharedStorage = {\n open: ({ appId, namespace }) => {\n if (appId === '') {\n throw new Error(\n 'sharedStorage.open: appId must be a non-empty string or omitted',\n )\n }\n const resolved = appId ?? 'mock-app'\n return createMockStorageApi(\n 'appStorage',\n `mock#shared/${resolved}/${namespace}`,\n )\n },\n read: ({ appId }) => {\n if (appId === '') {\n throw new Error(\n 'sharedStorage.read: appId must be a non-empty string or omitted',\n )\n }\n return {\n listSources: async () => [],\n getAllFromSource: async () => ({}),\n get: async () => null,\n getAllForKey: async () => [],\n }\n },\n }\n this.simulation = createUnavailableSimulationApi()\n this.rooms = createUnavailableRoomsApi()\n this.leaderboard = new MockLeaderboardApi()\n this.ugc = new MockUgcApi()\n\n this.avatar3d = new MockAvatarApi(rundotGameApi)\n this.navigation = new MockNavigationApi(rundotGameApi)\n this.notifications = new MockNotificationsApi(rundotGameApi)\n this.popups = new MockPopupsApi(this._overlay)\n this.profile = new MockProfileApi(rundotGameApi)\n\n // Create device and environment APIs and combine into system namespace\n const deviceApi = new MockDeviceApi(rundotGameApi)\n const environmentApi = new MockEnvironmentApi(rundotGameApi)\n this.system = new MockSystemApi(deviceApi, environmentApi, rundotGameApi)\n\n // MockCdnApi reads configuration from rundotGameApi._mock at runtime\n this.cdn = new MockCdnApi(rundotGameApi)\n this.time = new MockTimeApi(rundotGameApi)\n this.ai = new MockAiApi()\n this.haptics = new MockHapticsApi(rundotGameApi)\n this.features = new MockFeaturesApi()\n this.lifecycle = this._mockLifecyclesApi\n this.logging = new MockLoggingApi()\n this.iap = new MockIapApi()\n this.social = new MockSocialApi()\n this.imageGen = new MockImageGenApi()\n this.entitlements = new MockEntitlementApi()\n this.shop = new MockShopApi()\n this.video = new MockVideoApi()\n this.app = new MockAppApi(rundotGameApi)\n this.attribution = new MockAttributionApi()\n\n initializeRoomsApi(this.rundotGameApi, this)\n\n this.preloader = new MockPreloaderApi()\n rundotGameApi.isMock = () => true\n this.rundotGameApi.sharedAssets = new MockSharedAssetsApi(this.rundotGameApi)\n\n this.accessGate = new MockAccessGateApi(rundotGameApi)\n applyAccessGates(this)\n\n this.multiplayer = new MockMultiplayerApi({\n getProfile: () => rundotGameApi.getProfile(),\n })\n }\n\n initialize(options?: InitializationOptions): Promise<InitializationContext> {\n this._isInitialized = true\n\n // Populate system data on RundotGameAPI instance (same as RemoteHost)\n this.rundotGameApi._profileData = this.profile.getCurrentProfile()\n this.rundotGameApi._deviceData = this.system.getDevice()\n this.rundotGameApi._environmentData = this.system.getEnvironment()\n \n // Populate locale data (added for ph-strip-sdk-config-static-data branch)\n this.rundotGameApi._localeData = this.rundotGameApi._mock?.locale || 'en-US'\n this.rundotGameApi._languageCodeData = this.rundotGameApi._mock?.languageCode || 'en'\n\n this.context = {\n initializeAsleep: false,\n safeArea: this.rundotGameApi._safeAreaData,\n launchParams: options?.launchParams || {\"MOCK_LAUNCH_PARAMS_KEY\": \"MOCK_LAUNCH_PARAMS_VALUE\"},\n shareParams: options?.shareParams || {\"MOCK_SHARE_PARAMS_KEY\": \"MOCK_SHARE_PARAMS_VALUE\"},\n notificationParams: {},\n shareLinkId: options?.shareParams ? 'mock-share-id' : undefined,\n }\n\n return Promise.resolve(this.context)\n }\n\n private createOverlay(): MockOverlay {\n // Create overlay container\n const overlayContainer = document.createElement('div')\n overlayContainer.id = 'rundot-game-mock-overlay'\n overlayContainer.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 10000;\n `\n document.body.appendChild(overlayContainer)\n\n // Setup ad overlay container\n const adOverlay = this.setupAdOverlay()\n\n // Setup action sheet overlay container\n const actionSheet = this.setupActionSheetOverlay()\n\n return {\n container: overlayContainer,\n elements: {},\n appVisibilityState: 'visible',\n actionSheetOverlay: actionSheet,\n adOverlay: adOverlay,\n showAdOverlay: () => {\n return this.showAdOverlay('REWARDED VIDEO AD')\n },\n showActionSheet: (items, options) => {\n return this.showActionSheetOverlay(items, options)\n },\n }\n }\n\n private tryAwake() {\n if (this.state === MockHostState.SLEEPING) {\n this.triggerLifecycleEvent(RundotGameMessageId.AWAKE)\n this.state = MockHostState.PAUSED\n }\n }\n\n private trySleep() {\n if (this.state === MockHostState.PAUSED) {\n this.triggerLifecycleEvent(RundotGameMessageId.SLEEP)\n this.state = MockHostState.SLEEPING\n }\n }\n\n private tryPlay() {\n if (this.state === MockHostState.TERMINATED) {\n this.triggerLifecycleEvent(RundotGameMessageId.AWAKE)\n this.state = MockHostState.PAUSED\n this.triggerLifecycleEvent(RundotGameMessageId.RESUME)\n this.state = MockHostState.PLAYING\n }\n }\n\n private tryQuit() {\n if (this.state === MockHostState.PLAYING) {\n this.triggerLifecycleEvent(RundotGameMessageId.PAUSE)\n this.state = MockHostState.PAUSED\n }\n\n if (this.state === MockHostState.PAUSED) {\n this.triggerLifecycleEvent(RundotGameMessageId.SLEEP)\n this.state = MockHostState.SLEEPING\n }\n\n if (this.state === MockHostState.SLEEPING){\n this.triggerLifecycleEvent(RundotGameMessageId.QUIT)\n this.state = MockHostState.TERMINATED\n }\n }\n\n private tryResume() {\n if (this.state === MockHostState.PAUSED) {\n this.triggerLifecycleEvent(RundotGameMessageId.RESUME)\n this.state = MockHostState.PLAYING\n }\n }\n\n private async showAdOverlay(type: any): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const overlay = this._overlay\n const adOverlay = overlay.adOverlay\n\n // Clear any existing content\n overlay.adOverlay.innerHTML = ''\n\n // Add ad type heading\n const heading = document.createElement('h1')\n heading.style.cssText = `\n font-size: 24px;\n margin-bottom: 20px;\n text-align: center;\n `\n heading.innerText =\n type === 'interstitial' ? 'INTERSTITIAL AD' : 'REWARDED VIDEO AD'\n overlay.adOverlay.appendChild(heading)\n\n // Add mock ad content\n const content = document.createElement('div')\n content.style.cssText = `\n width: 300px;\n height: 250px;\n background-color: #1e40af;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 20px;\n border-radius: 8px;\n `\n content.innerText = 'Mock Ad Content'\n adOverlay.appendChild(content)\n\n // Add timer text\n const timer = document.createElement('p')\n timer.style.cssText = `\n margin-bottom: 20px;\n font-size: 16px;\n `\n timer.innerText = 'Normally ads would have a timer...'\n adOverlay.appendChild(timer)\n\n // Add OK button\n const okButton = document.createElement('button')\n okButton.style.cssText = `\n padding: 10px 40px;\n background-color: #2563eb;\n color: white;\n border: none;\n border-radius: 4px;\n font-size: 16px;\n cursor: pointer;\n `\n okButton.innerText = 'Close Ad'\n adOverlay.appendChild(okButton)\n\n // Show the overlay\n adOverlay.style.display = 'flex'\n\n okButton.onclick = () => {\n this.hideAdOverlay()\n resolve(true)\n }\n })\n }\n\n private hideAdOverlay() {\n const overlay = this._overlay\n if (overlay.adOverlay) {\n overlay.adOverlay.style.display = 'none'\n }\n }\n\n private setupActionSheetOverlay() {\n const actionSheetOverlay = document.createElement('div')\n actionSheetOverlay.id = 'rundot-game-action-sheet-overlay'\n actionSheetOverlay.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10600;\n font-family: sans-serif;\n display: none;\n `\n document.body.appendChild(actionSheetOverlay)\n return actionSheetOverlay\n }\n\n private createOverlayButton(\n id: string,\n text: string,\n position: { x: number; y: number; width: number; height: number },\n onClick: () => void,\n background: string,\n color: string,\n ) {\n const button = document.createElement('button')\n button.id = `rundot-game-mock-${id}-button`\n button.innerText = text\n button.style.cssText = `\n position: absolute;\n left: ${position.x}px;\n top: ${position.y}px;\n width: ${position.width}px;\n min-width: ${position.width}px;\n height: ${position.height}px;\n background: ${background};\n color: ${color};\n border: none;\n border-radius: 8px;\n font-family: sans-serif;\n font-weight: bold;\n font-size: ${Math.min(position.width, position.height) / 3}px;\n cursor: pointer;\n pointer-events: auto;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0.9;\n transition: opacity 0.2s;\n `\n button.addEventListener('click', onClick)\n button.addEventListener('mouseover', () => {\n button.style.opacity = '1'\n })\n button.addEventListener('mouseout', () => {\n button.style.opacity = '0.9'\n })\n\n return button\n }\n\n private triggerLifecycleEvent(name: string) {\n if (name == RundotGameMessageId.PAUSE) {\n this._mockLifecyclesApi.triggerPauseCallbacks()\n } else if (name == RundotGameMessageId.RESUME) {\n this._mockLifecyclesApi.triggerResumeCallbacks()\n } else if (name == RundotGameMessageId.QUIT) {\n this._mockLifecyclesApi.triggerQuitCallbacks()\n } else if (name == RundotGameMessageId.AWAKE) {\n this._mockLifecyclesApi.triggerAwakeCallbacks()\n } else if (name == RundotGameMessageId.SLEEP) {\n this._mockLifecyclesApi.triggerSleepCallbacks()\n }\n }\n\n private setupAdOverlay() {\n const adOverlay = document.createElement('div')\n adOverlay.id = 'rundot-game-ad-overlay'\n adOverlay.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(37, 99, 235, 0.9);\n color: white;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: 10500;\n font-family: sans-serif;\n display: none;\n `\n document.body.appendChild(adOverlay)\n return adOverlay\n }\n\n private showActionSheetOverlay(\n items: MockActionSheetItem[],\n options?: MockActionSheetOptions,\n ): Promise<string | number | null> {\n return new Promise((resolve, reject) => {\n const overlay = this._overlay\n // Clear any existing content and event listeners\n overlay.actionSheetOverlay.innerHTML = ''\n overlay.actionSheetOverlay.style.display = 'flex'\n\n // Create action sheet container\n const actionSheet = document.createElement('div')\n actionSheet.className = 'rundot-game-action-sheet'\n actionSheet.style.cssText = `\n background-color: white;\n border-radius: 8px;\n width: 80%;\n max-width: 400px;\n max-height: 80%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n color: black;\n `\n\n // Add title if provided\n if (options?.title) {\n const titleContainer = document.createElement('div')\n titleContainer.style.cssText = `\n padding: 16px;\n border-bottom: 1px solid #eaeaea;\n font-weight: bold;\n font-size: 18px;\n text-align: center;\n color: black;\n `\n titleContainer.innerText = options.title\n actionSheet.appendChild(titleContainer)\n }\n\n // Add message if provided\n if (options?.message) {\n const messageContainer = document.createElement('div')\n messageContainer.style.cssText = `\n padding: 8px 16px;\n color: #666;\n font-size: 14px;\n text-align: center;\n `\n messageContainer.innerText = options.message\n actionSheet.appendChild(messageContainer)\n }\n\n // Add options\n const optionsContainer = document.createElement('div')\n optionsContainer.style.cssText = `\n overflow-y: auto;\n max-height: 300px;\n `\n\n items.forEach((item, index) => {\n const optionItem = document.createElement('div')\n optionItem.style.cssText = `\n padding: 12px 16px;\n border-bottom: 1px solid #eaeaea;\n cursor: pointer;\n display: flex;\n align-items: center;\n transition: background-color 0.2s;\n color: black;\n `\n\n // Add hover effect\n optionItem.addEventListener('mouseover', () => {\n optionItem.style.backgroundColor = '#f5f5f5'\n })\n\n optionItem.addEventListener('mouseout', () => {\n optionItem.style.backgroundColor = 'white'\n })\n\n // Add icon if provided\n if (item.icon) {\n const iconSpan = document.createElement('span')\n iconSpan.style.cssText = `\n margin-right: 12px;\n font-size: 16px;\n `\n iconSpan.innerText = item.icon\n optionItem.appendChild(iconSpan)\n }\n\n // Add label\n const labelSpan = document.createElement('span')\n labelSpan.style.cssText = `\n color: black;\n `\n labelSpan.innerText = item.label\n optionItem.appendChild(labelSpan)\n\n // Handle click\n optionItem.addEventListener('click', () => {\n this.hideActionSheetOverlay()\n const optionId = item.id !== undefined ? item.id : index\n resolve(optionId)\n })\n\n optionsContainer.appendChild(optionItem)\n })\n\n actionSheet.appendChild(optionsContainer)\n\n // Add cancel button only if cancel is not disabled\n if (!options?.disableCancel) {\n const cancelButton = document.createElement('div')\n cancelButton.style.cssText = `\n padding: 14px 16px;\n text-align: center;\n font-weight: bold;\n cursor: pointer;\n color: #3b82f6;\n border-top: 1px solid #eaeaea;\n `\n cancelButton.innerText = options?.cancelButtonText || 'Cancel'\n cancelButton.addEventListener('click', () => {\n this.hideActionSheetOverlay()\n resolve(null)\n })\n\n actionSheet.appendChild(cancelButton)\n }\n\n // Add close button (X) in the top-right corner only if cancel is not disabled\n if (!options?.disableCancel) {\n const closeButton = document.createElement('div')\n closeButton.style.cssText = `\n position: absolute;\n top: 8px;\n right: 8px;\n width: 24px;\n height: 24px;\n border-radius: 12px;\n background-color: rgba(0,0,0,0.1);\n color: #666;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 14px;\n `\n closeButton.innerText = '✕'\n closeButton.addEventListener('click', () => {\n this.hideActionSheetOverlay()\n resolve(null)\n })\n\n actionSheet.appendChild(closeButton)\n overlay.actionSheetOverlay.appendChild(actionSheet)\n }\n })\n }\n\n hideActionSheetOverlay() {\n const overlay = this._overlay\n if (overlay.actionSheetOverlay) {\n overlay.actionSheetOverlay.style.display = 'none'\n }\n }\n}\n","import { MockHost } from './MockHost.ts'\nimport { RemoteHost } from './RemoteHost.ts'\nimport { AnalyticsApi } from './analytics'\nimport { AdsApi } from './ads'\nimport { StorageApi } from './storage'\nimport type { InboundStorageApi } from './storage/RpcInboundStorageApi'\n\n/**\n * Shared storage (M3): writer handle factory + cross-source reader handle\n * factory, scoped by (targetAppId, namespace).\n */\nexport interface SharedStorageHostApi {\n open(input: { appId?: string; namespace: string }): StorageApi\n read(input: { appId?: string; namespace: string }): InboundStorageApi\n}\nimport { Avatar3dApi } from './avatar3d'\nimport { RundotGameAPI } from './rundot-game-api/types.ts'\nimport { NavigationApi } from './navigation'\nimport { NotificationsApi } from './notifications'\nimport { PopupsApi } from './popups'\nimport { ProfileApi } from './profile'\nimport { SystemApi } from './system'\nimport { CdnApi } from './cdn'\nimport { TimeApi } from './time'\nimport { AiApi } from './ai'\nimport { HapticsApi } from './haptics'\nimport { FeaturesApi } from './features'\nimport { LifecycleApi } from './lifecycles'\nimport { SimulationApi } from './simulation'\nimport { RoomsApi } from './rooms'\nimport type { MultiplayerApi } from './mp/client/MultiplayerApi'\nimport { LoggingApi } from './logging'\nimport { IapApi } from './iap'\nimport { LeaderboardApi } from './leaderboard'\nimport { UgcApi } from './ugc'\nimport { PreloaderApi } from './game-preloader'\nimport { SocialApi } from './social'\nimport { ImageGenApi } from './imageGen/ImageGenApi'\nimport { EntitlementApi } from './entitlements'\nimport { ShopApi } from './shop'\nimport { AccessGateApi } from './access-gate'\nimport { VideoApi } from './video'\nimport { AppApi } from './app'\nimport { AttributionApi } from './attribution'\n\n/**\n * Safe area insets representing padding needed to avoid device notches and host UI.\n * Includes toolbar/feedHeader height + device safe areas.\n */\nexport interface SafeArea {\n left: number\n top: number\n right: number\n bottom: number\n}\n\n/**\n * @deprecated Use SafeArea instead. Will be removed in v4.0.0\n */\nexport type HudInsets = SafeArea\n\nexport interface InitializationOptions {\n helpText?: string\n hardDisableMock?: boolean\n mock?: Record<string, any>\n usePreloader?: boolean\n launchParams?: Record<string, string>\n shareParams?: Record<string, string>\n notificationParams?: Record<string, string>\n}\n\nexport interface InitializationContext {\n /**\n * Safe area insets from INIT_SDK response.\n * @deprecated Use RundotGameAPI.system.getSafeArea() instead. Will be removed in v4.0.0\n */\n safeArea?: SafeArea\n initializeAsleep: boolean\n launchParams?: Record<string, string>\n shareParams?: Record<string, string>\n notificationParams?: Record<string, string>\n /** The share document ID when launched from a share link; `undefined` otherwise. */\n shareLinkId?: string\n /** Data passed from a source game via game-to-game navigation (forward). */\n g2gLaunch?: Record<string, any>\n /** Data restored from a source game via game-to-game return navigation. */\n g2gReturn?: Record<string, any>\n}\n\nexport interface Host {\n readonly ads: AdsApi\n readonly analytics: AnalyticsApi\n readonly deviceCache: StorageApi\n readonly appStorage: StorageApi\n readonly ownerStorage: StorageApi\n readonly sharedStorage: SharedStorageHostApi\n readonly avatar3d: Avatar3dApi\n readonly navigation: NavigationApi\n readonly notifications: NotificationsApi\n readonly popups: PopupsApi\n readonly profile: ProfileApi\n readonly system: SystemApi\n readonly cdn: CdnApi\n readonly time: TimeApi\n readonly ai: AiApi\n readonly haptics: HapticsApi\n readonly features: FeaturesApi\n readonly lifecycle: LifecycleApi\n readonly simulation: SimulationApi\n readonly rooms: RoomsApi\n readonly logging: LoggingApi\n readonly leaderboard: LeaderboardApi\n readonly ugc: UgcApi\n readonly preloader: PreloaderApi\n readonly social: SocialApi\n readonly imageGen: ImageGenApi\n readonly entitlements: EntitlementApi\n readonly shop: ShopApi\n readonly accessGate: AccessGateApi\n readonly multiplayer: MultiplayerApi\n readonly video: VideoApi\n readonly app: AppApi\n readonly attribution: AttributionApi\n readonly isInitialized: boolean\n readonly iap: IapApi\n readonly instanceId: string\n\n readonly context?: InitializationContext\n\n initialize(options?: InitializationOptions): Promise<InitializationContext>\n}\n\n/**\n * Create a Host instance based on the runtime environment.\n *\n * SandboxHost is loaded via a separate entry point (`@series-inc/rundot-game-sdk/sandbox`)\n * which registers a factory on `globalThis.__RUNDOT_SANDBOX_HOST_FACTORY__`.\n * The Vite sandbox plugin injects this import automatically, keeping Firebase\n * completely out of the main bundle's dependency graph.\n */\nexport async function createHost(rundotGameApi: RundotGameAPI, isMock: boolean): Promise<Host> {\n if (isMock) {\n const factory = (globalThis as any).__RUNDOT_SANDBOX_HOST_FACTORY__\n if (factory) {\n return factory(rundotGameApi)\n }\n\n return new MockHost(rundotGameApi)\n }\n\n return new RemoteHost(rundotGameApi)\n}\n","import { Host } from '../Host';\nimport { RundotGameAPI } from '../rundot-game-api/types';\n\nexport * from './SocialApi';\nexport * from './RpcSocialApi';\nexport * from './MockSocialApi';\n\nexport function initializeSocial(rundotGameApi: RundotGameAPI, host: Host): void {\n rundotGameApi.social = host.social;\n}\n"]}
1
+ {"version":3,"sources":["../src/ai/RpcAiApi.ts","../src/ai/MockAiApi.ts","../src/ai/index.ts","../src/rpc/RpcClient.ts","../src/imageGen/RpcImageGenApi.ts","../src/imageGen/MockImageGenApi.ts","../src/imageGen/index.ts","../src/simulation/RpcSimulationApi.ts","../src/simulation/index.ts","../src/version.ts","../src/leaderboard/utils.ts","../src/leaderboard/RpcLeaderboardApi.ts","../src/leaderboard/MockLeaderboardApi.ts","../src/leaderboard/index.ts","../src/ugc/RpcUgcApi.ts","../src/ugc/MockUgcApi.ts","../src/ugc/index.ts","../src/social/MockSocialApi.ts","../src/app/RpcAdminUgcApi.ts","../src/app/RpcAdminImageGenApi.ts","../src/app/RpcAppApi.ts","../src/app/MockAppApi.ts","../src/app/index.ts","../src/attribution/RpcAttributionApi.ts","../src/attribution/MockAttributionApi.ts","../src/attribution/index.ts","../src/social/RpcSocialApi.ts","../src/RundotGameTransport.ts","../src/RemoteHost.ts","../src/MockHost.ts","../src/Host.ts","../src/social/index.ts"],"names":["submittedAt","entry","modeEntries","existingIndex","inserted"],"mappings":"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","file":"chunk-5JCPCAB6.js","sourcesContent":["import { AiApi, AiChatCompletionRequest, AiChatCompletionData } from './AiApi'\nimport { RpcClient } from '../rpc'\nimport { RundotGameMessageId } from '../RundotGameMessageId'\n\nexport class RpcAiApi implements AiApi {\n private readonly rpcClient: RpcClient\n\n constructor(rpcClient: RpcClient) {\n this.rpcClient = rpcClient\n }\n\n async requestChatCompletionAsync(\n request: AiChatCompletionRequest,\n ): Promise<AiChatCompletionData> {\n const response = await this.rpcClient.call<AiChatCompletionData>(\n RundotGameMessageId.AI_CHAT_COMPLETION,\n {\n request: (() => {\n const { apiKey, ...requestWithoutApiKey } = request\n return requestWithoutApiKey\n })(),\n },\n -1\n )\n // Return direct response data\n return response\n }\n\n async getAvailableCompletionModels(): Promise<Array<string>> {\n const response = await this.rpcClient.call<Array<string>>(\n RundotGameMessageId.AI_GET_AVAILABLE_MODELS,\n {},\n -1\n )\n return response\n }\n}\n","import { AiApi, AiChatCompletionData, AiChatCompletionRequest } from './AiApi'\n\nexport class MockAiApi implements AiApi {\n async requestChatCompletionAsync(_request: AiChatCompletionRequest): Promise<AiChatCompletionData> {\n console.warn('[RUN] AI completion API not available in mock mode')\n throw new Error('AI completion API requires backend connection')\n }\n\n async getAvailableCompletionModels(): Promise<Array<string>> {\n console.warn('[RUN] AI models API not available in mock mode')\n throw new Error('AI models API requires backend connection')\n }\n}\n","import { Host } from '../Host'\nimport { RundotGameAPI } from '../rundot-game-api/types'\nimport { AiChatCompletionRequest } from './AiApi'\n\nexport * from './AiApi'\nexport * from './RpcAiApi'\nexport * from './MockAiApi'\n\nexport function initializeAi(rundotGameApi: RundotGameAPI, host: Host) {\n rundotGameApi.ai = host.ai\n}\n","import { RpcRequest } from './RpcRequest.ts'\nimport { RpcResponse } from './RpcResponse.ts'\nimport { RpcTransport } from './RpcTransport.ts'\nimport { RpcNotification } from './RpcNotification'\nimport { generateId } from '../utils/idGenerator'\n\ninterface PendingCall {\n id: string\n resolve: (value: unknown) => void\n reject: (error: unknown) => void\n}\n\nexport interface Subscription {\n unsubscribe: () => void\n}\n\nexport class RpcClient {\n private readonly pendingCalls = new Map<string, PendingCall>()\n private readonly notificationCallbacks = new Map<string, Function>()\n\n private onResponseSub: Subscription | null = null\n private onNotificationSub: Subscription | null = null\n private transport: RpcTransport | null = null\n\n start(transport: RpcTransport): void {\n this.transport = transport\n this.onResponseSub = transport.onResponse(async (response) => {\n return this.handleRpcResponse(response)\n })\n this.onNotificationSub = transport.onNotification(async (notification) => {\n return this.handleRpcNotification(notification)\n })\n }\n\n stop(): void {\n if (this.onResponseSub) {\n this.onResponseSub.unsubscribe()\n this.onResponseSub = null\n }\n\n if (this.onNotificationSub) {\n this.onNotificationSub.unsubscribe()\n this.onNotificationSub = null\n }\n\n this.transport = null\n }\n\n onNotification<TPayload>(\n id: string,\n callback: (payload: TPayload) => void,\n ): Subscription {\n this.notificationCallbacks.set(id, callback)\n return {\n unsubscribe: () => {\n this.notificationCallbacks.delete(id)\n },\n }\n }\n\n callT<TArgs, TResult>(\n method: string,\n args?: TArgs,\n timeout: number = 30000,\n ): Promise<TResult> {\n return this.call(method, args, timeout)\n }\n\n async call<TResponse>(\n method: string,\n args?: unknown,\n timeout: number = 30000,\n ): Promise<TResponse> {\n // NOTE(Zee): Make this into options?\n return new Promise((resolve, reject) => {\n const id = generateId()\n this.addPendingCall(\n id,\n (value: unknown) => resolve(value as TResponse),\n (error: unknown) => reject(error),\n )\n\n const request: RpcRequest = {\n type: 'rpc-request',\n id,\n method,\n args: args,\n }\n\n if (this.transport) {\n this.transport.sendRequest(request)\n }\n\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...\n if (timeout > 0) {\n const startTime = Date.now()\n setTimeout(() => {\n if (this.hasPendingCall(id)) {\n this.removePendingCall(id)\n const elapsed = Date.now() - startTime\n console.error(\n `[RpcClient] TIMEOUT: ${method} after ${elapsed}ms (limit: ${timeout}ms)`,\n {\n method,\n id,\n args: this.safeStringifyArgs(args).substring(0, 500),\n timeout,\n elapsed,\n timestamp: new Date().toISOString(),\n },\n )\n reject(new Error(`RPC call ${method} timed out after ${elapsed}ms`))\n }\n }, timeout)\n }\n })\n }\n\n /**\n * Send a fire-and-forget RPC request.\n *\n * Unlike `call()`, `notify()`:\n * - does NOT register a pending call,\n * - does NOT arm a timeout,\n * - does NOT await or surface the host's response.\n *\n * Use this for telemetry / cleanup RPCs where the caller does not care about\n * the result and does not want spurious timeout errors when the iframe is\n * throttled (e.g. backgrounded tab) or the host's response is otherwise\n * late. Host-side errors are NOT surfaced to the caller.\n *\n * The wire format is identical to `call()` (an `rpc-request` with a\n * generated id), so any late response from the host is harmlessly dropped\n * by `handleRpcResponse` — there is no entry in `pendingCalls` to match.\n */\n notify(method: string, args?: unknown): void {\n const id = generateId()\n\n const request: RpcRequest = {\n type: 'rpc-request',\n id,\n method,\n args: args,\n }\n\n if (this.transport) {\n this.transport.sendRequest(request)\n }\n }\n\n private hasPendingCall(id: string): boolean {\n return this.pendingCalls.has(id)\n }\n\n private safeStringifyArgs(args: unknown): string {\n if (args === undefined) {\n return 'undefined'\n }\n if (args === null) {\n return 'null'\n }\n try {\n const serialized = JSON.stringify(args)\n if (serialized === undefined) {\n return 'undefined'\n }\n return serialized\n } catch (error) {\n return `[unserializable args: ${String(error)}]`\n }\n }\n\n private addPendingCall(\n id: string,\n resolve: (v: unknown) => void,\n reject: (e: unknown) => void,\n ): void {\n this.pendingCalls.set(id, {\n id: id,\n resolve: resolve,\n reject: reject,\n })\n }\n\n private removePendingCall(id: string): void {\n this.pendingCalls.delete(id)\n }\n\n private getPendingCall(id: string): PendingCall | undefined {\n return this.pendingCalls.get(id)\n }\n\n private handleRpcResponse(response: RpcResponse): boolean {\n const pending = this.getPendingCall(response.id)\n if (!pending) {\n return false\n }\n this.removePendingCall(response.id)\n\n if (response.error) {\n pending.reject(new Error(response.error.message))\n return true\n }\n\n pending.resolve(response.result)\n return true\n }\n\n private handleRpcNotification(notification: RpcNotification): void {\n const callback = this.notificationCallbacks.get(notification.id)\n if (callback) {\n callback(notification.payload)\n }\n }\n}\n","import { ImageGenApi, ImageGenParams, ImageGenResult } from './ImageGenApi';\nimport { RpcClient } from '../rpc';\nimport { RundotGameMessageId } from '../RundotGameMessageId';\n\nexport class RpcImageGenApi implements ImageGenApi {\n constructor(private readonly rpcClient: RpcClient) {}\n\n async generate(params: ImageGenParams): Promise<ImageGenResult> {\n // Use infinite timeout (-1) like AI API - image generation can be slow\n return this.rpcClient.call<ImageGenResult>(\n RundotGameMessageId.H5_IMAGE_GEN_GENERATE,\n params,\n -1, // Infinite timeout, matching RpcAiApi pattern\n );\n }\n}\n","import { ImageGenApi, ImageGenParams, ImageGenResult } from './ImageGenApi';\n\nexport class MockImageGenApi implements ImageGenApi {\n async generate(_params: ImageGenParams): Promise<ImageGenResult> {\n console.warn('[RUN] Image generation API not available in mock mode');\n throw new Error('Image generation API requires backend connection');\n }\n}\n","import type { Host } from '../Host';\nimport type { RundotGameAPI } from '../rundot-game-api/types';\n\nexport * from './ImageGenApi';\nexport { RpcImageGenApi } from './RpcImageGenApi';\nexport { MockImageGenApi } from './MockImageGenApi';\n// HttpImageGenApi is intentionally NOT exported here.\n// It depends on Firebase and should only be imported by SandboxHost.\n// This prevents Firebase from being bundled in production builds.\n\nexport function initializeImageGen(rundotGameApi: RundotGameAPI, host: Host): void {\n rundotGameApi.imageGen = host.imageGen;\n}\n","import {\n CollectRecipeResult,\n ExecuteRecipeOptions,\n ExecuteRecipeResponse,\n ExecuteScopedRecipeResult,\n ExecuteScopedRecipeOptions,\n GetActiveRunsOptions,\n GetAvailableRecipesOptions,\n GetAvailableRecipesResult,\n GetBatchRecipeRequirements,\n Recipe,\n SimulationApi,\n SimulationAvailableItem,\n SimulationAssignment,\n SimulationBatchOperation,\n SimulationBatchOperationsResult,\n SimulationPowerPreview,\n SimulationRunSummary,\n SimulationSlotMutationResult,\n SimulationSlotValidationResult,\n SimulationSlotContainer,\n SimulationState,\n SimulationPersonalState,\n SimulationRoomState,\n TriggerRecipeChainOptions,\n ResetStateOptions,\n ResetStateResult,\n} from './SimulationApi'\nimport { RpcClient } from '../rpc'\nimport { RundotGameMessageId } from '../RundotGameMessageId'\nimport {\n RecipeRequirementResult,\n RundotGameSimulationConfig,\n SimulationSubscribeOptions,\n SimulationUpdateData,\n} from '../rundot-game-api/types'\nimport { generateId } from '../utils/idGenerator'\n\ninterface ResolveFieldValueResponse {\n value: unknown\n}\n\ninterface SimulationUpdateNotification {\n subscriptionId: string\n updates: SimulationUpdateData\n}\n\ninterface StateResponseExtension {\n configuration?: RundotGameSimulationConfig\n}\n\ninterface PersonalStateResponse extends SimulationPersonalState, StateResponseExtension {}\n\ninterface RoomStateResponse extends SimulationRoomState, StateResponseExtension {}\n\ntype GetStateResponse = PersonalStateResponse | RoomStateResponse\n\nexport class RpcSimulationApi implements SimulationApi {\n private readonly rpcClient: RpcClient\n private _simulationConfig: RundotGameSimulationConfig | null = null\n private readonly subscriptionCallbacks = new Map<\n string,\n (data: SimulationUpdateData) => void\n >()\n\n constructor(rpcClient: RpcClient) {\n this.rpcClient = rpcClient\n this.rpcClient.onNotification(\n RundotGameMessageId.H5_SIMULATION_UPDATE,\n this.handleSimulationUpdate.bind(this),\n )\n }\n\n isEnabled(): boolean {\n return true\n }\n\n async validateSlotAssignmentAsync(\n containerId: string,\n slotId: string,\n itemId: string,\n ): Promise<SimulationSlotValidationResult> {\n return this.rpcClient.call<SimulationSlotValidationResult>(\n RundotGameMessageId.H5_SIMULATION_VALIDATE_ASSIGNMENT,\n {\n containerId,\n slotId,\n itemId,\n },\n )\n }\n\n async subscribeAsync(\n options: SimulationSubscribeOptions,\n ): Promise<() => void> {\n this.ensureValidSubscribeOptions(options)\n\n const subscriptionId = generateId()\n this.subscriptionCallbacks.set(subscriptionId, options.onUpdate)\n\n try {\n await this.rpcClient.call(RundotGameMessageId.H5_SIMULATION_SUBSCRIBE, {\n subscriptionId,\n entities: options.entities,\n tags: options.tags,\n activeRuns: options.activeRuns,\n roomId: options.roomId,\n })\n } catch (error) {\n this.subscriptionCallbacks.delete(subscriptionId)\n throw error\n }\n\n let unsubscribed = false\n return () => {\n if (unsubscribed) {\n return\n }\n unsubscribed = true\n\n this.subscriptionCallbacks.delete(subscriptionId)\n\n // Fire-and-forget cleanup: the SDK does not need (and cannot\n // meaningfully recover from) an unsubscribe response. Using\n // notify() avoids spurious 30s timeout errors when the iframe is\n // throttled (e.g. backgrounded tab) and the host's response is\n // late.\n this.rpcClient.notify(RundotGameMessageId.H5_SIMULATION_UNSUBSCRIBE, {\n subscriptionId,\n })\n }\n }\n\n executeBatchOperationsAsync(\n operations: Array<SimulationBatchOperation>,\n validateOnly?: boolean,\n ): Promise<SimulationBatchOperationsResult> {\n return this.rpcClient.call<SimulationBatchOperationsResult>(\n RundotGameMessageId.H5_SIMULATION_BATCH_OPERATIONS,\n {\n operations,\n validateOnly,\n },\n )\n }\n async getAvailableItemsAsync(\n containerId: string,\n slotId: string,\n ): Promise<SimulationAvailableItem[]> {\n const response = await this.rpcClient.call<{\n availableItems?: SimulationAvailableItem[]\n }>(\n RundotGameMessageId.H5_SIMULATION_GET_AVAILABLE_ITEMS,\n {\n containerId,\n slotId,\n },\n )\n return response.availableItems || []\n }\n calculatePowerPreviewAsync(\n containerId: string,\n slotId: string,\n candidateItemId: string,\n ): Promise<SimulationPowerPreview> {\n return this.rpcClient.call<SimulationPowerPreview>(\n RundotGameMessageId.H5_SIMULATION_CALCULATE_POWER_PREVIEW,\n {\n containerId,\n slotId,\n candidateItemId,\n },\n )\n }\n assignItemToSlotAsync(\n containerId: string,\n slotId: string,\n itemId: string,\n ): Promise<SimulationSlotMutationResult> {\n return this.rpcClient.call<SimulationSlotMutationResult>(\n RundotGameMessageId.H5_SIMULATION_ASSIGN_ITEM,\n {\n containerId,\n slotId,\n itemId,\n },\n )\n }\n\n removeItemFromSlotAsync(\n containerId: string,\n slotId: string,\n ): Promise<SimulationSlotMutationResult> {\n return this.rpcClient.call<SimulationSlotMutationResult>(\n RundotGameMessageId.H5_SIMULATION_REMOVE_ITEM,\n {\n containerId,\n slotId,\n },\n )\n }\n\n async getSlotContainersAsync(): Promise<SimulationSlotContainer[]> {\n const response = await this.rpcClient.call<{\n containers?: SimulationSlotContainer[]\n }>(\n RundotGameMessageId.H5_SIMULATION_GET_CONTAINERS,\n {},\n )\n return response.containers || []\n }\n\n async getSlotAssignmentsAsync(\n containerId: string,\n ): Promise<SimulationAssignment[]> {\n const response = await this.rpcClient.call<\n SimulationAssignment[] | { assignments?: SimulationAssignment[] }\n >(\n RundotGameMessageId.H5_SIMULATION_GET_ASSIGNMENTS,\n {\n containerId,\n },\n )\n // Server returns raw array, not wrapped in .assignments property\n return Array.isArray(response)\n ? response\n : response.assignments || []\n }\n\n async getStateAsync(roomId?: string): Promise<SimulationState> {\n const response = await this.rpcClient.call<GetStateResponse>(\n RundotGameMessageId.H5_SIMULATION_GET_STATE,\n {\n roomId: roomId,\n },\n )\n\n // Cache configuration if included in response\n if (response.configuration) {\n this._simulationConfig = response.configuration\n }\n return response\n }\n\n async getConfigAsync(roomId?: string): Promise<RundotGameSimulationConfig> {\n if (this._simulationConfig) {\n return this._simulationConfig\n }\n\n // Fetch configuration directly\n const config = await this.rpcClient.call<RundotGameSimulationConfig>(\n RundotGameMessageId.H5_SIMULATION_GET_CONFIG,\n {\n roomId,\n },\n )\n if (config) {\n this._simulationConfig = config\n return config\n }\n\n throw new Error('No simulation configuration available')\n }\n\n executeRecipeAsync(\n recipeId: string,\n inputs?: Record<string, unknown>,\n options?: ExecuteRecipeOptions,\n ): Promise<ExecuteRecipeResponse> {\n return this.rpcClient.call<ExecuteRecipeResponse>(\n RundotGameMessageId.H5_SIMULATION_EXECUTE_RECIPE,\n {\n recipeId: recipeId,\n inputs: inputs,\n roomId: options?.roomId,\n batchAmount: options?.batchAmount,\n allowPartialBatch: options?.allowPartialBatch,\n entity: options?.entity,\n nonce: options?.nonce,\n },\n )\n }\n\n collectRecipeAsync(runId: string): Promise<CollectRecipeResult> {\n return this.rpcClient.call(RundotGameMessageId.H5_SIMULATION_COLLECT_RECIPE, {\n runId: runId,\n })\n }\n\n resetStateAsync(options?: ResetStateOptions): Promise<ResetStateResult> {\n return this.rpcClient.call<ResetStateResult>(\n RundotGameMessageId.H5_SIMULATION_RESET_STATE,\n {\n initializeRecipe: options?.initializeRecipe,\n },\n )\n }\n\n getActiveRunsAsync(\n options?: GetActiveRunsOptions,\n ): Promise<SimulationRunSummary[]> {\n return this.rpcClient.call<SimulationRunSummary[]>(\n RundotGameMessageId.H5_SIMULATION_GET_ACTIVE_RUNS,\n {\n roomId: options?.roomId,\n },\n )\n }\n\n executeScopedRecipeAsync(\n recipeId: string,\n entity: string,\n inputs?: Record<string, unknown>,\n options?: ExecuteScopedRecipeOptions,\n ): Promise<ExecuteScopedRecipeResult> {\n return this.rpcClient.call(\n RundotGameMessageId.H5_SIMULATION_EXECUTE_SCOPED_RECIPE,\n {\n recipeId: recipeId,\n entity: entity,\n inputs: inputs,\n roomId: options?.roomId ?? null,\n options,\n },\n )\n }\n\n getAvailableRecipesAsync(\n options?: GetAvailableRecipesOptions,\n ): Promise<GetAvailableRecipesResult> {\n return this.rpcClient.call(\n RundotGameMessageId.H5_SIMULATION_GET_AVAILABLE_RECIPES,\n {\n roomId: options?.roomId || null,\n includeActorRecipes: options?.includeActorRecipes || false,\n },\n )\n }\n\n getRecipeRequirementsAsync(\n recipe: Recipe,\n ): Promise<RecipeRequirementResult> {\n return this.rpcClient.call<RecipeRequirementResult>(\n RundotGameMessageId.H5_SIMULATION_GET_RECIPE_REQUIREMENTS,\n {\n recipeId: recipe.recipeId,\n nonce: recipe.nonce,\n entity: recipe.entity,\n batchAmount: recipe.batchAmount,\n },\n )\n }\n\n getBatchRecipeRequirementsAsync(\n recipes: Recipe[],\n ): Promise<GetBatchRecipeRequirements> {\n return this.rpcClient.call<GetBatchRecipeRequirements>(\n RundotGameMessageId.H5_SIMULATION_GET_BATCH_RECIPE_REQUIREMENTS,\n {\n recipes,\n },\n )\n }\n\n triggerRecipeChainAsync(\n recipeId: string,\n options?: TriggerRecipeChainOptions,\n ): Promise<ExecuteRecipeResponse> {\n return this.rpcClient.call<ExecuteRecipeResponse>(\n RundotGameMessageId.H5_SIMULATION_TRIGGER_RECIPE_CHAIN,\n {\n triggerRecipeId: recipeId,\n context: options?.context,\n roomId: options?.roomId,\n },\n )\n }\n\n getEntityMetadataAsync(\n entityId: string,\n ): Promise<Record<string, unknown>> {\n return this.rpcClient.call<Record<string, unknown>>(\n RundotGameMessageId.H5_SIMULATION_GET_ENTITY_METADATA,\n {\n entityId,\n },\n )\n }\n\n async resolveFieldValueAsync(\n entityId: string,\n fieldPath: string,\n entity?: string,\n ): Promise<unknown> {\n const response = await this.rpcClient.call<ResolveFieldValueResponse>(\n RundotGameMessageId.H5_SIMULATION_RESOLVE_VALUE,\n {\n entityId,\n fieldPath,\n entity,\n },\n )\n // Extract primitive value from server response wrapper\n return response.value\n }\n\n private handleSimulationUpdate(\n notification: SimulationUpdateNotification,\n ): void {\n if (!notification || !notification.subscriptionId) {\n console.warn('[RUN] Received malformed simulation update')\n return\n }\n\n const callback = this.subscriptionCallbacks.get(notification.subscriptionId)\n if (!callback) {\n console.warn(\n '[RUN] Received update for unknown subscription:',\n notification.subscriptionId,\n )\n return\n }\n\n try {\n callback(notification.updates)\n } catch (error) {\n console.error('[RUN] Error in simulation subscription callback', error)\n }\n }\n\n private ensureValidSubscribeOptions(\n options: unknown,\n ): asserts options is SimulationSubscribeOptions {\n if (typeof options !== 'object' || options === null) {\n throw new Error('Simulation subscribe requires an options object')\n }\n\n const opts = options as Record<string, unknown>\n\n if (typeof opts.onUpdate !== 'function') {\n throw new Error('Simulation subscribe requires an onUpdate callback')\n }\n\n const hasFilter =\n (Array.isArray(opts.entities) && opts.entities.length > 0) ||\n (Array.isArray(opts.tags) && opts.tags.length > 0) ||\n Boolean(opts.activeRuns)\n\n if (!hasFilter) {\n throw new Error(\n 'Simulation subscribe requires at least one filter (entities, tags, activeRuns)',\n )\n }\n }\n}\n","import { RundotGameAPI, SimulationSubscribeOptions } from '../rundot-game-api/types'\nimport { Host } from '../Host'\nimport {\n SimulationApi,\n ExecuteScopedRecipeOptions,\n TriggerRecipeChainOptions,\n GetAvailableRecipesOptions,\n Recipe,\n ResetStateOptions,\n} from './SimulationApi'\n\nexport * from './SimulationApi'\nexport * from './RpcSimulationApi'\n// HttpSimulationApi is intentionally NOT exported here.\n// It depends on Firebase and should only be imported by SandboxHost via direct import.\n// This prevents Firebase from being bundled in production builds.\n\nexport function initializeSimulation(rundotGameApi: RundotGameAPI, host: Host) {\n rundotGameApi.simulation = {\n isEnabled: () => true,\n } as SimulationApi\n\n rundotGameApi.simulation.getConfigAsync = () => {\n return host.simulation.getConfigAsync()\n }\n\n rundotGameApi.simulation.getStateAsync = (roomId) => {\n return host.simulation.getStateAsync(roomId)\n }\n\n rundotGameApi.simulation.executeRecipeAsync = (recipeId, inputs, options) => {\n return host.simulation.executeRecipeAsync(recipeId, inputs, options)\n }\n\n rundotGameApi.simulation.getActiveRunsAsync = () => {\n return host.simulation.getActiveRunsAsync()\n }\n\n rundotGameApi.simulation.collectRecipeAsync = (runId: string) => {\n return host.simulation.collectRecipeAsync(runId)\n }\n\n rundotGameApi.simulation.executeScopedRecipeAsync = (\n recipeId: string,\n entity: string,\n inputs?: Record<string, unknown>,\n options?: ExecuteScopedRecipeOptions,\n ) => {\n return host.simulation.executeScopedRecipeAsync(recipeId, entity, inputs, options)\n }\n\n rundotGameApi.simulation.triggerRecipeChainAsync = (\n recipeId: string,\n options?: TriggerRecipeChainOptions,\n ) => {\n return host.simulation.triggerRecipeChainAsync(recipeId, options)\n }\n\n rundotGameApi.simulation.getAvailableRecipesAsync = async (\n options?: GetAvailableRecipesOptions,\n ) => {\n return host.simulation.getAvailableRecipesAsync(options)\n }\n\n rundotGameApi.simulation.getRecipeRequirementsAsync = (recipe: Recipe) => {\n return host.simulation.getRecipeRequirementsAsync(recipe)\n }\n\n rundotGameApi.simulation.getBatchRecipeRequirementsAsync = (recipes) => {\n return host.simulation.getBatchRecipeRequirementsAsync(recipes)\n }\n\n rundotGameApi.simulation.resolveFieldValueAsync = (\n entityId,\n fieldPath,\n entity,\n ) => {\n return host.simulation.resolveFieldValueAsync(entityId, fieldPath, entity)\n }\n\n rundotGameApi.simulation.getEntityMetadataAsync = (entityId) => {\n return host.simulation.getEntityMetadataAsync(entityId)\n }\n\n rundotGameApi.simulation.getSlotAssignmentsAsync = (containerId) => {\n return host.simulation.getSlotAssignmentsAsync(containerId)\n }\n\n rundotGameApi.simulation.getSlotContainersAsync = () => {\n return host.simulation.getSlotContainersAsync()\n }\n\n rundotGameApi.simulation.assignItemToSlotAsync = (containerId, slotId, itemId) => {\n return host.simulation.assignItemToSlotAsync(containerId, slotId, itemId)\n }\n\n rundotGameApi.simulation.removeItemFromSlotAsync = (containerId, slotId) => {\n return host.simulation.removeItemFromSlotAsync(containerId, slotId)\n }\n\n rundotGameApi.simulation.getAvailableItemsAsync = (containerId, slotId) => {\n return host.simulation.getAvailableItemsAsync(containerId, slotId)\n }\n\n rundotGameApi.simulation.calculatePowerPreviewAsync = (\n containerId: string,\n slotId: string,\n candidateItemId: string,\n ) => {\n return host.simulation.calculatePowerPreviewAsync(\n containerId,\n slotId,\n candidateItemId,\n )\n }\n\n rundotGameApi.simulation.executeBatchOperationsAsync = (\n operations,\n validateOnly,\n ) => {\n return host.simulation.executeBatchOperationsAsync(operations, validateOnly)\n }\n\n rundotGameApi.simulation.validateSlotAssignmentAsync = (\n containerId,\n slotId,\n itemId,\n ) => {\n return host.simulation.validateSlotAssignmentAsync(\n containerId,\n slotId,\n itemId,\n )\n }\n\n // ===== REAL-TIME SUBSCRIPTIONS =====\n rundotGameApi.simulation.subscribeAsync = (options: SimulationSubscribeOptions) => {\n return host.simulation.subscribeAsync(options)\n }\n\n // ===== STATE MANAGEMENT =====\n rundotGameApi.simulation.resetStateAsync = (options?: ResetStateOptions) => {\n return host.simulation.resetStateAsync(options)\n }\n}\n","declare const __SDK_VERSION__: string\nexport const SDK_VERSION = __SDK_VERSION__\n","/**\n * Hash algorithm used for score sealing\n */\nexport const HASH_ALGORITHM_WEB_CRYPTO = 'SHA-256'\nexport const HASH_ALGORITHM_NODE = 'sha256'\n\n/**\n * Compute HMAC-SHA256 hash for score sealing.\n * Hash always includes: score, duration, token\n * Matches server-side hash computation exactly.\n *\n * @param score - The score value\n * @param duration - Duration in seconds\n * @param token - Score token\n * @param sealingNonce - One-time nonce for this submission\n * @param sealingSecret - Secret key for HMAC\n * @returns Hex-encoded hash string\n */\nexport async function computeScoreHash(\n score: number,\n duration: number,\n token: string,\n sealingNonce: string,\n sealingSecret: string,\n): Promise<string> {\n // Build payload: score:value|duration:value|token:value\n const payload = `score:${score}|duration:${duration}|token:${token}`\n const fullPayload = `${payload}|nonce:${sealingNonce}`\n\n // HMAC-SHA256 using Web Crypto API\n const encoder = new TextEncoder()\n const keyData = encoder.encode(sealingSecret)\n const messageData = encoder.encode(fullPayload)\n\n const cryptoKey = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: HASH_ALGORITHM_WEB_CRYPTO },\n false,\n ['sign'],\n )\n\n const signature = await crypto.subtle.sign('HMAC', cryptoKey, messageData)\n\n // Convert to hex string\n return Array.from(new Uint8Array(signature))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n}\n\n","import { RpcClient } from '../rpc'\nimport { RundotGameMessageId } from '../RundotGameMessageId'\nimport {\n GetPagedScoresOptions,\n LeaderboardApi,\n PagedScoresResponse,\n GetPodiumScoresOptions,\n PodiumScoresResponse,\n PlayerRankResult,\n PlayerRankOptions,\n ScoreToken,\n SubmitScoreParams,\n SubmitScoreResult,\n} from './LeaderboardApi'\nimport { computeScoreHash } from './utils'\n\nexport class RpcLeaderboardApi implements LeaderboardApi {\n private readonly rpcClient: RpcClient\n /** Cache of score tokens for automatic hash computation */\n private tokenCache: Map<string, ScoreToken> = new Map()\n\n constructor(rpcClient: RpcClient) {\n this.rpcClient = rpcClient\n }\n\n /**\n * Create a score token for submitting a score.\n * Token is cached for automatic hash computation if score sealing is enabled.\n *\n * @param mode - Optional game mode\n * @returns Score token with sealing data if enabled\n */\n async createScoreToken(mode?: string): Promise<ScoreToken> {\n const token = await this.rpcClient.call<ScoreToken>(\n RundotGameMessageId.H5_LEADERBOARD_CREATE_SCORE_TOKEN,\n mode ? { mode } : {},\n )\n\n // Cache token with sealing data for auto-hash computation\n this.tokenCache.set(token.token, token)\n\n return token\n }\n\n /**\n * Submit a score to the leaderboard.\n * Automatically computes hash if score sealing is enabled and token was created via createScoreToken().\n *\n * @param params - Score submission parameters\n * @returns Submission result with acceptance status and rank\n * @throws Error if token not found in cache\n */\n async submitScore(params: SubmitScoreParams): Promise<SubmitScoreResult> {\n let hash: string | undefined\n\n // If token provided, check if sealing is enabled and auto-compute hash\n if (params.token) {\n const cachedToken = this.tokenCache.get(params.token)\n\n if (!cachedToken) {\n throw new Error(\n 'Invalid token: not found in cache. Did you call createScoreToken() first?'\n )\n }\n\n // Auto-compute hash if sealing enabled (token has nonce and secret)\n if (cachedToken.sealingNonce && cachedToken.sealingSecret) {\n hash = await computeScoreHash(\n params.score,\n params.duration,\n params.token,\n cachedToken.sealingNonce,\n cachedToken.sealingSecret,\n )\n }\n\n // Clean up used token from cache\n this.tokenCache.delete(params.token)\n }\n\n // Send to host/server (includes hash if sealing enabled)\n return this.rpcClient.call<SubmitScoreResult>(\n RundotGameMessageId.H5_LEADERBOARD_SUBMIT_SCORE,\n {\n token: params.token,\n score: params.score,\n duration: params.duration,\n mode: params.mode,\n period: params.period,\n telemetry: params.telemetry,\n metadata: params.metadata,\n hash, // undefined if no sealing, computed if sealing enabled\n },\n )\n }\n\n getPagedScores(options?: GetPagedScoresOptions): Promise<PagedScoresResponse> {\n return this.rpcClient.call<PagedScoresResponse>(\n RundotGameMessageId.H5_LEADERBOARD_GET_PAGED_SCORES,\n options ?? {},\n )\n }\n\n getMyRank(options?: PlayerRankOptions): Promise<PlayerRankResult> {\n return this.rpcClient.call<PlayerRankResult>(\n RundotGameMessageId.H5_LEADERBOARD_GET_MY_RANK,\n options ?? {},\n )\n }\n\n getPodiumScores(options?: GetPodiumScoresOptions): Promise<PodiumScoresResponse> {\n return this.rpcClient.call<PodiumScoresResponse>(\n RundotGameMessageId.H5_LEADERBOARD_GET_PODIUM_SCORES,\n options ?? {},\n )\n }\n}\n","import {\n GetPagedScoresOptions,\n LeaderboardApi,\n LeaderboardEntry,\n PagedScoresResponse,\n GetPodiumScoresOptions,\n PodiumScoresResponse,\n PlayerRankResult,\n PlayerRankOptions,\n ScoreToken,\n SubmitScoreParams,\n SubmitScoreResult,\n} from './LeaderboardApi'\nimport { computeScoreHash } from './utils'\n\ninterface MockScoreToken {\n id: string\n expiresAt: number\n mode: string\n sealingNonce: string | null\n used: boolean\n}\n\nexport class MockLeaderboardApi implements LeaderboardApi {\n private tokens: Map<string, MockScoreToken> = new Map()\n /** Cache of score tokens for automatic hash computation */\n private tokenCache: Map<string, ScoreToken> = new Map()\n private entriesByMode: Map<string, LeaderboardEntry[]> = new Map()\n private tokenCounter = 0\n private enableScoreSealing = false\n private scoreSealingSecret = 'mock-leaderboard-secret-key'\n\n constructor(options?: { enableScoreSealing?: boolean; scoreSealingSecret?: string }) {\n if (options?.enableScoreSealing) {\n this.enableScoreSealing = true\n }\n if (options?.scoreSealingSecret) {\n this.scoreSealingSecret = options.scoreSealingSecret\n }\n }\n\n /**\n * Configure mock leaderboard settings\n *\n * @param options - Configuration options\n */\n configure(options: { enableScoreSealing?: boolean; scoreSealingSecret?: string }): void {\n if (typeof options.enableScoreSealing === 'boolean') {\n this.enableScoreSealing = options.enableScoreSealing\n }\n if (options.scoreSealingSecret) {\n this.scoreSealingSecret = options.scoreSealingSecret\n }\n }\n\n private generateNonce(): string {\n return (\n Math.random().toString(36).slice(2) +\n Math.random().toString(36).slice(2)\n ).slice(0, 64)\n }\n\n private getModeKey(mode: string): string {\n const normalizedMode = mode || 'default'\n return `${normalizedMode}`\n }\n\n private getEntriesForMode(mode: string): LeaderboardEntry[] {\n const key = this.getModeKey(mode)\n if (!this.entriesByMode.has(key)) {\n this.entriesByMode.set(key, [])\n }\n return this.entriesByMode.get(key)!\n }\n\n /**\n * Create a mock score token for testing.\n * Token is cached for automatic hash computation if score sealing is enabled.\n *\n * @param mode - Optional game mode\n * @returns Score token with sealing data if enabled\n */\n async createScoreToken(mode?: string): Promise<ScoreToken> {\n const token = `mock_token_${++this.tokenCounter}`\n const startTime = Date.now()\n const expiresAt = startTime + 3_600_000\n const resolvedMode = mode || 'default'\n const sealingNonce = this.enableScoreSealing ? this.generateNonce() : null\n const sealingSecret = this.enableScoreSealing ? this.scoreSealingSecret : null\n\n this.tokens.set(token, {\n id: token,\n expiresAt,\n mode: resolvedMode,\n sealingNonce,\n used: false,\n })\n\n const result = {\n token,\n startTime,\n expiresAt,\n sealingNonce,\n sealingSecret,\n mode: resolvedMode,\n }\n\n // Cache for auto-hash computation\n this.tokenCache.set(token, result)\n\n return result\n }\n\n /**\n * Submit a mock score to the leaderboard.\n * Automatically computes hash if score sealing is enabled and token was created via createScoreToken().\n *\n * @param params - Score submission parameters\n * @returns Submission result with acceptance status and rank\n * @throws Error if token not found in cache or validation fails\n */\n async submitScore(params: SubmitScoreParams): Promise<SubmitScoreResult> {\n let hash: string | undefined\n\n // Auto-compute hash if token has sealing data\n if (params.token) {\n const cachedToken = this.tokenCache.get(params.token)\n\n if (!cachedToken) {\n throw new Error(\n 'Invalid token: not found in cache. Did you call createScoreToken() first?'\n )\n }\n\n if (cachedToken.sealingNonce && cachedToken.sealingSecret) {\n hash = await computeScoreHash(\n params.score,\n params.duration,\n params.token,\n cachedToken.sealingNonce,\n cachedToken.sealingSecret,\n )\n }\n }\n\n // Simple mode (no token)\n if (!params.token) {\n const mode = params.mode || 'default';\n const submittedAt = Date.now();\n\n const entry: LeaderboardEntry = {\n profileId: `mock_profile`,\n username: 'Mock Player',\n avatarUrl: null,\n score: params.score,\n duration: params.duration,\n submittedAt,\n token: 'simple-mode',\n rank: null,\n zScore: null,\n isAnomaly: false,\n trustScore: 50,\n metadata: params.metadata ?? null,\n isSeed: false,\n };\n\n const modeEntries = this.getEntriesForMode(mode);\n\n // Keep-best: only replace if new score is better (highest wins by default)\n const existingIndex = modeEntries.findIndex((e) => e.profileId === entry.profileId);\n if (existingIndex !== -1) {\n const existingScore = modeEntries[existingIndex].score;\n if (params.score <= existingScore) {\n // Score not better — reject\n return {\n accepted: false,\n rank: null,\n };\n }\n modeEntries.splice(existingIndex, 1);\n }\n\n modeEntries.push(entry);\n modeEntries.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return a.submittedAt - b.submittedAt;\n });\n\n modeEntries.forEach((e, index) => {\n modeEntries[index] = { ...e, rank: index + 1 };\n });\n\n const inserted = modeEntries.find((e) => e.submittedAt === submittedAt);\n return {\n accepted: true,\n rank: inserted?.rank ?? null,\n };\n }\n \n // Token mode\n const scoreToken = this.tokens.get(params.token);\n if (!scoreToken) {\n throw new Error('Invalid score token');\n }\n\n if (scoreToken.expiresAt < Date.now()) {\n throw new Error('Invalid or expired score token');\n }\n\n if (scoreToken.used) {\n throw new Error('Score token already used');\n }\n\n if (params.mode && params.mode !== scoreToken.mode) {\n throw new Error('Submission mode does not match token mode');\n }\n\n // Verify hash if sealing enabled\n if (scoreToken.sealingNonce && !hash) {\n throw new Error('Score hash required when score sealing is enabled');\n }\n\n const submittedAt = Date.now();\n const entry: LeaderboardEntry = {\n profileId: `mock_profile`,\n username: 'Mock Player',\n avatarUrl: null,\n score: params.score,\n duration: params.duration,\n submittedAt,\n token: params.token,\n rank: null,\n zScore: null,\n isAnomaly: false,\n trustScore: 50,\n metadata: params.metadata ?? null,\n isSeed: false,\n };\n\n const modeEntries = this.getEntriesForMode(scoreToken.mode);\n\n // Keep-best: only replace if new score is better (highest wins by default)\n const existingIndex = modeEntries.findIndex((e) => e.profileId === entry.profileId);\n let scoreAccepted = true;\n if (existingIndex !== -1) {\n const existingScore = modeEntries[existingIndex].score;\n if (params.score <= existingScore) {\n scoreAccepted = false;\n } else {\n modeEntries.splice(existingIndex, 1);\n }\n }\n\n if (scoreAccepted) {\n modeEntries.push(entry);\n modeEntries.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return a.submittedAt - b.submittedAt;\n });\n\n modeEntries.forEach((e, index) => {\n modeEntries[index] = { ...e, rank: index + 1 };\n });\n }\n\n // Token is always consumed regardless of score acceptance\n scoreToken.used = true;\n scoreToken.sealingNonce = null;\n\n // Clean up cache\n this.tokenCache.delete(params.token)\n\n const inserted = scoreAccepted\n ? modeEntries.find((e) => e.token === params.token && e.submittedAt === submittedAt)\n : null;\n\n return {\n accepted: scoreAccepted,\n rank: inserted?.rank ?? null,\n };\n }\n\n async getPagedScores(options?: GetPagedScoresOptions): Promise<PagedScoresResponse> {\n const limit = options?.limit ?? 10\n const mode = options?.mode ?? 'default'\n const modeEntries = [...this.getEntriesForMode(mode)]\n\n const entries = modeEntries.slice(0, limit).map((entry) => ({\n ...entry,\n }))\n\n return {\n variant: 'standard',\n entries,\n totalEntries: modeEntries.length,\n nextCursor: null,\n playerRank: null,\n periodInstance: options?.period ?? 'alltime',\n }\n }\n\n async getMyRank(_options?: PlayerRankOptions): Promise<PlayerRankResult> {\n const mode = _options?.mode ?? 'default'\n const modeEntries = this.getEntriesForMode(mode)\n const playerEntry = modeEntries[0] ?? null\n\n return {\n rank: playerEntry?.rank ?? null,\n score: playerEntry?.score,\n totalPlayers: modeEntries.length,\n percentile: playerEntry\n ? Math.max(0, 1 - ((playerEntry.rank ?? 1) - 1) / Math.max(modeEntries.length, 1))\n : undefined,\n trustScore: 50,\n periodInstance: _options?.period ?? 'alltime',\n }\n }\n\n async getPodiumScores(options?: GetPodiumScoresOptions): Promise<PodiumScoresResponse> {\n const mode = options?.mode ?? 'default'\n const modeEntries = [...this.getEntriesForMode(mode)]\n\n const topCount = Math.max(1, Math.min(options?.topCount ?? 3, 10))\n const aheadCount = Math.max(0, Math.min(options?.contextAhead ?? 4, 10))\n const behindCount = Math.max(0, Math.min(options?.contextBehind ?? 2, 10))\n\n const topEntries = modeEntries.slice(0, topCount)\n const playerEntry = modeEntries[0] ?? null\n const totalEntries = modeEntries.length\n\n let playerRank = playerEntry?.rank ?? null\n let beforePlayer: LeaderboardEntry[] = []\n let afterPlayer: LeaderboardEntry[] = []\n let totalBefore = playerRank ? playerRank - 1 : 0\n let totalAfter = playerRank ? Math.max(totalEntries - playerRank, 0) : 0\n let omittedBefore = totalBefore\n let omittedAfter = totalAfter\n\n if (playerRank && playerRank > 0) {\n const beforeStart = Math.max(playerRank - aheadCount - 1, 0)\n beforePlayer = modeEntries.slice(beforeStart, playerRank - 1)\n const afterEnd = Math.min(playerRank + behindCount, totalEntries)\n afterPlayer = modeEntries.slice(playerRank, afterEnd)\n\n const shownTopAhead = topEntries.filter((entry) => (entry.rank ?? 0) > 0 && (entry.rank ?? 0) < playerRank!).length\n omittedBefore = Math.max(totalBefore - (beforePlayer.length + shownTopAhead), 0)\n omittedAfter = Math.max(totalAfter - afterPlayer.length, 0)\n }\n\n return {\n variant: 'highlight',\n entries: topEntries,\n totalEntries,\n nextCursor: null,\n playerRank: playerRank ?? null,\n periodInstance: options?.period ?? 'alltime',\n context: {\n topEntries,\n beforePlayer,\n playerEntry: playerEntry ?? null,\n afterPlayer,\n totalBefore,\n totalAfter,\n omittedBefore,\n omittedAfter,\n },\n }\n }\n}\n","import { Host } from '../Host'\nimport { RundotGameAPI } from '../rundot-game-api/types'\n\nexport * from './LeaderboardApi'\nexport { RpcLeaderboardApi } from './RpcLeaderboardApi'\nexport { MockLeaderboardApi } from './MockLeaderboardApi'\n// HttpLeaderboardApi is intentionally NOT exported here.\n// It depends on Firebase (via callRemoteFunction) and should only be imported by SandboxHost.\n// This prevents Firebase from being bundled in production builds.\nexport * from './utils'\n\nexport function initializeLeaderboard(rundotGameApiInstance: RundotGameAPI, host: Host) {\n rundotGameApiInstance.leaderboard = host.leaderboard\n}\n","/**\n * RPC-backed UGC API implementation for RemoteHost\n *\n * All operations are forwarded to the React Native host via RPC messages.\n */\nimport { RpcClient } from '../rpc'\nimport { RundotGameMessageId } from '../RundotGameMessageId'\nimport {\n UgcApi,\n UgcEntry,\n UgcCreateParams,\n UgcUpdateParams,\n UgcListParams,\n UgcListResponse,\n UgcBrowseParams,\n UgcBrowseResponse,\n UgcGetManyParams,\n UgcGetManyResponse,\n UgcReportParams,\n UgcCountParams,\n UgcFollowCounts,\n} from './UgcApi'\n\nexport class RpcUgcApi implements UgcApi {\n private readonly rpcClient: RpcClient\n\n constructor(rpcClient: RpcClient) {\n this.rpcClient = rpcClient\n }\n\n async create(params: UgcCreateParams): Promise<UgcEntry> {\n return this.rpcClient.call<UgcEntry>(RundotGameMessageId.H5_UGC_CREATE, params)\n }\n\n async update(params: UgcUpdateParams): Promise<UgcEntry> {\n return this.rpcClient.call<UgcEntry>(RundotGameMessageId.H5_UGC_UPDATE, params)\n }\n\n async delete(id: string): Promise<void> {\n await this.rpcClient.call<void>(RundotGameMessageId.H5_UGC_DELETE, { id })\n }\n\n async get(id: string): Promise<UgcEntry | null> {\n return this.rpcClient.call<UgcEntry | null>(RundotGameMessageId.H5_UGC_GET, { id })\n }\n\n async listMine(params?: UgcListParams): Promise<UgcListResponse> {\n return this.rpcClient.call<UgcListResponse>(\n RundotGameMessageId.H5_UGC_LIST_MINE,\n params ?? {},\n )\n }\n\n async browse(params?: UgcBrowseParams): Promise<UgcBrowseResponse> {\n return this.rpcClient.call<UgcBrowseResponse>(\n RundotGameMessageId.H5_UGC_BROWSE,\n params ?? {},\n )\n }\n\n async getMany(params: UgcGetManyParams): Promise<UgcGetManyResponse> {\n return this.rpcClient.call<UgcGetManyResponse>(\n RundotGameMessageId.H5_UGC_GET_MANY,\n params,\n )\n }\n\n // Phase 2: Engagement methods\n\n async like(id: string): Promise<{ likeCount: number }> {\n return this.rpcClient.call<{ likeCount: number }>(\n RundotGameMessageId.H5_UGC_LIKE,\n { id },\n )\n }\n\n async unlike(id: string): Promise<{ likeCount: number }> {\n return this.rpcClient.call<{ likeCount: number }>(\n RundotGameMessageId.H5_UGC_UNLIKE,\n { id },\n )\n }\n\n async recordUse(id: string): Promise<{ useCount: number }> {\n return this.rpcClient.call<{ useCount: number }>(\n RundotGameMessageId.H5_UGC_RECORD_USE,\n { id },\n )\n }\n\n async report(params: UgcReportParams): Promise<void> {\n await this.rpcClient.call<void>(RundotGameMessageId.H5_UGC_REPORT, params)\n }\n\n async count(params?: UgcCountParams): Promise<{ count: number }> {\n return this.rpcClient.call<{ count: number }>(\n RundotGameMessageId.H5_UGC_COUNT,\n params ?? {},\n )\n }\n\n // Creator following\n\n async follow(targetProfileId: string): Promise<void> {\n await this.rpcClient.call<void>(\n RundotGameMessageId.H5_UGC_FOLLOW,\n { targetProfileId },\n )\n }\n\n async unfollow(targetProfileId: string): Promise<void> {\n await this.rpcClient.call<void>(\n RundotGameMessageId.H5_UGC_UNFOLLOW,\n { targetProfileId },\n )\n }\n\n async isFollowing(targetProfileId: string): Promise<{ isFollowing: boolean }> {\n return this.rpcClient.call<{ isFollowing: boolean }>(\n RundotGameMessageId.H5_UGC_IS_FOLLOWING,\n { targetProfileId },\n )\n }\n\n async getFollowCounts(targetProfileId: string): Promise<UgcFollowCounts> {\n return this.rpcClient.call<UgcFollowCounts>(\n RundotGameMessageId.H5_UGC_GET_FOLLOW_COUNTS,\n { targetProfileId },\n )\n }\n}\n","/**\n * Mock UGC API implementation\n *\n * Returns empty results for reads and throws errors for writes.\n * UGC requires a backend connection to function properly.\n */\nimport {\n UgcApi,\n UgcEntry,\n UgcCreateParams,\n UgcUpdateParams,\n UgcListParams,\n UgcListResponse,\n UgcBrowseParams,\n UgcBrowseResponse,\n UgcGetManyParams,\n UgcGetManyResponse,\n UgcReportParams,\n UgcCountParams,\n UgcFollowCounts,\n} from './UgcApi'\n\nexport class MockUgcApi implements UgcApi {\n async create(_params: UgcCreateParams): Promise<UgcEntry> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async update(_params: UgcUpdateParams): Promise<UgcEntry> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async delete(_id: string): Promise<void> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async get(_id: string): Promise<UgcEntry | null> {\n return null\n }\n\n async listMine(_params?: UgcListParams): Promise<UgcListResponse> {\n return { entries: [], nextCursor: undefined }\n }\n\n async browse(_params?: UgcBrowseParams): Promise<UgcBrowseResponse> {\n return { entries: [], nextCursor: undefined }\n }\n\n async getMany(_params: UgcGetManyParams): Promise<UgcGetManyResponse> {\n return { entries: [] }\n }\n\n // Phase 2: Engagement methods\n\n async like(_id: string): Promise<{ likeCount: number }> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async unlike(_id: string): Promise<{ likeCount: number }> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async recordUse(_id: string): Promise<{ useCount: number }> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async report(_params: UgcReportParams): Promise<void> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async count(_params?: UgcCountParams): Promise<{ count: number }> {\n return { count: 0 }\n }\n\n // Creator following\n\n async follow(_targetProfileId: string): Promise<void> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async unfollow(_targetProfileId: string): Promise<void> {\n console.warn('[RUN] UGC API not available in mock mode')\n throw new Error('UGC API requires backend connection')\n }\n\n async isFollowing(_targetProfileId: string): Promise<{ isFollowing: boolean }> {\n return { isFollowing: false }\n }\n\n async getFollowCounts(_targetProfileId: string): Promise<UgcFollowCounts> {\n return { followerCount: 0, followingCount: 0 }\n }\n}\n","import { Host } from '../Host'\nimport { RundotGameAPI } from '../rundot-game-api/types'\n\nexport * from './UgcApi'\nexport { RpcUgcApi } from './RpcUgcApi'\nexport { MockUgcApi } from './MockUgcApi'\n// HttpUgcApi is intentionally NOT exported here.\n// It depends on Firebase (via callRemoteFunction) and should only be imported by SandboxHost.\n// This prevents Firebase from being bundled in production builds.\n\nexport function initializeUgc(rundotGameApiInstance: RundotGameAPI, host: Host): void {\n rundotGameApiInstance.ugc = host.ugc\n}\n","import {\n QRCodeResult,\n ShareClickData,\n ShareLinkResult,\n SocialApi,\n SocialQRCodeOptions,\n} from './SocialApi';\n\nconst MOCK_QR_CODE =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';\n\nconst MOCK_SHARE_LINK_ID = 'mock-share-id';\n\nexport class MockSocialApi implements SocialApi {\n async shareLinkAsync(options: {\n shareParams: Record<string, string>;\n }): Promise<ShareLinkResult> {\n const shareUrl = this.createMockUrl(options.shareParams);\n\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n try {\n await navigator.clipboard.writeText(shareUrl);\n } catch (error) {\n console.warn(\n '[RUN:mock] Failed to copy share URL to clipboard',\n error,\n );\n }\n }\n\n return { shareUrl, shareLinkId: MOCK_SHARE_LINK_ID };\n }\n\n async createQRCodeAsync(options: {\n shareParams: Record<string, string>;\n qrOptions?: SocialQRCodeOptions;\n }): Promise<QRCodeResult> {\n const shareUrl = this.createMockUrl(options.shareParams);\n\n return {\n shareUrl,\n qrCode: MOCK_QR_CODE,\n shareLinkId: MOCK_SHARE_LINK_ID,\n };\n }\n\n async addShareClickDataAsync(options: {\n shareLinkId: string;\n metadata: Record<string, string>;\n }): Promise<void> {\n }\n\n async getShareClicksAsync(options: {\n shareLinkId: string;\n }): Promise<{ clicks: ShareClickData[]; truncated: boolean }> {\n return { clicks: [], truncated: false };\n }\n\n async getMyShareClickDataAsync(options: {\n shareLinkId: string;\n }): Promise<ShareClickData | null> {\n return null;\n }\n\n private createMockUrl(_shareParams: Record<string, string>): string {\n console.warn('[RUN:mock] Share params are stored online — mock URL is just a template')\n console.warn('[RUN:mock] Actual share URL looks like: https://mock-share-url.com/97dt/mock-share-id')\n return `https://mock-share-url.com/97dt/mock-share-id`;\n }\n}\n","import { RpcClient } from '../rpc'\nimport { RundotGameMessageId } from '../RundotGameMessageId'\nimport type {\n AdminUgcApi,\n AdminUgcBrowseParams,\n AdminUgcBrowseResponse,\n AdminUgcListReportsParams,\n AdminUgcListReportsResponse,\n AdminUgcResolveAction,\n} from './AppApi'\n\nexport class RpcAdminUgcApi implements AdminUgcApi {\n private readonly rpcClient: RpcClient\n\n constructor(rpcClient: RpcClient) {\n this.rpcClient = rpcClient\n }\n\n async browse(\n params?: AdminUgcBrowseParams,\n ): Promise<AdminUgcBrowseResponse> {\n return this.rpcClient.call<AdminUgcBrowseResponse>(\n RundotGameMessageId.H5_APP_ADMIN_UGC_BROWSE,\n params ?? {},\n )\n }\n\n async removeEntry(entryId: string): Promise<void> {\n await this.rpcClient.call<void>(\n RundotGameMessageId.H5_APP_ADMIN_UGC_REMOVE_ENTRY,\n { entryId },\n )\n }\n\n async listReports(\n params?: AdminUgcListReportsParams,\n ): Promise<AdminUgcListReportsResponse> {\n return this.rpcClient.call<AdminUgcListReportsResponse>(\n RundotGameMessageId.H5_APP_ADMIN_UGC_LIST_REPORTS,\n params ?? {},\n )\n }\n\n async resolveReport(\n reportId: string,\n action: AdminUgcResolveAction,\n ): Promise<void> {\n await this.rpcClient.call<void>(\n RundotGameMessageId.H5_APP_ADMIN_UGC_RESOLVE_REPORT,\n { reportId, action },\n )\n }\n}\n","import { RpcClient } from '../rpc'\nimport { RundotGameMessageId } from '../RundotGameMessageId'\nimport type {\n AdminImageGenApi,\n AdminImageGenBrowseParams,\n AdminImageGenBrowseResponse,\n AdminImageGenListReportsParams,\n AdminImageGenListReportsResponse,\n AdminImageGenResolveAction,\n} from './AppApi'\n\nexport class RpcAdminImageGenApi implements AdminImageGenApi {\n private readonly rpcClient: RpcClient\n\n constructor(rpcClient: RpcClient) {\n this.rpcClient = rpcClient\n }\n\n async browse(\n params?: AdminImageGenBrowseParams,\n ): Promise<AdminImageGenBrowseResponse> {\n return this.rpcClient.call<AdminImageGenBrowseResponse>(\n RundotGameMessageId.H5_APP_ADMIN_IMAGEGEN_BROWSE,\n params ?? {},\n )\n }\n\n async removeEntry(generationId: string): Promise<void> {\n await this.rpcClient.call<void>(\n RundotGameMessageId.H5_APP_ADMIN_IMAGEGEN_REMOVE_ENTRY,\n { generationId },\n )\n }\n\n async listReports(\n params?: AdminImageGenListReportsParams,\n ): Promise<AdminImageGenListReportsResponse> {\n return this.rpcClient.call<AdminImageGenListReportsResponse>(\n RundotGameMessageId.H5_APP_ADMIN_IMAGEGEN_LIST_REPORTS,\n params ?? {},\n )\n }\n\n async resolveReport(\n reportId: string,\n action: AdminImageGenResolveAction,\n ): Promise<void> {\n await this.rpcClient.call<void>(\n RundotGameMessageId.H5_APP_ADMIN_IMAGEGEN_RESOLVE_REPORT,\n { reportId, action },\n )\n }\n}\n","import { RpcClient } from '../rpc'\nimport { RundotGameMessageId } from '../RundotGameMessageId'\nimport type { AppApi, AppRole, AdminUgcApi, AdminImageGenApi } from './AppApi'\nimport { RpcAdminUgcApi } from './RpcAdminUgcApi'\nimport { RpcAdminImageGenApi } from './RpcAdminImageGenApi'\n\nexport class RpcAppApi implements AppApi {\n private readonly rpcClient: RpcClient\n readonly adminUgc: AdminUgcApi\n readonly adminImageGen: AdminImageGenApi\n\n constructor(rpcClient: RpcClient) {\n this.rpcClient = rpcClient\n this.adminUgc = new RpcAdminUgcApi(rpcClient)\n this.adminImageGen = new RpcAdminImageGenApi(rpcClient)\n }\n\n async getMyRole(): Promise<AppRole> {\n const result = await this.rpcClient.call<{ role: AppRole }>(\n RundotGameMessageId.H5_APP_GET_MY_ROLE,\n {},\n )\n return result.role\n }\n}\n","import type { AppApi, AppRole, AdminUgcApi, AdminImageGenApi } from './AppApi'\nimport type { RundotGameAPI } from '../rundot-game-api/types'\nimport { MockAdminUgcApi } from './MockAdminUgcApi'\nimport { MockAdminImageGenApi } from './MockAdminImageGenApi'\n\nexport class MockAppApi implements AppApi {\n readonly adminUgc: AdminUgcApi\n readonly adminImageGen: AdminImageGenApi\n\n constructor(private readonly rundotGameApi: RundotGameAPI) {\n this.adminUgc = new MockAdminUgcApi()\n this.adminImageGen = new MockAdminImageGenApi()\n }\n\n async getMyRole(): Promise<AppRole> {\n const mockRole = (\n this.rundotGameApi._mock as Record<string, Record<string, unknown>>\n )?.app?.role as string | undefined\n if (mockRole === 'owner' || mockRole === 'editor' || mockRole === 'none') {\n console.warn(\n `[RUN:mock] app.getMyRole() returning mock role: '${mockRole}'`,\n )\n return mockRole\n }\n console.warn(\n \"[RUN:mock] app.getMyRole() returning 'none'. Set _mock.app.role to 'owner', 'editor', or 'none' to control.\",\n )\n return 'none'\n }\n}\n","import type { Host } from '../Host'\nimport type { RundotGameAPI } from '../rundot-game-api/types'\n\nexport * from './AppApi'\nexport { RpcAppApi } from './RpcAppApi'\nexport { MockAppApi } from './MockAppApi'\nexport { RpcAdminUgcApi } from './RpcAdminUgcApi'\nexport { RpcAdminImageGenApi } from './RpcAdminImageGenApi'\nexport { MockAdminUgcApi } from './MockAdminUgcApi'\nexport { MockAdminImageGenApi } from './MockAdminImageGenApi'\nexport { SandboxAppApi, setStoredAppRole } from './SandboxAppApi'\n\nexport function initializeApp(\n rundotGameApiInstance: RundotGameAPI,\n host: Host,\n): void {\n rundotGameApiInstance.app = host.app\n}\n","import { RpcClient } from '../rpc'\nimport { RundotGameMessageId } from '../RundotGameMessageId'\nimport type { AttributionApi, CampaignParams } from './AttributionApi'\n\nexport class RpcAttributionApi implements AttributionApi {\n constructor(private readonly rpcClient: RpcClient) {}\n\n async getAttributionParams(): Promise<CampaignParams | null> {\n return this.rpcClient.call<CampaignParams | null>(\n RundotGameMessageId.H5_GET_ATTRIBUTION_PARAMS,\n {},\n )\n }\n}\n","import type { AttributionApi, CampaignParams } from './AttributionApi'\n\nexport class MockAttributionApi implements AttributionApi {\n async getAttributionParams(): Promise<CampaignParams | null> {\n return {\n utm_source: 'mock_source',\n utm_medium: 'mock_medium',\n utm_campaign: 'mock_campaign',\n utm_content: null,\n utm_term: null,\n fbclid: null,\n gclid: null,\n }\n }\n}\n","import type { Host } from '../Host'\nimport type { RundotGameAPI } from '../rundot-game-api/types'\n\nexport * from './AttributionApi'\nexport { RpcAttributionApi } from './RpcAttributionApi'\nexport { MockAttributionApi } from './MockAttributionApi'\n\nexport function initializeAttribution(\n rundotGameApiInstance: RundotGameAPI,\n host: Host,\n): void {\n rundotGameApiInstance.attribution = host.attribution\n}\n","import { RpcClient } from '../rpc';\nimport { RundotGameMessageId } from '../RundotGameMessageId';\nimport {\n QRCodeResult,\n ShareClickData,\n ShareLinkResult,\n ShareMetadata,\n SocialApi,\n SocialQRCodeOptions,\n} from './SocialApi';\n\nexport class RpcSocialApi implements SocialApi {\n constructor(private readonly rpcClient: RpcClient) {}\n\n async shareLinkAsync(options: {\n shareParams: Record<string, string>;\n metadata?: ShareMetadata;\n }): Promise<ShareLinkResult> {\n const result = (await this.rpcClient.call(RundotGameMessageId.SHARE_LINK, {\n shareParams: options.shareParams,\n metadata: options.metadata ?? {},\n })) as { shareUrl: string; shareLinkId: string };\n\n return {\n shareUrl: result.shareUrl,\n shareLinkId: result.shareLinkId,\n };\n }\n\n async createQRCodeAsync(options: {\n shareParams: Record<string, string>;\n metadata?: ShareMetadata;\n qrOptions?: SocialQRCodeOptions;\n }): Promise<QRCodeResult> {\n const result = (await this.rpcClient.call(\n RundotGameMessageId.CREATE_SHARE_QRCODE,\n {\n shareParams: options.shareParams,\n metadata: options.metadata ?? {},\n qrOptions: options.qrOptions ?? {},\n },\n )) as { shareUrl: string; qrCode: string; shareLinkId: string };\n\n return {\n shareUrl: result.shareUrl,\n qrCode: result.qrCode,\n shareLinkId: result.shareLinkId,\n };\n }\n\n async addShareClickDataAsync(options: {\n shareLinkId: string;\n metadata: Record<string, string>;\n }): Promise<void> {\n await this.rpcClient.call(RundotGameMessageId.SHARE_ADD_CLICK_DATA, {\n shareLinkId: options.shareLinkId,\n metadata: options.metadata,\n });\n }\n\n async getShareClicksAsync(options: {\n shareLinkId: string;\n }): Promise<{ clicks: ShareClickData[]; truncated: boolean }> {\n const result = (await this.rpcClient.call(\n RundotGameMessageId.SHARE_GET_CLICKS,\n { shareLinkId: options.shareLinkId },\n )) as { clicks: ShareClickData[]; truncated: boolean };\n\n return result;\n }\n\n async getMyShareClickDataAsync(options: {\n shareLinkId: string;\n }): Promise<ShareClickData | null> {\n const result = (await this.rpcClient.call(\n RundotGameMessageId.SHARE_GET_MY_CLICK_DATA,\n { shareLinkId: options.shareLinkId },\n )) as ShareClickData | null;\n\n return result;\n }\n}\n","import {\n OnNotificationCallback,\n OnRequestCallback,\n OnResponseCallback,\n RpcNotification,\n RpcRequest,\n RpcResponse,\n RpcTransport,\n Subscription,\n} from './rpc'\nimport { RundotGameMessageId } from './RundotGameMessageId'\n\nexport interface RundotGameMessage {\n type: string\n direction: string\n data?: {\n /**\n * Internal RPC correlation ID for request/response matching.\n *\n * ⚠️ WIRE PROTOCOL STABILITY WARNING ⚠️\n * This field name is part of the wire protocol between the SDK (H5 games) and the\n * host app (venus client). Both sides MUST agree on this field name.\n *\n * DO NOT RENAME THIS FIELD without coordinating a synchronized release of:\n * 1. venus-sdk (this file)\n * 2. venus/client H5MessageBus.ts\n *\n * Renaming breaks RPC - responses will not correlate and all API calls will timeout.\n */\n requestId?: string\n success?: boolean\n\n //NOTE(Zee): Some things send 'value' others send 'data'\n value?: any\n data?: any\n\n error?: string\n\n script?: string\n }\n instanceId: string\n timestamp: number\n}\n\ndeclare global {\n interface Window {\n _rundotGameInitState?: {\n poolId: string\n apiInjected: boolean\n gameInitialized: boolean\n }\n ReactNativeWebView?: {\n postMessage(message: string): void\n }\n rundotGame: {\n _config: {\n locale: string\n instanceId: string\n context?: any\n profile?: {\n id?: string\n username?: string\n name?: string\n displayName?: string\n avatarUrl?: string | null\n isAnonymous?: boolean\n }\n environment: {\n browserInfo?: {\n language: string\n }\n }\n _handlers: Record<string, any>\n }\n profile?: {\n id?: string\n username?: string\n avatarUrl?: string | null\n name?: string\n displayName?: string\n isAnonymous?: boolean\n } | null\n _fetchFromCdn: (url: string) => Promise<string>\n }\n }\n}\n\nexport type OnRundotGameMessageCallback = (message: RundotGameMessage) => void\n\nexport class RundotGameTransport implements RpcTransport {\n private readonly messageHandler: (event: MessageEvent) => void\n\n private readonly onNotificationCallbacks: OnNotificationCallback[] = []\n private readonly onNotificationCallbacksToRemove: OnNotificationCallback[] =\n []\n\n private readonly onRundotGameMessageCallbacks: OnRundotGameMessageCallback[] = []\n private readonly onResponseCallbacks: OnResponseCallback[] = []\n private readonly onResponseCallbacksToRemove: OnResponseCallback[] = []\n\n private _instanceId: string | null = null\n private isStarted: boolean = false\n private isProcessingMessage: boolean = false\n\n constructor() {\n this.messageHandler = async (event) => {\n this.isProcessingMessage = true\n\n let message: RundotGameMessage\n if (typeof event.data === 'string') {\n //this.log(`Message is a string. Parsing...`)\n message = JSON.parse(event.data)\n } else {\n message = event.data as RundotGameMessage\n }\n\n if (!message) {\n this.logInfo('No message found. Ignoring message...')\n return\n }\n\n //this.logInfo(`message received:\\n${JSON.stringify(message, null, 2)}`)\n\n this.notifyRundotGameMessageReceived(message)\n\n if (\n message.type === RundotGameMessageId.PAUSE ||\n message.type === RundotGameMessageId.RESUME ||\n message.type === RundotGameMessageId.AWAKE ||\n message.type === RundotGameMessageId.SLEEP ||\n message.type === RundotGameMessageId.QUIT\n ) {\n const notification: RpcNotification = {\n type: 'rpc-notification',\n id: message.type,\n payload: message.data,\n }\n this.handleNotification(notification)\n\n // NOTE(Zee): This early return is dangerous here. we have to make sure isProcessingMessage is set to false!\n this.isProcessingMessage = false\n return\n }\n\n const messageData = message.data\n if (!messageData) {\n this.logWarn('No data found. Ignoring message...')\n this.isProcessingMessage = false\n return\n }\n\n if (message.type === RundotGameMessageId.H5_SIMULATION_UPDATE) {\n const notification: RpcNotification = {\n type: 'rpc-notification',\n id: message.type,\n payload: message.data,\n }\n this.handleNotification(notification)\n this.isProcessingMessage = false\n return\n }\n\n if (message.type === RundotGameMessageId.H5_VIDEO_RESUME_FROM_NATIVE_PLAYBACK) {\n const notification: RpcNotification = {\n type: 'rpc-notification',\n id: message.type,\n payload: message.data,\n }\n this.handleNotification(notification)\n this.isProcessingMessage = false\n return\n }\n\n const requestId = messageData.requestId\n if (!requestId) {\n this.logWarn('No requestId. Ignoring message...')\n this.isProcessingMessage = false\n return\n }\n\n if (message.type !== RundotGameMessageId.H5_RESPONSE) {\n this.logWarn(`Ignoring unknown message type: ${message.type}`)\n this.isProcessingMessage = false\n return\n }\n\n const success = messageData.success\n let error = undefined\n if (!success) {\n error = {\n message: messageData.error || 'Unknown error',\n }\n }\n\n // Result can be either inside value or data\n let result = messageData.value\n if (result === undefined) {\n result = messageData.data\n }\n\n const response: RpcResponse = {\n type: 'rpc-response',\n id: requestId,\n result: result,\n method: message.type,\n error: error,\n }\n\n await this.handleResponse(response)\n this.isProcessingMessage = false\n }\n }\n onNotification(callback: OnNotificationCallback): Subscription {\n this.onNotificationCallbacks.push(callback)\n return {\n unsubscribe: () => {\n if (this.isProcessingMessage) {\n this.onNotificationCallbacks.push(callback)\n } else {\n this.removeOnNotificationCallback(callback)\n }\n },\n }\n }\n\n onRequest(callback: OnRequestCallback): Subscription {\n throw new Error('Method not implemented.')\n }\n\n onResponse(callback: OnResponseCallback): Subscription {\n this.onResponseCallbacks.push(callback)\n return {\n unsubscribe: () => {\n if (this.isProcessingMessage) {\n this.onResponseCallbacksToRemove.push(callback)\n } else {\n this.removeOnResponseCallback(callback)\n }\n },\n }\n }\n\n public get instanceId(): string | null {\n return this._instanceId\n }\n\n public set instanceId(instanceId: string) {\n this._instanceId = instanceId\n }\n\n sendRequest(request: RpcRequest): void {\n const instanceId = this.instanceId || 'unknown'\n const method = request.method\n const args =\n request.args && typeof request.args === 'object'\n ? (request.args as Record<string, unknown>)\n : {}\n const message: RundotGameMessage = {\n type: method,\n direction: 'H5_TO_APP',\n data: {\n ...args,\n requestId: request.id,\n },\n instanceId: instanceId,\n timestamp: Date.now(),\n }\n this.sendRundotGameMessage(message)\n }\n\n sendRundotGameMessage(message: RundotGameMessage): void {\n const messageAsString = JSON.stringify(message, null, 2)\n //this.logInfo(`Sending message:\\n${messageAsString}`)\n const reactNativeWebView = window.ReactNativeWebView\n if (reactNativeWebView) {\n reactNativeWebView.postMessage(messageAsString)\n } else {\n window.parent.postMessage(messageAsString, '*')\n }\n }\n\n sendResponse(response: RpcResponse): void {\n throw new Error('Method not implemented.')\n }\n\n start() {\n if (this.isStarted) {\n return\n }\n this.isStarted = true\n window.addEventListener('message', this.messageHandler, true)\n this.logInfo(`Started`)\n }\n\n stop() {\n if (!this.isStarted) {\n return\n }\n this.isStarted = false\n window.removeEventListener('message', this.messageHandler)\n this.logInfo(`Stopped`)\n }\n\n private handleNotification(notification: RpcNotification): void {\n //this.logInfo('Notification received: ', notification.id)\n for (const callback of this.onNotificationCallbacks) {\n callback(notification)\n }\n\n for (const callback of this.onNotificationCallbacksToRemove) {\n this.removeOnNotificationCallback(callback)\n }\n this.onNotificationCallbacksToRemove.length = 0\n }\n\n private async handleResponse(response: RpcResponse): Promise<void> {\n for (const callback of this.onResponseCallbacks) {\n const consumed = await callback(response)\n if (consumed) {\n break\n }\n }\n\n for (const callback of this.onResponseCallbacksToRemove) {\n this.removeOnResponseCallback(callback)\n }\n this.onResponseCallbacksToRemove.length = 0\n }\n\n private removeOnResponseCallback(callback: OnResponseCallback): void {\n this.onResponseCallbacks.splice(\n this.onResponseCallbacks.indexOf(callback),\n 1,\n )\n }\n\n private removeOnNotificationCallback(callback: OnNotificationCallback): void {\n this.onNotificationCallbacks.splice(\n this.onNotificationCallbacks.indexOf(callback),\n 1,\n )\n }\n\n private logInfo(message: string, ...params: any[]) {}\n\n private logWarn(message: string, ...params: any[]) {\n console.warn(`[RUN:transport] ${message}`, ...params)\n }\n\n onRundotGameMessage(callback: OnRundotGameMessageCallback): Subscription {\n this.onRundotGameMessageCallbacks.push(callback)\n return {\n unsubscribe: () => {\n this.onRundotGameMessageCallbacks.splice(\n this.onRundotGameMessageCallbacks.indexOf(callback),\n 1,\n )\n },\n }\n }\n\n private notifyRundotGameMessageReceived(message: RundotGameMessage) {\n for (const callback of this.onRundotGameMessageCallbacks) {\n callback(message)\n }\n }\n}\n","import {\n Host,\n InitializationContext,\n SafeArea,\n InitializationOptions,\n SharedStorageHostApi,\n} from './Host.ts'\nimport { RpcClient } from './rpc'\nimport { RundotGameTransport } from './RundotGameTransport.ts'\nimport { AnalyticsApi, RpcAnalyticsApi } from './analytics'\nimport { AdsApi, RpcAdsApi } from './ads'\nimport { RpcStorageApi, StorageApi } from './storage'\nimport { DualEmitStorageApi } from './storage/DualEmitStorageApi'\nimport { RpcInboundStorageApi } from './storage/RpcInboundStorageApi'\nimport { RundotGameMessageId } from './RundotGameMessageId.ts'\nimport { Avatar3dApi, RpcAvatarApi } from './avatar3d'\nimport { RundotGameAPI } from './rundot-game-api/types.ts'\nimport { NavigationApi, RpcNavigationApi } from './navigation'\nimport { NotificationsApi } from './notifications'\nimport { RpcNotificationsApi } from './notifications/RpcNotificationsApi'\nimport { PopupsApi, RpcPopupsApi } from './popups'\nimport { HostProfileApi, ProfileApi } from './profile'\nimport { SystemApi, HostSystemApi } from './system'\nimport { HostDeviceApi, DeviceInfo } from './device'\nimport { HostEnvironmentApi, EnvironmentInfo } from './environment'\nimport { CdnApi, HostCdnApi } from './cdn'\nimport { HostTimeApi, TimeApi } from './time'\nimport { AiApi, RpcAiApi } from './ai'\nimport { HapticsApi, RpcHapticsApi } from './haptics'\nimport { FeaturesApi, RpcFeaturesApi } from './features'\nimport { LifecycleApi, RpcLifecycleApi } from './lifecycles'\nimport { RpcSimulationApi, SimulationApi } from './simulation'\nimport { RoomsApi, initializeRoomsApi } from './rooms'\nimport { RpcRoomsApi } from './rooms/RpcRoomsApi'\nimport { LoggingApi, RpcLoggingApi } from './logging'\nimport { IapApi, RpcIapApi } from './iap'\nimport { RpcSharedAssetsApi } from './shared-assets'\nimport { LeaderboardApi, RpcLeaderboardApi } from './leaderboard'\nimport { UgcApi, RpcUgcApi } from './ugc'\nimport { PreloaderApi, RpcPreloaderApi } from './game-preloader'\nimport { SocialApi } from './social/SocialApi'\nimport { RpcSocialApi } from './social/RpcSocialApi'\nimport { ImageGenApi, RpcImageGenApi } from './imageGen'\nimport { EntitlementApi, RpcEntitlementApi } from './entitlements'\nimport { ShopApi, RpcShopApi } from './shop'\nimport { AccessGateApi, RpcAccessGateApi, applyAccessGates } from './access-gate'\nimport type { MultiplayerApi } from './mp/client/MultiplayerApi'\nimport { WsMultiplayerApi } from './mp/client/WsMultiplayerApi'\nimport { VideoApi, RpcVideoApi } from './video'\nimport { AppApi, RpcAppApi } from './app'\nimport { AttributionApi, RpcAttributionApi } from './attribution'\n\nexport class RemoteHost implements Host {\n readonly ads: AdsApi\n readonly analytics: AnalyticsApi\n readonly deviceCache: StorageApi\n readonly appStorage: StorageApi\n readonly ownerStorage: StorageApi\n readonly sharedStorage: SharedStorageHostApi\n readonly avatar3d: Avatar3dApi\n readonly navigation: NavigationApi\n readonly notifications: NotificationsApi\n readonly popups: PopupsApi\n readonly profile: ProfileApi\n readonly system: SystemApi\n readonly cdn: CdnApi\n readonly time: TimeApi\n ai: AiApi\n readonly haptics: HapticsApi\n readonly features: FeaturesApi\n readonly lifecycle: LifecycleApi\n simulation: SimulationApi\n rooms: RoomsApi\n readonly logging: LoggingApi\n readonly iap: IapApi\n readonly leaderboard: LeaderboardApi\n ugc: UgcApi\n readonly preloader: PreloaderApi\n readonly social: SocialApi\n imageGen: ImageGenApi\n readonly entitlements: EntitlementApi\n readonly shop: ShopApi\n readonly accessGate: AccessGateApi\n readonly multiplayer: MultiplayerApi\n readonly video: VideoApi\n readonly app: AppApi\n readonly attribution: AttributionApi\n\n context?: InitializationContext\n instanceId: string = 'unknown'\n\n get isInitialized() {\n return this._isInitialized\n }\n\n private readonly rundotGameApi: RundotGameAPI\n private readonly rpcClient: RpcClient\n private _isInitialized: boolean = false\n private _roomServerUrl: string = ''\n\n constructor(rundotGameApi: RundotGameAPI) {\n this.rundotGameApi = rundotGameApi\n const rpcClient = new RpcClient()\n this.rpcClient = rpcClient\n\n this.ads = new RpcAdsApi(rpcClient)\n this.analytics = new RpcAnalyticsApi(rpcClient)\n this.deviceCache = new RpcStorageApi(rpcClient, {\n clear: RundotGameMessageId.DEVICE_CACHE_CLEAR,\n getItem: RundotGameMessageId.DEVICE_CACHE_GET_ITEM,\n getKey: RundotGameMessageId.DEVICE_CACHE_KEY,\n length: RundotGameMessageId.DEVICE_CACHE_LENGTH,\n removeItem: RundotGameMessageId.DEVICE_CACHE_REMOVE_ITEM,\n setItem: RundotGameMessageId.DEVICE_CACHE_SET_ITEM,\n })\n this.appStorage = new RpcStorageApi(rpcClient, {\n clear: RundotGameMessageId.APP_STORAGE_CLEAR,\n getItem: RundotGameMessageId.APP_STORAGE_GET_ITEM,\n getKey: RundotGameMessageId.APP_STORAGE_KEY,\n length: RundotGameMessageId.APP_STORAGE_LENGTH,\n removeItem: RundotGameMessageId.APP_STORAGE_REMOVE_ITEM,\n setItem: RundotGameMessageId.APP_STORAGE_SET_ITEM,\n getAllItems: RundotGameMessageId.APP_STORAGE_GET_ALL_ITEMS,\n getAllData: RundotGameMessageId.APP_STORAGE_GET_ALL_DATA,\n setMultipleItems: RundotGameMessageId.APP_STORAGE_SET_MULTIPLE_ITEMS,\n removeMultipleItems: RundotGameMessageId.APP_STORAGE_REMOVE_MULTIPLE_ITEMS,\n })\n this.ownerStorage = new RpcStorageApi(rpcClient, {\n clear: RundotGameMessageId.OWNER_STORAGE_CLEAR,\n getItem: RundotGameMessageId.OWNER_STORAGE_GET_ITEM,\n getKey: RundotGameMessageId.OWNER_STORAGE_KEY,\n length: RundotGameMessageId.OWNER_STORAGE_LENGTH,\n removeItem: RundotGameMessageId.OWNER_STORAGE_REMOVE_ITEM,\n setItem: RundotGameMessageId.OWNER_STORAGE_SET_ITEM,\n getAllItems: RundotGameMessageId.OWNER_STORAGE_GET_ALL_ITEMS,\n getAllData: RundotGameMessageId.OWNER_STORAGE_GET_ALL_DATA,\n setMultipleItems: RundotGameMessageId.OWNER_STORAGE_SET_MULTIPLE_ITEMS,\n removeMultipleItems: RundotGameMessageId.OWNER_STORAGE_REMOVE_MULTIPLE_ITEMS,\n })\n\n // Shared storage (M3). `open` and `read` return synchronous handles; the\n // first method call on each handle performs the server-side policy check.\n // Handles are lightweight and not cached — multiple opens on the same\n // (targetAppId, namespace) pair produce independent Rpc-bound instances.\n this.sharedStorage = {\n open: ({ appId, namespace }: { appId?: string; namespace: string }) => {\n if (appId === '') {\n throw new Error(\n 'sharedStorage.open: appId must be a non-empty string or omitted',\n )\n }\n return new DualEmitStorageApi(\n rpcClient,\n {\n clear: RundotGameMessageId.SHARED_STORAGE_CLEAR,\n getItem: RundotGameMessageId.SHARED_STORAGE_GET_ITEM,\n getKey: RundotGameMessageId.SHARED_STORAGE_KEY,\n length: RundotGameMessageId.SHARED_STORAGE_LENGTH,\n removeItem: RundotGameMessageId.SHARED_STORAGE_REMOVE_ITEM,\n setItem: RundotGameMessageId.SHARED_STORAGE_SET_ITEM,\n getAllItems: RundotGameMessageId.SHARED_STORAGE_GET_ALL_ITEMS,\n getAllData: RundotGameMessageId.SHARED_STORAGE_GET_ALL_DATA,\n setMultipleItems: RundotGameMessageId.SHARED_STORAGE_SET_MULTIPLE_ITEMS,\n removeMultipleItems: RundotGameMessageId.SHARED_STORAGE_REMOVE_MULTIPLE_ITEMS,\n },\n { targetAppId: appId, namespace },\n {\n clear: RundotGameMessageId.GLOBAL_STORAGE_CLEAR,\n getItem: RundotGameMessageId.GLOBAL_STORAGE_GET_ITEM,\n getKey: RundotGameMessageId.GLOBAL_STORAGE_KEY,\n length: RundotGameMessageId.GLOBAL_STORAGE_LENGTH,\n removeItem: RundotGameMessageId.GLOBAL_STORAGE_REMOVE_ITEM,\n setItem: RundotGameMessageId.GLOBAL_STORAGE_SET_ITEM,\n getAllItems: RundotGameMessageId.GLOBAL_STORAGE_GET_ALL_ITEMS,\n setMultipleItems: RundotGameMessageId.GLOBAL_STORAGE_SET_MULTIPLE_ITEMS,\n removeMultipleItems: RundotGameMessageId.GLOBAL_STORAGE_REMOVE_MULTIPLE_ITEMS,\n },\n )\n },\n read: ({ appId, namespace }: { appId?: string; namespace: string }) => {\n if (appId === '') {\n throw new Error(\n 'sharedStorage.read: appId must be a non-empty string or omitted',\n )\n }\n return new RpcInboundStorageApi(\n rpcClient,\n {\n listSources: RundotGameMessageId.SHARED_STORAGE_INBOUND_LIST_SOURCES,\n get: RundotGameMessageId.SHARED_STORAGE_INBOUND_GET,\n getAllFromSource:\n RundotGameMessageId.SHARED_STORAGE_INBOUND_GET_ALL_FROM_SOURCE,\n getAllForKey:\n RundotGameMessageId.SHARED_STORAGE_INBOUND_GET_ALL_FOR_KEY,\n },\n { targetAppId: appId, namespace },\n )\n },\n }\n\n this.avatar3d = new RpcAvatarApi(rpcClient, rundotGameApi)\n this.navigation = new RpcNavigationApi(rpcClient, rundotGameApi)\n this.notifications = new RpcNotificationsApi(rpcClient)\n this.popups = new RpcPopupsApi(rpcClient)\n this.profile = new HostProfileApi(rundotGameApi)\n\n // Create device and environment APIs and combine into system namespace\n const deviceApi = new HostDeviceApi(rundotGameApi)\n const environmentApi = new HostEnvironmentApi(rundotGameApi)\n this.system = new HostSystemApi(deviceApi, environmentApi, rundotGameApi)\n\n this.cdn = new HostCdnApi(rpcClient)\n this.time = new HostTimeApi(rpcClient, rundotGameApi)\n this.ai = new RpcAiApi(rpcClient)\n this.haptics = new RpcHapticsApi(rpcClient)\n this.features = new RpcFeaturesApi(rpcClient)\n this.lifecycle = new RpcLifecycleApi(rpcClient)\n this.simulation = new RpcSimulationApi(rpcClient)\n this.rooms = new RpcRoomsApi(rpcClient)\n this.logging = new RpcLoggingApi(this, rpcClient)\n this.iap = new RpcIapApi(rpcClient)\n this.leaderboard = new RpcLeaderboardApi(rpcClient)\n this.ugc = new RpcUgcApi(rpcClient)\n this.preloader = new RpcPreloaderApi(rpcClient)\n this.social = new RpcSocialApi(rpcClient)\n this.imageGen = new RpcImageGenApi(rpcClient)\n this.entitlements = new RpcEntitlementApi(rpcClient)\n this.shop = new RpcShopApi(rpcClient)\n this.video = new RpcVideoApi(rpcClient)\n this.app = new RpcAppApi(rpcClient)\n this.attribution = new RpcAttributionApi(rpcClient)\n rundotGameApi.isMock = () => false\n this.rundotGameApi.sharedAssets = new RpcSharedAssetsApi(rpcClient, rundotGameApi)\n\n initializeRoomsApi(this.rundotGameApi, this)\n\n this.accessGate = new RpcAccessGateApi(rpcClient, rundotGameApi)\n applyAccessGates(this)\n\n // Multiplayer API — gets join ticket via RPC to native host\n // serverUrl and gameId are resolved lazily after initialize() populates them from InitResponse\n this.multiplayer = new WsMultiplayerApi({\n serverUrl: () => this._roomServerUrl,\n getJoinTicket: async (req) => {\n const result = await rpcClient.call<{ ticket: string }>(\n RundotGameMessageId.H5_REQUEST_JOIN_TICKET,\n req,\n )\n return result.ticket\n },\n })\n }\n\n async initialize(\n options?: InitializationOptions,\n ): Promise<InitializationContext> {\n const transport = new RundotGameTransport()\n transport.start()\n this.rpcClient.start(transport)\n\n // Set up room notification routing in RpcRoomsApi\n const roomsApi = this.rooms as RpcRoomsApi\n roomsApi.setupNotifications(transport)\n\n const response = await this.rpcClient.call<InitResponse>(\n RundotGameMessageId.INIT_SDK,\n {},\n -1,\n )\n\n transport.instanceId = response.instanceId\n this.instanceId = response.instanceId\n this._roomServerUrl = response.roomServerUrl ?? ''\n // Store data on RundotGameAPI instance (not global window.rundotGameApi)\n // Profile, device, and environment are all required in InitResponse\n const profile = response.profile\n const sanitizedProfile = {\n id: profile.id,\n username: profile.username,\n avatarUrl: profile.avatarUrl ?? null,\n isAnonymous: Boolean(profile.isAnonymous),\n }\n this.rundotGameApi._profileData = sanitizedProfile\n this.rundotGameApi._deviceData = response.device\n this.rundotGameApi._environmentData = response.environment\n this.rundotGameApi._localeData = response.locale\n this.rundotGameApi._languageCodeData = response.languageCode\n\n this._isInitialized = true\n\n await this.rpcClient.call(RundotGameMessageId.READY, {})\n\n const safeArea = response.safeArea\n if (safeArea) {\n // Store internally for system.getSafeArea()\n this.rundotGameApi._safeAreaData = safeArea\n }\n\n // Extract G2G navigation context and strip it from launchParams so\n // launchParams stays a clean Record<string, string> for consumers.\n const { g2gLaunch, g2gReturn, ...launchParams } = response.launchParams ?? {}\n\n this.context = {\n safeArea: safeArea,\n initializeAsleep: response.initializeAsleep,\n launchParams,\n shareParams: response.shareParams,\n notificationParams: response.notificationParams,\n shareLinkId: response.shareLinkId,\n g2gLaunch,\n g2gReturn,\n }\n\n return this.context\n }\n\n}\n\nexport interface InitResponse {\n initializeAsleep: boolean\n instanceId: string\n /** Game ID — used by multiplayer API to connect to the correct room server */\n gameId?: string\n /** Room server URL for multiplayer WebSocket connections */\n roomServerUrl?: string\n profile: {\n id: string\n username: string\n avatarUrl?: string | null\n isAnonymous?: boolean\n }\n safeArea?: SafeArea\n launchParams: Record<string, string> & {\n /** Present when this game was launched via game-to-game navigation. The games (source and destination) define the contract. */\n g2gLaunch?: Record<string, any>\n g2gReturn?: Record<string, any>\n }\n shareParams: Record<string, string>\n notificationParams?: Record<string, string>\n shareLinkId?: string\n environment: EnvironmentInfo\n device: DeviceInfo\n locale: string\n languageCode: string\n rooms?: {\n gameType?: string\n rulesPreset?: string\n matchmaking?: Record<string, any>\n createOptions?: Record<string, any>\n privateMatchDefaults?: Record<string, any>\n [key: string]: any\n }\n}\n","import { AnalyticsApi, MockAnalyticsApi } from './analytics'\nimport {\n Host,\n InitializationContext,\n InitializationOptions,\n SharedStorageHostApi,\n} from './Host.ts'\nimport { AdsApi, MockAdsApi } from './ads'\nimport { createMockStorageApi, StorageApi } from './storage'\nimport { Avatar3dApi, MockAvatarApi } from './avatar3d'\nimport { RundotGameAPI } from './rundot-game-api/types.ts'\nimport { MockNavigationApi, NavigationApi } from './navigation'\nimport { MockNotificationsApi, NotificationsApi } from './notifications'\nimport { MockPopupsApi, PopupsApi } from './popups'\nimport { MockProfileApi, ProfileApi } from './profile'\nimport { SystemApi, MockSystemApi } from './system'\nimport { MockDeviceApi } from './device'\nimport { MockEnvironmentApi } from './environment'\nimport { CdnApi, MockCdnApi } from './cdn'\nimport { MockTimeApi, TimeApi } from './time'\nimport { AiApi, MockAiApi } from './ai'\nimport { HapticsApi, MockHapticsApi } from './haptics'\nimport { FeaturesApi, MockFeaturesApi } from './features'\nimport { LifecycleApi, MockLifecycleApi } from './lifecycles'\nimport { SimulationApi } from './simulation'\nimport { RoomsApi, initializeRoomsApi } from './rooms'\nimport { LoggingApi, MockLoggingApi } from './logging'\nimport { IapApi, MockIapApi } from './iap'\nimport { RundotGameMessageId } from './RundotGameMessageId.ts'\nimport {\n MockOverlay,\n OverlayElements,\n MockActionSheetItem,\n MockActionSheetOptions,\n} from './MockOverlay'\nimport { MockSharedAssetsApi } from './shared-assets'\nimport { LeaderboardApi, MockLeaderboardApi } from './leaderboard'\nimport { UgcApi, MockUgcApi } from './ugc'\nimport { MockPreloaderApi, PreloaderApi } from './game-preloader'\nimport { SocialApi } from './social/SocialApi'\nimport { MockSocialApi } from './social/MockSocialApi'\nimport { ImageGenApi, MockImageGenApi } from './imageGen'\nimport { EntitlementApi, MockEntitlementApi } from './entitlements'\nimport { ShopApi, MockShopApi } from './shop'\nimport { AccessGateApi, MockAccessGateApi, applyAccessGates } from './access-gate'\nimport type { MultiplayerApi } from './mp/client/MultiplayerApi'\nimport { MockMultiplayerApi } from './mp/client/MockMultiplayerApi'\nimport { VideoApi, MockVideoApi } from './video'\nimport { AppApi, MockAppApi } from './app'\nimport { AttributionApi, MockAttributionApi } from './attribution'\n\nconst ROOMS_UNAVAILABLE_MESSAGE =\n '[RUN] Rooms API is only available when running inside the RUN.game host environment.'\n\nfunction createUnavailableRoomsApi(): RoomsApi {\n const roomsUnavailableError = (): Error => new Error(ROOMS_UNAVAILABLE_MESSAGE)\n\n return {\n async createRoomAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async joinOrCreateRoomAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async joinRoomByCodeAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async getUserRoomsAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async subscribeAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async updateRoomDataAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async getRoomDataAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async sendRoomMessageAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async leaveRoomAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async kickPlayerAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async startRoomGameAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async proposeMoveAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n async validateMoveAsync(): Promise<never> {\n throw roomsUnavailableError()\n },\n }\n}\n\nconst SIMULATION_UNAVAILABLE_MESSAGE =\n '[RUN] Simulation API is only available when running inside the RUN.game host environment.'\n\nfunction createUnavailableSimulationApi(): SimulationApi {\n const simulationUnavailableError = (): Error => new Error(SIMULATION_UNAVAILABLE_MESSAGE)\n\n return {\n isEnabled(): boolean {\n return false\n },\n async getStateAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getConfigAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async executeRecipeAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getActiveRunsAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async collectRecipeAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async executeScopedRecipeAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async triggerRecipeChainAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getAvailableRecipesAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getRecipeRequirementsAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getBatchRecipeRequirementsAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async resolveFieldValueAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getEntityMetadataAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getSlotContainersAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getSlotAssignmentsAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async assignItemToSlotAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async removeItemFromSlotAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async getAvailableItemsAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async calculatePowerPreviewAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async validateSlotAssignmentAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async executeBatchOperationsAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async subscribeAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n async resetStateAsync(): Promise<never> {\n throw simulationUnavailableError()\n },\n }\n}\n\nenum MockHostState {\n PLAYING,\n PAUSED,\n SLEEPING,\n TERMINATED,\n}\n\nexport class MockHost implements Host {\n readonly ads: AdsApi\n readonly analytics: AnalyticsApi\n readonly deviceCache: StorageApi\n readonly appStorage: StorageApi\n readonly ownerStorage: StorageApi\n readonly sharedStorage: SharedStorageHostApi\n readonly avatar3d: Avatar3dApi\n readonly navigation: NavigationApi\n readonly notifications: NotificationsApi\n readonly popups: PopupsApi\n readonly profile: ProfileApi\n readonly system: SystemApi\n readonly cdn: CdnApi\n readonly time: TimeApi\n ai: AiApi\n readonly haptics: HapticsApi\n readonly features: FeaturesApi\n readonly lifecycle: LifecycleApi\n simulation: SimulationApi\n rooms: RoomsApi\n readonly logging: LoggingApi\n readonly iap: IapApi\n readonly leaderboard: LeaderboardApi\n ugc: UgcApi\n readonly preloader: PreloaderApi\n readonly social: SocialApi\n readonly imageGen: ImageGenApi\n readonly entitlements: EntitlementApi\n readonly shop: ShopApi\n readonly accessGate: AccessGateApi\n readonly multiplayer: MultiplayerApi\n readonly video: VideoApi\n readonly app: AppApi\n readonly attribution: AttributionApi\n\n context?: InitializationContext\n readonly instanceId: string = 'mock'\n\n private state: MockHostState = MockHostState.PLAYING\n\n get isInitialized() {\n return this._isInitialized\n }\n\n private readonly rundotGameApi: RundotGameAPI\n private _isInitialized: boolean = false\n private readonly _overlay: MockOverlay\n\n private readonly _mockLifecyclesApi: MockLifecycleApi\n private readonly _mockAdsApi: MockAdsApi\n\n constructor(rundotGameApi: RundotGameAPI) {\n this.rundotGameApi = rundotGameApi\n this._overlay = this.createOverlay()\n this._mockAdsApi = new MockAdsApi(this._overlay)\n this._mockLifecyclesApi = new MockLifecycleApi()\n\n this.ads = this._mockAdsApi\n this.analytics = new MockAnalyticsApi()\n\n // Use local mock implementations (no backend connection)\n const appUrl = typeof window !== 'undefined' ? window.location.href : ''\n this.deviceCache = createMockStorageApi('deviceCache', appUrl)\n this.appStorage = createMockStorageApi('appStorage', appUrl)\n this.ownerStorage = createMockStorageApi('ownerStorage', appUrl)\n\n // Shared storage mock — writer handles reuse appStorage mock namespaced\n // by (appId, namespace); readers return empty for unknown targets. Good\n // enough for local testing without a real server; real access-control\n // checks only happen against the Cloud Run backend.\n //\n // NOTE: we intentionally do NOT embed `appUrl` here. `appUrl` is a full\n // http(s) URL in the browser, and `normalizeAppIdentifier` parses it via\n // `new URL(...)` and extracts only the pathname-based app ID, silently\n // dropping any `#shared/...` hash fragment. Different (appId, namespace)\n // scopes would then collide on the same localStorage prefix. Using a\n // non-URL prefix (like `SandboxHost`) passes through normalization\n // untouched and keeps each scope isolated.\n this.sharedStorage = {\n open: ({ appId, namespace }) => {\n if (appId === '') {\n throw new Error(\n 'sharedStorage.open: appId must be a non-empty string or omitted',\n )\n }\n const resolved = appId ?? 'mock-app'\n return createMockStorageApi(\n 'appStorage',\n `mock#shared/${resolved}/${namespace}`,\n )\n },\n read: ({ appId }) => {\n if (appId === '') {\n throw new Error(\n 'sharedStorage.read: appId must be a non-empty string or omitted',\n )\n }\n return {\n listSources: async () => [],\n getAllFromSource: async () => ({}),\n get: async () => null,\n getAllForKey: async () => [],\n }\n },\n }\n this.simulation = createUnavailableSimulationApi()\n this.rooms = createUnavailableRoomsApi()\n this.leaderboard = new MockLeaderboardApi()\n this.ugc = new MockUgcApi()\n\n this.avatar3d = new MockAvatarApi(rundotGameApi)\n this.navigation = new MockNavigationApi(rundotGameApi)\n this.notifications = new MockNotificationsApi(rundotGameApi)\n this.popups = new MockPopupsApi(this._overlay)\n this.profile = new MockProfileApi(rundotGameApi)\n\n // Create device and environment APIs and combine into system namespace\n const deviceApi = new MockDeviceApi(rundotGameApi)\n const environmentApi = new MockEnvironmentApi(rundotGameApi)\n this.system = new MockSystemApi(deviceApi, environmentApi, rundotGameApi)\n\n // MockCdnApi reads configuration from rundotGameApi._mock at runtime\n this.cdn = new MockCdnApi(rundotGameApi)\n this.time = new MockTimeApi(rundotGameApi)\n this.ai = new MockAiApi()\n this.haptics = new MockHapticsApi(rundotGameApi)\n this.features = new MockFeaturesApi()\n this.lifecycle = this._mockLifecyclesApi\n this.logging = new MockLoggingApi()\n this.iap = new MockIapApi()\n this.social = new MockSocialApi()\n this.imageGen = new MockImageGenApi()\n this.entitlements = new MockEntitlementApi()\n this.shop = new MockShopApi()\n this.video = new MockVideoApi()\n this.app = new MockAppApi(rundotGameApi)\n this.attribution = new MockAttributionApi()\n\n initializeRoomsApi(this.rundotGameApi, this)\n\n this.preloader = new MockPreloaderApi()\n rundotGameApi.isMock = () => true\n this.rundotGameApi.sharedAssets = new MockSharedAssetsApi(this.rundotGameApi)\n\n this.accessGate = new MockAccessGateApi(rundotGameApi)\n applyAccessGates(this)\n\n this.multiplayer = new MockMultiplayerApi({\n getProfile: () => rundotGameApi.getProfile(),\n })\n }\n\n initialize(options?: InitializationOptions): Promise<InitializationContext> {\n this._isInitialized = true\n\n // Populate system data on RundotGameAPI instance (same as RemoteHost)\n this.rundotGameApi._profileData = this.profile.getCurrentProfile()\n this.rundotGameApi._deviceData = this.system.getDevice()\n this.rundotGameApi._environmentData = this.system.getEnvironment()\n \n // Populate locale data (added for ph-strip-sdk-config-static-data branch)\n this.rundotGameApi._localeData = this.rundotGameApi._mock?.locale || 'en-US'\n this.rundotGameApi._languageCodeData = this.rundotGameApi._mock?.languageCode || 'en'\n\n this.context = {\n initializeAsleep: false,\n safeArea: this.rundotGameApi._safeAreaData,\n launchParams: options?.launchParams || {\"MOCK_LAUNCH_PARAMS_KEY\": \"MOCK_LAUNCH_PARAMS_VALUE\"},\n shareParams: options?.shareParams || {\"MOCK_SHARE_PARAMS_KEY\": \"MOCK_SHARE_PARAMS_VALUE\"},\n notificationParams: {},\n shareLinkId: options?.shareParams ? 'mock-share-id' : undefined,\n }\n\n return Promise.resolve(this.context)\n }\n\n private createOverlay(): MockOverlay {\n // Create overlay container\n const overlayContainer = document.createElement('div')\n overlayContainer.id = 'rundot-game-mock-overlay'\n overlayContainer.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 10000;\n `\n document.body.appendChild(overlayContainer)\n\n // Setup ad overlay container\n const adOverlay = this.setupAdOverlay()\n\n // Setup action sheet overlay container\n const actionSheet = this.setupActionSheetOverlay()\n\n return {\n container: overlayContainer,\n elements: {},\n appVisibilityState: 'visible',\n actionSheetOverlay: actionSheet,\n adOverlay: adOverlay,\n showAdOverlay: () => {\n return this.showAdOverlay('REWARDED VIDEO AD')\n },\n showActionSheet: (items, options) => {\n return this.showActionSheetOverlay(items, options)\n },\n }\n }\n\n private tryAwake() {\n if (this.state === MockHostState.SLEEPING) {\n this.triggerLifecycleEvent(RundotGameMessageId.AWAKE)\n this.state = MockHostState.PAUSED\n }\n }\n\n private trySleep() {\n if (this.state === MockHostState.PAUSED) {\n this.triggerLifecycleEvent(RundotGameMessageId.SLEEP)\n this.state = MockHostState.SLEEPING\n }\n }\n\n private tryPlay() {\n if (this.state === MockHostState.TERMINATED) {\n this.triggerLifecycleEvent(RundotGameMessageId.AWAKE)\n this.state = MockHostState.PAUSED\n this.triggerLifecycleEvent(RundotGameMessageId.RESUME)\n this.state = MockHostState.PLAYING\n }\n }\n\n private tryQuit() {\n if (this.state === MockHostState.PLAYING) {\n this.triggerLifecycleEvent(RundotGameMessageId.PAUSE)\n this.state = MockHostState.PAUSED\n }\n\n if (this.state === MockHostState.PAUSED) {\n this.triggerLifecycleEvent(RundotGameMessageId.SLEEP)\n this.state = MockHostState.SLEEPING\n }\n\n if (this.state === MockHostState.SLEEPING){\n this.triggerLifecycleEvent(RundotGameMessageId.QUIT)\n this.state = MockHostState.TERMINATED\n }\n }\n\n private tryResume() {\n if (this.state === MockHostState.PAUSED) {\n this.triggerLifecycleEvent(RundotGameMessageId.RESUME)\n this.state = MockHostState.PLAYING\n }\n }\n\n private async showAdOverlay(type: any): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const overlay = this._overlay\n const adOverlay = overlay.adOverlay\n\n // Clear any existing content\n overlay.adOverlay.innerHTML = ''\n\n // Add ad type heading\n const heading = document.createElement('h1')\n heading.style.cssText = `\n font-size: 24px;\n margin-bottom: 20px;\n text-align: center;\n `\n heading.innerText =\n type === 'interstitial' ? 'INTERSTITIAL AD' : 'REWARDED VIDEO AD'\n overlay.adOverlay.appendChild(heading)\n\n // Add mock ad content\n const content = document.createElement('div')\n content.style.cssText = `\n width: 300px;\n height: 250px;\n background-color: #1e40af;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 20px;\n border-radius: 8px;\n `\n content.innerText = 'Mock Ad Content'\n adOverlay.appendChild(content)\n\n // Add timer text\n const timer = document.createElement('p')\n timer.style.cssText = `\n margin-bottom: 20px;\n font-size: 16px;\n `\n timer.innerText = 'Normally ads would have a timer...'\n adOverlay.appendChild(timer)\n\n // Add OK button\n const okButton = document.createElement('button')\n okButton.style.cssText = `\n padding: 10px 40px;\n background-color: #2563eb;\n color: white;\n border: none;\n border-radius: 4px;\n font-size: 16px;\n cursor: pointer;\n `\n okButton.innerText = 'Close Ad'\n adOverlay.appendChild(okButton)\n\n // Show the overlay\n adOverlay.style.display = 'flex'\n\n okButton.onclick = () => {\n this.hideAdOverlay()\n resolve(true)\n }\n })\n }\n\n private hideAdOverlay() {\n const overlay = this._overlay\n if (overlay.adOverlay) {\n overlay.adOverlay.style.display = 'none'\n }\n }\n\n private setupActionSheetOverlay() {\n const actionSheetOverlay = document.createElement('div')\n actionSheetOverlay.id = 'rundot-game-action-sheet-overlay'\n actionSheetOverlay.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10600;\n font-family: sans-serif;\n display: none;\n `\n document.body.appendChild(actionSheetOverlay)\n return actionSheetOverlay\n }\n\n private createOverlayButton(\n id: string,\n text: string,\n position: { x: number; y: number; width: number; height: number },\n onClick: () => void,\n background: string,\n color: string,\n ) {\n const button = document.createElement('button')\n button.id = `rundot-game-mock-${id}-button`\n button.innerText = text\n button.style.cssText = `\n position: absolute;\n left: ${position.x}px;\n top: ${position.y}px;\n width: ${position.width}px;\n min-width: ${position.width}px;\n height: ${position.height}px;\n background: ${background};\n color: ${color};\n border: none;\n border-radius: 8px;\n font-family: sans-serif;\n font-weight: bold;\n font-size: ${Math.min(position.width, position.height) / 3}px;\n cursor: pointer;\n pointer-events: auto;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0.9;\n transition: opacity 0.2s;\n `\n button.addEventListener('click', onClick)\n button.addEventListener('mouseover', () => {\n button.style.opacity = '1'\n })\n button.addEventListener('mouseout', () => {\n button.style.opacity = '0.9'\n })\n\n return button\n }\n\n private triggerLifecycleEvent(name: string) {\n if (name == RundotGameMessageId.PAUSE) {\n this._mockLifecyclesApi.triggerPauseCallbacks()\n } else if (name == RundotGameMessageId.RESUME) {\n this._mockLifecyclesApi.triggerResumeCallbacks()\n } else if (name == RundotGameMessageId.QUIT) {\n this._mockLifecyclesApi.triggerQuitCallbacks()\n } else if (name == RundotGameMessageId.AWAKE) {\n this._mockLifecyclesApi.triggerAwakeCallbacks()\n } else if (name == RundotGameMessageId.SLEEP) {\n this._mockLifecyclesApi.triggerSleepCallbacks()\n }\n }\n\n private setupAdOverlay() {\n const adOverlay = document.createElement('div')\n adOverlay.id = 'rundot-game-ad-overlay'\n adOverlay.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgba(37, 99, 235, 0.9);\n color: white;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: 10500;\n font-family: sans-serif;\n display: none;\n `\n document.body.appendChild(adOverlay)\n return adOverlay\n }\n\n private showActionSheetOverlay(\n items: MockActionSheetItem[],\n options?: MockActionSheetOptions,\n ): Promise<string | number | null> {\n return new Promise((resolve, reject) => {\n const overlay = this._overlay\n // Clear any existing content and event listeners\n overlay.actionSheetOverlay.innerHTML = ''\n overlay.actionSheetOverlay.style.display = 'flex'\n\n // Create action sheet container\n const actionSheet = document.createElement('div')\n actionSheet.className = 'rundot-game-action-sheet'\n actionSheet.style.cssText = `\n background-color: white;\n border-radius: 8px;\n width: 80%;\n max-width: 400px;\n max-height: 80%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n color: black;\n `\n\n // Add title if provided\n if (options?.title) {\n const titleContainer = document.createElement('div')\n titleContainer.style.cssText = `\n padding: 16px;\n border-bottom: 1px solid #eaeaea;\n font-weight: bold;\n font-size: 18px;\n text-align: center;\n color: black;\n `\n titleContainer.innerText = options.title\n actionSheet.appendChild(titleContainer)\n }\n\n // Add message if provided\n if (options?.message) {\n const messageContainer = document.createElement('div')\n messageContainer.style.cssText = `\n padding: 8px 16px;\n color: #666;\n font-size: 14px;\n text-align: center;\n `\n messageContainer.innerText = options.message\n actionSheet.appendChild(messageContainer)\n }\n\n // Add options\n const optionsContainer = document.createElement('div')\n optionsContainer.style.cssText = `\n overflow-y: auto;\n max-height: 300px;\n `\n\n items.forEach((item, index) => {\n const optionItem = document.createElement('div')\n optionItem.style.cssText = `\n padding: 12px 16px;\n border-bottom: 1px solid #eaeaea;\n cursor: pointer;\n display: flex;\n align-items: center;\n transition: background-color 0.2s;\n color: black;\n `\n\n // Add hover effect\n optionItem.addEventListener('mouseover', () => {\n optionItem.style.backgroundColor = '#f5f5f5'\n })\n\n optionItem.addEventListener('mouseout', () => {\n optionItem.style.backgroundColor = 'white'\n })\n\n // Add icon if provided\n if (item.icon) {\n const iconSpan = document.createElement('span')\n iconSpan.style.cssText = `\n margin-right: 12px;\n font-size: 16px;\n `\n iconSpan.innerText = item.icon\n optionItem.appendChild(iconSpan)\n }\n\n // Add label\n const labelSpan = document.createElement('span')\n labelSpan.style.cssText = `\n color: black;\n `\n labelSpan.innerText = item.label\n optionItem.appendChild(labelSpan)\n\n // Handle click\n optionItem.addEventListener('click', () => {\n this.hideActionSheetOverlay()\n const optionId = item.id !== undefined ? item.id : index\n resolve(optionId)\n })\n\n optionsContainer.appendChild(optionItem)\n })\n\n actionSheet.appendChild(optionsContainer)\n\n // Add cancel button only if cancel is not disabled\n if (!options?.disableCancel) {\n const cancelButton = document.createElement('div')\n cancelButton.style.cssText = `\n padding: 14px 16px;\n text-align: center;\n font-weight: bold;\n cursor: pointer;\n color: #3b82f6;\n border-top: 1px solid #eaeaea;\n `\n cancelButton.innerText = options?.cancelButtonText || 'Cancel'\n cancelButton.addEventListener('click', () => {\n this.hideActionSheetOverlay()\n resolve(null)\n })\n\n actionSheet.appendChild(cancelButton)\n }\n\n // Add close button (X) in the top-right corner only if cancel is not disabled\n if (!options?.disableCancel) {\n const closeButton = document.createElement('div')\n closeButton.style.cssText = `\n position: absolute;\n top: 8px;\n right: 8px;\n width: 24px;\n height: 24px;\n border-radius: 12px;\n background-color: rgba(0,0,0,0.1);\n color: #666;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 14px;\n `\n closeButton.innerText = '✕'\n closeButton.addEventListener('click', () => {\n this.hideActionSheetOverlay()\n resolve(null)\n })\n\n actionSheet.appendChild(closeButton)\n overlay.actionSheetOverlay.appendChild(actionSheet)\n }\n })\n }\n\n hideActionSheetOverlay() {\n const overlay = this._overlay\n if (overlay.actionSheetOverlay) {\n overlay.actionSheetOverlay.style.display = 'none'\n }\n }\n}\n","import { MockHost } from './MockHost.ts'\nimport { RemoteHost } from './RemoteHost.ts'\nimport { AnalyticsApi } from './analytics'\nimport { AdsApi } from './ads'\nimport { StorageApi } from './storage'\nimport type { InboundStorageApi } from './storage/RpcInboundStorageApi'\n\n/**\n * Shared storage (M3): writer handle factory + cross-source reader handle\n * factory, scoped by (targetAppId, namespace).\n */\nexport interface SharedStorageHostApi {\n open(input: { appId?: string; namespace: string }): StorageApi\n read(input: { appId?: string; namespace: string }): InboundStorageApi\n}\nimport { Avatar3dApi } from './avatar3d'\nimport { RundotGameAPI } from './rundot-game-api/types.ts'\nimport { NavigationApi } from './navigation'\nimport { NotificationsApi } from './notifications'\nimport { PopupsApi } from './popups'\nimport { ProfileApi } from './profile'\nimport { SystemApi } from './system'\nimport { CdnApi } from './cdn'\nimport { TimeApi } from './time'\nimport { AiApi } from './ai'\nimport { HapticsApi } from './haptics'\nimport { FeaturesApi } from './features'\nimport { LifecycleApi } from './lifecycles'\nimport { SimulationApi } from './simulation'\nimport { RoomsApi } from './rooms'\nimport type { MultiplayerApi } from './mp/client/MultiplayerApi'\nimport { LoggingApi } from './logging'\nimport { IapApi } from './iap'\nimport { LeaderboardApi } from './leaderboard'\nimport { UgcApi } from './ugc'\nimport { PreloaderApi } from './game-preloader'\nimport { SocialApi } from './social'\nimport { ImageGenApi } from './imageGen/ImageGenApi'\nimport { EntitlementApi } from './entitlements'\nimport { ShopApi } from './shop'\nimport { AccessGateApi } from './access-gate'\nimport { VideoApi } from './video'\nimport { AppApi } from './app'\nimport { AttributionApi } from './attribution'\n\n/**\n * Safe area insets representing padding needed to avoid device notches and host UI.\n * Includes toolbar/feedHeader height + device safe areas.\n */\nexport interface SafeArea {\n left: number\n top: number\n right: number\n bottom: number\n}\n\n/**\n * @deprecated Use SafeArea instead. Will be removed in v4.0.0\n */\nexport type HudInsets = SafeArea\n\nexport interface InitializationOptions {\n helpText?: string\n hardDisableMock?: boolean\n mock?: Record<string, any>\n usePreloader?: boolean\n launchParams?: Record<string, string>\n shareParams?: Record<string, string>\n notificationParams?: Record<string, string>\n}\n\nexport interface InitializationContext {\n /**\n * Safe area insets from INIT_SDK response.\n * @deprecated Use RundotGameAPI.system.getSafeArea() instead. Will be removed in v4.0.0\n */\n safeArea?: SafeArea\n initializeAsleep: boolean\n launchParams?: Record<string, string>\n shareParams?: Record<string, string>\n notificationParams?: Record<string, string>\n /** The share document ID when launched from a share link; `undefined` otherwise. */\n shareLinkId?: string\n /** Data passed from a source game via game-to-game navigation (forward). */\n g2gLaunch?: Record<string, any>\n /** Data restored from a source game via game-to-game return navigation. */\n g2gReturn?: Record<string, any>\n}\n\nexport interface Host {\n readonly ads: AdsApi\n readonly analytics: AnalyticsApi\n readonly deviceCache: StorageApi\n readonly appStorage: StorageApi\n readonly ownerStorage: StorageApi\n readonly sharedStorage: SharedStorageHostApi\n readonly avatar3d: Avatar3dApi\n readonly navigation: NavigationApi\n readonly notifications: NotificationsApi\n readonly popups: PopupsApi\n readonly profile: ProfileApi\n readonly system: SystemApi\n readonly cdn: CdnApi\n readonly time: TimeApi\n readonly ai: AiApi\n readonly haptics: HapticsApi\n readonly features: FeaturesApi\n readonly lifecycle: LifecycleApi\n readonly simulation: SimulationApi\n readonly rooms: RoomsApi\n readonly logging: LoggingApi\n readonly leaderboard: LeaderboardApi\n readonly ugc: UgcApi\n readonly preloader: PreloaderApi\n readonly social: SocialApi\n readonly imageGen: ImageGenApi\n readonly entitlements: EntitlementApi\n readonly shop: ShopApi\n readonly accessGate: AccessGateApi\n readonly multiplayer: MultiplayerApi\n readonly video: VideoApi\n readonly app: AppApi\n readonly attribution: AttributionApi\n readonly isInitialized: boolean\n readonly iap: IapApi\n readonly instanceId: string\n\n readonly context?: InitializationContext\n\n initialize(options?: InitializationOptions): Promise<InitializationContext>\n}\n\n/**\n * Create a Host instance based on the runtime environment.\n *\n * SandboxHost is loaded via a separate entry point (`@series-inc/rundot-game-sdk/sandbox`)\n * which registers a factory on `globalThis.__RUNDOT_SANDBOX_HOST_FACTORY__`.\n * The Vite sandbox plugin injects this import automatically, keeping Firebase\n * completely out of the main bundle's dependency graph.\n */\nexport async function createHost(rundotGameApi: RundotGameAPI, isMock: boolean): Promise<Host> {\n if (isMock) {\n const factory = (globalThis as any).__RUNDOT_SANDBOX_HOST_FACTORY__\n if (factory) {\n return factory(rundotGameApi)\n }\n\n return new MockHost(rundotGameApi)\n }\n\n return new RemoteHost(rundotGameApi)\n}\n","import { Host } from '../Host';\nimport { RundotGameAPI } from '../rundot-game-api/types';\n\nexport * from './SocialApi';\nexport * from './RpcSocialApi';\nexport * from './MockSocialApi';\n\nexport function initializeSocial(rundotGameApi: RundotGameAPI, host: Host): void {\n rundotGameApi.social = host.social;\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { s as RpcRequest, t as RpcResponse, u as RpcNotification, A as AnalyticsApi, v as RpcClient, R as RundotGameAPI, H as Host, w as StorageApi, N as NavigationApi, Q as QuitOptions, x as NavigationStackInfo, y as PushAppOptions, z as NavigateToGameOptions, C as NotificationsApi, D as ScheduleLocalNotification, E as ScheduleNotificationOptions, F as PopupsApi, G as ShowToastOptions, I as ShowInterstitialAdOptions, J as ShowRewardedAdOptions, K as ProfileApi, P as Profile, L as DeviceApi, M as DeviceInfo, O as EnvironmentApi, T as EnvironmentInfo, U as SystemApi, V as SafeArea, W as CdnApi, X as FetchFromCdnOptions, Y as AssetUrlResult, Z as TimeApi, _ as ServerTimeData, $ as GetFutureTimeOptions, a0 as AiApi, a1 as AiChatCompletionRequest, a2 as AiChatCompletionData, a3 as HapticsApi, a4 as HapticFeedbackStyle, a5 as FeaturesApi, a6 as Experiment, a7 as LifecycleApi, a8 as SleepCallback, a9 as Subscription, aa as AwakeCallback, ab as PauseCallback, ac as ResumeCallback, ad as QuitCallback, ae as BackButtonCallback, af as SimulationApi, ag as SimulationSlotValidationResult, p as SimulationSubscribeOptions, ah as SimulationBatchOperation, ai as SimulationBatchOperationsResult, aj as SimulationAvailableItem, ak as SimulationPowerPreview, al as SimulationSlotMutationResult, am as SimulationSlotContainer, an as SimulationAssignment, ao as SimulationState, i as RundotGameSimulationConfig, ap as ExecuteRecipeOptions, aq as ExecuteRecipeResponse, ar as CollectRecipeResult, as as ResetStateOptions, at as ResetStateResult, au as GetActiveRunsOptions, n as SimulationRunSummary, av as ExecuteScopedRecipeOptions, aw as ExecuteScopedRecipeResult, ax as GetAvailableRecipesOptions, ay as GetAvailableRecipesResult, az as Recipe, b as RecipeRequirementResult, aA as GetBatchRecipeRequirements, aB as TriggerRecipeChainOptions, aC as RoomDataUpdate, aD as RoomMessageEvent, aE as ProposedMoveEvent, aF as RundotGameTransport, aG as RoomsApi, aH as CreateRoomOptions, h as RundotGameRoom, aI as JoinOrCreateRoomOptions, aJ as JoinOrCreateResult, aK as ListRoomsOptions, aL as UpdateRoomDataOptions, aM as RoomMessageRequest, aN as StartRoomGameOptions, aO as ProposeMoveRequest, aP as ProposeMoveResult, aQ as ValidateMoveVerdict, aR as ValidateMoveResult, aS as RoomSubscriptionOptions, aT as LoggingApi, aU as IapApi, aV as SpendCurrencyOptions, aW as SpendCurrencyResult, aX as SubscriptionTier, aY as RunSubscriptionsResponse, aZ as SubscriptionInterval, a_ as PurchaseSubscriptionResponse, a$ as OpenStoreResult, b0 as LoadEmbeddedAssetsResponse, b1 as SharedAssetsApi, b2 as LeaderboardApi, b3 as ScoreToken, b4 as SubmitScoreParams, b5 as SubmitScoreResult, b6 as GetPagedScoresOptions, b7 as PagedScoresResponse, b8 as PlayerRankOptions, b9 as PlayerRankResult, ba as GetPodiumScoresOptions, bb as PodiumScoresResponse, bc as PreloaderApi, bd as SocialApi, be as ShareMetadata, bf as ShareLinkResult, bg as SocialQRCodeOptions, bh as QRCodeResult, bi as ShareClickData, bj as EntitlementApi, bk as Entitlement, bl as LedgerEntry, bm as ShopApi, bn as StorefrontResponse, bo as StorefrontItem, bp as ShopPurchaseResponse, bq as ShopOrderHistoryResponse, br as PromptLoginResult, bs as AccessTier, bt as AccessGateApi, bu as ImageGenApi, bv as UgcApi, bw as VideoApi, bx as AppApi, by as AdminUgcApi, bz as AdminImageGenApi, bA as AppRole, bB as AdminUgcBrowseParams, bC as AdminUgcBrowseResponse, bD as AdminUgcListReportsParams, bE as AdminUgcListReportsResponse, bF as AdminUgcResolveAction, bG as AdminImageGenBrowseParams, bH as AdminImageGenBrowseResponse, bI as AdminImageGenListReportsParams, bJ as AdminImageGenListReportsResponse, bK as AdminImageGenResolveAction, bL as Avatar3dApi, bM as AssetManifest, bN as Avatar3dConfig, bO as ShowEditorOptions, bP as Avatar3dEdits, bQ as AdsApi, bR as ImageGenParams, bS as ImageGenResult, bT as SharedStorageHostApi, bU as MultiplayerApi, bV as AttributionApi, bW as InitializationContext, bX as InitializationOptions } from './AdsApi-CaRKU_iI.js';
2
- export { bY as AccessDeniedError, bZ as AdminUgcEntry, b_ as AiMessage, b$ as Asset, c0 as Category, c1 as ConnectionState, c2 as GetSubscriptionsForTierRequest, c3 as HudInsets, c4 as ImageGenEntry, c5 as ImageGenModel, c6 as ImageGenReport, c7 as InboundForKeyEntry, c8 as InboundMethodIds, c9 as InboundStorageApi, ca as IsPlayerSubscribedRequest, cb as JoinOrCreateRoomEnvelopeResponse, cc as JoinRoomMatchCriteria, cd as LeaderboardAntiCheatConfig, ce as LeaderboardConfig, cf as LeaderboardDisplaySettings, cg as LeaderboardEntry, ch as LeaderboardModeConfig, ci as LeaderboardPeriodConfig, cj as LeaderboardPeriodType, ck as LoadEmbeddedAssetsRequest, cl as MockAvatarApi, cm as NotificationTriggerInput, cn as OnNotificationCallback, co as OnRequestCallback, cp as OnResponseCallback, cq as PodiumScoresContext, cr as ProposedMovePayload, cs as Protocol, ct as PurchaseSubscriptionRequest, cu as ROOM_GAME_PHASES, cv as RecipeInfo, cw as RoomEnvelopeResponse, cx as RoomEvents, cy as RoomGamePhase, cz as RoomMessageEventType, cA as RoomMessagePayload, cB as RoomsEnvelopeResponse, cC as RpcInboundStorageApi, cD as RpcSharedAssetsApi, cE as RpcTransport, cF as RunSubscription, cG as RundotGameRoomCustomMetadata, cH as RundotGameRoomPayload, cI as RundotGameRoomRules, cJ as RundotGameRoomRulesGameState, cK as ServerPlayer, cL as ServerRoom, cM as ShopOrder, cN as SimulationBatchOperationAssign, cO as SimulationBatchOperationRemove, cP as SimulationBatchOperationResult, cQ as SimulationPersonalState, cR as SimulationRoomActiveRecipe, cS as SimulationRoomState, cT as StorefrontCollection, cU as StorefrontCollectionItem, cV as SubPath, cW as TimeIntervalTriggerInput, cX as UgcReport, cY as createHost, cZ as resolveCollectionItemPrice } from './AdsApi-CaRKU_iI.js';
1
+ import { s as RpcRequest, t as RpcResponse, u as RpcNotification, A as AnalyticsApi, v as RpcClient, R as RundotGameAPI, H as Host, w as StorageApi, N as NavigationApi, Q as QuitOptions, x as NavigationStackInfo, y as PushAppOptions, z as NavigateToGameOptions, C as NotificationsApi, D as ScheduleLocalNotification, E as ScheduleNotificationOptions, F as PopupsApi, G as ShowToastOptions, I as ShowInterstitialAdOptions, J as ShowRewardedAdOptions, K as ProfileApi, P as Profile, L as DeviceApi, M as DeviceInfo, O as EnvironmentApi, T as EnvironmentInfo, U as SystemApi, V as SafeArea, W as CdnApi, X as FetchFromCdnOptions, Y as AssetUrlResult, Z as TimeApi, _ as ServerTimeData, $ as GetFutureTimeOptions, a0 as AiApi, a1 as AiChatCompletionRequest, a2 as AiChatCompletionData, a3 as HapticsApi, a4 as HapticFeedbackStyle, a5 as FeaturesApi, a6 as Experiment, a7 as LifecycleApi, a8 as SleepCallback, a9 as Subscription, aa as AwakeCallback, ab as PauseCallback, ac as ResumeCallback, ad as QuitCallback, ae as BackButtonCallback, af as SimulationApi, ag as SimulationSlotValidationResult, p as SimulationSubscribeOptions, ah as SimulationBatchOperation, ai as SimulationBatchOperationsResult, aj as SimulationAvailableItem, ak as SimulationPowerPreview, al as SimulationSlotMutationResult, am as SimulationSlotContainer, an as SimulationAssignment, ao as SimulationState, i as RundotGameSimulationConfig, ap as ExecuteRecipeOptions, aq as ExecuteRecipeResponse, ar as CollectRecipeResult, as as ResetStateOptions, at as ResetStateResult, au as GetActiveRunsOptions, n as SimulationRunSummary, av as ExecuteScopedRecipeOptions, aw as ExecuteScopedRecipeResult, ax as GetAvailableRecipesOptions, ay as GetAvailableRecipesResult, az as Recipe, b as RecipeRequirementResult, aA as GetBatchRecipeRequirements, aB as TriggerRecipeChainOptions, aC as RoomDataUpdate, aD as RoomMessageEvent, aE as ProposedMoveEvent, aF as RundotGameTransport, aG as RoomsApi, aH as CreateRoomOptions, h as RundotGameRoom, aI as JoinOrCreateRoomOptions, aJ as JoinOrCreateResult, aK as ListRoomsOptions, aL as UpdateRoomDataOptions, aM as RoomMessageRequest, aN as StartRoomGameOptions, aO as ProposeMoveRequest, aP as ProposeMoveResult, aQ as ValidateMoveVerdict, aR as ValidateMoveResult, aS as RoomSubscriptionOptions, aT as LoggingApi, aU as IapApi, aV as SpendCurrencyOptions, aW as SpendCurrencyResult, aX as SubscriptionTier, aY as RunSubscriptionsResponse, aZ as SubscriptionInterval, a_ as PurchaseSubscriptionResponse, a$ as OpenStoreResult, b0 as LoadEmbeddedAssetsResponse, b1 as SharedAssetsApi, b2 as LeaderboardApi, b3 as ScoreToken, b4 as SubmitScoreParams, b5 as SubmitScoreResult, b6 as GetPagedScoresOptions, b7 as PagedScoresResponse, b8 as PlayerRankOptions, b9 as PlayerRankResult, ba as GetPodiumScoresOptions, bb as PodiumScoresResponse, bc as PreloaderApi, bd as SocialApi, be as ShareMetadata, bf as ShareLinkResult, bg as SocialQRCodeOptions, bh as QRCodeResult, bi as ShareClickData, bj as EntitlementApi, bk as Entitlement, bl as LedgerEntry, bm as ShopApi, bn as StorefrontResponse, bo as StorefrontItem, bp as ShopPurchaseResponse, bq as ShopOrderHistoryResponse, br as PromptLoginResult, bs as AccessTier, bt as AccessGateApi, bu as ImageGenApi, bv as UgcApi, bw as VideoApi, bx as AppApi, by as AdminUgcApi, bz as AdminImageGenApi, bA as AppRole, bB as AdminUgcBrowseParams, bC as AdminUgcBrowseResponse, bD as AdminUgcListReportsParams, bE as AdminUgcListReportsResponse, bF as AdminUgcResolveAction, bG as AdminImageGenBrowseParams, bH as AdminImageGenBrowseResponse, bI as AdminImageGenListReportsParams, bJ as AdminImageGenListReportsResponse, bK as AdminImageGenResolveAction, bL as Avatar3dApi, bM as AssetManifest, bN as Avatar3dConfig, bO as ShowEditorOptions, bP as Avatar3dEdits, bQ as AdsApi, bR as ImageGenParams, bS as ImageGenResult, bT as SharedStorageHostApi, bU as MultiplayerApi, bV as AttributionApi, bW as InitializationContext, bX as InitializationOptions } from './AdsApi-Cvh5AyFY.js';
2
+ export { bY as AccessDeniedError, bZ as AdminUgcEntry, b_ as AiContentBlock, b$ as AiImageContent, c0 as AiImageUrlContent, c1 as AiMessage, c2 as AiTextContent, c3 as Asset, c4 as Category, c5 as ConnectionState, c6 as GetSubscriptionsForTierRequest, c7 as HudInsets, c8 as ImageGenEntry, c9 as ImageGenModel, ca as ImageGenReport, cb as InboundForKeyEntry, cc as InboundMethodIds, cd as InboundStorageApi, ce as IsPlayerSubscribedRequest, cf as JoinOrCreateRoomEnvelopeResponse, cg as JoinRoomMatchCriteria, ch as LeaderboardAntiCheatConfig, ci as LeaderboardConfig, cj as LeaderboardDisplaySettings, ck as LeaderboardEntry, cl as LeaderboardModeConfig, cm as LeaderboardPeriodConfig, cn as LeaderboardPeriodType, co as LoadEmbeddedAssetsRequest, cp as MockAvatarApi, cq as NotificationTriggerInput, cr as OnNotificationCallback, cs as OnRequestCallback, ct as OnResponseCallback, cu as PodiumScoresContext, cv as ProposedMovePayload, cw as Protocol, cx as PurchaseSubscriptionRequest, cy as ROOM_GAME_PHASES, cz as RecipeInfo, cA as RoomEnvelopeResponse, cB as RoomEvents, cC as RoomGamePhase, cD as RoomMessageEventType, cE as RoomMessagePayload, cF as RoomsEnvelopeResponse, cG as RpcInboundStorageApi, cH as RpcSharedAssetsApi, cI as RpcTransport, cJ as RunSubscription, cK as RundotGameRoomCustomMetadata, cL as RundotGameRoomPayload, cM as RundotGameRoomRules, cN as RundotGameRoomRulesGameState, cO as ServerPlayer, cP as ServerRoom, cQ as ShopOrder, cR as SimulationBatchOperationAssign, cS as SimulationBatchOperationRemove, cT as SimulationBatchOperationResult, cU as SimulationPersonalState, cV as SimulationRoomActiveRecipe, cW as SimulationRoomState, cX as StorefrontCollection, cY as StorefrontCollectionItem, cZ as SubPath, c_ as TimeIntervalTriggerInput, c$ as UgcReport, d0 as createHost, d1 as resolveCollectionItemPrice } from './AdsApi-Cvh5AyFY.js';
3
3
  export { WEBVIEW_LIBRARY_SHIM_SOURCE, getWebviewLibraryShimSource } from './webview/index.js';
4
4
 
5
5
  type RpcMessage = RpcRequest | RpcResponse | RpcNotification;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { HASH_ALGORITHM_NODE, HASH_ALGORITHM_WEB_CRYPTO, MockAiApi, MockAppApi, MockImageGenApi, MockLeaderboardApi, MockSocialApi, RemoteHost, RpcAdminImageGenApi, RpcAdminUgcApi, RpcAiApi, RpcAppApi, RpcClient, RpcImageGenApi, RpcLeaderboardApi, RpcSimulationApi, RpcSocialApi, SDK_VERSION, computeScoreHash, createHost, initializeAi, initializeApp, initializeImageGen, initializeLeaderboard, initializeSimulation, initializeSocial } from './chunk-BQPNVJYG.js';
1
+ export { HASH_ALGORITHM_NODE, HASH_ALGORITHM_WEB_CRYPTO, MockAiApi, MockAppApi, MockImageGenApi, MockLeaderboardApi, MockSocialApi, RemoteHost, RpcAdminImageGenApi, RpcAdminUgcApi, RpcAiApi, RpcAppApi, RpcClient, RpcImageGenApi, RpcLeaderboardApi, RpcSimulationApi, RpcSocialApi, SDK_VERSION, computeScoreHash, createHost, initializeAi, initializeApp, initializeImageGen, initializeLeaderboard, initializeSimulation, initializeSocial } from './chunk-5JCPCAB6.js';
2
2
  export { AccessDeniedError, BaseCdnApi, DEFAULT_SHARED_LIB_CDN_BASE, DualEmitStorageApi, EMBEDDED_LIBRARIES, EMBEDDED_LIBRARY_BY_KEY, FILE_EXTENSION_PATTERN, HapticFeedbackStyle, HostCdnApi, HostDeviceApi, HostEnvironmentApi, HostProfileApi, HostSystemApi, HostTimeApi, MIN_CDN_PATH_SEGMENTS, MODULE_TO_LIBRARY_SPECIFIERS, MockAccessGateApi, MockAdminImageGenApi, MockAdminUgcApi, MockAdsApi, MockAnalyticsApi, MockAvatarApi, MockCdnApi, MockDebug, MockDeviceApi, MockEntitlementApi, MockEnvironmentApi, MockFeaturesApi, MockHapticsApi, MockIapApi, MockLifecycleApi, MockLoggingApi, MockNavigationApi, MockNotificationsApi, MockPopupsApi, MockPreloaderApi, MockProfileApi, MockSharedAssetsApi, MockShopApi, MockStorageApi, MockSystemApi, MockTimeApi, MockVideoApi, ROOM_GAME_PHASES, RpcAccessGateApi, RpcAdsApi, RpcAnalyticsApi, RpcAvatarApi, RpcEntitlementApi, RpcFeaturesApi, RpcHapticsApi, RpcIapApi, RpcInboundStorageApi, RpcLifecycleApi, RpcLoggingApi, RpcNavigationApi, RpcNotificationsApi, RpcPopupsApi, RpcPreloaderApi, RpcRoomsApi, RpcSharedAssetsApi, RpcShopApi, RpcStorageApi, RpcVideoApi, RundotGameMessageId, RundotGameRoom, SandboxAppApi, SandboxProfileApi, applyAccessGates, base64ToArrayBuffer, base64ToUtf8, createAccessGatedApi, createMockStorageApi, getLibraryDefinition, hasHostedUrlStructure, initializeAccessGate, initializeAds, initializeAnalytics, initializeAvatar3d, initializeCdn, initializeEntitlements, initializeFeaturesApi, initializeHaptics, initializeIap, initializeLifecycleApi, initializeLocalNotifications, initializeLoggingApi, initializePopups, initializePreloader, initializeProfile, initializeRoomsApi, initializeShop, initializeStackNavigation, initializeStorage, initializeSystem, initializeTime, initializeVideo, isPacificDaylightTime, mockLog, parseCdnPathSegments, resolveCollectionItemPrice, setStoredAppRole, setupRoomNotifications } from './chunk-XS3XSIG7.js';
3
3
  export { WEBVIEW_LIBRARY_SHIM_SOURCE, getWebviewLibraryShimSource } from './chunk-BWJ34LKD.js';
4
4
  import './chunk-3GKY3LY5.js';
@@ -1,5 +1,5 @@
1
- import { R as RundotGameAPI$1 } from '../AdsApi-CaRKU_iI.js';
2
- export { B as BatchRecipeRequirementsResult, P as Profile, a as RecipeRequirementQuery, b as RecipeRequirementResult, c as RundotGameAvailableRecipe, d as RundotGameCollectRecipeResult, e as RundotGameExecuteRecipeOptions, f as RundotGameExecuteRecipeResult, g as RundotGameExecuteScopedRecipeOptions, h as RundotGameRoom, i as RundotGameSimulationConfig, j as RundotGameSimulationEffect, k as RundotGameSimulationRecipe, l as RundotGameSimulationStateResponse, S as SimulationActiveRunsUpdate, m as SimulationEntityUpdate, n as SimulationRunSummary, o as SimulationSnapshotUpdate, p as SimulationSubscribeOptions, q as SimulationUpdateData, r as SimulationUpdateType } from '../AdsApi-CaRKU_iI.js';
1
+ import { R as RundotGameAPI$1 } from '../AdsApi-Cvh5AyFY.js';
2
+ export { B as BatchRecipeRequirementsResult, P as Profile, a as RecipeRequirementQuery, b as RecipeRequirementResult, c as RundotGameAvailableRecipe, d as RundotGameCollectRecipeResult, e as RundotGameExecuteRecipeOptions, f as RundotGameExecuteRecipeResult, g as RundotGameExecuteScopedRecipeOptions, h as RundotGameRoom, i as RundotGameSimulationConfig, j as RundotGameSimulationEffect, k as RundotGameSimulationRecipe, l as RundotGameSimulationStateResponse, S as SimulationActiveRunsUpdate, m as SimulationEntityUpdate, n as SimulationRunSummary, o as SimulationSnapshotUpdate, p as SimulationSubscribeOptions, q as SimulationUpdateData, r as SimulationUpdateType } from '../AdsApi-Cvh5AyFY.js';
3
3
 
4
4
  /**
5
5
  * TypeScript definitions for rundot-game-api
@@ -1,4 +1,4 @@
1
- import { SDK_VERSION, createHost, initializeLeaderboard, initializeUgc, initializeAi, initializeImageGen, initializeSimulation, initializeSocial, initializeApp, initializeAttribution } from '../chunk-BQPNVJYG.js';
1
+ import { SDK_VERSION, createHost, initializeLeaderboard, initializeUgc, initializeAi, initializeImageGen, initializeSimulation, initializeSocial, initializeApp, initializeAttribution } from '../chunk-5JCPCAB6.js';
2
2
  import { initializeMultiplayerApi } from '../chunk-KORBGNZX.js';
3
3
  import { hasHostedUrlStructure, initializeStorage, initializeRoomsApi, initializeAds, initializePopups, initializeAnalytics, initializeIap, initializeLocalNotifications, initializePreloader, initializeTime, initializeLifecycleApi, initializeHaptics, initializeCdn, initializeFeaturesApi, initializeLoggingApi, initializeProfile, initializeSystem, initializeAvatar3d, initializeStackNavigation, initializeEntitlements, initializeShop, initializeAccessGate, initializeVideo } from '../chunk-XS3XSIG7.js';
4
4
  import { createProxiedObject, createProxiedMethod } from '../chunk-3GKY3LY5.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@series-inc/rundot-game-sdk",
3
- "version": "5.14.3-beta.migration-test",
3
+ "version": "5.14.3-beta.migration-test-2",
4
4
  "description": "RUN.game SDK",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -57,6 +57,7 @@
57
57
  "generate:embedded-three-exports": "node scripts/generate-embedded-three-exports.mjs",
58
58
  "pack": "npm pack",
59
59
  "test": "jest",
60
+ "build:test-app": "npm run build --prefix tests/test-app",
60
61
  "dev": "tsup --watch",
61
62
  "generate:embedded-react-exports": "node scripts/generate-embedded-react-exports.mjs",
62
63
  "generate:embedded-inkjs-exports": "node scripts/generate-embedded-inkjs-exports.mjs",