@indiegems/gem-web-sdk 10.1.0 → 10.2.0

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.
@@ -1,2 +1,2 @@
1
- function i(r){let e=String(r);if(!/^[A-Za-z0-9_.-]{1,128}$/.test(e)||e==="."||e==="..")throw new TypeError(`${JSON.stringify(e)} is not a usable path segment \u2014 it is interpolated into a URL`);return encodeURIComponent(e)}async function u(r,e,n){let t=`/v1/inventory/transfers/${i(e)}/accept`;return r.client.post(t,void 0,n?.signal)}async function g(r,e,n,t,s,a){let o=`/v1/inventory/${i(e)}/${i(n)}/progressions/${i(t)}/add`;return r.client.post(o,s,a?.signal)}async function p(r,e,n,t){let s=`/v1/voice/sessions/${i(e)}/admin`;return r.client.post(s,n,t?.signal)}async function c(r,e,n){let t=`/v1/inventory/transfers/${i(e)}/cancel`;return r.client.post(t,void 0,n?.signal)}async function m(r,e,n,t,s,a){let o=`/v1/inventory/${i(e)}/${i(n)}/progressions/${i(t)}/claim`;return r.client.post(o,s,a?.signal)}async function d(r,e,n){let t=`/v1/games/${i(r.gameId())}/game-rooms/${i(e)}`;return r.client.delete(t,n?.signal)}async function _(r,e,n,t,s){let a=`/v1/inventory/${i(e)}/${i(n)}/orders/batch`;return r.client.post(a,t,s?.signal,{...s?.ifMatch===void 0?{}:{ifMatch:s.ifMatch}})}async function y(r,e,n,t,s){let a=`/v1/inventory/${i(e)}/${i(n)}/orders`;return r.client.post(a,t,s?.signal,{...s?.ifMatch===void 0?{}:{ifMatch:s.ifMatch}})}async function b(r,e,n){return r.client.post("/v1/voice/sessions",e,n?.signal)}async function f(r,e,n,t,s){let a=`/v1/settings/${i(e)}/${i(n)}/${i(t)}`;return r.client.delete(a,s?.signal)}async function R(r,e,n,t,s){let a=`/v1/saves/${i(e)}/${i(n)}/${i(t)}`;return r.client.delete(a,s?.signal)}async function h(r,e,n){let t=`/v1/voice/sessions/${i(e)}`;return r.client.delete(t,n?.signal)}async function v(r,e,n,t){let s=`/v1/showcase/players/${i(e)}/${i(n)}`;return r.client.delete(s,t?.signal)}async function S(r,e,n,t,s){let a=`/v1/inventory/${i(e)}/${i(n)}/recipes/execute`;return r.client.post(a,t,s?.signal,{...s?.ifMatch===void 0?{}:{ifMatch:s.ifMatch}})}async function x(r,e,n,t,s,a){let o=`/v1/saves/${i(e)}/${i(n)}/${i(t)}/finalize`;return r.client.post(o,s,a?.signal)}async function P(r,e,n){let t=`/v1/games/${i(r.gameId())}/config/channels/${i(e)}`;return r.client.getWithEtag(t,{...n?.signal===void 0?{}:{signal:n.signal},...n?.ifNoneMatch===void 0?{}:{ifNoneMatch:n.ifNoneMatch}})}async function A(r,e,n){let t=`/v1/inventory/loot-tables/${i(e)}/drop-rates`;return r.client.get(t,n?.signal)}async function w(r,e,n,t,s){let a=`/v1/inventory/${i(e)}/${i(n)}/currencies/${i(t)}`;return r.client.get(a,s?.signal)}async function k(r,e,n,t,s){let a=`/v1/settings/${i(e)}/${i(n)}/${i(t)}`;return r.client.getWithEtag(a,{...s?.signal===void 0?{}:{signal:s.signal},...s?.ifNoneMatch===void 0?{}:{ifNoneMatch:s.ifNoneMatch}})}async function $(r,e,n,t){let s=new URLSearchParams;t?.include_buckets!==void 0&&s.set("include_buckets",String(t?.include_buckets)),t?.include_custom_data!==void 0&&s.set("include_custom_data",String(t?.include_custom_data)),t?.currency_limit!==void 0&&s.set("currency_limit",String(t?.currency_limit)),t?.currency_cursor!==void 0&&s.set("currency_cursor",String(t?.currency_cursor)),t?.item_limit!==void 0&&s.set("item_limit",String(t?.item_limit)),t?.item_cursor!==void 0&&s.set("item_cursor",String(t?.item_cursor)),t?.progression_limit!==void 0&&s.set("progression_limit",String(t?.progression_limit)),t?.progression_cursor!==void 0&&s.set("progression_cursor",String(t?.progression_cursor));let a=s.toString(),o=`/v1/inventory/${i(e)}/${i(n)}`+(a?`?${a}`:"");return r.client.get(o,t?.signal)}async function G(r,e,n,t,s){let a=`/v1/inventory/${i(e)}/${i(n)}/items/${i(t)}`;return r.client.get(a,s?.signal)}async function O(r,e,n,t,s){let a=new URLSearchParams;s?.bucket_1!==void 0&&a.set("bucket_1",String(s?.bucket_1)),s?.bucket_2!==void 0&&a.set("bucket_2",String(s?.bucket_2)),s?.limit!==void 0&&a.set("limit",String(s?.limit)),s?.periods_back!==void 0&&a.set("periods_back",String(s?.periods_back)),s?.period!==void 0&&a.set("period",String(s?.period)),s?.player_id!==void 0&&a.set("player_id",String(s?.player_id));let o=a.toString(),l=`/v1/leaderboards/${i(e)}/${i(n)}/${i(t)}`+(o?`?${o}`:"");return r.client.get(l,s?.signal)}async function I(r,e,n,t,s){let a=`/v1/inventory/${i(e)}/${i(n)}/orders/${i(t)}`;return r.client.get(a,s?.signal)}async function q(r,e,n,t,s){let a=`/v1/inventory/${i(e)}/${i(n)}/progressions/${i(t)}`;return r.client.get(a,s?.signal)}async function C(r,e,n,t,s,a){let o=`/v1/inventory/${i(e)}/${i(n)}/catalogs/${i(t)}/recipes/${i(s)}/availability`;return r.client.get(o,a?.signal)}async function E(r,e,n,t){let s=new URLSearchParams;t?.limit!==void 0&&s.set("limit",String(t?.limit));let a=s.toString(),o=`/v1/inventory/${i(e)}/${i(n)}/recipe-usage`+(a?`?${a}`:"");return r.client.get(o,t?.signal)}async function L(r,e,n,t,s){let a=`/v1/saves/${i(e)}/${i(n)}/${i(t)}`;return r.client.getWithEtag(a,{...s?.signal===void 0?{}:{signal:s.signal},...s?.ifNoneMatch===void 0?{}:{ifNoneMatch:s.ifNoneMatch}})}async function T(r,e,n){let t=`/v1/events/${i(e)}`;return r.client.get(t,n?.signal)}async function B(r,e,n){let t=`/v2/games/${i(r.gameId())}/game-rooms/${i(e)}`;return r.client.getWithEtag(t,{...n?.signal===void 0?{}:{signal:n.signal},...n?.ifNoneMatch===void 0?{}:{ifNoneMatch:n.ifNoneMatch}})}async function M(r,e,n){let t=new URLSearchParams;n?.bucket_1!==void 0&&t.set("bucket_1",String(n?.bucket_1)),n?.bucket_2!==void 0&&t.set("bucket_2",String(n?.bucket_2)),n?.periods_back!==void 0&&t.set("periods_back",String(n?.periods_back)),n?.period!==void 0&&t.set("period",String(n?.period)),n?.player_id!==void 0&&t.set("player_id",String(n?.player_id));let s=t.toString(),a=`/v1/leaderboards/${i(e)}`+(s?`?${s}`:"");return r.client.get(a,n?.signal)}async function U(r,e,n){let t=`/v1/profiles/players/${i(e)}`;return r.client.get(t,n?.signal)}async function V(r,e){let n=new URLSearchParams;e?.config_version!==void 0&&n.set("config_version",String(e?.config_version));let t=n.toString(),s="/v1/inventory/platform-funded-game-inventory-purchase-catalog"+(t?`?${t}`:"");return r.client.get(s,e?.signal)}async function N(r,e,n){let t=`/v1/game-room-templates/${i(e)}`;return r.client.get(t,n?.signal)}async function D(r,e,n){let t=`/v1/games/${i(r.gameId())}/game-rooms/${i(e)}/room-args`;return r.client.get(t,n?.signal)}async function F(r,e,n,t){let s=`/v1/showcase/players/${i(e)}/${i(n)}`;return r.client.get(s,t?.signal)}async function j(r,e,n){let t=`/v1/inventory/transfers/${i(e)}`;return r.client.get(t,n?.signal)}async function z(r,e,n){let t=`/v1/games/${i(r.gameId())}/analytics/events`;return r.client.post(t,e,n?.signal,{replaySafe:true})}async function W(r,e,n){return r.client.post("/v1/inventory/transfers",e,n?.signal)}async function K(r,e,n){return r.client.postBytes("/v1/functions/invoke",e,n?.signal)}async function H(r,e,n,t){let s=`/v1/games/${i(r.gameId())}/game-rooms/${i(e)}/kick/${i(n)}`;return r.client.post(s,void 0,t?.signal)}async function J(r,e){let n=new URLSearchParams;e?.periods_back!==void 0&&n.set("periods_back",String(e?.periods_back)),e?.player_id!==void 0&&n.set("player_id",String(e?.player_id));let t=n.toString(),s="/v1/challenges"+(t?`?${t}`:"");return r.client.get(s,e?.signal)}async function Z(r,e,n,t){let s=`/v1/settings/${i(e)}/${i(n)}`;return r.client.get(s,t?.signal)}async function Q(r,e,n,t){let s=new URLSearchParams;t?.limit!==void 0&&s.set("limit",String(t?.limit)),t?.cursor!==void 0&&s.set("cursor",String(t?.cursor));let a=s.toString(),o=`/v1/inventory/${i(e)}/${i(n)}/orders`+(a?`?${a}`:"");return r.client.get(o,t?.signal)}async function X(r,e,n,t){let s=`/v1/inventory/${i(e)}/${i(n)}/progressions`;return r.client.get(s,t?.signal)}async function Y(r,e,n,t){let s=new URLSearchParams;t?.limit!==void 0&&s.set("limit",String(t?.limit)),t?.cursor!==void 0&&s.set("cursor",String(t?.cursor));let a=s.toString(),o=`/v1/saves/${i(e)}/${i(n)}`+(a?`?${a}`:"");return r.client.get(o,t?.signal)}async function ee(r,e){let n=new URLSearchParams;e?.include_inactive!==void 0&&n.set("include_inactive",String(e?.include_inactive)),e?.limit!==void 0&&n.set("limit",String(e?.limit)),e?.offset!==void 0&&n.set("offset",String(e?.offset));let t=n.toString(),s="/v1/events"+(t?`?${t}`:"");return r.client.get(s,e?.signal)}async function ne(r,e){let n=new URLSearchParams;e?.status!==void 0&&n.set("status",String(e?.status)),e?.game_channel!==void 0&&n.set("game_channel",String(e?.game_channel)),e?.game_room_type!==void 0&&n.set("game_room_type",String(e?.game_room_type)),e?.template_id!==void 0&&n.set("template_id",String(e?.template_id)),e?.template_slug!==void 0&&n.set("template_slug",String(e?.template_slug)),e?.limit!==void 0&&n.set("limit",String(e?.limit)),e?.cursor!==void 0&&n.set("cursor",String(e?.cursor));let t=n.toString(),s=`/v1/games/${i(r.gameId())}/game-rooms`+(t?`?${t}`:"");return r.client.get(s,e?.signal)}async function te(r,e){return r.client.get("/v1/game-room-templates",e?.signal)}async function re(r,e){let n=new URLSearchParams;e.entity_type!==void 0&&n.set("entity_type",String(e.entity_type)),e.entity_id!==void 0&&n.set("entity_id",String(e.entity_id)),e?.direction!==void 0&&n.set("direction",String(e?.direction)),e?.status!==void 0&&n.set("status",String(e?.status)),e?.cursor!==void 0&&n.set("cursor",String(e?.cursor)),e?.limit!==void 0&&n.set("limit",String(e?.limit));let t=n.toString(),s="/v1/inventory/transfers"+(t?`?${t}`:"");return r.client.get(s,e?.signal)}async function se(r,e,n,t,s,a){let o=`/v1/inventory/${i(e)}/${i(n)}/progressions/${i(t)}/max`;return r.client.post(o,s,a?.signal)}async function ie(r,e,n,t,s,a){let o=`/v1/settings/${i(e)}/${i(n)}/${i(t)}`;return r.client.put(o,s,a?.signal,{...a?.ifMatch===void 0?{}:{ifMatch:a.ifMatch}})}async function ae(r,e,n,t){let s=`/v1/games/${i(r.gameId())}/game-rooms/${i(e)}/room-args`;return r.client.put(s,n,t?.signal)}async function oe(r,e,n,t,s){let a=`/v1/showcase/players/${i(e)}/${i(n)}`;return r.client.put(a,t,s?.signal)}async function le(r,e,n){let t=`/v1/inventory/transfers/${i(e)}/reject`;return r.client.post(t,void 0,n?.signal)}async function ue(r,e,n,t,s,a){let o=`/v1/saves/${i(e)}/${i(n)}/${i(t)}/upload-url`;return r.client.post(o,s,a?.signal,{replaySafe:true})}async function ge(r,e,n,t,s,a){let o=`/v1/inventory/${i(e)}/${i(n)}/progressions/${i(t)}/reset`;return r.client.post(o,s,a?.signal)}async function pe(r,e,n,t,s){let a=`/v1/inventory/${i(e)}/${i(n)}/orders/simulate`;return r.client.post(a,t,s?.signal)}async function ce(r,e,n,t){let s=`/v2/games/${i(r.gameId())}/game-rooms/${i(e)}/transfer/${i(n)}`;return r.client.post(s,void 0,t?.signal)}async function me(r,e,n,t){let s=`/v2/games/${i(r.gameId())}/game-rooms/${i(e)}`;return r.client.patch(s,n,t?.signal,{...t?.ifMatch===void 0?{}:{ifMatch:t.ifMatch}})}export{u as acceptTransfer,g as addEntityProgression,p as adminAction,c as cancelInventoryTransfer,m as claimEntityProgressionRewards,d as closeGameRoom,_ as createEntityBatchOrder,y as createEntityOrder,b as createSession,f as deleteEntityGameSetting,R as deleteEntitySave,h as deleteSession,v as deleteShowcaseValue,S as executeEntityRecipe,x as finalizeSaveUpload,P as getChannelAssignment,A as getDropRates,w as getEntityCurrency,k as getEntityGameSetting,$ as getEntityInventory,G as getEntityInventoryItem,O as getEntityLeaderboard,I as getEntityOrder,q as getEntityProgression,C as getEntityRecipeAvailability,E as getEntityRecipeUsage,L as getEntitySave,T as getEvent,B as getGameRoomV2,M as getLeaderboard,U as getPlayerGameProfile,V as getPurchaseCatalog,N as getResolvedTemplate,D as getRoomArgs,F as getShowcaseValue,j as getTransferDetails,z as ingestAnalyticsEvents,W as initiateInventoryTransfer,K as invokeFunction,H as kickPlayer,J as listChallenges,Z as listEntityGameSettings,Q as listEntityOrders,X as listEntityProgressions,Y as listEntitySaves,ee as listEvents,ne as listGameRooms,te as listResolvedTemplates,re as listTransfers,se as maxEntityProgression,ie as putEntityGameSetting,ae as putRoomArgs,oe as putShowcaseValue,le as rejectTransfer,ue as requestSaveUploadUrl,ge as resetEntityProgression,pe as simulateEntityOrder,ce as transferHostV2,me as updateGameRoomV2};//# sourceMappingURL=gem-web-sdk.server-api.js.map
1
+ function i(r){let e=String(r);if(!/^[A-Za-z0-9_.-]{1,128}$/.test(e)||e==="."||e==="..")throw new TypeError(`${JSON.stringify(e)} is not a usable path segment \u2014 it is interpolated into a URL`);return encodeURIComponent(e)}async function u(r,e,n){let t=`/v1/inventory/transfers/${i(e)}/accept`;return r.client.post(t,void 0,n?.signal)}async function g(r,e,n,t,s,a){let o=`/v1/inventory/${i(e)}/${i(n)}/progressions/${i(t)}/add`;return r.client.post(o,s,a?.signal)}async function p(r,e,n,t){let s=`/v1/voice/sessions/${i(e)}/admin`;return r.client.post(s,n,t?.signal)}async function c(r,e,n){let t=`/v1/inventory/transfers/${i(e)}/cancel`;return r.client.post(t,void 0,n?.signal)}async function m(r,e,n,t,s,a){let o=`/v1/inventory/${i(e)}/${i(n)}/progressions/${i(t)}/claim`;return r.client.post(o,s,a?.signal)}async function d(r,e,n){let t=`/v1/games/${i(r.gameId())}/game-rooms/${i(e)}`;return r.client.delete(t,n?.signal)}async function _(r,e,n,t,s){let a=`/v1/inventory/${i(e)}/${i(n)}/orders/batch`;return r.client.post(a,t,s?.signal,{...s?.ifMatch===void 0?{}:{ifMatch:s.ifMatch}})}async function y(r,e,n,t,s){let a=`/v1/inventory/${i(e)}/${i(n)}/orders`;return r.client.post(a,t,s?.signal,{...s?.ifMatch===void 0?{}:{ifMatch:s.ifMatch}})}async function b(r,e,n){return r.client.post("/v1/voice/sessions",e,n?.signal)}async function f(r,e,n,t,s){let a=`/v1/settings/${i(e)}/${i(n)}/${i(t)}`;return r.client.delete(a,s?.signal)}async function R(r,e,n,t,s){let a=`/v1/saves/${i(e)}/${i(n)}/${i(t)}`;return r.client.delete(a,s?.signal)}async function h(r,e,n){let t=`/v1/voice/sessions/${i(e)}`;return r.client.delete(t,n?.signal)}async function v(r,e,n,t){let s=`/v1/showcase/players/${i(e)}/${i(n)}`;return r.client.delete(s,t?.signal)}async function S(r,e,n,t,s){let a=`/v1/inventory/${i(e)}/${i(n)}/recipes/execute`;return r.client.post(a,t,s?.signal,{...s?.ifMatch===void 0?{}:{ifMatch:s.ifMatch}})}async function x(r,e,n,t,s,a){let o=`/v1/saves/${i(e)}/${i(n)}/${i(t)}/finalize`;return r.client.post(o,s,a?.signal)}async function P(r,e,n){let t=`/v1/games/${i(r.gameId())}/config/channels/${i(e)}`;return r.client.getWithEtag(t,{...n?.signal===void 0?{}:{signal:n.signal},...n?.ifNoneMatch===void 0?{}:{ifNoneMatch:n.ifNoneMatch}})}async function A(r,e,n){let t=`/v1/inventory/loot-tables/${i(e)}/drop-rates`;return r.client.get(t,n?.signal)}async function k(r,e,n,t,s){let a=`/v1/inventory/${i(e)}/${i(n)}/currencies/${i(t)}`;return r.client.get(a,s?.signal)}async function w(r,e,n,t,s){let a=`/v1/settings/${i(e)}/${i(n)}/${i(t)}`;return r.client.getWithEtag(a,{...s?.signal===void 0?{}:{signal:s.signal},...s?.ifNoneMatch===void 0?{}:{ifNoneMatch:s.ifNoneMatch}})}async function $(r,e,n,t){let s=new URLSearchParams;t?.include_buckets!==void 0&&s.set("include_buckets",String(t?.include_buckets)),t?.include_custom_data!==void 0&&s.set("include_custom_data",String(t?.include_custom_data)),t?.currency_limit!==void 0&&s.set("currency_limit",String(t?.currency_limit)),t?.currency_cursor!==void 0&&s.set("currency_cursor",String(t?.currency_cursor)),t?.item_limit!==void 0&&s.set("item_limit",String(t?.item_limit)),t?.item_cursor!==void 0&&s.set("item_cursor",String(t?.item_cursor)),t?.progression_limit!==void 0&&s.set("progression_limit",String(t?.progression_limit)),t?.progression_cursor!==void 0&&s.set("progression_cursor",String(t?.progression_cursor));let a=s.toString(),o=`/v1/inventory/${i(e)}/${i(n)}`+(a?`?${a}`:"");return r.client.get(o,t?.signal)}async function G(r,e,n,t,s){let a=`/v1/inventory/${i(e)}/${i(n)}/items/${i(t)}`;return r.client.get(a,s?.signal)}async function O(r,e,n,t,s){let a=new URLSearchParams;s?.bucket_1!==void 0&&a.set("bucket_1",String(s?.bucket_1)),s?.bucket_2!==void 0&&a.set("bucket_2",String(s?.bucket_2)),s?.limit!==void 0&&a.set("limit",String(s?.limit)),s?.periods_back!==void 0&&a.set("periods_back",String(s?.periods_back)),s?.period!==void 0&&a.set("period",String(s?.period)),s?.player_id!==void 0&&a.set("player_id",String(s?.player_id));let o=a.toString(),l=`/v1/leaderboards/${i(e)}/${i(n)}/${i(t)}`+(o?`?${o}`:"");return r.client.get(l,s?.signal)}async function I(r,e,n,t,s){let a=`/v1/inventory/${i(e)}/${i(n)}/orders/${i(t)}`;return r.client.get(a,s?.signal)}async function q(r,e,n,t,s){let a=`/v1/inventory/${i(e)}/${i(n)}/progressions/${i(t)}`;return r.client.get(a,s?.signal)}async function C(r,e,n,t,s,a){let o=`/v1/inventory/${i(e)}/${i(n)}/catalogs/${i(t)}/recipes/${i(s)}/availability`;return r.client.get(o,a?.signal)}async function E(r,e,n,t){let s=new URLSearchParams;t?.limit!==void 0&&s.set("limit",String(t?.limit));let a=s.toString(),o=`/v1/inventory/${i(e)}/${i(n)}/recipe-usage`+(a?`?${a}`:"");return r.client.get(o,t?.signal)}async function M(r,e,n,t,s){let a=`/v1/saves/${i(e)}/${i(n)}/${i(t)}`;return r.client.getWithEtag(a,{...s?.signal===void 0?{}:{signal:s.signal},...s?.ifNoneMatch===void 0?{}:{ifNoneMatch:s.ifNoneMatch}})}async function L(r,e,n){let t=`/v1/events/${i(e)}`;return r.client.get(t,n?.signal)}async function B(r,e,n){let t=`/v2/games/${i(r.gameId())}/game-rooms/${i(e)}`;return r.client.getWithEtag(t,{...n?.signal===void 0?{}:{signal:n.signal},...n?.ifNoneMatch===void 0?{}:{ifNoneMatch:n.ifNoneMatch}})}async function T(r,e,n){let t=new URLSearchParams;n?.bucket_1!==void 0&&t.set("bucket_1",String(n?.bucket_1)),n?.bucket_2!==void 0&&t.set("bucket_2",String(n?.bucket_2)),n?.periods_back!==void 0&&t.set("periods_back",String(n?.periods_back)),n?.period!==void 0&&t.set("period",String(n?.period)),n?.player_id!==void 0&&t.set("player_id",String(n?.player_id));let s=t.toString(),a=`/v1/leaderboards/${i(e)}`+(s?`?${s}`:"");return r.client.get(a,n?.signal)}async function U(r,e,n){let t=`/v1/profiles/players/${i(e)}`;return r.client.get(t,n?.signal)}async function V(r,e){let n=new URLSearchParams;e?.config_version!==void 0&&n.set("config_version",String(e?.config_version));let t=n.toString(),s="/v1/inventory/platform-funded-game-inventory-purchase-catalog"+(t?`?${t}`:"");return r.client.get(s,e?.signal)}async function N(r,e,n){let t=`/v1/game-room-templates/${i(e)}`;return r.client.get(t,n?.signal)}async function D(r,e,n){let t=`/v1/games/${i(r.gameId())}/game-rooms/${i(e)}/room-args`;return r.client.get(t,n?.signal)}async function F(r,e,n,t){let s=`/v1/showcase/players/${i(e)}/${i(n)}`;return r.client.get(s,t?.signal)}async function j(r,e,n){let t=`/v1/inventory/transfers/${i(e)}`;return r.client.get(t,n?.signal)}async function z(r,e,n){let t=`/v1/games/${i(r.gameId())}/analytics/events`;return r.client.post(t,e,n?.signal,{replaySafe:true})}async function W(r,e,n){return r.client.post("/v1/inventory/transfers",e,n?.signal)}async function K(r,e,n){return r.client.postBytes("/v1/functions/invoke",e,n?.signal)}async function H(r,e,n,t){let s=`/v1/games/${i(r.gameId())}/game-rooms/${i(e)}/kick/${i(n)}`;return r.client.post(s,void 0,t?.signal)}async function J(r,e){let n=new URLSearchParams;e?.periods_back!==void 0&&n.set("periods_back",String(e?.periods_back)),e?.player_id!==void 0&&n.set("player_id",String(e?.player_id));let t=n.toString(),s="/v1/challenges"+(t?`?${t}`:"");return r.client.get(s,e?.signal)}async function Z(r,e,n,t){let s=`/v1/settings/${i(e)}/${i(n)}`;return r.client.get(s,t?.signal)}async function Q(r,e,n,t){let s=new URLSearchParams;t?.limit!==void 0&&s.set("limit",String(t?.limit)),t?.cursor!==void 0&&s.set("cursor",String(t?.cursor));let a=s.toString(),o=`/v1/inventory/${i(e)}/${i(n)}/orders`+(a?`?${a}`:"");return r.client.get(o,t?.signal)}async function X(r,e,n,t){let s=`/v1/inventory/${i(e)}/${i(n)}/progressions`;return r.client.get(s,t?.signal)}async function Y(r,e,n,t){let s=new URLSearchParams;t?.limit!==void 0&&s.set("limit",String(t?.limit)),t?.cursor!==void 0&&s.set("cursor",String(t?.cursor));let a=s.toString(),o=`/v1/saves/${i(e)}/${i(n)}`+(a?`?${a}`:"");return r.client.get(o,t?.signal)}async function ee(r,e){let n=new URLSearchParams;e?.include_inactive!==void 0&&n.set("include_inactive",String(e?.include_inactive)),e?.limit!==void 0&&n.set("limit",String(e?.limit)),e?.offset!==void 0&&n.set("offset",String(e?.offset));let t=n.toString(),s="/v1/events"+(t?`?${t}`:"");return r.client.get(s,e?.signal)}async function ne(r,e){let n=new URLSearchParams;e?.status!==void 0&&n.set("status",String(e?.status)),e?.game_channel!==void 0&&n.set("game_channel",String(e?.game_channel)),e?.game_room_type!==void 0&&n.set("game_room_type",String(e?.game_room_type)),e?.template_id!==void 0&&n.set("template_id",String(e?.template_id)),e?.template_slug!==void 0&&n.set("template_slug",String(e?.template_slug)),e?.limit!==void 0&&n.set("limit",String(e?.limit)),e?.cursor!==void 0&&n.set("cursor",String(e?.cursor));let t=n.toString(),s=`/v1/games/${i(r.gameId())}/game-rooms`+(t?`?${t}`:"");return r.client.get(s,e?.signal)}async function te(r,e){return r.client.get("/v1/game-room-templates",e?.signal)}async function re(r,e){let n=new URLSearchParams;e.entity_type!==void 0&&n.set("entity_type",String(e.entity_type)),e.entity_id!==void 0&&n.set("entity_id",String(e.entity_id)),e?.direction!==void 0&&n.set("direction",String(e?.direction)),e?.status!==void 0&&n.set("status",String(e?.status)),e?.cursor!==void 0&&n.set("cursor",String(e?.cursor)),e?.limit!==void 0&&n.set("limit",String(e?.limit));let t=n.toString(),s="/v1/inventory/transfers"+(t?`?${t}`:"");return r.client.get(s,e?.signal)}async function se(r,e,n,t,s,a){let o=`/v1/inventory/${i(e)}/${i(n)}/progressions/${i(t)}/max`;return r.client.post(o,s,a?.signal)}async function ie(r,e,n,t,s,a){let o=`/v1/settings/${i(e)}/${i(n)}/${i(t)}`;return r.client.put(o,s,a?.signal,{...a?.ifMatch===void 0?{}:{ifMatch:a.ifMatch}})}async function ae(r,e,n,t){let s=`/v1/games/${i(r.gameId())}/game-rooms/${i(e)}/room-args`;return r.client.put(s,n,t?.signal)}async function oe(r,e,n,t,s){let a=`/v1/showcase/players/${i(e)}/${i(n)}`;return r.client.put(a,t,s?.signal)}async function le(r,e,n){let t=`/v1/inventory/transfers/${i(e)}/reject`;return r.client.post(t,void 0,n?.signal)}async function ue(r,e,n,t){let s=`/v1/games/${i(r.gameId())}/matches/${i(e)}/players/report`;return r.client.post(s,n,t?.signal)}async function ge(r,e,n,t,s,a){let o=`/v1/saves/${i(e)}/${i(n)}/${i(t)}/upload-url`;return r.client.post(o,s,a?.signal,{replaySafe:true})}async function pe(r,e,n,t,s,a){let o=`/v1/inventory/${i(e)}/${i(n)}/progressions/${i(t)}/reset`;return r.client.post(o,s,a?.signal)}async function ce(r,e,n,t){let s=`/v1/games/${i(r.gameId())}/matches/${i(e)}/backfill`;return r.client.put(s,n,t?.signal)}async function me(r,e,n,t,s){let a=`/v1/inventory/${i(e)}/${i(n)}/orders/simulate`;return r.client.post(a,t,s?.signal)}async function de(r,e,n,t){let s=`/v2/games/${i(r.gameId())}/game-rooms/${i(e)}/transfer/${i(n)}`;return r.client.post(s,void 0,t?.signal)}async function _e(r,e,n,t){let s=`/v2/games/${i(r.gameId())}/game-rooms/${i(e)}`;return r.client.patch(s,n,t?.signal,{...t?.ifMatch===void 0?{}:{ifMatch:t.ifMatch}})}export{u as acceptTransfer,g as addEntityProgression,p as adminAction,c as cancelInventoryTransfer,m as claimEntityProgressionRewards,d as closeGameRoom,_ as createEntityBatchOrder,y as createEntityOrder,b as createSession,f as deleteEntityGameSetting,R as deleteEntitySave,h as deleteSession,v as deleteShowcaseValue,S as executeEntityRecipe,x as finalizeSaveUpload,P as getChannelAssignment,A as getDropRates,k as getEntityCurrency,w as getEntityGameSetting,$ as getEntityInventory,G as getEntityInventoryItem,O as getEntityLeaderboard,I as getEntityOrder,q as getEntityProgression,C as getEntityRecipeAvailability,E as getEntityRecipeUsage,M as getEntitySave,L as getEvent,B as getGameRoomV2,T as getLeaderboard,U as getPlayerGameProfile,V as getPurchaseCatalog,N as getResolvedTemplate,D as getRoomArgs,F as getShowcaseValue,j as getTransferDetails,z as ingestAnalyticsEvents,W as initiateInventoryTransfer,K as invokeFunction,H as kickPlayer,J as listChallenges,Z as listEntityGameSettings,Q as listEntityOrders,X as listEntityProgressions,Y as listEntitySaves,ee as listEvents,ne as listGameRooms,te as listResolvedTemplates,re as listTransfers,se as maxEntityProgression,ie as putEntityGameSetting,ae as putRoomArgs,oe as putShowcaseValue,le as rejectTransfer,ue as reportMatchPlayers,ge as requestSaveUploadUrl,pe as resetEntityProgression,ce as setMatchBackfill,me as simulateEntityOrder,de as transferHostV2,_e as updateGameRoomV2};//# sourceMappingURL=gem-web-sdk.server-api.js.map
2
2
  //# sourceMappingURL=gem-web-sdk.server-api.js.map
@@ -1,3 +1,3 @@
1
- var ve=Object.defineProperty;var Re=(n,e)=>{for(var t in e)ve(n,t,{get:e[t],enumerable:true});};globalThis.__gemWebSdkVersion="[gem-web-sdk:sdkVersion:10.1.0]";function xe(n,e){return e!==void 0?!e:n==="chain_exhausted"}var $=class{constructor(e){this.options=e;}options;grant=null;state="pending";failure=null;generation=0;inFlight=null;rejected=false;get currentState(){return this.state}get lastFailure(){return this.failure}async get(){if(this.state==="lost")throw new _(this.failure??"unavailable","the session cannot be renewed");let e=this.seconds();if(this.grant&&e<this.grant.expiresAt-this.renewBefore())return this.grant.token;if(this.grant&&e>=this.grant.chainEndsAt)throw this.enter("lost","chain_exhausted"),new _("chain_exhausted","the token chain reached its ceiling");return this.refresh(this.nextReason())}nextReason(){return this.rejected?"rejected":this.grant?"expiring":"initial"}invalidate(e){e!==void 0&&this.grant!==null&&this.grant.token!==e||this.rejected&&this.grant===null||(this.grant=null,this.generation+=1,this.inFlight=null,this.rejected=true,this.state!=="lost"&&this.enter("pending"));}accept(e){this.state!=="lost"&&(this.grant=e,this.rejected=false,this.enter("ready"));}close(e="unavailable"){this.grant=null,this.generation+=1,this.inFlight=null,this.enter("lost",e);}refresh(e){if(this.inFlight)return this.inFlight;let t=this.generation;this.enter("pending");let r=this.options.request(e).then(o=>{if(t!==this.generation)throw new _("internal","token arrived for a superseded generation");return this.grant=o,this.rejected=false,this.enter("ready"),o.token}).catch(o=>{let s=Se(o),i=o?.retryable;throw t===this.generation&&this.enter(xe(s,typeof i=="boolean"?i:void 0)?"lost":"degraded",s),o instanceof _?o:new _(s,String(o))}).finally(()=>{this.inFlight===r&&(this.inFlight=null);});return this.inFlight=r,r}enter(e,t){this.failure=t??(e==="ready"?null:this.failure),this.state!==e&&(this.state=e,this.options.onStateChange?.(e,t));}renewBefore(){return this.options.renewBeforeSeconds??60}seconds(){return Math.floor(this.options.clock.now()/1e3)}},_=class n extends Error{constructor(t,r){super(`auth ${t}: ${r}`);this.reason=t;this.name="AuthError";}reason;static isAuthError(t){if(t instanceof n)return true;let r=t;return r?.name==="AuthError"&&typeof r.reason=="string"}};function Se(n){if(n instanceof _)return n.reason;let e=n?.reason;return typeof e=="string"&&["chain_exhausted","unavailable","timeout","internal"].includes(e)?e:"internal"}var p=class n extends Error{retryable=false;constructor(e){super(e),this.name="TransportRefusal";}static isRefusal(e){if(e instanceof n)return true;let t=e;return t?.name==="TransportRefusal"&&t.retryable===false}},j=["if-match","if-none-match"],W=4096;function ke(n){if(!n)return;let e={};for(let[t,r]of Object.entries(n)){let o=t.toLowerCase();if(!j.includes(o)||r===void 0)continue;let s=typeof r=="string"?we(r):r;if(typeof s!="string"||s.length>W||!Ae(s))throw new p(`the ${o} header value cannot be sent \u2014 it is not a string, is longer than ${W} characters, or contains a character outside the range an HTTP header value may carry. This is a malformed request, not a server failure; the value is withheld here rather than written to logs.`);s!==""&&(e[o]=s);}return Object.freeze(e)}function we(n){let e=o=>o===32||o===9||o===10||o===13,t=0,r=n.length;for(;t<r&&e(n.charCodeAt(t));)t++;for(;r>t&&e(n.charCodeAt(r-1));)r--;return n.slice(t,r)}function Ae(n){for(let e=0;e<n.length;e++){let t=n.charCodeAt(e);if(t!==9&&(t<32||t===127||t>255))return false}return true}function Pe(n){let{bytes:e}=n;if(e!==void 0){if(Object.prototype.toString.call(e)!=="[object Uint8Array]")throw new p("the raw body is not a Uint8Array, so it cannot be sent as bytes. This is a malformed request, not a server failure.");if(n.body!==void 0)throw new p("the request carries both a JSON body and a raw body, and only one can be sent. This is a malformed request, not a server failure.");return new Uint8Array(e)}}function z(n,e){let t=e.replayUnauthorizedOnce??true;return {async request(r){let o={...r},s=ke(o.headers),i=Pe(o),l=Object.freeze({...o,headers:s,...i===void 0?{}:{bytes:i}}),d=await e.tokenSource.get(),c=await n(l,d);if(c.status!==401||!t)return c;e.tokenSource.invalidate(d);let m=await e.tokenSource.get(),b=await n(l,m);if(b.status===401)throw e.tokenSource.close("unavailable"),new _("unavailable","the server refused a freshly minted token");return b}}}function K(n){let e=typeof n=="string"?new TextEncoder().encode(n):n;return btoa(Te(e))}function Te(n){let t="";for(let r=0;r<n.length;r+=32768)t+=String.fromCharCode(...n.subarray(r,r+32768));return t}var g=class extends Error{constructor(t,r,o,s,i){super(`${t} (${r}): ${o}`);this.reason=t;this.status=r;this.detail=o;this.retryAfterSeconds=s;this.code=i;this.name="GemApiError";}reason;status;detail;retryAfterSeconds;code;get retryable(){return this.reason==="unavailable"||this.reason==="rate_limited"}},J=new WeakMap;function X(n){return J.get(n)??{}}var Oe=new Set([408,429,500,502,503,504]),Ge=6e4;function Ce(n){if(n===void 0)return 2;if(!Number.isInteger(n)||n<0||n>10)throw new p(`maxRetries must be a whole number between 0 and 10; received ${JSON.stringify(n)}. This is a configuration fault, not a server failure.`);return n}var T=class{constructor(e){this.options=e;}options;async get(e,t){return this.send({method:"GET",path:e,signal:t},true)}async getWithEtag(e,t={}){let r=await this.sendRaw({method:"GET",path:e,...t.signal===void 0?{}:{signal:t.signal},...t.ifNoneMatch===void 0?{}:{headers:{"if-none-match":t.ifNoneMatch}}},true),o=r.etag===void 0?{}:{etag:r.etag};return r.status===304?{modified:false,...o}:{modified:true,body:r.body,...o}}async put(e,t,r,o={}){return this.send({method:"PUT",path:e,body:t,signal:r,...E(o)},o.replaySafe===true)}async post(e,t,r,o={}){return this.send({method:"POST",path:e,body:t,signal:r,...E(o)},o.replaySafe===true)}async postBytes(e,t,r,o={}){let s=await this.sendRaw({method:"POST",path:e,bytes:t,responseType:"bytes",signal:r,...E(o)},o.replaySafe===true);return {bytes:Ee(s.body),...s.invocationId===void 0?{}:{invocationId:s.invocationId}}}async patch(e,t,r,o={}){return this.send({method:"PATCH",path:e,body:t,signal:r,...E(o)},o.replaySafe===true)}async delete(e,t,r={}){return this.send({method:"DELETE",path:e,signal:t,...E(r)},r.replaySafe===true)}async send(e,t){return (await this.sendRaw(e,t)).body}async sendRaw(e,t){let r=t?Ce(this.options.maxRetries)+1:1,o=null;if(e.signal?.aborted)throw Y(e.signal);for(let s=0;s<r;s++){if(s>0&&await this.backoff(s,o,e.signal),e.signal?.aborted)throw Y(e.signal);let i;try{i=await this.options.transport.request(e);}catch(d){if(_.isAuthError(d)||p.isRefusal(d)||e.signal?.aborted||Ie(d))throw d;o=new g("unavailable",0,String(d));continue}if(i.status>=200&&i.status<300||i.status===304)return i;let l=qe(i);if(!Oe.has(i.status))throw l;o=l;}throw o??new g("unavailable",0,"no attempt was made")}backoff(e,t,r){if(r?.aborted)return Promise.resolve();let o=t?.retryAfterSeconds,s=o!==void 0?o*1e3:2**(e-1)*250,i=2**(e-1)*250,l=Math.min(Math.max(s,i),Ge);return new Promise(d=>{let c=this.options.clock,m=false,b=false,x,f=()=>{m||(m=true,b&&c.clearTimeout(x),r?.removeEventListener("abort",f),d());};r?.addEventListener("abort",f,{once:true}),x=c.setTimeout(f,l),b=true,m&&c.clearTimeout(x);})}};function Ee(n){if(n instanceof Uint8Array)return n;if(n==null)return new Uint8Array(0);let e=typeof n=="string"?n:JSON.stringify(n);return new TextEncoder().encode(e)}function E(n){return {...n.keepalive===void 0?{}:{keepalive:n.keepalive},...n.ifMatch===void 0?{}:{headers:{"if-match":n.ifMatch}}}}function Y(n){return n.reason!==void 0?n.reason:new DOMException("The operation was aborted.","AbortError")}function Ie(n){let e=n?.name;return e==="AbortError"||e==="TimeoutError"}function qe(n){let e=$e(n),t=Me(n.body),r={...t===void 0?{}:{details:t},...n.invocationId===void 0?{}:{invocationId:n.invocationId}};return Object.keys(r).length>0&&J.set(e,r),e}var Le=new Map([["insufficient_funds","insufficient_funds"]]);function $e(n){let{status:e,body:t}=n,r=je(t),o=n.retryAfterSeconds??Be(t),s=Fe(t),i=s===void 0?void 0:Le.get(s);if(i!==void 0)return new g(i,e,r,void 0,s);switch(e){case 304:return new g("not_modified",e,r);case 400:case 422:return new g("invalid",e,r,void 0,s);case 403:return new g("forbidden",e,r,void 0,s);case 404:return new g("not_found",e,r,void 0,s);case 402:return new g("insufficient_funds",e,r,void 0,s);case 409:return new g("conflict",e,r,void 0,s);case 412:return new g("precondition_failed",e,r,void 0,s);case 413:return new g("too_large",e,r,void 0,s);case 429:return new g("rate_limited",e,r,o,s);default:return new g("unavailable",e,r,o,s)}}function je(n){if(typeof n=="string")return n;let e=n?.message;if(typeof e=="string")return e;let t=n?.error;if(typeof t=="string")return t;let r=t?.message;return typeof r=="string"?r:"no detail"}function Me(n){let t=n?.error?.details;return t===null?void 0:t}function Fe(n){let t=n?.error?.code;return typeof t=="string"&&t.length>0?t:void 0}function Be(n){let e=n?.retryAfterSeconds;return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function Ue(n){let e=n.lastIndexOf("@");return (e===-1?n:`***@${n.slice(e+1)}`).slice(0,200)}var Ne=new Set(j);function De(n){if(!n)return {};let e={};for(let[t,r]of Object.entries(n))Ne.has(t.toLowerCase())&&(e[t.toLowerCase()]=r);return e}function Q(n){let e=n.fetch??globalThis.fetch.bind(globalThis);return z(async(t,r)=>{let o;try{o=new URL(n.baseUrl.replace(/\/+$/,""));}catch{throw new p("the configured baseUrl is not a valid URL. Its value is withheld here rather than written to logs. This is a configuration fault, not a server failure.")}let s;try{s=new URL(o.href.replace(/\/+$/,"")+t.path);}catch{throw new p(`${JSON.stringify(typeof t.path=="string"?Ue(t.path):"(a non-string path)")} does not form a valid URL against ${o.protocol}//${o.host}. This is a malformed request, not a server failure.`)}if(s.protocol!==o.protocol||s.host!==o.host)throw new p(`${JSON.stringify(s.pathname)} resolves to ${s.protocol}//${s.host}, not ${o.protocol}//${o.host}. A request path may not change the request's origin \u2014 it carries the play token.`);if(s.username!==""||s.password!==""){let f=o.username!==""||o.password!=="",v=s.username!==o.username||s.password!==o.password,y=f?v?"baseUrl (and possibly the request path)":"baseUrl":"request path";throw new p(`the ${y} puts credentials in the URL, which cannot be fetched (${t.method} ${s.pathname}). The value is withheld here rather than written to logs. This is a malformed request, not a server failure.`)}for(let[f,v]of Object.entries(n.defaultQuery??{}))s.searchParams.has(f)||s.searchParams.set(f,v);let i=t.bytes,l=t.bytes===void 0?void 0:"application/octet-stream";try{t.body!==void 0&&(i=JSON.stringify(t.body),l="application/json");}catch(f){throw new p(`the body of ${t.method} ${JSON.stringify(s.pathname)} could not be serialised to JSON: ${String(f)}. This is a bug in the request, not a server failure \u2014 retrying sends the same unserialisable value.`)}let d=await e(s.toString(),{method:t.method,headers:{authorization:`Bearer ${r}`,...l===void 0?{}:{"content-type":l},...De(t.headers)},body:i,signal:t.signal,...t.keepalive===void 0?{}:{keepalive:t.keepalive},credentials:"omit",mode:"cors",redirect:"error",cache:"no-store",referrerPolicy:"no-referrer"}),c=null;if(t.responseType==="bytes"&&d.status>=200&&d.status<300)c=new Uint8Array(await d.arrayBuffer());else {let f=await d.text();if(f.length>0)try{c=JSON.parse(f);}catch{c=f;}}let m=d.headers.get("etag"),b=He(d.headers.get("retry-after")),x=d.headers.get("x-gem-invocation-id");return {status:d.status,body:c,...m===null?{}:{etag:m},...b===void 0?{}:{retryAfterSeconds:b},...x===null||x===""?{}:{invocationId:x}}},n)}function He(n){if(n===null)return;let e=n.trim();if(!/^\d+$/.test(e))return;let t=Number(e);return Number.isFinite(t)?t:void 0}var Ve="gem-web-bridge";var O=65536,Z=8,M=5e3,ee=1024;function U(n){return Object.freeze(Object.assign(Object.create(null),n))}U({"gem.handshake":30,"gem.handshake.accept":5,"gem.token":30,"gem.token.denied":30,"gem.player":12,"gem.pause":120,"gem.prefs":60,"gem.cohorts":12,"gem.earnAllowanceChanged":30,"gem.viewport":60,"gem.deviceSettings":12,"gem.willTerminate":10,"gem.roomEvent":120,"gem.socketState":12,"gem.seatedEvent":60,"gem.autoStartFailedEvent":30,"gem.signalEvent":1800,"gem.dedicatedEvent":120,"gem.partyResult":30,"gem.clusterTarget":12,"gem.devtools":30,"gem.screenshot":6,"gem.screenshot.denied":12,"gem.requestContext":12,"gem.gameContext":12,"gem.signal":1200,"gem.dedicatedOffer":60,"gem.partyRequest":12,"gem.ready":5,"gem.engaged":5,"gem.progress":600,"gem.requestToken":12,"gem.requestLocalServer":6,"gem.localServer":30,"gem.localServer.denied":30,"gem.exit":5,"gem.openExternal":6,"gem.requestFullscreen":30,"gem.audioState":120,"gem.rewardCue":60,"gem.walletDisplay":60,"gem.menu":60,"gem.menuSelect":60,"gem.requestShare":6,"gem.vibrate":600,"gem.frameStats":120,"gem.portraitBorders":60,"gem.error":60,"gem.requestPurchase":12,"gem.purchaseResult":30,"gem.deviceSettings.put":30,"gem.deviceSettings.result":30,"gem.requestAd":6,"gem.adResult":12,"gem.requestSignIn":6,"gem.signInResult":12,"gem.requestFriendChallenge":12,"gem.friendChallengeResult":30,__malformed:60});U({"gem.requestAd":"ads","gem.adResult":"ads","gem.requestSignIn":"signIn","gem.signInResult":"signIn","gem.requestPurchase":"purchases","gem.purchaseResult":"purchases","gem.requestFriendChallenge":"friendChallenges","gem.friendChallengeResult":"friendChallenges","gem.devtools":"devtools","gem.screenshot":"screenshot","gem.screenshot.denied":"screenshot","gem.requestContext":"feedbackContext","gem.gameContext":"feedbackContext","gem.roomEvent":"rooms","gem.signal":"p2p","gem.signalEvent":"p2p","gem.dedicatedOffer":"dedicated","gem.dedicatedEvent":"dedicated","gem.clusterTarget":"clusterTarget","gem.partyRequest":"parties","gem.partyResult":"parties","gem.autoStartFailedEvent":"autoStartFailure","gem.seatedEvent":"partySeating","gem.socketState":"socketState","gem.audioState":"audioState","gem.rewardCue":"rewardCue","gem.frameStats":"frameStats","gem.portraitBorders":"portraitBorders","gem.engaged":"engagement","gem.viewport":"viewport","gem.walletDisplay":"walletDisplay","gem.requestLocalServer":"localHost","gem.localServer":"localHost","gem.localServer.denied":"localHost","gem.cohorts":"cohorts","gem.earnAllowanceChanged":"earnAllowance","gem.deviceSettings":"deviceSettings","gem.deviceSettings.put":"deviceSettings","gem.deviceSettings.result":"deviceSettings","gem.requestShare":"share","gem.vibrate":"vibration","gem.menu":"gameMenu","gem.menuSelect":"gameMenu"});function ze(n){let e=/^([a-z][a-z0-9+.-]*):\/\/([a-z0-9.-]+|\[[0-9a-f:.]+\])(:([0-9]{1,5}))?$/i.exec(n);return e===null?false:e[4]===void 0||Number(e[4])<=65535}function Ke(n){let e;try{e=new URL(n);}catch{return false}return e.username!==""||e.password!==""?false:e.protocol==="https:"?true:e.protocol==="http:"&&(e.hostname==="localhost"||e.hostname==="127.0.0.1")}function Ye(n){return /^[a-z]{2,8}(-[a-z0-9]{1,8})*$/i.test(n)}function Je(n){return /^[a-z_]+$/.test(n)}function B(n,e,t){if(e>Z)return `nesting deeper than ${Z}`;if(++t.nodes>M)return `more than ${M} values`;if(t.bytes>O)return `over the ${O} byte limit`;if(n==null)return t.bytes+=4,null;let r=typeof n;if(r==="boolean")return t.bytes+=5,null;if(r==="number")return t.bytes+=8,null;if(r==="string")return t.bytes+=n.length*3+2,null;if(r!=="object")return `${r} is not plain data`;let o=n;if(t.seen.has(o))return "a repeated or cyclic object reference";if(t.seen.add(o),Array.isArray(n)){if(n.length>ee)return `an array of ${n.length} entries, over the ${ee} limit`;t.bytes+=2;for(let l of n){let d=B(l,e+1,t);if(d)return d}return null}let s=Object.getPrototypeOf(n);if(s!==Object.prototype&&s!==null)return "a value that is not a plain object";t.bytes+=2;let i=n;for(let l in i){if(!Object.prototype.hasOwnProperty.call(i,l))continue;if(++t.nodes>M)return `more than ${M} values`;if(t.bytes+=l.length*3+4,t.bytes>O)return `over the ${O} byte limit`;let d=B(i[l],e+1,t);if(d)return d}return null}function Xe(n){let e={nodes:0,bytes:0,seen:new Set},t=B(n,0,e);return t?`message contains ${t}`:e.bytes>O?`message is over the ${O} byte limit`:null}var Qe={origin:[ze,"not a well-formed origin"],url:[Ke,"not a safe absolute http(s) URL"],bcp47:[Ye,"not a well-formed BCP 47 tag"],code:[Je,"not a code of lower-case letters and underscores"]};function ne(n,e,t){for(let r of e){let o=t===""?r.n:`${t}.${r.n}`,s=n[r.n];if(s==null){if(r.o)continue;return `${o}: required`}let i=te(s,r,o);if(i)return i}return null}function te(n,e,t){switch(e.k){case "s":{if(typeof n!="string")return `${t}: expected string`;if(n.length>e.max)return `${t}: exceeds ${e.max} characters`;if(e.f){let[r,o]=Qe[e.f];if(!r(n))return `${t}: ${o}`}return null}case "i":return typeof n!="number"||!Number.isInteger(n)?`${t}: expected integer`:n<e.lo||n>e.hi?`${t}: out of range ${e.lo}..${e.hi}`:null;case "b":return typeof n=="boolean"?null:`${t}: expected boolean`;case "e":{let r=e.v;return r.includes(n)?null:`${t}: not one of ${r.join("|")}`}case "o":return typeof n!="object"||n===null||Array.isArray(n)?`${t}: expected object`:ne(n,e.fs,t);case "j":return typeof n!="object"||n===null||Array.isArray(n)?`${t}: expected a plain object`:null;case "a":{if(!Array.isArray(n))return `${t}: expected array`;if(n.length>e.max)return `${t}: exceeds ${e.max} items`;let r=e.it,o=`${t}[]`;for(let s of n){if(s==null){if(r.o)continue;return `${o}: required`}let i=te(s,r,o);if(i)return i}return null}default:{let r=e.k;return `${t}: unknown kind ${String(r)}`}}}function u(n,e){return t=>{let r=Xe(t);if(r)return r;if(typeof t!="object"||t===null||Array.isArray(t))return "message: expected object";let o=t;return o.gem!==Ve?"gem: wrong protocol marker":o.type!==n?`type: expected ${n}`:ne(o,e,"")}}var Ze=u("gem.handshake",[{n:"versions",k:"o",fs:[{n:"min",k:"i",lo:1,hi:1e3},{n:"max",k:"i",lo:1,hi:1e3}]},{n:"capabilities",k:"a",o:1,max:64,it:{n:"",k:"s",max:64}},{n:"embedder",k:"s",max:2048,f:"origin"},{n:"unbidden",k:"b",o:1}]),en=u("gem.handshake.accept",[{n:"v",k:"i",lo:1,hi:1e3},{n:"capabilities",k:"a",o:1,max:64,it:{n:"",k:"s",max:64}}]),nn=u("gem.token",[{n:"token",k:"s",max:4096},{n:"requestId",k:"s",o:1,max:64},{n:"generation",k:"i",lo:0,hi:2147483647},{n:"apiBaseUrl",k:"s",o:1,max:512,f:"url"},{n:"playerId",k:"s",max:64},{n:"gameId",k:"s",max:64},{n:"channel",k:"e",v:["dev","test","release"]},{n:"gameVersion",k:"s",o:1,max:64},{n:"expiresAt",k:"i",lo:0,hi:4102444800},{n:"chainEndsAt",k:"i",lo:0,hi:4102444800},{n:"allowDevTools",k:"b",o:1}]),tn=u("gem.token.denied",[{n:"requestId",k:"s",max:64},{n:"retryable",k:"b"},{n:"retryAfterMs",k:"i",o:1,lo:0,hi:36e5},{n:"reason",k:"e",v:["chain_exhausted","unavailable"]},{n:"correlationId",k:"s",max:64}]),rn=u("gem.player",[{n:"untrusted",k:"o",fs:[{n:"displayName",k:"s",max:64},{n:"displayTag",k:"s",o:1,max:80},{n:"displayHandle",k:"s",max:80}]},{n:"playerId",k:"s",o:1,max:64},{n:"discriminator",k:"s",o:1,max:8},{n:"avatarIconUrl",k:"s",o:1,max:2048,f:"url"},{n:"badges",k:"a",o:1,max:2,it:{n:"",k:"o",fs:[{n:"itemId",k:"s",max:64},{n:"iconUrl",k:"s",max:2048,f:"url"}]}},{n:"displayTag",k:"s",max:8},{n:"avatarUrl",k:"s",o:1,max:2048,f:"url"},{n:"boost",k:"o",o:1,fs:[{n:"multipliers",k:"a",max:8,it:{n:"",k:"o",fs:[{n:"currencyId",k:"s",max:64},{n:"currencySlug",k:"s",max:32},{n:"multiplierBp",k:"i",lo:1e4,hi:1e6}]}},{n:"expiresInDays",k:"i",o:1,lo:1,hi:7}]}]),on=u("gem.pause",[{n:"paused",k:"b"}]),sn=u("gem.prefs",[{n:"reducedMotion",k:"b"},{n:"muted",k:"b"},{n:"showFrameStats",k:"b",o:1},{n:"locale",k:"s",max:35,f:"bcp47"},{n:"recommended",k:"o",o:1,fs:[{n:"volume",k:"i",lo:0,hi:100},{n:"batterySaver",k:"b"},{n:"keyboardLayout",k:"e",v:["wasd","arrows"]},{n:"gamepadConfirm",k:"e",v:["south","east"]},{n:"vibration",k:"b"}]}]),an=u("gem.cohorts",[{n:"cohorts",k:"a",max:8,it:{n:"",k:"o",fs:[{n:"experimentId",k:"s",max:36},{n:"variantKey",k:"s",max:32}]}}]),ln=u("gem.earnAllowanceChanged",[]),dn=u("gem.viewport",[{n:"insets",k:"o",fs:[{n:"top",k:"i",lo:0,hi:4096},{n:"right",k:"i",lo:0,hi:4096},{n:"bottom",k:"i",lo:0,hi:4096},{n:"left",k:"i",lo:0,hi:4096}]},{n:"reserved",k:"a",o:1,max:4,it:{n:"",k:"o",fs:[{n:"x",k:"i",lo:0,hi:16384},{n:"y",k:"i",lo:0,hi:16384},{n:"width",k:"i",lo:0,hi:16384},{n:"height",k:"i",lo:0,hi:16384}]}}]),un=u("gem.deviceSettings",[{n:"settings",k:"j",o:1}]),cn=u("gem.willTerminate",[{n:"reason",k:"e",v:["grant_expiring","session_ended","navigating","kill_switch"]},{n:"graceMs",k:"i",lo:0,hi:6e4}]),mn=u("gem.roomEvent",[{n:"event",k:"e",v:["updated","match_started","match_ready","match_failed","version_stale"]},{n:"roomId",k:"s",max:64},{n:"matchId",k:"s",o:1,max:64},{n:"version",k:"i",o:1,lo:0,hi:2147483647},{n:"reason",k:"s",o:1,max:64},{n:"platform",k:"e",o:1,v:["universal","mobile"]}]),gn=u("gem.socketState",[{n:"connected",k:"b"},{n:"reason",k:"e",o:1,v:["connecting","dropped","watchdog","terminal"]}]),pn=u("gem.seatedEvent",[{n:"roomId",k:"s",max:64}]),yn=u("gem.autoStartFailedEvent",[{n:"roomId",k:"s",max:64},{n:"code",k:"s",max:64}]),fn=u("gem.signalEvent",[{n:"event",k:"e",v:["hello","offer","answer","ice","peerJoined","peerLeft","migration","matchEnded","error"]},{n:"matchId",k:"s",max:64},{n:"data",k:"j"}]),hn=u("gem.dedicatedEvent",[{n:"event",k:"e",v:["answer","error","matchEnded"]},{n:"matchId",k:"s",max:64},{n:"sdp",k:"s",o:1,max:10240},{n:"sessionId",k:"s",o:1,max:64},{n:"code",k:"s",o:1,max:64},{n:"message",k:"s",o:1,max:256},{n:"reason",k:"s",o:1,max:64}]),_n=u("gem.partyResult",[{n:"requestId",k:"s",max:64},{n:"partyId",k:"s",o:1,max:64}]),bn=u("gem.clusterTarget",[{n:"clusterTargetId",k:"s",max:64},{n:"clusterTargetIds",k:"a",o:1,max:3,it:{n:"",k:"s",max:64}}]),vn=u("gem.devtools",[{n:"action",k:"e",v:["open","close","toggle"]}]),Rn=u("gem.screenshot",[{n:"maxWidth",k:"i",lo:1,hi:7680},{n:"maxHeight",k:"i",lo:1,hi:4320}]),xn=u("gem.screenshot.denied",[{n:"reason",k:"e",v:["not_wired","no_source","unsupported","unreadable","tainted","too_large","busy","declined","failed"]},{n:"retryable",k:"b"}]),Sn=u("gem.requestContext",[]),kn=u("gem.gameContext",[{n:"context",k:"j"}]),wn=u("gem.signal",[{n:"signal",k:"e",v:["join","offer","answer","ice","migrationAck","hostUnreachable"]},{n:"matchId",k:"s",max:64},{n:"data",k:"j"}]),An=u("gem.dedicatedOffer",[{n:"matchId",k:"s",max:64},{n:"sdp",k:"s",max:10240},{n:"intent",k:"e",v:["initial","ice_restart","full_reconnect"]}]),Pn=u("gem.partyRequest",[{n:"requestId",k:"s",max:64}]),Tn=u("gem.ready",[]),On=u("gem.engaged",[]),Gn=u("gem.progress",[{n:"loaded",k:"i",lo:0,hi:1099511627776},{n:"total",k:"i",lo:0,hi:1099511627776}]),Cn=u("gem.requestToken",[{n:"requestId",k:"s",max:64},{n:"reason",k:"e",v:["initial","expiring","rejected"]}]),En=u("gem.requestLocalServer",[{n:"requestId",k:"s",max:64},{n:"gameRoomId",k:"s",max:64}]),In=u("gem.localServer",[{n:"requestId",k:"s",max:64},{n:"serverId",k:"s",o:1,max:128}]),qn=u("gem.localServer.denied",[{n:"requestId",k:"s",max:64},{n:"retryable",k:"b"},{n:"reason",k:"e",v:["refused","unavailable"]}]),Ln=u("gem.exit",[{n:"reason",k:"s",o:1,max:64}]),$n=u("gem.openExternal",[{n:"url",k:"s",max:2048,f:"url"}]),jn=u("gem.requestFullscreen",[{n:"enabled",k:"b"}]),Mn=u("gem.audioState",[{n:"muted",k:"b"}]),Fn=u("gem.rewardCue",[{n:"currencySlug",k:"s",max:32},{n:"expected",k:"i",o:1,lo:1,hi:1e9},{n:"origin",k:"o",o:1,fs:[{n:"x",k:"i",lo:0,hi:16384},{n:"y",k:"i",lo:0,hi:16384}]}]),Bn=u("gem.walletDisplay",[{n:"visible",k:"b"},{n:"currencies",k:"a",o:1,max:8,it:{n:"",k:"s",max:64}},{n:"score",k:"b",o:1}]),Un=u("gem.menu",[{n:"settings",k:"b"},{n:"items",k:"a",o:1,max:4,it:{n:"",k:"o",fs:[{n:"id",k:"s",max:32},{n:"label",k:"s",max:40}]}}]),Nn=u("gem.menuSelect",[{n:"entry",k:"e",v:["settings","item"]},{n:"id",k:"s",o:1,max:32}]),Dn=u("gem.requestShare",[{n:"params",k:"a",max:16,it:{n:"",k:"o",fs:[{n:"key",k:"s",max:64},{n:"value",k:"s",max:512}]}}]),Hn=u("gem.vibrate",[{n:"pattern",k:"a",max:99,it:{n:"",k:"i",lo:0,hi:1e4}}]),Vn=u("gem.frameStats",[{n:"fps",k:"i",lo:0,hi:1e3},{n:"frameTimeP95Ms",k:"i",lo:0,hi:1e5}]),Wn=u("gem.portraitBorders",[{n:"name",k:"s",o:1,max:40}]),zn=u("gem.error",[{n:"code",k:"e",v:["version_mismatch","handshake_timeout","handshake_duplicate","invalid_message","rate_limited","token_unavailable","unsupported","unsupported_capability","internal"]},{n:"message",k:"s",o:1,max:256}]),Kn=u("gem.requestPurchase",[{n:"requestId",k:"s",max:64},{n:"purchaseKind",k:"e",v:["item","recipe"]},{n:"targetId",k:"s",max:64},{n:"currencySlug",k:"s",max:32},{n:"quantity",k:"i",o:1,lo:1,hi:10},{n:"catalogId",k:"s",o:1,max:64}]),Yn=u("gem.purchaseResult",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["ok","declined","unavailable"]},{n:"reason",k:"s",o:1,max:64,f:"code"},{n:"purchaseId",k:"s",o:1,max:64}]),Jn=u("gem.deviceSettings.put",[{n:"requestId",k:"s",max:64},{n:"settings",k:"j"}]),Xn=u("gem.deviceSettings.result",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["stored","too_large","unavailable"]}]),Qn=u("gem.requestAd",[{n:"requestId",k:"s",max:64},{n:"placement",k:"s",max:32},{n:"format",k:"e",v:["interstitial","rewarded"]}]),Zn=u("gem.adResult",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["shown","no_ad","unavailable"]}]),et=u("gem.requestSignIn",[{n:"requestId",k:"s",max:64}]),nt=u("gem.signInResult",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["signed_in","declined","unavailable"]}]),tt=u("gem.requestFriendChallenge",[{n:"requestId",k:"s",max:64},{n:"playerId",k:"s",max:64},{n:"template",k:"s",max:64},{n:"params",k:"j",o:1}]),rt=u("gem.friendChallengeResult",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["accepted","cancelled","refused","unavailable","rate_limited","invalid"]},{n:"code",k:"s",o:1,max:64},{n:"param",k:"s",o:1,max:64},{n:"channel",k:"s",o:1,max:16},{n:"configVersion",k:"i",o:1,lo:0,hi:9007199254740991},{n:"retryAfterMs",k:"i",o:1,lo:0,hi:864e5},{n:"detail",k:"s",o:1,max:300}]);U({"gem.handshake":Ze,"gem.handshake.accept":en,"gem.token":nn,"gem.token.denied":tn,"gem.player":rn,"gem.pause":on,"gem.prefs":sn,"gem.cohorts":an,"gem.earnAllowanceChanged":ln,"gem.viewport":dn,"gem.deviceSettings":un,"gem.willTerminate":cn,"gem.roomEvent":mn,"gem.socketState":gn,"gem.seatedEvent":pn,"gem.autoStartFailedEvent":yn,"gem.signalEvent":fn,"gem.dedicatedEvent":hn,"gem.partyResult":_n,"gem.clusterTarget":bn,"gem.devtools":vn,"gem.screenshot":Rn,"gem.screenshot.denied":xn,"gem.requestContext":Sn,"gem.gameContext":kn,"gem.signal":wn,"gem.dedicatedOffer":An,"gem.partyRequest":Pn,"gem.ready":Tn,"gem.engaged":On,"gem.progress":Gn,"gem.requestToken":Cn,"gem.requestLocalServer":En,"gem.localServer":In,"gem.localServer.denied":qn,"gem.exit":Ln,"gem.openExternal":$n,"gem.requestFullscreen":jn,"gem.audioState":Mn,"gem.rewardCue":Fn,"gem.walletDisplay":Bn,"gem.menu":Un,"gem.menuSelect":Nn,"gem.requestShare":Dn,"gem.vibrate":Hn,"gem.frameStats":Vn,"gem.portraitBorders":Wn,"gem.error":zn,"gem.requestPurchase":Kn,"gem.purchaseResult":Yn,"gem.deviceSettings.put":Jn,"gem.deviceSettings.result":Xn,"gem.requestAd":Qn,"gem.adResult":Zn,"gem.requestSignIn":et,"gem.signInResult":nt,"gem.requestFriendChallenge":tt,"gem.friendChallengeResult":rt});var G={now:()=>Date.now(),setTimeout:(n,e)=>setTimeout(n,e),clearTimeout:n=>clearTimeout(n)};var ot=1e4;function re(n,e){return N(n,e)}function N(n,e){if(typeof n.serverToken!="function"||typeof n.onServerToken!="function")throw new Error("this runtime delivers no game-server token: host.serverToken/onServerToken are missing. The server image running this bundle predates token delivery \u2014 the bundle cannot call gem-api on it.");let t=i=>({token:i.token,expiresAt:i.expiresAt,chainEndsAt:Number.POSITIVE_INFINITY}),r=null,o=new $({clock:e.clock,...e.onStateChange===void 0?{}:{onStateChange:e.onStateChange},request:()=>new Promise((i,l)=>{let d=e.clock.setTimeout(()=>{r=null,l({reason:"unavailable",retryable:true});},e.timeoutMs??ot);r={resolve:c=>{e.clock.clearTimeout(d),i(c);},reject:l,timer:d};})}),s=n.onServerToken(i=>{let l=t(i),d=r;if(d){r=null,d.resolve(l);return}o.accept(l);});return {source:o,dispose(){s(),r&&(e.clock.clearTimeout(r.timer),r.reject({reason:"unavailable",retryable:false}),r=null);}}}var H={};Re(H,{acceptTransfer:()=>st,addEntityProgression:()=>at,adminAction:()=>it,cancelInventoryTransfer:()=>lt,claimEntityProgressionRewards:()=>dt,closeGameRoom:()=>ut,createEntityBatchOrder:()=>ct,createEntityOrder:()=>mt,createSession:()=>gt,deleteEntityGameSetting:()=>pt,deleteEntitySave:()=>yt,deleteSession:()=>ft,deleteShowcaseValue:()=>ht,executeEntityRecipe:()=>_t,finalizeSaveUpload:()=>bt,getChannelAssignment:()=>vt,getDropRates:()=>Rt,getEntityCurrency:()=>xt,getEntityGameSetting:()=>St,getEntityInventory:()=>kt,getEntityInventoryItem:()=>wt,getEntityLeaderboard:()=>At,getEntityOrder:()=>Pt,getEntityProgression:()=>Tt,getEntityRecipeAvailability:()=>Ot,getEntityRecipeUsage:()=>Gt,getEntitySave:()=>Ct,getEvent:()=>Et,getGameRoomV2:()=>It,getLeaderboard:()=>qt,getPlayerGameProfile:()=>Lt,getPurchaseCatalog:()=>$t,getResolvedTemplate:()=>jt,getRoomArgs:()=>Mt,getShowcaseValue:()=>Ft,getTransferDetails:()=>Bt,ingestAnalyticsEvents:()=>D,initiateInventoryTransfer:()=>Ut,invokeFunction:()=>Nt,kickPlayer:()=>Dt,listChallenges:()=>Ht,listEntityGameSettings:()=>Vt,listEntityOrders:()=>Wt,listEntityProgressions:()=>zt,listEntitySaves:()=>Kt,listEvents:()=>Yt,listGameRooms:()=>Jt,listResolvedTemplates:()=>Xt,listTransfers:()=>Qt,maxEntityProgression:()=>Zt,putEntityGameSetting:()=>er,putRoomArgs:()=>nr,putShowcaseValue:()=>tr,rejectTransfer:()=>rr,requestSaveUploadUrl:()=>or,resetEntityProgression:()=>sr,simulateEntityOrder:()=>ar,transferHostV2:()=>ir,updateGameRoomV2:()=>lr});function a(n){let e=String(n);if(!/^[A-Za-z0-9_.-]{1,128}$/.test(e)||e==="."||e==="..")throw new TypeError(`${JSON.stringify(e)} is not a usable path segment \u2014 it is interpolated into a URL`);return encodeURIComponent(e)}async function st(n,e,t){let r=`/v1/inventory/transfers/${a(e)}/accept`;return n.client.post(r,void 0,t?.signal)}async function at(n,e,t,r,o,s){let i=`/v1/inventory/${a(e)}/${a(t)}/progressions/${a(r)}/add`;return n.client.post(i,o,s?.signal)}async function it(n,e,t,r){let o=`/v1/voice/sessions/${a(e)}/admin`;return n.client.post(o,t,r?.signal)}async function lt(n,e,t){let r=`/v1/inventory/transfers/${a(e)}/cancel`;return n.client.post(r,void 0,t?.signal)}async function dt(n,e,t,r,o,s){let i=`/v1/inventory/${a(e)}/${a(t)}/progressions/${a(r)}/claim`;return n.client.post(i,o,s?.signal)}async function ut(n,e,t){let r=`/v1/games/${a(n.gameId())}/game-rooms/${a(e)}`;return n.client.delete(r,t?.signal)}async function ct(n,e,t,r,o){let s=`/v1/inventory/${a(e)}/${a(t)}/orders/batch`;return n.client.post(s,r,o?.signal,{...o?.ifMatch===void 0?{}:{ifMatch:o.ifMatch}})}async function mt(n,e,t,r,o){let s=`/v1/inventory/${a(e)}/${a(t)}/orders`;return n.client.post(s,r,o?.signal,{...o?.ifMatch===void 0?{}:{ifMatch:o.ifMatch}})}async function gt(n,e,t){return n.client.post("/v1/voice/sessions",e,t?.signal)}async function pt(n,e,t,r,o){let s=`/v1/settings/${a(e)}/${a(t)}/${a(r)}`;return n.client.delete(s,o?.signal)}async function yt(n,e,t,r,o){let s=`/v1/saves/${a(e)}/${a(t)}/${a(r)}`;return n.client.delete(s,o?.signal)}async function ft(n,e,t){let r=`/v1/voice/sessions/${a(e)}`;return n.client.delete(r,t?.signal)}async function ht(n,e,t,r){let o=`/v1/showcase/players/${a(e)}/${a(t)}`;return n.client.delete(o,r?.signal)}async function _t(n,e,t,r,o){let s=`/v1/inventory/${a(e)}/${a(t)}/recipes/execute`;return n.client.post(s,r,o?.signal,{...o?.ifMatch===void 0?{}:{ifMatch:o.ifMatch}})}async function bt(n,e,t,r,o,s){let i=`/v1/saves/${a(e)}/${a(t)}/${a(r)}/finalize`;return n.client.post(i,o,s?.signal)}async function vt(n,e,t){let r=`/v1/games/${a(n.gameId())}/config/channels/${a(e)}`;return n.client.getWithEtag(r,{...t?.signal===void 0?{}:{signal:t.signal},...t?.ifNoneMatch===void 0?{}:{ifNoneMatch:t.ifNoneMatch}})}async function Rt(n,e,t){let r=`/v1/inventory/loot-tables/${a(e)}/drop-rates`;return n.client.get(r,t?.signal)}async function xt(n,e,t,r,o){let s=`/v1/inventory/${a(e)}/${a(t)}/currencies/${a(r)}`;return n.client.get(s,o?.signal)}async function St(n,e,t,r,o){let s=`/v1/settings/${a(e)}/${a(t)}/${a(r)}`;return n.client.getWithEtag(s,{...o?.signal===void 0?{}:{signal:o.signal},...o?.ifNoneMatch===void 0?{}:{ifNoneMatch:o.ifNoneMatch}})}async function kt(n,e,t,r){let o=new URLSearchParams;r?.include_buckets!==void 0&&o.set("include_buckets",String(r?.include_buckets)),r?.include_custom_data!==void 0&&o.set("include_custom_data",String(r?.include_custom_data)),r?.currency_limit!==void 0&&o.set("currency_limit",String(r?.currency_limit)),r?.currency_cursor!==void 0&&o.set("currency_cursor",String(r?.currency_cursor)),r?.item_limit!==void 0&&o.set("item_limit",String(r?.item_limit)),r?.item_cursor!==void 0&&o.set("item_cursor",String(r?.item_cursor)),r?.progression_limit!==void 0&&o.set("progression_limit",String(r?.progression_limit)),r?.progression_cursor!==void 0&&o.set("progression_cursor",String(r?.progression_cursor));let s=o.toString(),i=`/v1/inventory/${a(e)}/${a(t)}`+(s?`?${s}`:"");return n.client.get(i,r?.signal)}async function wt(n,e,t,r,o){let s=`/v1/inventory/${a(e)}/${a(t)}/items/${a(r)}`;return n.client.get(s,o?.signal)}async function At(n,e,t,r,o){let s=new URLSearchParams;o?.bucket_1!==void 0&&s.set("bucket_1",String(o?.bucket_1)),o?.bucket_2!==void 0&&s.set("bucket_2",String(o?.bucket_2)),o?.limit!==void 0&&s.set("limit",String(o?.limit)),o?.periods_back!==void 0&&s.set("periods_back",String(o?.periods_back)),o?.period!==void 0&&s.set("period",String(o?.period)),o?.player_id!==void 0&&s.set("player_id",String(o?.player_id));let i=s.toString(),l=`/v1/leaderboards/${a(e)}/${a(t)}/${a(r)}`+(i?`?${i}`:"");return n.client.get(l,o?.signal)}async function Pt(n,e,t,r,o){let s=`/v1/inventory/${a(e)}/${a(t)}/orders/${a(r)}`;return n.client.get(s,o?.signal)}async function Tt(n,e,t,r,o){let s=`/v1/inventory/${a(e)}/${a(t)}/progressions/${a(r)}`;return n.client.get(s,o?.signal)}async function Ot(n,e,t,r,o,s){let i=`/v1/inventory/${a(e)}/${a(t)}/catalogs/${a(r)}/recipes/${a(o)}/availability`;return n.client.get(i,s?.signal)}async function Gt(n,e,t,r){let o=new URLSearchParams;r?.limit!==void 0&&o.set("limit",String(r?.limit));let s=o.toString(),i=`/v1/inventory/${a(e)}/${a(t)}/recipe-usage`+(s?`?${s}`:"");return n.client.get(i,r?.signal)}async function Ct(n,e,t,r,o){let s=`/v1/saves/${a(e)}/${a(t)}/${a(r)}`;return n.client.getWithEtag(s,{...o?.signal===void 0?{}:{signal:o.signal},...o?.ifNoneMatch===void 0?{}:{ifNoneMatch:o.ifNoneMatch}})}async function Et(n,e,t){let r=`/v1/events/${a(e)}`;return n.client.get(r,t?.signal)}async function It(n,e,t){let r=`/v2/games/${a(n.gameId())}/game-rooms/${a(e)}`;return n.client.getWithEtag(r,{...t?.signal===void 0?{}:{signal:t.signal},...t?.ifNoneMatch===void 0?{}:{ifNoneMatch:t.ifNoneMatch}})}async function qt(n,e,t){let r=new URLSearchParams;t?.bucket_1!==void 0&&r.set("bucket_1",String(t?.bucket_1)),t?.bucket_2!==void 0&&r.set("bucket_2",String(t?.bucket_2)),t?.periods_back!==void 0&&r.set("periods_back",String(t?.periods_back)),t?.period!==void 0&&r.set("period",String(t?.period)),t?.player_id!==void 0&&r.set("player_id",String(t?.player_id));let o=r.toString(),s=`/v1/leaderboards/${a(e)}`+(o?`?${o}`:"");return n.client.get(s,t?.signal)}async function Lt(n,e,t){let r=`/v1/profiles/players/${a(e)}`;return n.client.get(r,t?.signal)}async function $t(n,e){let t=new URLSearchParams;e?.config_version!==void 0&&t.set("config_version",String(e?.config_version));let r=t.toString(),o="/v1/inventory/platform-funded-game-inventory-purchase-catalog"+(r?`?${r}`:"");return n.client.get(o,e?.signal)}async function jt(n,e,t){let r=`/v1/game-room-templates/${a(e)}`;return n.client.get(r,t?.signal)}async function Mt(n,e,t){let r=`/v1/games/${a(n.gameId())}/game-rooms/${a(e)}/room-args`;return n.client.get(r,t?.signal)}async function Ft(n,e,t,r){let o=`/v1/showcase/players/${a(e)}/${a(t)}`;return n.client.get(o,r?.signal)}async function Bt(n,e,t){let r=`/v1/inventory/transfers/${a(e)}`;return n.client.get(r,t?.signal)}async function D(n,e,t){let r=`/v1/games/${a(n.gameId())}/analytics/events`;return n.client.post(r,e,t?.signal,{replaySafe:true})}async function Ut(n,e,t){return n.client.post("/v1/inventory/transfers",e,t?.signal)}async function Nt(n,e,t){return n.client.postBytes("/v1/functions/invoke",e,t?.signal)}async function Dt(n,e,t,r){let o=`/v1/games/${a(n.gameId())}/game-rooms/${a(e)}/kick/${a(t)}`;return n.client.post(o,void 0,r?.signal)}async function Ht(n,e){let t=new URLSearchParams;e?.periods_back!==void 0&&t.set("periods_back",String(e?.periods_back)),e?.player_id!==void 0&&t.set("player_id",String(e?.player_id));let r=t.toString(),o="/v1/challenges"+(r?`?${r}`:"");return n.client.get(o,e?.signal)}async function Vt(n,e,t,r){let o=`/v1/settings/${a(e)}/${a(t)}`;return n.client.get(o,r?.signal)}async function Wt(n,e,t,r){let o=new URLSearchParams;r?.limit!==void 0&&o.set("limit",String(r?.limit)),r?.cursor!==void 0&&o.set("cursor",String(r?.cursor));let s=o.toString(),i=`/v1/inventory/${a(e)}/${a(t)}/orders`+(s?`?${s}`:"");return n.client.get(i,r?.signal)}async function zt(n,e,t,r){let o=`/v1/inventory/${a(e)}/${a(t)}/progressions`;return n.client.get(o,r?.signal)}async function Kt(n,e,t,r){let o=new URLSearchParams;r?.limit!==void 0&&o.set("limit",String(r?.limit)),r?.cursor!==void 0&&o.set("cursor",String(r?.cursor));let s=o.toString(),i=`/v1/saves/${a(e)}/${a(t)}`+(s?`?${s}`:"");return n.client.get(i,r?.signal)}async function Yt(n,e){let t=new URLSearchParams;e?.include_inactive!==void 0&&t.set("include_inactive",String(e?.include_inactive)),e?.limit!==void 0&&t.set("limit",String(e?.limit)),e?.offset!==void 0&&t.set("offset",String(e?.offset));let r=t.toString(),o="/v1/events"+(r?`?${r}`:"");return n.client.get(o,e?.signal)}async function Jt(n,e){let t=new URLSearchParams;e?.status!==void 0&&t.set("status",String(e?.status)),e?.game_channel!==void 0&&t.set("game_channel",String(e?.game_channel)),e?.game_room_type!==void 0&&t.set("game_room_type",String(e?.game_room_type)),e?.template_id!==void 0&&t.set("template_id",String(e?.template_id)),e?.template_slug!==void 0&&t.set("template_slug",String(e?.template_slug)),e?.limit!==void 0&&t.set("limit",String(e?.limit)),e?.cursor!==void 0&&t.set("cursor",String(e?.cursor));let r=t.toString(),o=`/v1/games/${a(n.gameId())}/game-rooms`+(r?`?${r}`:"");return n.client.get(o,e?.signal)}async function Xt(n,e){return n.client.get("/v1/game-room-templates",e?.signal)}async function Qt(n,e){let t=new URLSearchParams;e.entity_type!==void 0&&t.set("entity_type",String(e.entity_type)),e.entity_id!==void 0&&t.set("entity_id",String(e.entity_id)),e?.direction!==void 0&&t.set("direction",String(e?.direction)),e?.status!==void 0&&t.set("status",String(e?.status)),e?.cursor!==void 0&&t.set("cursor",String(e?.cursor)),e?.limit!==void 0&&t.set("limit",String(e?.limit));let r=t.toString(),o="/v1/inventory/transfers"+(r?`?${r}`:"");return n.client.get(o,e?.signal)}async function Zt(n,e,t,r,o,s){let i=`/v1/inventory/${a(e)}/${a(t)}/progressions/${a(r)}/max`;return n.client.post(i,o,s?.signal)}async function er(n,e,t,r,o,s){let i=`/v1/settings/${a(e)}/${a(t)}/${a(r)}`;return n.client.put(i,o,s?.signal,{...s?.ifMatch===void 0?{}:{ifMatch:s.ifMatch}})}async function nr(n,e,t,r){let o=`/v1/games/${a(n.gameId())}/game-rooms/${a(e)}/room-args`;return n.client.put(o,t,r?.signal)}async function tr(n,e,t,r,o){let s=`/v1/showcase/players/${a(e)}/${a(t)}`;return n.client.put(s,r,o?.signal)}async function rr(n,e,t){let r=`/v1/inventory/transfers/${a(e)}/reject`;return n.client.post(r,void 0,t?.signal)}async function or(n,e,t,r,o,s){let i=`/v1/saves/${a(e)}/${a(t)}/${a(r)}/upload-url`;return n.client.post(i,o,s?.signal,{replaySafe:true})}async function sr(n,e,t,r,o,s){let i=`/v1/inventory/${a(e)}/${a(t)}/progressions/${a(r)}/reset`;return n.client.post(i,o,s?.signal)}async function ar(n,e,t,r,o){let s=`/v1/inventory/${a(e)}/${a(t)}/orders/simulate`;return n.client.post(s,r,o?.signal)}async function ir(n,e,t,r){let o=`/v2/games/${a(n.gameId())}/game-rooms/${a(e)}/transfer/${a(t)}`;return n.client.post(o,void 0,r?.signal)}async function lr(n,e,t,r){let o=`/v2/games/${a(n.gameId())}/game-rooms/${a(e)}`;return n.client.patch(o,t,r?.signal,{...r?.ifMatch===void 0?{}:{ifMatch:r.ifMatch}})}var oe="gem_";var cr=1e4,mr=50,gr=1e3,pr=65536-4*1024,se=n=>typeof n=="number"?n:0,yr=n=>typeof n=="string"?n:"";function ae(){let n=globalThis.crypto;return typeof n?.randomUUID=="function"?n.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.floor(Math.random()*16);return (e==="x"?t:t&3|8).toString(16)})}function fr(n){return n?.retryable===true}function hr(n,e){let t=n??{},r=Array.isArray(t.rejected)?t.rejected.map(o=>{let s=o??{};return {index:se(s.index),code:yr(s.code)}}):[];return {accepted:se(t.accepted),rejected:r,dropped:e,duplicate:t.duplicate===true}}function ie(n,e){return {event_uid:n.uid,name:n.name,offset_ms:Math.round(n.atMs)-e,player_id:n.playerId,dimensions:n.dimensions,measures:n.measures}}function le(n){let e=Math.max(1,Math.floor(n.maxQueue??gr)),t={client:n.client,gameId:()=>n.gameId},r=[],o=0,s=null,i=false,l=false,d=false,c=false,m=y=>{n.log?.(y);},b=()=>{s!==null&&(n.clock.clearTimeout(s),s=null);},x=()=>{s!==null||i||l||(s=n.clock.setTimeout(()=>{s=null,v().catch(()=>{});},cr));},f=()=>{let y=Math.min(r.length,100),h=128;for(let w=0;w<y;w+=1){let A=r[w];if(A===void 0)break;if(h+=JSON.stringify(ie(A,0)).length+1,h>pr)return Math.max(1,w)}return y};async function v(y){if(r.length===0)return {accepted:0,rejected:[],dropped:0,duplicate:false};b();let h=r.splice(0,f()),w=o;o=0;let A=Math.round(n.clock.now()),L={batch_id:ae(),sent_at_ms:A,events:h.map(S=>ie(S,A))};l=true;try{let S=await D(t,L,y===void 0?void 0:{signal:y}),P=hr(S,w);for(let be of P.rejected)m(`[gem] analytics: an event was refused (${be.code}). See the analytics_events section of your game config.`);return P}catch(S){if(fr(S))for(r=[...h,...r],o+=w;r.length>e;)r.shift(),o+=1;else m(`[gem] analytics: ${h.length} event(s) were discarded \u2014 the platform refused the batch and will refuse it again: ${String(S)}`);throw S}finally{l=false,r.length>0&&x();}}return {track(y,h,w={}){if(i)return;if(typeof y!="string"||y===""){c||(c=true,m(`[gem] analytics: '${h}' was not recorded \u2014 an event from a server has to name the player it is about. A game-server token names no player, so the platform cannot infer one; pass the id from join() or host.players().`));return}if(h.startsWith(oe)){d||(d=true,m(`[gem] analytics: '${h}' was not recorded \u2014 the gem_ prefix is reserved, and the platform's own events are client-sourced, so a server may not emit one at all. Name your event something else.`));return}let A={},L={};for(let[S,P]of Object.entries(w))typeof P=="string"?A[S]=P:typeof P=="number"&&Number.isFinite(P)&&(L[S]=P);for(;r.length>=e;)r.shift(),o+=1;r.push({uid:ae(),playerId:y,name:h,atMs:n.clock.now(),dimensions:A,measures:L}),r.length>=mr?v().catch(()=>{}):x();},flush:y=>v(y),get pending(){return r.length},dispose(){i=true,b(),r=[],o=0;}}}var _r=new Map([["function_error",false],["function_failed",false],["function_timeout",false],["function_not_published",false],["function_input_too_large",false],["functions_not_configured",false],["forbidden",false],["function_capacity_unavailable",true],["function_host_unreachable",true],["function_host_error",true],["rate_limited",true],["service_unavailable",true]]),I=class extends g{constructor(e,t){super(e.reason,e.status,e.detail,e.retryAfterSeconds,e.code),this.name="GemFunctionError",Object.assign(this,t);}get retryable(){return (this.code===void 0?void 0:_r.get(this.code))??super.retryable}},C=class{#e;constructor(e){this.#e=e;}async invoke(e,t={}){let r=br(e),o;try{o=await this.#e(r,t.signal===void 0?{}:{signal:t.signal});}catch(s){throw s instanceof g?Rr(s):s}return vr(o)}};function br(n){if(n instanceof ArrayBuffer)return new Uint8Array(n);if(ArrayBuffer.isView(n))return new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let e;try{e=JSON.stringify(n);}catch(t){throw new p(`the function input could not be serialised to JSON: ${String(t)}. Pass bytes, or a value JSON can carry. This is a bug in the call, not a server failure.`)}if(e===void 0)throw new p(`the function input is ${typeof n}, which JSON cannot carry. Pass bytes \u2014 an empty Uint8Array for no input \u2014 or a JSON value. This is a bug in the call, not a server failure.`);return new TextEncoder().encode(e)}function vr(n){let{bytes:e}=n,t=()=>new TextDecoder("utf-8",{fatal:true}).decode(e);return {bytes:e,...n.invocationId===void 0?{}:{invocationId:n.invocationId},text:t,json:()=>JSON.parse(t())}}function Rr(n){let{details:e,invocationId:t}=X(n),o=e?.untrusted?.message,s=e?.reason;return new I(n,{...t===void 0?{}:{invocationId:t},...n.code==="function_error"&&typeof o=="string"?{functionMessage:o}:{},...n.code==="function_failed"&&typeof s=="string"?{failure:s}:{}})}var k=n=>typeof n=="string"?n:"",xr=/(?:Z|[+-]\d{2}:?\d{2})$/i;function de(n){let e=k(n);if(!xr.test(e))return 0;let t=Date.parse(e);return Number.isFinite(t)?Math.floor(t/1e3):0}var Sr=/^[0-9a-f]{1,64}$/,kr=/^[0-9a-f]{16}$/,wr=/^[A-Za-z][A-Za-z0-9_+\-/]{0,63}$/,Ar=/^(?:[01]\d|2[0-3]):[0-5]\d$/;function Pr(n){let e=k(n),t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!t)return;let[r,o,s]=[Number(t[1]),Number(t[2]),Number(t[3])],i=new Date(Date.UTC(r,o-1,s));return i.getUTCFullYear()===r&&i.getUTCMonth()===o-1&&i.getUTCDate()===s?e:void 0}var Tr=4096,Or=new TextEncoder;function Gr(n){let e=k(n.challenge_data),t=k(n.challenge_data_hash);return e===""||!kr.test(t)?{}:Or.encode(e).length>Tr?{}:{data:e,dataHash:t}}function Cr(n){let e=n??{},t=de(e.period_start_at),r=de(e.period_ends_at);if(t===0||r===0)return;let o=k(e.slug),s=k(e.seed),i=Pr(e.period_local_date),l=k(e.boundary),d=k(e.reset_time);return {id:k(e.progression_definition_id),...o===""?{}:{slug:o},window:k(e.window),periodStartAt:t,periodEndsAt:r,...i===void 0?{}:{periodLocalDate:i},boundary:wr.test(l)?l:"",resetTime:Ar.test(d)?d:"",seed:Sr.test(s)?s:"",...Gr(e)}}function ue(n){if(n!==void 0&&(!Number.isInteger(n)||n<0||n>400))throw new TypeError(`periodsBack must be an integer between 0 and 400, got ${String(n)}`)}function ce(n){let e=n??{};return Array.isArray(e.challenges)?e.challenges.map(Cr).filter(t=>t!==void 0):[]}function me(n){return {async list(e){let{playerId:t,periodsBack:r,signal:o}=e??{};if(typeof t!="string"||t==="")throw new TypeError("gem.challenges.list needs { playerId }: a game-server token names no player, so the platform cannot tell whose period you mean. Pass the id from join() or gem.players().");ue(r);let s=await n({player_id:t,...r===void 0?{}:{periods_back:r},...o===void 0?{}:{signal:o}});return ce(s)}}}function Er(n){let e={};for(let[t,r]of Object.entries(H))if(typeof r=="function"){let o=r;e[t]=(...s)=>o(n,...s);}return e}function F(n,e={}){let t=e.clock??G,r=e.baseUrl??n.apiBaseUrl;if(!r)throw new Error("this runtime names no gem-api host (host.apiBaseUrl is missing). The server image running this bundle predates token delivery \u2014 the bundle cannot call gem-api on it.");let o=N(n,{clock:t,...e.onAuthStateChange===void 0?{}:{onStateChange:e.onAuthStateChange}}),s=Q({baseUrl:r,tokenSource:o.source,defaultQuery:{game_id:n.gameId,channel:n.channel},...e.fetch===void 0?{}:{fetch:e.fetch}}),i=new T({transport:s,clock:t}),l={gameId:n.gameId,channel:n.channel,matchId:n.matchId,...n.gameRoomId===void 0?{}:{gameRoomId:n.gameRoomId}},d=Er({client:i,gameId:()=>l.gameId}),c=l.gameRoomId,m=n.endMatch,b=n.log,x=le({client:i,clock:t,gameId:l.gameId,...typeof b=="function"?{log:v=>b.call(n,v)}:{}});return {identity:l,client:i,api:d,match:{end:async()=>{if(m===void 0)throw new Error("this runtime cannot end the match: the server image running this bundle predates host.endMatch, and only the platform half holds the allocation proof an end needs.");await m.call(n);}},analytics:x,functions:new C(d.invokeFunction),challenges:me(d.listChallenges),...c===void 0?{}:{room:{get:v=>d.getGameRoomV2(c,v),args:async v=>{let y=await d.getGameRoomV2(c,v?.signal===void 0?{}:{signal:v.signal}),h=y.modified?y.body:void 0;if(h?.room_args==null||h.room_args_template==null)throw new g("not_found",404,"this room's template declares no room args",void 0,"room_args_not_defined");return {room_args:h.room_args,room_args_template:h.room_args_template}}}},dispose:()=>{x.dispose(),o.dispose();}}}var Ir=["explicit","stale_cleanup","game_room_closed","replaced","migration_failed","host_left","insufficient_players","all_left","expired","migration_rate_exceeded","game_room_gone","failed","idle","reclaimed"],qr=new Set(Ir);function ge(n){return typeof n=="string"&&qr.has(n)?n:"unknown"}var R=class{#e;constructor(e){this.#e=e,Object.freeze(this);}toString(){return "[gem: use gem.text.toPlain()]"}toJSON(){return this.toString()}get[Symbol.toStringTag](){return "PlayerText"}static unwrap(e){return e.#e}};function q(n){return new R(n)}var pe={toPlain(n){return R.unwrap(n)},compare(n,e,t){let r=n instanceof R?R.unwrap(n):n,o=e instanceof R?R.unwrap(e):e,s;try{s=new Intl.Collator(t);}catch{s=new Intl.Collator;}return s.compare(r,o)},equals(n,e){let t=n instanceof R?R.unwrap(n):n,r=e instanceof R?R.unwrap(e):e;return t.normalize("NFC")===r.normalize("NFC")}};var ye="the match has not started yet: the runtime hands over the host at `init`, and this was read before that. Read it from `init` or later \u2014 a bundle that needs a value at module scope is reading it one call too early.";function V(n,e={}){let t=e.clock??G,r=()=>{let l=n();if(l===null)throw new Error(ye);return l},o=null,s=()=>{if(o===null)throw new Error(ye);return o};return {server:{get identity(){return s().identity},get client(){return s().client},get api(){return s().api},get match(){return s().match},get analytics(){return s().analytics},get functions(){return s().functions},get challenges(){return s().challenges},get room(){return s().room},dispose(){o?.dispose();},get sizeClass(){return r().sizeClass},get roomArgs(){return r().roomArgs},get roster(){return r().roster},players(){return r().players()},profile(l){let c=r().profile?.(l);if(!c)return null;let m=c.displayName;return typeof m!="string"||m===""?null:{displayName:q(m),...typeof c.displayTag=="string"&&c.displayTag!==""?{displayTag:q(c.displayTag)}:{},...typeof c.discriminator=="string"?{discriminator:c.discriminator}:{}}},playerNumber(l){return r().playerNumber?.(l)},send(l,d,c){c===void 0?r().send(l,d):r().send(l,d,c);},broadcast(l,d){d===void 0?r().broadcast(l):r().broadcast(l,d);},kick(l,d){d===void 0?r().kick(l):r().kick(l,d);},log(l){r().log(l);},warn(l){r().warn(l);}},attach:()=>{o=F(r(),{...e,clock:t});}}}function fe(n,e={}){let{server:t,attach:r}=V(()=>n,e);return r(),t}function Lr(n){if(n===void 0||typeof n.reason!="string"||n.reason==="")return;let e=n.platform_reason??n.endedReason;return {reason:n.reason,...e===void 0?{}:{endedReason:ge(e)}}}function he(n,e={}){return ()=>{let t=null,{server:r,attach:o}=V(()=>t,e),s=n(r),i={async init(l){t=l,o(),await s.init?.();},async shutdown(l){let d=Lr(l);try{await s.shutdown?.(d);}finally{r.dispose();}}};return s.join&&(i.join=(l,d)=>s.join?.(l,d)),s.leave&&(i.leave=(l,d)=>s.leave?.(l,d)),s.message&&(i.message=(l,d,c,m)=>s.message?.(l,d,c,m)),i}}var $r=new Set(["unlocked","already_unlocked","suppressed"]);function _e(n){let e=n?.changes;if(!Array.isArray(e))return [];let t=[];for(let r of e){let o=r??{};if(o.type!=="achievement_unlocked"||typeof o.outcome!="string"||!$r.has(o.outcome)||typeof o.achievement_id!="string"||o.achievement_id==="")continue;let s=o.outcome;t.push({achievementId:o.achievement_id,progressionDefinitionId:typeof o.progression_definition_id=="string"?o.progression_definition_id:"",points:s==="unlocked"&&typeof o.points=="number"&&Number.isFinite(o.points)?o.points:0,outcome:s,...typeof o.reason=="string"?{reason:o.reason}:{}});}return t}
2
- export{_ as AuthError,j as CONDITIONAL_HEADERS,C as FunctionsApi,g as GemApiError,T as GemClient,I as GemFunctionError,R as PlayerText,p as TransportRefusal,_e as achievementReceipts,q as asPlayerText,F as createGemServer,re as createHostTokenSource,fe as createMatchServer,he as defineServer,G as systemClock,pe as text,K as toBase64};//# sourceMappingURL=gem-web-sdk.server.js.map
1
+ var ve=Object.defineProperty;var Re=(n,e)=>{for(var t in e)ve(n,t,{get:e[t],enumerable:true});};globalThis.__gemWebSdkVersion="[gem-web-sdk:sdkVersion:10.2.0]";function xe(n,e){return e!==void 0?!e:n==="chain_exhausted"}var L=class{constructor(e){this.options=e;}options;grant=null;state="pending";failure=null;generation=0;inFlight=null;rejected=false;get currentState(){return this.state}get lastFailure(){return this.failure}async get(){if(this.state==="lost")throw new R(this.failure??"unavailable","the session cannot be renewed");let e=this.seconds();if(this.grant&&e<this.grant.expiresAt-this.renewBefore())return this.grant.token;if(this.grant&&e>=this.grant.chainEndsAt)throw this.enter("lost","chain_exhausted"),new R("chain_exhausted","the token chain reached its ceiling");return this.refresh(this.nextReason())}nextReason(){return this.rejected?"rejected":this.grant?"expiring":"initial"}invalidate(e){e!==void 0&&this.grant!==null&&this.grant.token!==e||this.rejected&&this.grant===null||(this.grant=null,this.generation+=1,this.inFlight=null,this.rejected=true,this.state!=="lost"&&this.enter("pending"));}accept(e){this.state!=="lost"&&(this.grant=e,this.rejected=false,this.enter("ready"));}close(e="unavailable"){this.grant=null,this.generation+=1,this.inFlight=null,this.enter("lost",e);}refresh(e){if(this.inFlight)return this.inFlight;let t=this.generation;this.enter("pending");let r=this.options.request(e).then(o=>{if(t!==this.generation)throw new R("internal","token arrived for a superseded generation");return this.grant=o,this.rejected=false,this.enter("ready"),o.token}).catch(o=>{let a=Se(o),i=o?.retryable;throw t===this.generation&&this.enter(xe(a,typeof i=="boolean"?i:void 0)?"lost":"degraded",a),o instanceof R?o:new R(a,String(o))}).finally(()=>{this.inFlight===r&&(this.inFlight=null);});return this.inFlight=r,r}enter(e,t){this.failure=t??(e==="ready"?null:this.failure),this.state!==e&&(this.state=e,this.options.onStateChange?.(e,t));}renewBefore(){return this.options.renewBeforeSeconds??60}seconds(){return Math.floor(this.options.clock.now()/1e3)}},R=class n extends Error{constructor(t,r){super(`auth ${t}: ${r}`);this.reason=t;this.name="AuthError";}reason;static isAuthError(t){if(t instanceof n)return true;let r=t;return r?.name==="AuthError"&&typeof r.reason=="string"}};function Se(n){if(n instanceof R)return n.reason;let e=n?.reason;return typeof e=="string"&&["chain_exhausted","unavailable","timeout","internal"].includes(e)?e:"internal"}var h=class n extends Error{retryable=false;constructor(e){super(e),this.name="TransportRefusal";}static isRefusal(e){if(e instanceof n)return true;let t=e;return t?.name==="TransportRefusal"&&t.retryable===false}},$=["if-match","if-none-match"],W=4096;function ke(n){if(!n)return;let e={};for(let[t,r]of Object.entries(n)){let o=t.toLowerCase();if(!$.includes(o)||r===void 0)continue;let a=typeof r=="string"?we(r):r;if(typeof a!="string"||a.length>W||!Ae(a))throw new h(`the ${o} header value cannot be sent \u2014 it is not a string, is longer than ${W} characters, or contains a character outside the range an HTTP header value may carry. This is a malformed request, not a server failure; the value is withheld here rather than written to logs.`);a!==""&&(e[o]=a);}return Object.freeze(e)}function we(n){let e=o=>o===32||o===9||o===10||o===13,t=0,r=n.length;for(;t<r&&e(n.charCodeAt(t));)t++;for(;r>t&&e(n.charCodeAt(r-1));)r--;return n.slice(t,r)}function Ae(n){for(let e=0;e<n.length;e++){let t=n.charCodeAt(e);if(t!==9&&(t<32||t===127||t>255))return false}return true}function Pe(n){let{bytes:e}=n;if(e!==void 0){if(Object.prototype.toString.call(e)!=="[object Uint8Array]")throw new h("the raw body is not a Uint8Array, so it cannot be sent as bytes. This is a malformed request, not a server failure.");if(n.body!==void 0)throw new h("the request carries both a JSON body and a raw body, and only one can be sent. This is a malformed request, not a server failure.");return new Uint8Array(e)}}function z(n,e){let t=e.replayUnauthorizedOnce??true;return {async request(r){let o={...r},a=ke(o.headers),i=Pe(o),d=Object.freeze({...o,headers:a,...i===void 0?{}:{bytes:i}}),l=await e.tokenSource.get(),c=await n(d,l);if(c.status!==401||!t)return c;e.tokenSource.invalidate(l);let p=await e.tokenSource.get(),b=await n(d,p);if(b.status===401)throw e.tokenSource.close("unavailable"),new R("unavailable","the server refused a freshly minted token");return b}}}function K(n){let e=typeof n=="string"?new TextEncoder().encode(n):n;return btoa(Te(e))}function Te(n){let t="";for(let r=0;r<n.length;r+=32768)t+=String.fromCharCode(...n.subarray(r,r+32768));return t}var g=class extends Error{constructor(t,r,o,a,i){super(`${t} (${r}): ${o}`);this.reason=t;this.status=r;this.detail=o;this.retryAfterSeconds=a;this.code=i;this.name="GemApiError";}reason;status;detail;retryAfterSeconds;code;get retryable(){return this.reason==="unavailable"||this.reason==="rate_limited"}},J=new WeakMap;function X(n){return J.get(n)??{}}var Oe=new Set([408,429,500,502,503,504]),Ge=6e4;function Ce(n){if(n===void 0)return 2;if(!Number.isInteger(n)||n<0||n>10)throw new h(`maxRetries must be a whole number between 0 and 10; received ${JSON.stringify(n)}. This is a configuration fault, not a server failure.`);return n}var T=class{constructor(e){this.options=e;}options;async get(e,t){return this.send({method:"GET",path:e,signal:t},true)}async getWithEtag(e,t={}){let r=await this.sendRaw({method:"GET",path:e,...t.signal===void 0?{}:{signal:t.signal},...t.ifNoneMatch===void 0?{}:{headers:{"if-none-match":t.ifNoneMatch}}},true),o=r.etag===void 0?{}:{etag:r.etag};return r.status===304?{modified:false,...o}:{modified:true,body:r.body,...o}}async put(e,t,r,o={}){return this.send({method:"PUT",path:e,body:t,signal:r,...E(o)},o.replaySafe===true)}async post(e,t,r,o={}){return this.send({method:"POST",path:e,body:t,signal:r,...E(o)},o.replaySafe===true)}async postBytes(e,t,r,o={}){let a=await this.sendRaw({method:"POST",path:e,bytes:t,responseType:"bytes",signal:r,...E(o)},o.replaySafe===true);return {bytes:Ee(a.body),...a.invocationId===void 0?{}:{invocationId:a.invocationId}}}async patch(e,t,r,o={}){return this.send({method:"PATCH",path:e,body:t,signal:r,...E(o)},o.replaySafe===true)}async delete(e,t,r={}){return this.send({method:"DELETE",path:e,signal:t,...E(r)},r.replaySafe===true)}async send(e,t){return (await this.sendRaw(e,t)).body}async sendRaw(e,t){let r=t?Ce(this.options.maxRetries)+1:1,o=null;if(e.signal?.aborted)throw Y(e.signal);for(let a=0;a<r;a++){if(a>0&&await this.backoff(a,o,e.signal),e.signal?.aborted)throw Y(e.signal);let i;try{i=await this.options.transport.request(e);}catch(l){if(R.isAuthError(l)||h.isRefusal(l)||e.signal?.aborted||Ie(l))throw l;o=new g("unavailable",0,String(l));continue}if(i.status>=200&&i.status<300||i.status===304)return i;let d=qe(i);if(!Oe.has(i.status))throw d;o=d;}throw o??new g("unavailable",0,"no attempt was made")}backoff(e,t,r){if(r?.aborted)return Promise.resolve();let o=t?.retryAfterSeconds,a=o!==void 0?o*1e3:2**(e-1)*250,i=2**(e-1)*250,d=Math.min(Math.max(a,i),Ge);return new Promise(l=>{let c=this.options.clock,p=false,b=false,S,_=()=>{p||(p=true,b&&c.clearTimeout(S),r?.removeEventListener("abort",_),l());};r?.addEventListener("abort",_,{once:true}),S=c.setTimeout(_,d),b=true,p&&c.clearTimeout(S);})}};function Ee(n){if(n instanceof Uint8Array)return n;if(n==null)return new Uint8Array(0);let e=typeof n=="string"?n:JSON.stringify(n);return new TextEncoder().encode(e)}function E(n){return {...n.keepalive===void 0?{}:{keepalive:n.keepalive},...n.ifMatch===void 0?{}:{headers:{"if-match":n.ifMatch}}}}function Y(n){return n.reason!==void 0?n.reason:new DOMException("The operation was aborted.","AbortError")}function Ie(n){let e=n?.name;return e==="AbortError"||e==="TimeoutError"}function qe(n){let e=Le(n),t=je(n.body),r={...t===void 0?{}:{details:t},...n.invocationId===void 0?{}:{invocationId:n.invocationId}};return Object.keys(r).length>0&&J.set(e,r),e}var Me=new Map([["insufficient_funds","insufficient_funds"]]);function Le(n){let{status:e,body:t}=n,r=$e(t),o=n.retryAfterSeconds??Be(t),a=Fe(t),i=a===void 0?void 0:Me.get(a);if(i!==void 0)return new g(i,e,r,void 0,a);switch(e){case 304:return new g("not_modified",e,r);case 400:case 422:return new g("invalid",e,r,void 0,a);case 403:return new g("forbidden",e,r,void 0,a);case 404:return new g("not_found",e,r,void 0,a);case 402:return new g("insufficient_funds",e,r,void 0,a);case 409:return new g("conflict",e,r,void 0,a);case 412:return new g("precondition_failed",e,r,void 0,a);case 413:return new g("too_large",e,r,void 0,a);case 429:return new g("rate_limited",e,r,o,a);default:return new g("unavailable",e,r,o,a)}}function $e(n){if(typeof n=="string")return n;let e=n?.message;if(typeof e=="string")return e;let t=n?.error;if(typeof t=="string")return t;let r=t?.message;return typeof r=="string"?r:"no detail"}function je(n){let t=n?.error?.details;return t===null?void 0:t}function Fe(n){let t=n?.error?.code;return typeof t=="string"&&t.length>0?t:void 0}function Be(n){let e=n?.retryAfterSeconds;return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function Ue(n){let e=n.lastIndexOf("@");return (e===-1?n:`***@${n.slice(e+1)}`).slice(0,200)}var Ne=new Set($);function De(n){if(!n)return {};let e={};for(let[t,r]of Object.entries(n))Ne.has(t.toLowerCase())&&(e[t.toLowerCase()]=r);return e}function Q(n){let e=n.fetch??globalThis.fetch.bind(globalThis);return z(async(t,r)=>{let o;try{o=new URL(n.baseUrl.replace(/\/+$/,""));}catch{throw new h("the configured baseUrl is not a valid URL. Its value is withheld here rather than written to logs. This is a configuration fault, not a server failure.")}let a;try{a=new URL(o.href.replace(/\/+$/,"")+t.path);}catch{throw new h(`${JSON.stringify(typeof t.path=="string"?Ue(t.path):"(a non-string path)")} does not form a valid URL against ${o.protocol}//${o.host}. This is a malformed request, not a server failure.`)}if(a.protocol!==o.protocol||a.host!==o.host)throw new h(`${JSON.stringify(a.pathname)} resolves to ${a.protocol}//${a.host}, not ${o.protocol}//${o.host}. A request path may not change the request's origin \u2014 it carries the play token.`);if(a.username!==""||a.password!==""){let _=o.username!==""||o.password!=="",y=a.username!==o.username||a.password!==o.password,m=_?y?"baseUrl (and possibly the request path)":"baseUrl":"request path";throw new h(`the ${m} puts credentials in the URL, which cannot be fetched (${t.method} ${a.pathname}). The value is withheld here rather than written to logs. This is a malformed request, not a server failure.`)}for(let[_,y]of Object.entries(n.defaultQuery??{}))a.searchParams.has(_)||a.searchParams.set(_,y);let i=t.bytes,d=t.bytes===void 0?void 0:"application/octet-stream";try{t.body!==void 0&&(i=JSON.stringify(t.body),d="application/json");}catch(_){throw new h(`the body of ${t.method} ${JSON.stringify(a.pathname)} could not be serialised to JSON: ${String(_)}. This is a bug in the request, not a server failure \u2014 retrying sends the same unserialisable value.`)}let l=await e(a.toString(),{method:t.method,headers:{authorization:`Bearer ${r}`,...d===void 0?{}:{"content-type":d},...De(t.headers)},body:i,signal:t.signal,...t.keepalive===void 0?{}:{keepalive:t.keepalive},credentials:"omit",mode:"cors",redirect:"error",cache:"no-store",referrerPolicy:"no-referrer"}),c=null;if(t.responseType==="bytes"&&l.status>=200&&l.status<300)c=new Uint8Array(await l.arrayBuffer());else {let _=await l.text();if(_.length>0)try{c=JSON.parse(_);}catch{c=_;}}let p=l.headers.get("etag"),b=He(l.headers.get("retry-after")),S=l.headers.get("x-gem-invocation-id");return {status:l.status,body:c,...p===null?{}:{etag:p},...b===void 0?{}:{retryAfterSeconds:b},...S===null||S===""?{}:{invocationId:S}}},n)}function He(n){if(n===null)return;let e=n.trim();if(!/^\d+$/.test(e))return;let t=Number(e);return Number.isFinite(t)?t:void 0}var Ve="gem-web-bridge";var O=65536,Z=8,j=5e3,ee=1024;function U(n){return Object.freeze(Object.assign(Object.create(null),n))}U({"gem.handshake":30,"gem.handshake.accept":5,"gem.token":30,"gem.token.denied":30,"gem.player":12,"gem.pause":120,"gem.prefs":60,"gem.cohorts":12,"gem.earnAllowanceChanged":30,"gem.viewport":60,"gem.deviceSettings":12,"gem.willTerminate":10,"gem.roomEvent":120,"gem.socketState":12,"gem.seatedEvent":60,"gem.autoStartFailedEvent":30,"gem.signalEvent":1800,"gem.dedicatedEvent":120,"gem.partyResult":30,"gem.clusterTarget":12,"gem.devtools":30,"gem.screenshot":6,"gem.screenshot.denied":12,"gem.requestContext":12,"gem.gameContext":12,"gem.signal":1200,"gem.dedicatedOffer":60,"gem.partyRequest":12,"gem.ready":5,"gem.engaged":5,"gem.progress":600,"gem.requestToken":12,"gem.requestLocalServer":6,"gem.localServer":30,"gem.localServer.denied":30,"gem.exit":5,"gem.openExternal":6,"gem.requestFullscreen":30,"gem.audioState":120,"gem.rewardCue":60,"gem.walletDisplay":60,"gem.menu":60,"gem.menuSelect":60,"gem.requestShare":6,"gem.requestAvatarPicker":6,"gem.vibrate":600,"gem.frameStats":120,"gem.portraitBorders":60,"gem.error":60,"gem.requestPurchase":12,"gem.purchaseResult":30,"gem.deviceSettings.put":30,"gem.deviceSettings.result":30,"gem.requestAd":6,"gem.adResult":12,"gem.requestSignIn":6,"gem.signInResult":12,"gem.requestFriendChallenge":12,"gem.friendChallengeResult":30,__malformed:60});U({"gem.requestAd":"ads","gem.adResult":"ads","gem.requestSignIn":"signIn","gem.signInResult":"signIn","gem.requestPurchase":"purchases","gem.purchaseResult":"purchases","gem.requestFriendChallenge":"friendChallenges","gem.friendChallengeResult":"friendChallenges","gem.devtools":"devtools","gem.screenshot":"screenshot","gem.screenshot.denied":"screenshot","gem.requestContext":"feedbackContext","gem.gameContext":"feedbackContext","gem.roomEvent":"rooms","gem.signal":"p2p","gem.signalEvent":"p2p","gem.dedicatedOffer":"dedicated","gem.dedicatedEvent":"dedicated","gem.clusterTarget":"clusterTarget","gem.partyRequest":"parties","gem.partyResult":"parties","gem.autoStartFailedEvent":"autoStartFailure","gem.seatedEvent":"partySeating","gem.socketState":"socketState","gem.audioState":"audioState","gem.rewardCue":"rewardCue","gem.frameStats":"frameStats","gem.portraitBorders":"portraitBorders","gem.engaged":"engagement","gem.viewport":"viewport","gem.walletDisplay":"walletDisplay","gem.requestLocalServer":"localHost","gem.localServer":"localHost","gem.localServer.denied":"localHost","gem.cohorts":"cohorts","gem.earnAllowanceChanged":"earnAllowance","gem.deviceSettings":"deviceSettings","gem.deviceSettings.put":"deviceSettings","gem.deviceSettings.result":"deviceSettings","gem.requestShare":"share","gem.requestAvatarPicker":"avatarPicker","gem.vibrate":"vibration","gem.menu":"gameMenu","gem.menuSelect":"gameMenu"});function ze(n){let e=/^([a-z][a-z0-9+.-]*):\/\/([a-z0-9.-]+|\[[0-9a-f:.]+\])(:([0-9]{1,5}))?$/i.exec(n);return e===null?false:e[4]===void 0||Number(e[4])<=65535}function Ke(n){let e;try{e=new URL(n);}catch{return false}return e.username!==""||e.password!==""?false:e.protocol==="https:"?true:e.protocol==="http:"&&(e.hostname==="localhost"||e.hostname==="127.0.0.1")}function Ye(n){return /^[a-z]{2,8}(-[a-z0-9]{1,8})*$/i.test(n)}function Je(n){return /^[a-z_]+$/.test(n)}function B(n,e,t){if(e>Z)return `nesting deeper than ${Z}`;if(++t.nodes>j)return `more than ${j} values`;if(t.bytes>O)return `over the ${O} byte limit`;if(n==null)return t.bytes+=4,null;let r=typeof n;if(r==="boolean")return t.bytes+=5,null;if(r==="number")return t.bytes+=8,null;if(r==="string")return t.bytes+=n.length*3+2,null;if(r!=="object")return `${r} is not plain data`;let o=n;if(t.seen.has(o))return "a repeated or cyclic object reference";if(t.seen.add(o),Array.isArray(n)){if(n.length>ee)return `an array of ${n.length} entries, over the ${ee} limit`;t.bytes+=2;for(let d of n){let l=B(d,e+1,t);if(l)return l}return null}let a=Object.getPrototypeOf(n);if(a!==Object.prototype&&a!==null)return "a value that is not a plain object";t.bytes+=2;let i=n;for(let d in i){if(!Object.prototype.hasOwnProperty.call(i,d))continue;if(++t.nodes>j)return `more than ${j} values`;if(t.bytes+=d.length*3+4,t.bytes>O)return `over the ${O} byte limit`;let l=B(i[d],e+1,t);if(l)return l}return null}function Xe(n){let e={nodes:0,bytes:0,seen:new Set},t=B(n,0,e);return t?`message contains ${t}`:e.bytes>O?`message is over the ${O} byte limit`:null}var Qe={origin:[ze,"not a well-formed origin"],url:[Ke,"not a safe absolute http(s) URL"],bcp47:[Ye,"not a well-formed BCP 47 tag"],code:[Je,"not a code of lower-case letters and underscores"]};function ne(n,e,t){for(let r of e){let o=t===""?r.n:`${t}.${r.n}`,a=n[r.n];if(a==null){if(r.o)continue;return `${o}: required`}let i=te(a,r,o);if(i)return i}return null}function te(n,e,t){switch(e.k){case "s":{if(typeof n!="string")return `${t}: expected string`;if(n.length>e.max)return `${t}: exceeds ${e.max} characters`;if(e.f){let[r,o]=Qe[e.f];if(!r(n))return `${t}: ${o}`}return null}case "i":return typeof n!="number"||!Number.isInteger(n)?`${t}: expected integer`:n<e.lo||n>e.hi?`${t}: out of range ${e.lo}..${e.hi}`:null;case "b":return typeof n=="boolean"?null:`${t}: expected boolean`;case "e":{let r=e.v;return r.includes(n)?null:`${t}: not one of ${r.join("|")}`}case "o":return typeof n!="object"||n===null||Array.isArray(n)?`${t}: expected object`:ne(n,e.fs,t);case "j":return typeof n!="object"||n===null||Array.isArray(n)?`${t}: expected a plain object`:null;case "a":{if(!Array.isArray(n))return `${t}: expected array`;if(n.length>e.max)return `${t}: exceeds ${e.max} items`;let r=e.it,o=`${t}[]`;for(let a of n){if(a==null){if(r.o)continue;return `${o}: required`}let i=te(a,r,o);if(i)return i}return null}default:{let r=e.k;return `${t}: unknown kind ${String(r)}`}}}function u(n,e){return t=>{let r=Xe(t);if(r)return r;if(typeof t!="object"||t===null||Array.isArray(t))return "message: expected object";let o=t;return o.gem!==Ve?"gem: wrong protocol marker":o.type!==n?`type: expected ${n}`:ne(o,e,"")}}var Ze=u("gem.handshake",[{n:"versions",k:"o",fs:[{n:"min",k:"i",lo:1,hi:1e3},{n:"max",k:"i",lo:1,hi:1e3}]},{n:"capabilities",k:"a",o:1,max:64,it:{n:"",k:"s",max:64}},{n:"embedder",k:"s",max:2048,f:"origin"},{n:"unbidden",k:"b",o:1}]),en=u("gem.handshake.accept",[{n:"v",k:"i",lo:1,hi:1e3},{n:"capabilities",k:"a",o:1,max:64,it:{n:"",k:"s",max:64}}]),nn=u("gem.token",[{n:"token",k:"s",max:4096},{n:"requestId",k:"s",o:1,max:64},{n:"generation",k:"i",lo:0,hi:2147483647},{n:"apiBaseUrl",k:"s",o:1,max:512,f:"url"},{n:"playerId",k:"s",max:64},{n:"gameId",k:"s",max:64},{n:"channel",k:"e",v:["dev","test","release"]},{n:"gameVersion",k:"s",o:1,max:64},{n:"expiresAt",k:"i",lo:0,hi:4102444800},{n:"chainEndsAt",k:"i",lo:0,hi:4102444800},{n:"allowDevTools",k:"b",o:1}]),tn=u("gem.token.denied",[{n:"requestId",k:"s",max:64},{n:"retryable",k:"b"},{n:"retryAfterMs",k:"i",o:1,lo:0,hi:36e5},{n:"reason",k:"e",v:["chain_exhausted","unavailable"]},{n:"correlationId",k:"s",max:64}]),rn=u("gem.player",[{n:"untrusted",k:"o",fs:[{n:"displayName",k:"s",max:64},{n:"displayTag",k:"s",o:1,max:80},{n:"displayHandle",k:"s",max:80}]},{n:"playerId",k:"s",o:1,max:64},{n:"discriminator",k:"s",o:1,max:8},{n:"avatarIconUrl",k:"s",o:1,max:2048,f:"url"},{n:"avatarIconId",k:"s",o:1,max:64},{n:"badges",k:"a",o:1,max:2,it:{n:"",k:"o",fs:[{n:"itemId",k:"s",max:64},{n:"iconUrl",k:"s",max:2048,f:"url"}]}},{n:"displayTag",k:"s",max:8},{n:"avatarUrl",k:"s",o:1,max:2048,f:"url"},{n:"boost",k:"o",o:1,fs:[{n:"multipliers",k:"a",max:8,it:{n:"",k:"o",fs:[{n:"currencyId",k:"s",max:64},{n:"currencySlug",k:"s",max:32},{n:"multiplierBp",k:"i",lo:1e4,hi:1e6}]}},{n:"expiresInDays",k:"i",o:1,lo:1,hi:7}]}]),on=u("gem.pause",[{n:"paused",k:"b"}]),an=u("gem.prefs",[{n:"reducedMotion",k:"b"},{n:"muted",k:"b"},{n:"showFrameStats",k:"b",o:1},{n:"locale",k:"s",max:35,f:"bcp47"},{n:"recommended",k:"o",o:1,fs:[{n:"volume",k:"i",lo:0,hi:100},{n:"batterySaver",k:"b"},{n:"keyboardLayout",k:"e",v:["wasd","arrows"]},{n:"gamepadConfirm",k:"e",v:["south","east"]},{n:"vibration",k:"b"}]}]),sn=u("gem.cohorts",[{n:"cohorts",k:"a",max:8,it:{n:"",k:"o",fs:[{n:"experimentId",k:"s",max:36},{n:"variantKey",k:"s",max:32}]}}]),ln=u("gem.earnAllowanceChanged",[]),dn=u("gem.viewport",[{n:"insets",k:"o",fs:[{n:"top",k:"i",lo:0,hi:4096},{n:"right",k:"i",lo:0,hi:4096},{n:"bottom",k:"i",lo:0,hi:4096},{n:"left",k:"i",lo:0,hi:4096}]},{n:"reserved",k:"a",o:1,max:4,it:{n:"",k:"o",fs:[{n:"x",k:"i",lo:0,hi:16384},{n:"y",k:"i",lo:0,hi:16384},{n:"width",k:"i",lo:0,hi:16384},{n:"height",k:"i",lo:0,hi:16384}]}}]),un=u("gem.deviceSettings",[{n:"settings",k:"j",o:1}]),cn=u("gem.willTerminate",[{n:"reason",k:"e",v:["grant_expiring","session_ended","navigating","kill_switch"]},{n:"graceMs",k:"i",lo:0,hi:6e4}]),mn=u("gem.roomEvent",[{n:"event",k:"e",v:["updated","match_started","match_ready","match_failed","version_stale"]},{n:"roomId",k:"s",max:64},{n:"matchId",k:"s",o:1,max:64},{n:"version",k:"i",o:1,lo:0,hi:2147483647},{n:"reason",k:"s",o:1,max:64},{n:"platform",k:"e",o:1,v:["universal","mobile"]}]),gn=u("gem.socketState",[{n:"connected",k:"b"},{n:"reason",k:"e",o:1,v:["connecting","dropped","watchdog","terminal"]}]),pn=u("gem.seatedEvent",[{n:"roomId",k:"s",max:64}]),yn=u("gem.autoStartFailedEvent",[{n:"roomId",k:"s",max:64},{n:"code",k:"s",max:64}]),fn=u("gem.signalEvent",[{n:"event",k:"e",v:["hello","offer","answer","ice","peerJoined","peerLeft","migration","matchEnded","error"]},{n:"matchId",k:"s",max:64},{n:"data",k:"j"}]),hn=u("gem.dedicatedEvent",[{n:"event",k:"e",v:["answer","error","matchEnded"]},{n:"matchId",k:"s",max:64},{n:"sdp",k:"s",o:1,max:10240},{n:"sessionId",k:"s",o:1,max:64},{n:"code",k:"s",o:1,max:64},{n:"message",k:"s",o:1,max:256},{n:"reason",k:"s",o:1,max:64}]),_n=u("gem.partyResult",[{n:"requestId",k:"s",max:64},{n:"partyId",k:"s",o:1,max:64}]),bn=u("gem.clusterTarget",[{n:"clusterTargetId",k:"s",max:64},{n:"clusterTargetIds",k:"a",o:1,max:3,it:{n:"",k:"s",max:64}}]),vn=u("gem.devtools",[{n:"action",k:"e",v:["open","close","toggle"]}]),Rn=u("gem.screenshot",[{n:"maxWidth",k:"i",lo:1,hi:7680},{n:"maxHeight",k:"i",lo:1,hi:4320}]),xn=u("gem.screenshot.denied",[{n:"reason",k:"e",v:["not_wired","no_source","unsupported","unreadable","tainted","too_large","busy","declined","failed"]},{n:"retryable",k:"b"}]),Sn=u("gem.requestContext",[]),kn=u("gem.gameContext",[{n:"context",k:"j"}]),wn=u("gem.signal",[{n:"signal",k:"e",v:["join","offer","answer","ice","migrationAck","hostUnreachable"]},{n:"matchId",k:"s",max:64},{n:"data",k:"j"}]),An=u("gem.dedicatedOffer",[{n:"matchId",k:"s",max:64},{n:"sdp",k:"s",max:10240},{n:"intent",k:"e",v:["initial","ice_restart","full_reconnect"]}]),Pn=u("gem.partyRequest",[{n:"requestId",k:"s",max:64}]),Tn=u("gem.ready",[]),On=u("gem.engaged",[]),Gn=u("gem.progress",[{n:"loaded",k:"i",lo:0,hi:1099511627776},{n:"total",k:"i",lo:0,hi:1099511627776}]),Cn=u("gem.requestToken",[{n:"requestId",k:"s",max:64},{n:"reason",k:"e",v:["initial","expiring","rejected"]}]),En=u("gem.requestLocalServer",[{n:"requestId",k:"s",max:64},{n:"gameRoomId",k:"s",max:64}]),In=u("gem.localServer",[{n:"requestId",k:"s",max:64},{n:"serverId",k:"s",o:1,max:128}]),qn=u("gem.localServer.denied",[{n:"requestId",k:"s",max:64},{n:"retryable",k:"b"},{n:"reason",k:"e",v:["refused","unavailable"]}]),Mn=u("gem.exit",[{n:"reason",k:"s",o:1,max:64}]),Ln=u("gem.openExternal",[{n:"url",k:"s",max:2048,f:"url"}]),$n=u("gem.requestFullscreen",[{n:"enabled",k:"b"}]),jn=u("gem.audioState",[{n:"muted",k:"b"}]),Fn=u("gem.rewardCue",[{n:"currencySlug",k:"s",max:32},{n:"expected",k:"i",o:1,lo:1,hi:1e9},{n:"origin",k:"o",o:1,fs:[{n:"x",k:"i",lo:0,hi:16384},{n:"y",k:"i",lo:0,hi:16384}]}]),Bn=u("gem.walletDisplay",[{n:"visible",k:"b"},{n:"currencies",k:"a",o:1,max:8,it:{n:"",k:"s",max:64}},{n:"score",k:"b",o:1}]),Un=u("gem.menu",[{n:"settings",k:"b"},{n:"items",k:"a",o:1,max:4,it:{n:"",k:"o",fs:[{n:"id",k:"s",max:32},{n:"label",k:"s",max:40}]}}]),Nn=u("gem.menuSelect",[{n:"entry",k:"e",v:["settings","item"]},{n:"id",k:"s",o:1,max:32}]),Dn=u("gem.requestShare",[{n:"params",k:"a",max:16,it:{n:"",k:"o",fs:[{n:"key",k:"s",max:64},{n:"value",k:"s",max:512}]}}]),Hn=u("gem.requestAvatarPicker",[]),Vn=u("gem.vibrate",[{n:"pattern",k:"a",max:99,it:{n:"",k:"i",lo:0,hi:1e4}}]),Wn=u("gem.frameStats",[{n:"fps",k:"i",lo:0,hi:1e3},{n:"frameTimeP95Ms",k:"i",lo:0,hi:1e5}]),zn=u("gem.portraitBorders",[{n:"name",k:"s",o:1,max:40}]),Kn=u("gem.error",[{n:"code",k:"e",v:["version_mismatch","handshake_timeout","handshake_duplicate","invalid_message","rate_limited","token_unavailable","unsupported","unsupported_capability","internal"]},{n:"message",k:"s",o:1,max:256}]),Yn=u("gem.requestPurchase",[{n:"requestId",k:"s",max:64},{n:"purchaseKind",k:"e",v:["item","recipe"]},{n:"targetId",k:"s",max:64},{n:"currencySlug",k:"s",max:32},{n:"quantity",k:"i",o:1,lo:1,hi:10},{n:"catalogId",k:"s",o:1,max:64}]),Jn=u("gem.purchaseResult",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["ok","declined","unavailable"]},{n:"reason",k:"s",o:1,max:64,f:"code"},{n:"purchaseId",k:"s",o:1,max:64}]),Xn=u("gem.deviceSettings.put",[{n:"requestId",k:"s",max:64},{n:"settings",k:"j"}]),Qn=u("gem.deviceSettings.result",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["stored","too_large","unavailable"]}]),Zn=u("gem.requestAd",[{n:"requestId",k:"s",max:64},{n:"placement",k:"s",max:32},{n:"format",k:"e",v:["interstitial","rewarded"]}]),et=u("gem.adResult",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["shown","no_ad","unavailable"]}]),nt=u("gem.requestSignIn",[{n:"requestId",k:"s",max:64}]),tt=u("gem.signInResult",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["signed_in","declined","unavailable"]}]),rt=u("gem.requestFriendChallenge",[{n:"requestId",k:"s",max:64},{n:"playerId",k:"s",max:64},{n:"template",k:"s",max:64},{n:"params",k:"j",o:1}]),ot=u("gem.friendChallengeResult",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["accepted","cancelled","refused","unavailable","rate_limited","invalid"]},{n:"code",k:"s",o:1,max:64},{n:"param",k:"s",o:1,max:64},{n:"channel",k:"s",o:1,max:16},{n:"configVersion",k:"i",o:1,lo:0,hi:9007199254740991},{n:"retryAfterMs",k:"i",o:1,lo:0,hi:864e5},{n:"detail",k:"s",o:1,max:300}]);U({"gem.handshake":Ze,"gem.handshake.accept":en,"gem.token":nn,"gem.token.denied":tn,"gem.player":rn,"gem.pause":on,"gem.prefs":an,"gem.cohorts":sn,"gem.earnAllowanceChanged":ln,"gem.viewport":dn,"gem.deviceSettings":un,"gem.willTerminate":cn,"gem.roomEvent":mn,"gem.socketState":gn,"gem.seatedEvent":pn,"gem.autoStartFailedEvent":yn,"gem.signalEvent":fn,"gem.dedicatedEvent":hn,"gem.partyResult":_n,"gem.clusterTarget":bn,"gem.devtools":vn,"gem.screenshot":Rn,"gem.screenshot.denied":xn,"gem.requestContext":Sn,"gem.gameContext":kn,"gem.signal":wn,"gem.dedicatedOffer":An,"gem.partyRequest":Pn,"gem.ready":Tn,"gem.engaged":On,"gem.progress":Gn,"gem.requestToken":Cn,"gem.requestLocalServer":En,"gem.localServer":In,"gem.localServer.denied":qn,"gem.exit":Mn,"gem.openExternal":Ln,"gem.requestFullscreen":$n,"gem.audioState":jn,"gem.rewardCue":Fn,"gem.walletDisplay":Bn,"gem.menu":Un,"gem.menuSelect":Nn,"gem.requestShare":Dn,"gem.requestAvatarPicker":Hn,"gem.vibrate":Vn,"gem.frameStats":Wn,"gem.portraitBorders":zn,"gem.error":Kn,"gem.requestPurchase":Yn,"gem.purchaseResult":Jn,"gem.deviceSettings.put":Xn,"gem.deviceSettings.result":Qn,"gem.requestAd":Zn,"gem.adResult":et,"gem.requestSignIn":nt,"gem.signInResult":tt,"gem.requestFriendChallenge":rt,"gem.friendChallengeResult":ot});var G={now:()=>Date.now(),setTimeout:(n,e)=>setTimeout(n,e),clearTimeout:n=>clearTimeout(n)};var at=1e4;function re(n,e){return N(n,e)}function N(n,e){if(typeof n.serverToken!="function"||typeof n.onServerToken!="function")throw new Error("this runtime delivers no game-server token: host.serverToken/onServerToken are missing. The server image running this bundle predates token delivery \u2014 the bundle cannot call gem-api on it.");let t=i=>({token:i.token,expiresAt:i.expiresAt,chainEndsAt:Number.POSITIVE_INFINITY}),r=null,o=new L({clock:e.clock,...e.onStateChange===void 0?{}:{onStateChange:e.onStateChange},request:()=>new Promise((i,d)=>{let l=e.clock.setTimeout(()=>{r=null,d({reason:"unavailable",retryable:true});},e.timeoutMs??at);r={resolve:c=>{e.clock.clearTimeout(l),i(c);},reject:d,timer:l};})}),a=n.onServerToken(i=>{let d=t(i),l=r;if(l){r=null,l.resolve(d);return}o.accept(d);});return {source:o,dispose(){a(),r&&(e.clock.clearTimeout(r.timer),r.reject({reason:"unavailable",retryable:false}),r=null);}}}var H={};Re(H,{acceptTransfer:()=>st,addEntityProgression:()=>it,adminAction:()=>lt,cancelInventoryTransfer:()=>dt,claimEntityProgressionRewards:()=>ut,closeGameRoom:()=>ct,createEntityBatchOrder:()=>mt,createEntityOrder:()=>gt,createSession:()=>pt,deleteEntityGameSetting:()=>yt,deleteEntitySave:()=>ft,deleteSession:()=>ht,deleteShowcaseValue:()=>_t,executeEntityRecipe:()=>bt,finalizeSaveUpload:()=>vt,getChannelAssignment:()=>Rt,getDropRates:()=>xt,getEntityCurrency:()=>St,getEntityGameSetting:()=>kt,getEntityInventory:()=>wt,getEntityInventoryItem:()=>At,getEntityLeaderboard:()=>Pt,getEntityOrder:()=>Tt,getEntityProgression:()=>Ot,getEntityRecipeAvailability:()=>Gt,getEntityRecipeUsage:()=>Ct,getEntitySave:()=>Et,getEvent:()=>It,getGameRoomV2:()=>qt,getLeaderboard:()=>Mt,getPlayerGameProfile:()=>Lt,getPurchaseCatalog:()=>$t,getResolvedTemplate:()=>jt,getRoomArgs:()=>Ft,getShowcaseValue:()=>Bt,getTransferDetails:()=>Ut,ingestAnalyticsEvents:()=>D,initiateInventoryTransfer:()=>Nt,invokeFunction:()=>Dt,kickPlayer:()=>Ht,listChallenges:()=>Vt,listEntityGameSettings:()=>Wt,listEntityOrders:()=>zt,listEntityProgressions:()=>Kt,listEntitySaves:()=>Yt,listEvents:()=>Jt,listGameRooms:()=>Xt,listResolvedTemplates:()=>Qt,listTransfers:()=>Zt,maxEntityProgression:()=>er,putEntityGameSetting:()=>nr,putRoomArgs:()=>tr,putShowcaseValue:()=>rr,rejectTransfer:()=>or,reportMatchPlayers:()=>ar,requestSaveUploadUrl:()=>sr,resetEntityProgression:()=>ir,setMatchBackfill:()=>lr,simulateEntityOrder:()=>dr,transferHostV2:()=>ur,updateGameRoomV2:()=>cr});function s(n){let e=String(n);if(!/^[A-Za-z0-9_.-]{1,128}$/.test(e)||e==="."||e==="..")throw new TypeError(`${JSON.stringify(e)} is not a usable path segment \u2014 it is interpolated into a URL`);return encodeURIComponent(e)}async function st(n,e,t){let r=`/v1/inventory/transfers/${s(e)}/accept`;return n.client.post(r,void 0,t?.signal)}async function it(n,e,t,r,o,a){let i=`/v1/inventory/${s(e)}/${s(t)}/progressions/${s(r)}/add`;return n.client.post(i,o,a?.signal)}async function lt(n,e,t,r){let o=`/v1/voice/sessions/${s(e)}/admin`;return n.client.post(o,t,r?.signal)}async function dt(n,e,t){let r=`/v1/inventory/transfers/${s(e)}/cancel`;return n.client.post(r,void 0,t?.signal)}async function ut(n,e,t,r,o,a){let i=`/v1/inventory/${s(e)}/${s(t)}/progressions/${s(r)}/claim`;return n.client.post(i,o,a?.signal)}async function ct(n,e,t){let r=`/v1/games/${s(n.gameId())}/game-rooms/${s(e)}`;return n.client.delete(r,t?.signal)}async function mt(n,e,t,r,o){let a=`/v1/inventory/${s(e)}/${s(t)}/orders/batch`;return n.client.post(a,r,o?.signal,{...o?.ifMatch===void 0?{}:{ifMatch:o.ifMatch}})}async function gt(n,e,t,r,o){let a=`/v1/inventory/${s(e)}/${s(t)}/orders`;return n.client.post(a,r,o?.signal,{...o?.ifMatch===void 0?{}:{ifMatch:o.ifMatch}})}async function pt(n,e,t){return n.client.post("/v1/voice/sessions",e,t?.signal)}async function yt(n,e,t,r,o){let a=`/v1/settings/${s(e)}/${s(t)}/${s(r)}`;return n.client.delete(a,o?.signal)}async function ft(n,e,t,r,o){let a=`/v1/saves/${s(e)}/${s(t)}/${s(r)}`;return n.client.delete(a,o?.signal)}async function ht(n,e,t){let r=`/v1/voice/sessions/${s(e)}`;return n.client.delete(r,t?.signal)}async function _t(n,e,t,r){let o=`/v1/showcase/players/${s(e)}/${s(t)}`;return n.client.delete(o,r?.signal)}async function bt(n,e,t,r,o){let a=`/v1/inventory/${s(e)}/${s(t)}/recipes/execute`;return n.client.post(a,r,o?.signal,{...o?.ifMatch===void 0?{}:{ifMatch:o.ifMatch}})}async function vt(n,e,t,r,o,a){let i=`/v1/saves/${s(e)}/${s(t)}/${s(r)}/finalize`;return n.client.post(i,o,a?.signal)}async function Rt(n,e,t){let r=`/v1/games/${s(n.gameId())}/config/channels/${s(e)}`;return n.client.getWithEtag(r,{...t?.signal===void 0?{}:{signal:t.signal},...t?.ifNoneMatch===void 0?{}:{ifNoneMatch:t.ifNoneMatch}})}async function xt(n,e,t){let r=`/v1/inventory/loot-tables/${s(e)}/drop-rates`;return n.client.get(r,t?.signal)}async function St(n,e,t,r,o){let a=`/v1/inventory/${s(e)}/${s(t)}/currencies/${s(r)}`;return n.client.get(a,o?.signal)}async function kt(n,e,t,r,o){let a=`/v1/settings/${s(e)}/${s(t)}/${s(r)}`;return n.client.getWithEtag(a,{...o?.signal===void 0?{}:{signal:o.signal},...o?.ifNoneMatch===void 0?{}:{ifNoneMatch:o.ifNoneMatch}})}async function wt(n,e,t,r){let o=new URLSearchParams;r?.include_buckets!==void 0&&o.set("include_buckets",String(r?.include_buckets)),r?.include_custom_data!==void 0&&o.set("include_custom_data",String(r?.include_custom_data)),r?.currency_limit!==void 0&&o.set("currency_limit",String(r?.currency_limit)),r?.currency_cursor!==void 0&&o.set("currency_cursor",String(r?.currency_cursor)),r?.item_limit!==void 0&&o.set("item_limit",String(r?.item_limit)),r?.item_cursor!==void 0&&o.set("item_cursor",String(r?.item_cursor)),r?.progression_limit!==void 0&&o.set("progression_limit",String(r?.progression_limit)),r?.progression_cursor!==void 0&&o.set("progression_cursor",String(r?.progression_cursor));let a=o.toString(),i=`/v1/inventory/${s(e)}/${s(t)}`+(a?`?${a}`:"");return n.client.get(i,r?.signal)}async function At(n,e,t,r,o){let a=`/v1/inventory/${s(e)}/${s(t)}/items/${s(r)}`;return n.client.get(a,o?.signal)}async function Pt(n,e,t,r,o){let a=new URLSearchParams;o?.bucket_1!==void 0&&a.set("bucket_1",String(o?.bucket_1)),o?.bucket_2!==void 0&&a.set("bucket_2",String(o?.bucket_2)),o?.limit!==void 0&&a.set("limit",String(o?.limit)),o?.periods_back!==void 0&&a.set("periods_back",String(o?.periods_back)),o?.period!==void 0&&a.set("period",String(o?.period)),o?.player_id!==void 0&&a.set("player_id",String(o?.player_id));let i=a.toString(),d=`/v1/leaderboards/${s(e)}/${s(t)}/${s(r)}`+(i?`?${i}`:"");return n.client.get(d,o?.signal)}async function Tt(n,e,t,r,o){let a=`/v1/inventory/${s(e)}/${s(t)}/orders/${s(r)}`;return n.client.get(a,o?.signal)}async function Ot(n,e,t,r,o){let a=`/v1/inventory/${s(e)}/${s(t)}/progressions/${s(r)}`;return n.client.get(a,o?.signal)}async function Gt(n,e,t,r,o,a){let i=`/v1/inventory/${s(e)}/${s(t)}/catalogs/${s(r)}/recipes/${s(o)}/availability`;return n.client.get(i,a?.signal)}async function Ct(n,e,t,r){let o=new URLSearchParams;r?.limit!==void 0&&o.set("limit",String(r?.limit));let a=o.toString(),i=`/v1/inventory/${s(e)}/${s(t)}/recipe-usage`+(a?`?${a}`:"");return n.client.get(i,r?.signal)}async function Et(n,e,t,r,o){let a=`/v1/saves/${s(e)}/${s(t)}/${s(r)}`;return n.client.getWithEtag(a,{...o?.signal===void 0?{}:{signal:o.signal},...o?.ifNoneMatch===void 0?{}:{ifNoneMatch:o.ifNoneMatch}})}async function It(n,e,t){let r=`/v1/events/${s(e)}`;return n.client.get(r,t?.signal)}async function qt(n,e,t){let r=`/v2/games/${s(n.gameId())}/game-rooms/${s(e)}`;return n.client.getWithEtag(r,{...t?.signal===void 0?{}:{signal:t.signal},...t?.ifNoneMatch===void 0?{}:{ifNoneMatch:t.ifNoneMatch}})}async function Mt(n,e,t){let r=new URLSearchParams;t?.bucket_1!==void 0&&r.set("bucket_1",String(t?.bucket_1)),t?.bucket_2!==void 0&&r.set("bucket_2",String(t?.bucket_2)),t?.periods_back!==void 0&&r.set("periods_back",String(t?.periods_back)),t?.period!==void 0&&r.set("period",String(t?.period)),t?.player_id!==void 0&&r.set("player_id",String(t?.player_id));let o=r.toString(),a=`/v1/leaderboards/${s(e)}`+(o?`?${o}`:"");return n.client.get(a,t?.signal)}async function Lt(n,e,t){let r=`/v1/profiles/players/${s(e)}`;return n.client.get(r,t?.signal)}async function $t(n,e){let t=new URLSearchParams;e?.config_version!==void 0&&t.set("config_version",String(e?.config_version));let r=t.toString(),o="/v1/inventory/platform-funded-game-inventory-purchase-catalog"+(r?`?${r}`:"");return n.client.get(o,e?.signal)}async function jt(n,e,t){let r=`/v1/game-room-templates/${s(e)}`;return n.client.get(r,t?.signal)}async function Ft(n,e,t){let r=`/v1/games/${s(n.gameId())}/game-rooms/${s(e)}/room-args`;return n.client.get(r,t?.signal)}async function Bt(n,e,t,r){let o=`/v1/showcase/players/${s(e)}/${s(t)}`;return n.client.get(o,r?.signal)}async function Ut(n,e,t){let r=`/v1/inventory/transfers/${s(e)}`;return n.client.get(r,t?.signal)}async function D(n,e,t){let r=`/v1/games/${s(n.gameId())}/analytics/events`;return n.client.post(r,e,t?.signal,{replaySafe:true})}async function Nt(n,e,t){return n.client.post("/v1/inventory/transfers",e,t?.signal)}async function Dt(n,e,t){return n.client.postBytes("/v1/functions/invoke",e,t?.signal)}async function Ht(n,e,t,r){let o=`/v1/games/${s(n.gameId())}/game-rooms/${s(e)}/kick/${s(t)}`;return n.client.post(o,void 0,r?.signal)}async function Vt(n,e){let t=new URLSearchParams;e?.periods_back!==void 0&&t.set("periods_back",String(e?.periods_back)),e?.player_id!==void 0&&t.set("player_id",String(e?.player_id));let r=t.toString(),o="/v1/challenges"+(r?`?${r}`:"");return n.client.get(o,e?.signal)}async function Wt(n,e,t,r){let o=`/v1/settings/${s(e)}/${s(t)}`;return n.client.get(o,r?.signal)}async function zt(n,e,t,r){let o=new URLSearchParams;r?.limit!==void 0&&o.set("limit",String(r?.limit)),r?.cursor!==void 0&&o.set("cursor",String(r?.cursor));let a=o.toString(),i=`/v1/inventory/${s(e)}/${s(t)}/orders`+(a?`?${a}`:"");return n.client.get(i,r?.signal)}async function Kt(n,e,t,r){let o=`/v1/inventory/${s(e)}/${s(t)}/progressions`;return n.client.get(o,r?.signal)}async function Yt(n,e,t,r){let o=new URLSearchParams;r?.limit!==void 0&&o.set("limit",String(r?.limit)),r?.cursor!==void 0&&o.set("cursor",String(r?.cursor));let a=o.toString(),i=`/v1/saves/${s(e)}/${s(t)}`+(a?`?${a}`:"");return n.client.get(i,r?.signal)}async function Jt(n,e){let t=new URLSearchParams;e?.include_inactive!==void 0&&t.set("include_inactive",String(e?.include_inactive)),e?.limit!==void 0&&t.set("limit",String(e?.limit)),e?.offset!==void 0&&t.set("offset",String(e?.offset));let r=t.toString(),o="/v1/events"+(r?`?${r}`:"");return n.client.get(o,e?.signal)}async function Xt(n,e){let t=new URLSearchParams;e?.status!==void 0&&t.set("status",String(e?.status)),e?.game_channel!==void 0&&t.set("game_channel",String(e?.game_channel)),e?.game_room_type!==void 0&&t.set("game_room_type",String(e?.game_room_type)),e?.template_id!==void 0&&t.set("template_id",String(e?.template_id)),e?.template_slug!==void 0&&t.set("template_slug",String(e?.template_slug)),e?.limit!==void 0&&t.set("limit",String(e?.limit)),e?.cursor!==void 0&&t.set("cursor",String(e?.cursor));let r=t.toString(),o=`/v1/games/${s(n.gameId())}/game-rooms`+(r?`?${r}`:"");return n.client.get(o,e?.signal)}async function Qt(n,e){return n.client.get("/v1/game-room-templates",e?.signal)}async function Zt(n,e){let t=new URLSearchParams;e.entity_type!==void 0&&t.set("entity_type",String(e.entity_type)),e.entity_id!==void 0&&t.set("entity_id",String(e.entity_id)),e?.direction!==void 0&&t.set("direction",String(e?.direction)),e?.status!==void 0&&t.set("status",String(e?.status)),e?.cursor!==void 0&&t.set("cursor",String(e?.cursor)),e?.limit!==void 0&&t.set("limit",String(e?.limit));let r=t.toString(),o="/v1/inventory/transfers"+(r?`?${r}`:"");return n.client.get(o,e?.signal)}async function er(n,e,t,r,o,a){let i=`/v1/inventory/${s(e)}/${s(t)}/progressions/${s(r)}/max`;return n.client.post(i,o,a?.signal)}async function nr(n,e,t,r,o,a){let i=`/v1/settings/${s(e)}/${s(t)}/${s(r)}`;return n.client.put(i,o,a?.signal,{...a?.ifMatch===void 0?{}:{ifMatch:a.ifMatch}})}async function tr(n,e,t,r){let o=`/v1/games/${s(n.gameId())}/game-rooms/${s(e)}/room-args`;return n.client.put(o,t,r?.signal)}async function rr(n,e,t,r,o){let a=`/v1/showcase/players/${s(e)}/${s(t)}`;return n.client.put(a,r,o?.signal)}async function or(n,e,t){let r=`/v1/inventory/transfers/${s(e)}/reject`;return n.client.post(r,void 0,t?.signal)}async function ar(n,e,t,r){let o=`/v1/games/${s(n.gameId())}/matches/${s(e)}/players/report`;return n.client.post(o,t,r?.signal)}async function sr(n,e,t,r,o,a){let i=`/v1/saves/${s(e)}/${s(t)}/${s(r)}/upload-url`;return n.client.post(i,o,a?.signal,{replaySafe:true})}async function ir(n,e,t,r,o,a){let i=`/v1/inventory/${s(e)}/${s(t)}/progressions/${s(r)}/reset`;return n.client.post(i,o,a?.signal)}async function lr(n,e,t,r){let o=`/v1/games/${s(n.gameId())}/matches/${s(e)}/backfill`;return n.client.put(o,t,r?.signal)}async function dr(n,e,t,r,o){let a=`/v1/inventory/${s(e)}/${s(t)}/orders/simulate`;return n.client.post(a,r,o?.signal)}async function ur(n,e,t,r){let o=`/v2/games/${s(n.gameId())}/game-rooms/${s(e)}/transfer/${s(t)}`;return n.client.post(o,void 0,r?.signal)}async function cr(n,e,t,r){let o=`/v2/games/${s(n.gameId())}/game-rooms/${s(e)}`;return n.client.patch(o,t,r?.signal,{...r?.ifMatch===void 0?{}:{ifMatch:r.ifMatch}})}var oe="gem_";var pr=1e4,yr=50,fr=1e3,hr=65536-4*1024,ae=n=>typeof n=="number"?n:0,_r=n=>typeof n=="string"?n:"";function se(){let n=globalThis.crypto;return typeof n?.randomUUID=="function"?n.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.floor(Math.random()*16);return (e==="x"?t:t&3|8).toString(16)})}function br(n){return n?.retryable===true}function vr(n,e){let t=n??{},r=Array.isArray(t.rejected)?t.rejected.map(o=>{let a=o??{};return {index:ae(a.index),code:_r(a.code)}}):[];return {accepted:ae(t.accepted),rejected:r,dropped:e,duplicate:t.duplicate===true}}function ie(n,e){return {event_uid:n.uid,name:n.name,offset_ms:Math.round(n.atMs)-e,player_id:n.playerId,dimensions:n.dimensions,measures:n.measures}}function le(n){let e=Math.max(1,Math.floor(n.maxQueue??fr)),t={client:n.client,gameId:()=>n.gameId},r=[],o=0,a=null,i=false,d=false,l=false,c=false,p=m=>{n.log?.(m);},b=()=>{a!==null&&(n.clock.clearTimeout(a),a=null);},S=()=>{a!==null||i||d||(a=n.clock.setTimeout(()=>{a=null,y().catch(()=>{});},pr));},_=()=>{let m=Math.min(r.length,100),f=128;for(let v=0;v<m;v+=1){let A=r[v];if(A===void 0)break;if(f+=JSON.stringify(ie(A,0)).length+1,f>hr)return Math.max(1,v)}return m};async function y(m){if(r.length===0)return {accepted:0,rejected:[],dropped:0,duplicate:false};b();let f=r.splice(0,_()),v=o;o=0;let A=Math.round(n.clock.now()),M={batch_id:se(),sent_at_ms:A,events:f.map(k=>ie(k,A))};d=true;try{let k=await D(t,M,m===void 0?void 0:{signal:m}),P=vr(k,v);for(let be of P.rejected)p(`[gem] analytics: an event was refused (${be.code}). See the analytics_events section of your game config.`);return P}catch(k){if(br(k))for(r=[...f,...r],o+=v;r.length>e;)r.shift(),o+=1;else p(`[gem] analytics: ${f.length} event(s) were discarded \u2014 the platform refused the batch and will refuse it again: ${String(k)}`);throw k}finally{d=false,r.length>0&&S();}}return {track(m,f,v={}){if(i)return;if(typeof m!="string"||m===""){c||(c=true,p(`[gem] analytics: '${f}' was not recorded \u2014 an event from a server has to name the player it is about. A game-server token names no player, so the platform cannot infer one; pass the id from join() or host.players().`));return}if(f.startsWith(oe)){l||(l=true,p(`[gem] analytics: '${f}' was not recorded \u2014 the gem_ prefix is reserved, and the platform's own events are client-sourced, so a server may not emit one at all. Name your event something else.`));return}let A={},M={};for(let[k,P]of Object.entries(v))typeof P=="string"?A[k]=P:typeof P=="number"&&Number.isFinite(P)&&(M[k]=P);for(;r.length>=e;)r.shift(),o+=1;r.push({uid:se(),playerId:m,name:f,atMs:n.clock.now(),dimensions:A,measures:M}),r.length>=yr?y().catch(()=>{}):S();},flush:m=>y(m),get pending(){return r.length},dispose(){i=true,b(),r=[],o=0;}}}var Rr=new Map([["function_error",false],["function_failed",false],["function_timeout",false],["function_not_published",false],["function_input_too_large",false],["functions_not_configured",false],["forbidden",false],["function_capacity_unavailable",true],["function_host_unreachable",true],["function_host_error",true],["rate_limited",true],["service_unavailable",true]]),I=class extends g{constructor(e,t){super(e.reason,e.status,e.detail,e.retryAfterSeconds,e.code),this.name="GemFunctionError",Object.assign(this,t);}get retryable(){return (this.code===void 0?void 0:Rr.get(this.code))??super.retryable}},C=class{#e;constructor(e){this.#e=e;}async invoke(e,t={}){let r=xr(e),o;try{o=await this.#e(r,t.signal===void 0?{}:{signal:t.signal});}catch(a){throw a instanceof g?kr(a):a}return Sr(o)}};function xr(n){if(n instanceof ArrayBuffer)return new Uint8Array(n);if(ArrayBuffer.isView(n))return new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let e;try{e=JSON.stringify(n);}catch(t){throw new h(`the function input could not be serialised to JSON: ${String(t)}. Pass bytes, or a value JSON can carry. This is a bug in the call, not a server failure.`)}if(e===void 0)throw new h(`the function input is ${typeof n}, which JSON cannot carry. Pass bytes \u2014 an empty Uint8Array for no input \u2014 or a JSON value. This is a bug in the call, not a server failure.`);return new TextEncoder().encode(e)}function Sr(n){let{bytes:e}=n,t=()=>new TextDecoder("utf-8",{fatal:true}).decode(e);return {bytes:e,...n.invocationId===void 0?{}:{invocationId:n.invocationId},text:t,json:()=>JSON.parse(t())}}function kr(n){let{details:e,invocationId:t}=X(n),o=e?.untrusted?.message,a=e?.reason;return new I(n,{...t===void 0?{}:{invocationId:t},...n.code==="function_error"&&typeof o=="string"?{functionMessage:o}:{},...n.code==="function_failed"&&typeof a=="string"?{failure:a}:{}})}var w=n=>typeof n=="string"?n:"",wr=/(?:Z|[+-]\d{2}:?\d{2})$/i;function de(n){let e=w(n);if(!wr.test(e))return 0;let t=Date.parse(e);return Number.isFinite(t)?Math.floor(t/1e3):0}var Ar=/^[0-9a-f]{1,64}$/,Pr=/^[0-9a-f]{16}$/,Tr=/^[A-Za-z][A-Za-z0-9_+\-/]{0,63}$/,Or=/^(?:[01]\d|2[0-3]):[0-5]\d$/;function Gr(n){let e=w(n),t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!t)return;let[r,o,a]=[Number(t[1]),Number(t[2]),Number(t[3])],i=new Date(Date.UTC(r,o-1,a));return i.getUTCFullYear()===r&&i.getUTCMonth()===o-1&&i.getUTCDate()===a?e:void 0}var Cr=4096,Er=new TextEncoder;function Ir(n){let e=w(n.challenge_data),t=w(n.challenge_data_hash);return e===""||!Pr.test(t)?{}:Er.encode(e).length>Cr?{}:{data:e,dataHash:t}}function qr(n){let e=n??{},t=de(e.period_start_at),r=de(e.period_ends_at);if(t===0||r===0)return;let o=w(e.slug),a=w(e.seed),i=Gr(e.period_local_date),d=w(e.boundary),l=w(e.reset_time);return {id:w(e.progression_definition_id),...o===""?{}:{slug:o},window:w(e.window),periodStartAt:t,periodEndsAt:r,...i===void 0?{}:{periodLocalDate:i},boundary:Tr.test(d)?d:"",resetTime:Or.test(l)?l:"",seed:Ar.test(a)?a:"",...Ir(e)}}function ue(n){if(n!==void 0&&(!Number.isInteger(n)||n<0||n>400))throw new TypeError(`periodsBack must be an integer between 0 and 400, got ${String(n)}`)}function ce(n){let e=n??{};return Array.isArray(e.challenges)?e.challenges.map(qr).filter(t=>t!==void 0):[]}function me(n){return {async list(e){let{playerId:t,periodsBack:r,signal:o}=e??{};if(typeof t!="string"||t==="")throw new TypeError("gem.challenges.list needs { playerId }: a game-server token names no player, so the platform cannot tell whose period you mean. Pass the id from join() or gem.players().");ue(r);let a=await n({player_id:t,...r===void 0?{}:{periods_back:r},...o===void 0?{}:{signal:o}});return ce(a)}}}function Mr(n){let e={};for(let[t,r]of Object.entries(H))if(typeof r=="function"){let o=r;e[t]=(...a)=>o(n,...a);}return e}function F(n,e={}){let t=e.clock??G,r=e.baseUrl??n.apiBaseUrl;if(!r)throw new Error("this runtime names no gem-api host (host.apiBaseUrl is missing). The server image running this bundle predates token delivery \u2014 the bundle cannot call gem-api on it.");let o=N(n,{clock:t,...e.onAuthStateChange===void 0?{}:{onStateChange:e.onAuthStateChange}}),a=Q({baseUrl:r,tokenSource:o.source,defaultQuery:{game_id:n.gameId,channel:n.channel},...e.fetch===void 0?{}:{fetch:e.fetch}}),i=new T({transport:a,clock:t}),d={gameId:n.gameId,channel:n.channel,matchId:n.matchId,...n.gameRoomId===void 0?{}:{gameRoomId:n.gameRoomId}},l=Mr({client:i,gameId:()=>d.gameId}),c=d.gameRoomId,p=n.endMatch,b=n.log,S=le({client:i,clock:t,gameId:d.gameId,...typeof b=="function"?{log:y=>b.call(n,y)}:{}});return {identity:d,client:i,api:l,match:{end:async()=>{if(p===void 0)throw new Error("this runtime cannot end the match: the server image running this bundle predates host.endMatch, and only the platform half holds the allocation proof an end needs.");await p.call(n);},setBackfill:async(y,m)=>{let f=await l.setMatchBackfill(d.matchId,{open:y.open,...y.seats===void 0?{}:{seats:y.seats}},m===void 0?{}:{signal:m});return {open:f.open,seats:f.seats??null}},reportPlayers:async(y,m)=>(await l.reportMatchPlayers(d.matchId,{players:y.map(v=>({player_id:v.playerId,state:v.state}))},m===void 0?{}:{signal:m})).players.map(v=>({playerId:v.player_id,outcome:v.outcome}))},analytics:S,functions:new C(l.invokeFunction),challenges:me(l.listChallenges),...c===void 0?{}:{room:{get:y=>l.getGameRoomV2(c,y),args:async y=>{let m=await l.getGameRoomV2(c,y?.signal===void 0?{}:{signal:y.signal}),f=m.modified?m.body:void 0;if(f?.room_args==null||f.room_args_template==null)throw new g("not_found",404,"this room's template declares no room args",void 0,"room_args_not_defined");return {room_args:f.room_args,room_args_template:f.room_args_template}}}},dispose:()=>{S.dispose(),o.dispose();}}}var Lr=["explicit","stale_cleanup","game_room_closed","replaced","migration_failed","host_left","insufficient_players","all_left","expired","migration_rate_exceeded","game_room_gone","failed","idle","reclaimed"],$r=new Set(Lr);function ge(n){return typeof n=="string"&&$r.has(n)?n:"unknown"}var x=class{#e;constructor(e){this.#e=e,Object.freeze(this);}toString(){return "[gem: use gem.text.toPlain()]"}toJSON(){return this.toString()}get[Symbol.toStringTag](){return "PlayerText"}static unwrap(e){return e.#e}};function q(n){return new x(n)}var pe={toPlain(n){return x.unwrap(n)},compare(n,e,t){let r=n instanceof x?x.unwrap(n):n,o=e instanceof x?x.unwrap(e):e,a;try{a=new Intl.Collator(t);}catch{a=new Intl.Collator;}return a.compare(r,o)},equals(n,e){let t=n instanceof x?x.unwrap(n):n,r=e instanceof x?x.unwrap(e):e;return t.normalize("NFC")===r.normalize("NFC")}};var ye="the match has not started yet: the runtime hands over the host at `init`, and this was read before that. Read it from `init` or later \u2014 a bundle that needs a value at module scope is reading it one call too early.";function V(n,e={}){let t=e.clock??G,r=()=>{let d=n();if(d===null)throw new Error(ye);return d},o=null,a=()=>{if(o===null)throw new Error(ye);return o};return {server:{get identity(){return a().identity},get client(){return a().client},get api(){return a().api},get match(){return a().match},get analytics(){return a().analytics},get functions(){return a().functions},get challenges(){return a().challenges},get room(){return a().room},dispose(){o?.dispose();},get sizeClass(){return r().sizeClass},get roomArgs(){return r().roomArgs},get roster(){return r().roster},players(){return r().players()},profile(d){let c=r().profile?.(d);if(!c)return null;let p=c.displayName;return typeof p!="string"||p===""?null:{displayName:q(p),...typeof c.displayTag=="string"&&c.displayTag!==""?{displayTag:q(c.displayTag)}:{},...typeof c.discriminator=="string"?{discriminator:c.discriminator}:{}}},playerNumber(d){return r().playerNumber?.(d)},send(d,l,c){c===void 0?r().send(d,l):r().send(d,l,c);},broadcast(d,l){l===void 0?r().broadcast(d):r().broadcast(d,l);},kick(d,l){l===void 0?r().kick(d):r().kick(d,l);},log(d){r().log(d);},warn(d){r().warn(d);}},attach:()=>{o=F(r(),{...e,clock:t});}}}function fe(n,e={}){let{server:t,attach:r}=V(()=>n,e);return r(),t}function jr(n){if(n===void 0||typeof n.reason!="string"||n.reason==="")return;let e=n.platform_reason??n.endedReason;return {reason:n.reason,...e===void 0?{}:{endedReason:ge(e)}}}var Fr=1e4;function Br(n){let e=false;return t=>{if(e)return;let r;try{r=n.match.reportPlayers([{playerId:t,state:"connected"}],AbortSignal.timeout(Fr));}catch{return}r.catch(o=>{o instanceof g&&o.status>=400&&o.status<500&&(e=o.status!==429);});}}function he(n,e={}){return ()=>{let t=null,{server:r,attach:o}=V(()=>t,e),a=n(r),i={async init(l){t=l,o(),await a.init?.();},async shutdown(l){let c=jr(l);try{await a.shutdown?.(c);}finally{r.dispose();}}},d=Br(r);return i.join=(l,c)=>(d(l),a.join?.(l,c)),a.leave&&(i.leave=(l,c)=>a.leave?.(l,c)),a.message&&(i.message=(l,c,p,b)=>a.message?.(l,c,p,b)),i}}var Ur=new Set(["unlocked","already_unlocked","suppressed"]);function _e(n){let e=n?.changes;if(!Array.isArray(e))return [];let t=[];for(let r of e){let o=r??{};if(o.type!=="achievement_unlocked"||typeof o.outcome!="string"||!Ur.has(o.outcome)||typeof o.achievement_id!="string"||o.achievement_id==="")continue;let a=o.outcome;t.push({achievementId:o.achievement_id,progressionDefinitionId:typeof o.progression_definition_id=="string"?o.progression_definition_id:"",points:a==="unlocked"&&typeof o.points=="number"&&Number.isFinite(o.points)?o.points:0,outcome:a,...typeof o.reason=="string"?{reason:o.reason}:{}});}return t}
2
+ export{R as AuthError,$ as CONDITIONAL_HEADERS,C as FunctionsApi,g as GemApiError,T as GemClient,I as GemFunctionError,x as PlayerText,h as TransportRefusal,_e as achievementReceipts,q as asPlayerText,F as createGemServer,re as createHostTokenSource,fe as createMatchServer,he as defineServer,G as systemClock,pe as text,K as toBase64};//# sourceMappingURL=gem-web-sdk.server.js.map
3
3
  //# sourceMappingURL=gem-web-sdk.server.js.map
package/dist/index.d.ts CHANGED
@@ -63,6 +63,7 @@ declare const FRAME_TO_PARENT: readonly [
63
63
  "gem.walletDisplay",
64
64
  "gem.menu",
65
65
  "gem.requestShare",
66
+ "gem.requestAvatarPicker",
66
67
  "gem.vibrate",
67
68
  "gem.frameStats",
68
69
  "gem.portraitBorders",
@@ -73,7 +74,7 @@ declare const FRAME_TO_PARENT: readonly [
73
74
  "gem.requestSignIn",
74
75
  "gem.requestFriendChallenge"
75
76
  ];
76
- type GemCapability = "ads" | "signIn" | "purchases" | "friendChallenges" | "devtools" | "screenshot" | "feedbackContext" | "rooms" | "p2p" | "dedicated" | "clusterTarget" | "parties" | "autoStartFailure" | "partySeating" | "socketState" | "audioState" | "rewardCue" | "frameStats" | "portraitBorders" | "engagement" | "viewport" | "reservedAreas" | "walletDisplay" | "localHost" | "cohorts" | "earnAllowance" | "deviceSettings" | "asyncOpponents" | "share" | "vibration" | "gameMenu";
77
+ type GemCapability = "ads" | "signIn" | "purchases" | "friendChallenges" | "devtools" | "screenshot" | "feedbackContext" | "rooms" | "p2p" | "dedicated" | "clusterTarget" | "parties" | "autoStartFailure" | "partySeating" | "socketState" | "audioState" | "rewardCue" | "frameStats" | "portraitBorders" | "engagement" | "viewport" | "reservedAreas" | "walletDisplay" | "localHost" | "cohorts" | "earnAllowance" | "deviceSettings" | "asyncOpponents" | "share" | "avatarPicker" | "vibration" | "gameMenu";
77
78
  declare const CAPABILITY_GATES: Readonly<Record<string, string>>;
78
79
  declare const CAPABILITY_NAMESPACE_GATES: ReadonlyArray<readonly [
79
80
  string,
@@ -133,6 +134,7 @@ interface GemPlayer {
133
134
  readonly playerId?: string;
134
135
  readonly discriminator?: string;
135
136
  readonly avatarIconUrl?: string;
137
+ readonly avatarIconId?: string;
136
138
  readonly badges?: {
137
139
  itemId: string;
138
140
  iconUrl: string;
@@ -408,6 +410,10 @@ interface GemRequestShare {
408
410
  value: string;
409
411
  }[];
410
412
  }
413
+ interface GemRequestAvatarPicker {
414
+ readonly gem: typeof PROTOCOL;
415
+ readonly type: "gem.requestAvatarPicker";
416
+ }
411
417
  interface GemVibrate {
412
418
  readonly gem: typeof PROTOCOL;
413
419
  readonly type: "gem.vibrate";
@@ -505,7 +511,7 @@ interface GemFriendChallengeResult {
505
511
  readonly detail?: string;
506
512
  }
507
513
  type ParentMessage = GemHandshake | GemToken | GemTokenDenied | GemPlayer | GemPause | GemPrefs | GemCohorts | GemEarnAllowanceChanged | GemViewport | GemDeviceSettings | GemWillTerminate | GemRoomEvent | GemSocketState | GemSeatedEvent | GemAutoStartFailedEvent | GemSignalEvent | GemDedicatedEvent | GemPartyResult | GemClusterTarget | GemDevtools | GemScreenshot | GemRequestContext | GemLocalServer | GemLocalServerDenied | GemMenuSelect | GemError | GemPurchaseResult | GemDeviceSettingsResult | GemAdResult | GemSignInResult | GemFriendChallengeResult;
508
- type FrameMessage = GemHandshakeAccept | GemScreenshotDenied | GemGameContext | GemSignal | GemDedicatedOffer | GemPartyRequest | GemReady | GemEngaged | GemProgress | GemRequestToken | GemRequestLocalServer | GemExit | GemOpenExternal | GemRequestFullscreen | GemAudioState | GemRewardCue | GemWalletDisplay | GemMenu | GemRequestShare | GemVibrate | GemFrameStats | GemPortraitBorders | GemError | GemRequestPurchase | GemDeviceSettingsPut | GemRequestAd | GemRequestSignIn | GemRequestFriendChallenge;
514
+ type FrameMessage = GemHandshakeAccept | GemScreenshotDenied | GemGameContext | GemSignal | GemDedicatedOffer | GemPartyRequest | GemReady | GemEngaged | GemProgress | GemRequestToken | GemRequestLocalServer | GemExit | GemOpenExternal | GemRequestFullscreen | GemAudioState | GemRewardCue | GemWalletDisplay | GemMenu | GemRequestShare | GemRequestAvatarPicker | GemVibrate | GemFrameStats | GemPortraitBorders | GemError | GemRequestPurchase | GemDeviceSettingsPut | GemRequestAd | GemRequestSignIn | GemRequestFriendChallenge;
509
515
  type GemMessage = ParentMessage | FrameMessage;
510
516
  type Rejection = string | null;
511
517
  declare function isOrigin(s: string): boolean;
@@ -554,6 +560,7 @@ declare const validateGemWalletDisplay: (raw: unknown) => Rejection;
554
560
  declare const validateGemMenu: (raw: unknown) => Rejection;
555
561
  declare const validateGemMenuSelect: (raw: unknown) => Rejection;
556
562
  declare const validateGemRequestShare: (raw: unknown) => Rejection;
563
+ declare const validateGemRequestAvatarPicker: (raw: unknown) => Rejection;
557
564
  declare const validateGemVibrate: (raw: unknown) => Rejection;
558
565
  declare const validateGemFrameStats: (raw: unknown) => Rejection;
559
566
  declare const validateGemPortraitBorders: (raw: unknown) => Rejection;
@@ -692,6 +699,7 @@ interface SendPlayerInput {
692
699
  readonly playerId?: string;
693
700
  readonly discriminator?: string;
694
701
  readonly avatarIconUrl?: string;
702
+ readonly avatarIconId?: string;
695
703
  readonly badges?: readonly {
696
704
  readonly itemId: string;
697
705
  readonly iconUrl: string;
@@ -740,6 +748,7 @@ interface HostCallbacks {
740
748
  onRequestSignIn?(msg: GemRequestSignIn): void;
741
749
  onRequestFriendChallenge?(msg: GemRequestFriendChallenge): void;
742
750
  onRequestShare?(msg: GemRequestShare): void;
751
+ onRequestAvatarPicker?(): void;
743
752
  onVibrate?(msg: GemVibrate): void;
744
753
  onPartyEvent?(event: PartyEventRelay): void;
745
754
  onError?(code: GemErrorCode, message?: string): void;
@@ -1056,6 +1065,7 @@ declare class GemFrame {
1056
1065
  readonly key: string;
1057
1066
  readonly value: string;
1058
1067
  }>): boolean;
1068
+ requestAvatarPicker(): boolean;
1059
1069
  requestVibrate(pattern: readonly number[]): boolean;
1060
1070
  reportFrameStats(stats: {
1061
1071
  fps: number;
@@ -2282,4 +2292,4 @@ interface P2pMatchApi {
2282
2292
  session(matchId: string): P2pSession | null;
2283
2293
  }
2284
2294
  declare function createP2pApi(options: P2pApiOptions): P2pMatchApi;
2285
- export { type AutoReconnectOptions, type AwaitMatchOptions, CAPABILITY_GATES, CAPABILITY_NAMESPACE_GATES, CHANNELS, CHANNEL_KINDS, type ChannelKind, type ClientPlatform, ClientTelemetry, type ClientTelemetryOptions, type ClientVersion, type Clock, type ClusterTarget, type ClusterTargetBridge, type ClusterTargetLike, type ClusterTargetListResolver, type ClusterTargetRefresher, type ClusterTargetResolver, type ClusterTargetSource, type ClusterTargetSourceOptions, type ConnectOptions, type CreateRoomOptions, INBOUND_EVENTS as DEDICATED_INBOUND_EVENTS, DEFAULT_WELCOME_CEILING_MS, DEVICE_SETTINGS_MAX_BYTES, type DataChannelLike$1 as DataChannelLike, type DedicatedServerApi, type DedicatedServerApiOptions, DedicatedServerError, type DedicatedServerFailure, type DedicatedServerSession, type DedicatedSignalTransport, DedicatedSignalingHub, type DedicatedSignalingOptions, type EstablishOptions, FRAME_TO_PARENT, type FailedMatch, type FrameCallbacks, type FrameMessage, type FrameOptions, type FrameState, type GemAdResult, type GemAudioState, type GemAutoStartFailedEvent, type GemCapability, type GemClusterTarget, type GemCohorts, type GemDedicatedEvent, type GemDedicatedOffer, type GemDeviceSettings, type GemDeviceSettingsPut, type GemDeviceSettingsResult, type GemDevtools, type GemEarnAllowanceChanged, type GemEngaged, type GemError, type GemErrorCode, type GemExit, GemFrame, type GemFrameStats, type GemFriendChallengeResult, type GemGameContext, type GemHandshake, type GemHandshakeAccept, GemHost, type GemLocalServer, type GemLocalServerDenied, type GemMenu, type GemMenuSelect, type GemMessage, type GemOpenExternal, type GemPartyRequest, type GemPartyResult, type GemPause, type GemPlayer, type GemPortraitBorders, type GemPrefs, type GemProgress, type GemPurchaseResult, type GemReady, type GemRequestAd, type GemRequestContext, type GemRequestFriendChallenge, type GemRequestFullscreen, type GemRequestLocalServer, type GemRequestPurchase, type GemRequestShare, type GemRequestSignIn, type GemRequestToken, type GemRewardCue, type GemRoomEvent, type GemScreenshot, type GemScreenshotDenied, type GemSeatedEvent, type GemSignInResult, type GemSignal, type GemSignalEvent, type GemSocketState, type GemToken, type GemTokenDenied, type GemVibrate, type GemViewport, type GemWalletDisplay, type GemWillTerminate, HANDSHAKE_TIMEOUT_MS, type HandshakeEvent, type HostCallbacks, HostMigration, type HostOptions, type HostState, type JoinCredential, type JoinExchange, type JoinRoomOptions, type JoinWelcome, type KeySource, type ListRoomsOptions, MALFORMED_INBOUND_KEY, MAX_ARRAY_LENGTH, MAX_CLUSTER_TARGETS, MAX_MESSAGE_BYTES, MAX_MESSAGE_DEPTH, MAX_MESSAGE_NODES, MAX_SIGNALS_PER_SECOND, MAX_SOCKET_FRAME_BYTES, MIGRATION_TIMEOUT_MS, type MatchAutoStartFailed, type MatchConnectionState, type MatchEnded, type MatchOutcome, type MatchOutcomeWaitOptions, type MatchReconnected, type MatchReconnecting, type MatchSession, type MatchSessionPhase, type MatchSuspended, type MatchTicket, type MatchTicketOutcome, type MatchTicketStatus, type MigrationState, type OfferRefusal, type OfferRequest, P2pApi, type P2pConnectOptions, P2pError, type P2pEventMap, type P2pEventName, type P2pFailure, type P2pMatchApi, type P2pPeer, P2pSession, PARENT_TO_FRAME, PROTOCOL, type ParentMessage, type PartyBridge, type PartyEventRelay, type PartyResolver, type PartyResolverOptions, type PeerConnectionLike$1 as PeerConnectionLike, PlayerText, type PortLike, type PortMessageHandler, type PresentCredentialOptions, type PurchaseRefusalCode, type QueueForMatchOptions, type QuickJoinOptions, RATE_LIMITS, RateLimiter, type ReadyMatch, type Rejection, type RelayedDedicatedEvent, type RelayedRoomEvent, type RelayedSignal, type ResolvedClientVersion, type Room, type RoomArgEntry, type RoomArgScalar, type RoomArgType, type RoomArgValue, type RoomArgs, RoomEmitter, type RoomEventMap, type RoomEventName, type RoomManager, type RoomManagerOptions, type RoomMember, type RoomOperationError, type RoomPage, type RoomStatus, type RoomSummary, RoomsApi, type RoomsApiOptions, SUPPORTED_VERSIONS, type SdpType$1 as SdpType, type SendPlayerInput, type SessionDescriptionLike$1 as SessionDescriptionLike, type SignalTransport, type SignalingAnswer, type SignalingChannel, SignalingClient, type SignalingIntent, type StartMatchOptions, type StartedMatch$1 as StartedMatch, TELEMETRY_EVENTS, TRANSPORT_LABELS, type TelemetrySample, type TokenDenial, type TokenGrant, type TransportLabel, type TurnLease, type UpdateRoomOptions, VALIDATORS, type VerifiedCredential, WEBRTC_DEDICATED, WEBRTC_P2P, WEB_ENGINE_VERSION, WEB_PROTOCOL_VERSION, type WindowLike, asPlayerText, awaitMatchOutcome, browserPeerConnection, buildDedicatedOfferFrame, buildSocketFrame, capabilityFor, createClusterTargetSource, createDedicatedServerApi, createKeySource, createP2pApi, createPartyResolver, createRoomManager, deviceSettingsByteLength, establishDataChannel, fingerprintOf, fingerprintsMatch, generateCertificate, isOrigin, listClusterTargets, memberFromWire, negotiateVersion, normaliseClusterTarget, normaliseClusterTargets, normaliseFingerprint, originsEqual, presentJoinCredential, projectDedicatedEvent, projectPartyEvent, projectSignal, roomArgValuesFromWire, roomArgsTemplateFromWire, roomFromWire, startMatch, summaryFromWire, systemClock, text, unavailableSignaling, validateGemAdResult, validateGemAudioState, validateGemAutoStartFailedEvent, validateGemClusterTarget, validateGemCohorts, validateGemDedicatedEvent, validateGemDedicatedOffer, validateGemDeviceSettings, validateGemDeviceSettingsPut, validateGemDeviceSettingsResult, validateGemDevtools, validateGemEarnAllowanceChanged, validateGemEngaged, validateGemError, validateGemExit, validateGemFrameStats, validateGemFriendChallengeResult, validateGemGameContext, validateGemHandshake, validateGemHandshakeAccept, validateGemLocalServer, validateGemLocalServerDenied, validateGemMenu, validateGemMenuSelect, validateGemOpenExternal, validateGemPartyRequest, validateGemPartyResult, validateGemPause, validateGemPlayer, validateGemPortraitBorders, validateGemPrefs, validateGemProgress, validateGemPurchaseResult, validateGemReady, validateGemRequestAd, validateGemRequestContext, validateGemRequestFriendChallenge, validateGemRequestFullscreen, validateGemRequestLocalServer, validateGemRequestPurchase, validateGemRequestShare, validateGemRequestSignIn, validateGemRequestToken, validateGemRewardCue, validateGemRoomEvent, validateGemScreenshot, validateGemScreenshotDenied, validateGemSeatedEvent, validateGemSignInResult, validateGemSignal, validateGemSignalEvent, validateGemSocketState, validateGemToken, validateGemTokenDenied, validateGemVibrate, validateGemViewport, validateGemWalletDisplay, validateGemWillTerminate, validateSize, verifyCredential };
2295
+ export { type AutoReconnectOptions, type AwaitMatchOptions, CAPABILITY_GATES, CAPABILITY_NAMESPACE_GATES, CHANNELS, CHANNEL_KINDS, type ChannelKind, type ClientPlatform, ClientTelemetry, type ClientTelemetryOptions, type ClientVersion, type Clock, type ClusterTarget, type ClusterTargetBridge, type ClusterTargetLike, type ClusterTargetListResolver, type ClusterTargetRefresher, type ClusterTargetResolver, type ClusterTargetSource, type ClusterTargetSourceOptions, type ConnectOptions, type CreateRoomOptions, INBOUND_EVENTS as DEDICATED_INBOUND_EVENTS, DEFAULT_WELCOME_CEILING_MS, DEVICE_SETTINGS_MAX_BYTES, type DataChannelLike$1 as DataChannelLike, type DedicatedServerApi, type DedicatedServerApiOptions, DedicatedServerError, type DedicatedServerFailure, type DedicatedServerSession, type DedicatedSignalTransport, DedicatedSignalingHub, type DedicatedSignalingOptions, type EstablishOptions, FRAME_TO_PARENT, type FailedMatch, type FrameCallbacks, type FrameMessage, type FrameOptions, type FrameState, type GemAdResult, type GemAudioState, type GemAutoStartFailedEvent, type GemCapability, type GemClusterTarget, type GemCohorts, type GemDedicatedEvent, type GemDedicatedOffer, type GemDeviceSettings, type GemDeviceSettingsPut, type GemDeviceSettingsResult, type GemDevtools, type GemEarnAllowanceChanged, type GemEngaged, type GemError, type GemErrorCode, type GemExit, GemFrame, type GemFrameStats, type GemFriendChallengeResult, type GemGameContext, type GemHandshake, type GemHandshakeAccept, GemHost, type GemLocalServer, type GemLocalServerDenied, type GemMenu, type GemMenuSelect, type GemMessage, type GemOpenExternal, type GemPartyRequest, type GemPartyResult, type GemPause, type GemPlayer, type GemPortraitBorders, type GemPrefs, type GemProgress, type GemPurchaseResult, type GemReady, type GemRequestAd, type GemRequestAvatarPicker, type GemRequestContext, type GemRequestFriendChallenge, type GemRequestFullscreen, type GemRequestLocalServer, type GemRequestPurchase, type GemRequestShare, type GemRequestSignIn, type GemRequestToken, type GemRewardCue, type GemRoomEvent, type GemScreenshot, type GemScreenshotDenied, type GemSeatedEvent, type GemSignInResult, type GemSignal, type GemSignalEvent, type GemSocketState, type GemToken, type GemTokenDenied, type GemVibrate, type GemViewport, type GemWalletDisplay, type GemWillTerminate, HANDSHAKE_TIMEOUT_MS, type HandshakeEvent, type HostCallbacks, HostMigration, type HostOptions, type HostState, type JoinCredential, type JoinExchange, type JoinRoomOptions, type JoinWelcome, type KeySource, type ListRoomsOptions, MALFORMED_INBOUND_KEY, MAX_ARRAY_LENGTH, MAX_CLUSTER_TARGETS, MAX_MESSAGE_BYTES, MAX_MESSAGE_DEPTH, MAX_MESSAGE_NODES, MAX_SIGNALS_PER_SECOND, MAX_SOCKET_FRAME_BYTES, MIGRATION_TIMEOUT_MS, type MatchAutoStartFailed, type MatchConnectionState, type MatchEnded, type MatchOutcome, type MatchOutcomeWaitOptions, type MatchReconnected, type MatchReconnecting, type MatchSession, type MatchSessionPhase, type MatchSuspended, type MatchTicket, type MatchTicketOutcome, type MatchTicketStatus, type MigrationState, type OfferRefusal, type OfferRequest, P2pApi, type P2pConnectOptions, P2pError, type P2pEventMap, type P2pEventName, type P2pFailure, type P2pMatchApi, type P2pPeer, P2pSession, PARENT_TO_FRAME, PROTOCOL, type ParentMessage, type PartyBridge, type PartyEventRelay, type PartyResolver, type PartyResolverOptions, type PeerConnectionLike$1 as PeerConnectionLike, PlayerText, type PortLike, type PortMessageHandler, type PresentCredentialOptions, type PurchaseRefusalCode, type QueueForMatchOptions, type QuickJoinOptions, RATE_LIMITS, RateLimiter, type ReadyMatch, type Rejection, type RelayedDedicatedEvent, type RelayedRoomEvent, type RelayedSignal, type ResolvedClientVersion, type Room, type RoomArgEntry, type RoomArgScalar, type RoomArgType, type RoomArgValue, type RoomArgs, RoomEmitter, type RoomEventMap, type RoomEventName, type RoomManager, type RoomManagerOptions, type RoomMember, type RoomOperationError, type RoomPage, type RoomStatus, type RoomSummary, RoomsApi, type RoomsApiOptions, SUPPORTED_VERSIONS, type SdpType$1 as SdpType, type SendPlayerInput, type SessionDescriptionLike$1 as SessionDescriptionLike, type SignalTransport, type SignalingAnswer, type SignalingChannel, SignalingClient, type SignalingIntent, type StartMatchOptions, type StartedMatch$1 as StartedMatch, TELEMETRY_EVENTS, TRANSPORT_LABELS, type TelemetrySample, type TokenDenial, type TokenGrant, type TransportLabel, type TurnLease, type UpdateRoomOptions, VALIDATORS, type VerifiedCredential, WEBRTC_DEDICATED, WEBRTC_P2P, WEB_ENGINE_VERSION, WEB_PROTOCOL_VERSION, type WindowLike, asPlayerText, awaitMatchOutcome, browserPeerConnection, buildDedicatedOfferFrame, buildSocketFrame, capabilityFor, createClusterTargetSource, createDedicatedServerApi, createKeySource, createP2pApi, createPartyResolver, createRoomManager, deviceSettingsByteLength, establishDataChannel, fingerprintOf, fingerprintsMatch, generateCertificate, isOrigin, listClusterTargets, memberFromWire, negotiateVersion, normaliseClusterTarget, normaliseClusterTargets, normaliseFingerprint, originsEqual, presentJoinCredential, projectDedicatedEvent, projectPartyEvent, projectSignal, roomArgValuesFromWire, roomArgsTemplateFromWire, roomFromWire, startMatch, summaryFromWire, systemClock, text, unavailableSignaling, validateGemAdResult, validateGemAudioState, validateGemAutoStartFailedEvent, validateGemClusterTarget, validateGemCohorts, validateGemDedicatedEvent, validateGemDedicatedOffer, validateGemDeviceSettings, validateGemDeviceSettingsPut, validateGemDeviceSettingsResult, validateGemDevtools, validateGemEarnAllowanceChanged, validateGemEngaged, validateGemError, validateGemExit, validateGemFrameStats, validateGemFriendChallengeResult, validateGemGameContext, validateGemHandshake, validateGemHandshakeAccept, validateGemLocalServer, validateGemLocalServerDenied, validateGemMenu, validateGemMenuSelect, validateGemOpenExternal, validateGemPartyRequest, validateGemPartyResult, validateGemPause, validateGemPlayer, validateGemPortraitBorders, validateGemPrefs, validateGemProgress, validateGemPurchaseResult, validateGemReady, validateGemRequestAd, validateGemRequestAvatarPicker, validateGemRequestContext, validateGemRequestFriendChallenge, validateGemRequestFullscreen, validateGemRequestLocalServer, validateGemRequestPurchase, validateGemRequestShare, validateGemRequestSignIn, validateGemRequestToken, validateGemRewardCue, validateGemRoomEvent, validateGemScreenshot, validateGemScreenshotDenied, validateGemSeatedEvent, validateGemSignInResult, validateGemSignal, validateGemSignalEvent, validateGemSocketState, validateGemToken, validateGemTokenDenied, validateGemVibrate, validateGemViewport, validateGemWalletDisplay, validateGemWillTerminate, validateSize, verifyCredential };