@indiegems/gem-web-sdk 7.1.0 → 7.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.
- package/brand/ticket-hero-128.png +0 -0
- package/brand/ticket-hero-256.png +0 -0
- package/brand/ticket-hero-384.png +0 -0
- package/brand/ticket-hero-512.png +0 -0
- package/brand/ticket-hero-768.png +0 -0
- package/brand/ticket-icon-20-1.5x.png +0 -0
- package/brand/ticket-icon-20-1x.png +0 -0
- package/brand/ticket-icon-20-2x.png +0 -0
- package/brand/ticket-icon-20-3x.png +0 -0
- package/brand/ticket-icon-32-1.5x.png +0 -0
- package/brand/ticket-icon-32-1x.png +0 -0
- package/brand/ticket-icon-32-2x.png +0 -0
- package/brand/ticket-icon-32-3x.png +0 -0
- package/dist/game.d.ts +21 -6
- package/dist/gem-web-sdk.bridge.js +1 -1
- package/dist/gem-web-sdk.esm.js +2 -2
- package/dist/gem-web-sdk.game.js +2 -2
- package/dist/gem-web-sdk.min.js +2 -2
- package/dist/gem-web-sdk.sdk.js +2 -2
- package/dist/gem-web-sdk.server-api.js +1 -1
- package/dist/gem-web-sdk.server.js +2 -2
- package/dist/index.d.ts +4 -2
- package/dist/sdk.d.ts +31 -6
- package/dist/server-api.d.ts +10 -0
- package/dist/server.d.ts +10 -0
- package/package.json +1 -1
- package/schema/bridge.v1.json +159 -29
|
@@ -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,t){let n=`/v1/inventory/transfers/${i(e)}/accept`;return r.client.post(n,void 0,t?.signal)}async function g(r,e,t,n,s,o){let a=`/v1/inventory/${i(e)}/${i(t)}/progressions/${i(n)}/add`;return r.client.post(a,s,o?.signal)}async function p(r,e,t,n){let s=`/v1/voice/sessions/${i(e)}/admin`;return r.client.post(s,t,n?.signal)}async function c(r,e,t){let n=`/v1/inventory/transfers/${i(e)}/cancel`;return r.client.post(n,void 0,t?.signal)}async function m(r,e,t,n,s,o){let a=`/v1/inventory/${i(e)}/${i(t)}/progressions/${i(n)}/claim`;return r.client.post(a,s,o?.signal)}async function d(r,e,t){let n=`/v1/games/${i(r.gameId())}/game-rooms/${i(e)}`;return r.client.delete(n,t?.signal)}async function _(r,e,t,n,s){let o=`/v1/inventory/${i(e)}/${i(t)}/orders/batch`;return r.client.post(o,n,s?.signal,{...s?.ifMatch===void 0?{}:{ifMatch:s.ifMatch}})}async function y(r,e,t,n,s){let o=`/v1/inventory/${i(e)}/${i(t)}/orders`;return r.client.post(o,n,s?.signal,{...s?.ifMatch===void 0?{}:{ifMatch:s.ifMatch}})}async function b(r,e,t){return r.client.post("/v1/voice/sessions",e,t?.signal)}async function R(r,e,t,n,s){let o=`/v1/settings/${i(e)}/${i(t)}/${i(n)}`;return r.client.delete(o,s?.signal)}async function f(r,e,t,n,s){let o=`/v1/saves/${i(e)}/${i(t)}/${i(n)}`;return r.client.delete(o,s?.signal)}async function v(r,e,t){let n=`/v1/voice/sessions/${i(e)}`;return r.client.delete(n,t?.signal)}async function h(r,e,t,n,s){let o=`/v1/inventory/${i(e)}/${i(t)}/recipes/execute`;return r.client.post(o,n,s?.signal,{...s?.ifMatch===void 0?{}:{ifMatch:s.ifMatch}})}async function S(r,e,t,n,s,o){let a=`/v1/saves/${i(e)}/${i(t)}/${i(n)}/finalize`;return r.client.post(a,s,o?.signal)}async function x(r,e,t){let n=`/v1/inventory/loot-tables/${i(e)}/drop-rates`;return r.client.get(n,t?.signal)}async function P(r,e,t,n,s){let o=`/v1/inventory/${i(e)}/${i(t)}/currencies/${i(n)}`;return r.client.get(o,s?.signal)}async function A(r,e,t,n,s){let o=`/v1/settings/${i(e)}/${i(t)}/${i(n)}`;return r.client.getWithEtag(o,{...s?.signal===void 0?{}:{signal:s.signal},...s?.ifNoneMatch===void 0?{}:{ifNoneMatch:s.ifNoneMatch}})}async function w(r,e,t,n){let s=new URLSearchParams;n?.include_buckets!==void 0&&s.set("include_buckets",String(n?.include_buckets)),n?.include_custom_data!==void 0&&s.set("include_custom_data",String(n?.include_custom_data)),n?.currency_limit!==void 0&&s.set("currency_limit",String(n?.currency_limit)),n?.currency_cursor!==void 0&&s.set("currency_cursor",String(n?.currency_cursor)),n?.item_limit!==void 0&&s.set("item_limit",String(n?.item_limit)),n?.item_cursor!==void 0&&s.set("item_cursor",String(n?.item_cursor)),n?.progression_limit!==void 0&&s.set("progression_limit",String(n?.progression_limit)),n?.progression_cursor!==void 0&&s.set("progression_cursor",String(n?.progression_cursor));let o=s.toString(),a=`/v1/inventory/${i(e)}/${i(t)}`+(o?`?${o}`:"");return r.client.get(a,n?.signal)}async function k(r,e,t,n,s){let o=`/v1/inventory/${i(e)}/${i(t)}/items/${i(n)}`;return r.client.get(o,s?.signal)}async function $(r,e,t,n,s){let o=new URLSearchParams;s?.bucket_1!==void 0&&o.set("bucket_1",String(s?.bucket_1)),s?.bucket_2!==void 0&&o.set("bucket_2",String(s?.bucket_2)),s?.limit!==void 0&&o.set("limit",String(s?.limit));let a=o.toString(),l=`/v1/leaderboards/${i(e)}/${i(t)}/${i(n)}`+(a?`?${a}`:"");return r.client.get(l,s?.signal)}async function G(r,e,t,n,s){let o=`/v1/inventory/${i(e)}/${i(t)}/orders/${i(n)}`;return r.client.get(o,s?.signal)}async function O(r,e,t,n,s){let o=`/v1/inventory/${i(e)}/${i(t)}/progressions/${i(n)}`;return r.client.get(o,s?.signal)}async function I(r,e,t,n,s,o){let a=`/v1/inventory/${i(e)}/${i(t)}/catalogs/${i(n)}/recipes/${i(s)}/availability`;return r.client.get(a,o?.signal)}async function q(r,e,t,n){let s=new URLSearchParams;n?.limit!==void 0&&s.set("limit",String(n?.limit));let o=s.toString(),a=`/v1/inventory/${i(e)}/${i(t)}/recipe-usage`+(o?`?${o}`:"");return r.client.get(a,n?.signal)}async function C(r,e,t,n,s){let o=`/v1/saves/${i(e)}/${i(t)}/${i(n)}`;return r.client.getWithEtag(o,{...s?.signal===void 0?{}:{signal:s.signal},...s?.ifNoneMatch===void 0?{}:{ifNoneMatch:s.ifNoneMatch}})}async function E(r,e,t){let n=`/v1/events/${i(e)}`;return r.client.get(n,t?.signal)}async function T(r,e,t){let n=`/v2/games/${i(r.gameId())}/game-rooms/${i(e)}`;return r.client.getWithEtag(n,{...t?.signal===void 0?{}:{signal:t.signal},...t?.ifNoneMatch===void 0?{}:{ifNoneMatch:t.ifNoneMatch}})}async function L(r,e,t){let n=new URLSearchParams;t?.bucket_1!==void 0&&n.set("bucket_1",String(t?.bucket_1)),t?.bucket_2!==void 0&&n.set("bucket_2",String(t?.bucket_2));let s=n.toString(),o=`/v1/leaderboards/${i(e)}`+(s?`?${s}`:"");return r.client.get(o,t?.signal)}async function B(r,e){let t=new URLSearchParams;e?.config_version!==void 0&&t.set("config_version",String(e?.config_version));let n=t.toString(),s="/v1/inventory/platform-funded-game-inventory-purchase-catalog"+(n?`?${n}`:"");return r.client.get(s,e?.signal)}async function U(r,e,t){let n=`/v1/game-room-templates/${i(e)}`;return r.client.get(n,t?.signal)}async function M(r,e,t){let n=`/v1/games/${i(r.gameId())}/game-rooms/${i(e)}/room-args`;return r.client.get(n,t?.signal)}async function D(r,e,t){let n=`/v1/inventory/transfers/${i(e)}`;return r.client.get(n,t?.signal)}async function V(r,e,t){let n=`/v1/games/${i(r.gameId())}/analytics/events`;return r.client.post(n,e,t?.signal,{replaySafe:true})}async function N(r,e,t){return r.client.post("/v1/inventory/transfers",e,t?.signal)}async function j(r,e,t){return r.client.postBytes("/v1/functions/invoke",e,t?.signal)}async function F(r,e,t,n){let s=`/v1/games/${i(r.gameId())}/game-rooms/${i(e)}/kick/${i(t)}`;return r.client.post(s,void 0,n?.signal)}async function z(r,e){let t=new URLSearchParams;e?.periods_back!==void 0&&t.set("periods_back",String(e?.periods_back));let n=t.toString(),s="/v1/challenges"+(n?`?${n}`:"");return r.client.get(s,e?.signal)}async function W(r,e,t,n){let s=`/v1/settings/${i(e)}/${i(t)}`;return r.client.get(s,n?.signal)}async function K(r,e,t,n){let s=new URLSearchParams;n?.limit!==void 0&&s.set("limit",String(n?.limit)),n?.cursor!==void 0&&s.set("cursor",String(n?.cursor));let o=s.toString(),a=`/v1/inventory/${i(e)}/${i(t)}/orders`+(o?`?${o}`:"");return r.client.get(a,n?.signal)}async function H(r,e,t,n){let s=`/v1/inventory/${i(e)}/${i(t)}/progressions`;return r.client.get(s,n?.signal)}async function J(r,e,t,n){let s=new URLSearchParams;n?.limit!==void 0&&s.set("limit",String(n?.limit)),n?.cursor!==void 0&&s.set("cursor",String(n?.cursor));let o=s.toString(),a=`/v1/saves/${i(e)}/${i(t)}`+(o?`?${o}`:"");return r.client.get(a,n?.signal)}async function Z(r,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 n=t.toString(),s="/v1/events"+(n?`?${n}`:"");return r.client.get(s,e?.signal)}async function Q(r,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 n=t.toString(),s=`/v1/games/${i(r.gameId())}/game-rooms`+(n?`?${n}`:"");return r.client.get(s,e?.signal)}async function X(r,e){return r.client.get("/v1/game-room-templates",e?.signal)}async function Y(r,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 n=t.toString(),s="/v1/inventory/transfers"+(n?`?${n}`:"");return r.client.get(s,e?.signal)}async function ee(r,e,t,n,s,o){let a=`/v1/settings/${i(e)}/${i(t)}/${i(n)}`;return r.client.put(a,s,o?.signal,{...o?.ifMatch===void 0?{}:{ifMatch:o.ifMatch}})}async function ne(r,e,t,n){let s=`/v1/games/${i(r.gameId())}/game-rooms/${i(e)}/room-args`;return r.client.put(s,t,n?.signal)}async function te(r,e,t){let n=`/v1/inventory/transfers/${i(e)}/reject`;return r.client.post(n,void 0,t?.signal)}async function re(r,e,t,n,s,o){let a=`/v1/saves/${i(e)}/${i(t)}/${i(n)}/upload-url`;return r.client.post(a,s,o?.signal,{replaySafe:true})}async function se(r,e,t,n,s,o){let a=`/v1/inventory/${i(e)}/${i(t)}/progressions/${i(n)}/reset`;return r.client.post(a,s,o?.signal)}async function ie(r,e,t,n,s){let o=`/v1/inventory/${i(e)}/${i(t)}/orders/simulate`;return r.client.post(o,n,s?.signal)}async function oe(r,e,t,n){let s=`/v2/games/${i(r.gameId())}/game-rooms/${i(e)}/transfer/${i(t)}`;return r.client.post(s,void 0,n?.signal)}async function ae(r,e,t,n){let s=`/v2/games/${i(r.gameId())}/game-rooms/${i(e)}`;return r.client.patch(s,t,n?.signal,{...n?.ifMatch===void 0?{}:{ifMatch:n.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,R as deleteEntityGameSetting,f as deleteEntitySave,v as deleteSession,h as executeEntityRecipe,S as finalizeSaveUpload,x as getDropRates,P as getEntityCurrency,A as getEntityGameSetting,w as getEntityInventory,k as getEntityInventoryItem,$ as getEntityLeaderboard,G as getEntityOrder,O as getEntityProgression,I as getEntityRecipeAvailability,q as getEntityRecipeUsage,C as getEntitySave,E as getEvent,T as getGameRoomV2,L as getLeaderboard,B as getPurchaseCatalog,U as getResolvedTemplate,M as getRoomArgs,D as getTransferDetails,V as ingestAnalyticsEvents,N as initiateInventoryTransfer,j as invokeFunction,F as kickPlayer,z as listChallenges,W as listEntityGameSettings,K as listEntityOrders,H as listEntityProgressions,J as listEntitySaves,Z as listEvents,Q as listGameRooms,X as listResolvedTemplates,Y as listTransfers,ee as putEntityGameSetting,ne as putRoomArgs,te as rejectTransfer,re as requestSaveUploadUrl,se as resetEntityProgression,ie as simulateEntityOrder,oe as transferHostV2,ae 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,t){let n=`/v1/inventory/transfers/${i(e)}/accept`;return r.client.post(n,void 0,t?.signal)}async function g(r,e,t,n,s,o){let a=`/v1/inventory/${i(e)}/${i(t)}/progressions/${i(n)}/add`;return r.client.post(a,s,o?.signal)}async function p(r,e,t,n){let s=`/v1/voice/sessions/${i(e)}/admin`;return r.client.post(s,t,n?.signal)}async function c(r,e,t){let n=`/v1/inventory/transfers/${i(e)}/cancel`;return r.client.post(n,void 0,t?.signal)}async function m(r,e,t,n,s,o){let a=`/v1/inventory/${i(e)}/${i(t)}/progressions/${i(n)}/claim`;return r.client.post(a,s,o?.signal)}async function d(r,e,t){let n=`/v1/games/${i(r.gameId())}/game-rooms/${i(e)}`;return r.client.delete(n,t?.signal)}async function _(r,e,t,n,s){let o=`/v1/inventory/${i(e)}/${i(t)}/orders/batch`;return r.client.post(o,n,s?.signal,{...s?.ifMatch===void 0?{}:{ifMatch:s.ifMatch}})}async function y(r,e,t,n,s){let o=`/v1/inventory/${i(e)}/${i(t)}/orders`;return r.client.post(o,n,s?.signal,{...s?.ifMatch===void 0?{}:{ifMatch:s.ifMatch}})}async function b(r,e,t){return r.client.post("/v1/voice/sessions",e,t?.signal)}async function f(r,e,t,n,s){let o=`/v1/settings/${i(e)}/${i(t)}/${i(n)}`;return r.client.delete(o,s?.signal)}async function R(r,e,t,n,s){let o=`/v1/saves/${i(e)}/${i(t)}/${i(n)}`;return r.client.delete(o,s?.signal)}async function v(r,e,t){let n=`/v1/voice/sessions/${i(e)}`;return r.client.delete(n,t?.signal)}async function h(r,e,t,n,s){let o=`/v1/inventory/${i(e)}/${i(t)}/recipes/execute`;return r.client.post(o,n,s?.signal,{...s?.ifMatch===void 0?{}:{ifMatch:s.ifMatch}})}async function S(r,e,t,n,s,o){let a=`/v1/saves/${i(e)}/${i(t)}/${i(n)}/finalize`;return r.client.post(a,s,o?.signal)}async function x(r,e,t){let n=`/v1/inventory/loot-tables/${i(e)}/drop-rates`;return r.client.get(n,t?.signal)}async function P(r,e,t,n,s){let o=`/v1/inventory/${i(e)}/${i(t)}/currencies/${i(n)}`;return r.client.get(o,s?.signal)}async function A(r,e,t,n,s){let o=`/v1/settings/${i(e)}/${i(t)}/${i(n)}`;return r.client.getWithEtag(o,{...s?.signal===void 0?{}:{signal:s.signal},...s?.ifNoneMatch===void 0?{}:{ifNoneMatch:s.ifNoneMatch}})}async function w(r,e,t,n){let s=new URLSearchParams;n?.include_buckets!==void 0&&s.set("include_buckets",String(n?.include_buckets)),n?.include_custom_data!==void 0&&s.set("include_custom_data",String(n?.include_custom_data)),n?.currency_limit!==void 0&&s.set("currency_limit",String(n?.currency_limit)),n?.currency_cursor!==void 0&&s.set("currency_cursor",String(n?.currency_cursor)),n?.item_limit!==void 0&&s.set("item_limit",String(n?.item_limit)),n?.item_cursor!==void 0&&s.set("item_cursor",String(n?.item_cursor)),n?.progression_limit!==void 0&&s.set("progression_limit",String(n?.progression_limit)),n?.progression_cursor!==void 0&&s.set("progression_cursor",String(n?.progression_cursor));let o=s.toString(),a=`/v1/inventory/${i(e)}/${i(t)}`+(o?`?${o}`:"");return r.client.get(a,n?.signal)}async function k(r,e,t,n,s){let o=`/v1/inventory/${i(e)}/${i(t)}/items/${i(n)}`;return r.client.get(o,s?.signal)}async function $(r,e,t,n,s){let o=new URLSearchParams;s?.bucket_1!==void 0&&o.set("bucket_1",String(s?.bucket_1)),s?.bucket_2!==void 0&&o.set("bucket_2",String(s?.bucket_2)),s?.limit!==void 0&&o.set("limit",String(s?.limit));let a=o.toString(),l=`/v1/leaderboards/${i(e)}/${i(t)}/${i(n)}`+(a?`?${a}`:"");return r.client.get(l,s?.signal)}async function G(r,e,t,n,s){let o=`/v1/inventory/${i(e)}/${i(t)}/orders/${i(n)}`;return r.client.get(o,s?.signal)}async function O(r,e,t,n,s){let o=`/v1/inventory/${i(e)}/${i(t)}/progressions/${i(n)}`;return r.client.get(o,s?.signal)}async function I(r,e,t,n,s,o){let a=`/v1/inventory/${i(e)}/${i(t)}/catalogs/${i(n)}/recipes/${i(s)}/availability`;return r.client.get(a,o?.signal)}async function q(r,e,t,n){let s=new URLSearchParams;n?.limit!==void 0&&s.set("limit",String(n?.limit));let o=s.toString(),a=`/v1/inventory/${i(e)}/${i(t)}/recipe-usage`+(o?`?${o}`:"");return r.client.get(a,n?.signal)}async function C(r,e,t,n,s){let o=`/v1/saves/${i(e)}/${i(t)}/${i(n)}`;return r.client.getWithEtag(o,{...s?.signal===void 0?{}:{signal:s.signal},...s?.ifNoneMatch===void 0?{}:{ifNoneMatch:s.ifNoneMatch}})}async function E(r,e,t){let n=`/v1/events/${i(e)}`;return r.client.get(n,t?.signal)}async function T(r,e,t){let n=`/v2/games/${i(r.gameId())}/game-rooms/${i(e)}`;return r.client.getWithEtag(n,{...t?.signal===void 0?{}:{signal:t.signal},...t?.ifNoneMatch===void 0?{}:{ifNoneMatch:t.ifNoneMatch}})}async function L(r,e,t){let n=new URLSearchParams;t?.bucket_1!==void 0&&n.set("bucket_1",String(t?.bucket_1)),t?.bucket_2!==void 0&&n.set("bucket_2",String(t?.bucket_2));let s=n.toString(),o=`/v1/leaderboards/${i(e)}`+(s?`?${s}`:"");return r.client.get(o,t?.signal)}async function B(r,e){let t=new URLSearchParams;e?.config_version!==void 0&&t.set("config_version",String(e?.config_version));let n=t.toString(),s="/v1/inventory/platform-funded-game-inventory-purchase-catalog"+(n?`?${n}`:"");return r.client.get(s,e?.signal)}async function U(r,e,t){let n=`/v1/game-room-templates/${i(e)}`;return r.client.get(n,t?.signal)}async function M(r,e,t){let n=`/v1/games/${i(r.gameId())}/game-rooms/${i(e)}/room-args`;return r.client.get(n,t?.signal)}async function D(r,e,t){let n=`/v1/inventory/transfers/${i(e)}`;return r.client.get(n,t?.signal)}async function V(r,e,t){let n=`/v1/games/${i(r.gameId())}/analytics/events`;return r.client.post(n,e,t?.signal,{replaySafe:true})}async function N(r,e,t){return r.client.post("/v1/inventory/transfers",e,t?.signal)}async function j(r,e,t){return r.client.postBytes("/v1/functions/invoke",e,t?.signal)}async function F(r,e,t,n){let s=`/v1/games/${i(r.gameId())}/game-rooms/${i(e)}/kick/${i(t)}`;return r.client.post(s,void 0,n?.signal)}async function z(r,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 n=t.toString(),s="/v1/challenges"+(n?`?${n}`:"");return r.client.get(s,e?.signal)}async function W(r,e,t,n){let s=`/v1/settings/${i(e)}/${i(t)}`;return r.client.get(s,n?.signal)}async function K(r,e,t,n){let s=new URLSearchParams;n?.limit!==void 0&&s.set("limit",String(n?.limit)),n?.cursor!==void 0&&s.set("cursor",String(n?.cursor));let o=s.toString(),a=`/v1/inventory/${i(e)}/${i(t)}/orders`+(o?`?${o}`:"");return r.client.get(a,n?.signal)}async function H(r,e,t,n){let s=`/v1/inventory/${i(e)}/${i(t)}/progressions`;return r.client.get(s,n?.signal)}async function J(r,e,t,n){let s=new URLSearchParams;n?.limit!==void 0&&s.set("limit",String(n?.limit)),n?.cursor!==void 0&&s.set("cursor",String(n?.cursor));let o=s.toString(),a=`/v1/saves/${i(e)}/${i(t)}`+(o?`?${o}`:"");return r.client.get(a,n?.signal)}async function Z(r,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 n=t.toString(),s="/v1/events"+(n?`?${n}`:"");return r.client.get(s,e?.signal)}async function Q(r,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 n=t.toString(),s=`/v1/games/${i(r.gameId())}/game-rooms`+(n?`?${n}`:"");return r.client.get(s,e?.signal)}async function X(r,e){return r.client.get("/v1/game-room-templates",e?.signal)}async function Y(r,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 n=t.toString(),s="/v1/inventory/transfers"+(n?`?${n}`:"");return r.client.get(s,e?.signal)}async function ee(r,e,t,n,s,o){let a=`/v1/settings/${i(e)}/${i(t)}/${i(n)}`;return r.client.put(a,s,o?.signal,{...o?.ifMatch===void 0?{}:{ifMatch:o.ifMatch}})}async function ne(r,e,t,n){let s=`/v1/games/${i(r.gameId())}/game-rooms/${i(e)}/room-args`;return r.client.put(s,t,n?.signal)}async function te(r,e,t){let n=`/v1/inventory/transfers/${i(e)}/reject`;return r.client.post(n,void 0,t?.signal)}async function re(r,e,t,n,s,o){let a=`/v1/saves/${i(e)}/${i(t)}/${i(n)}/upload-url`;return r.client.post(a,s,o?.signal,{replaySafe:true})}async function se(r,e,t,n,s,o){let a=`/v1/inventory/${i(e)}/${i(t)}/progressions/${i(n)}/reset`;return r.client.post(a,s,o?.signal)}async function ie(r,e,t,n,s){let o=`/v1/inventory/${i(e)}/${i(t)}/orders/simulate`;return r.client.post(o,n,s?.signal)}async function oe(r,e,t,n){let s=`/v2/games/${i(r.gameId())}/game-rooms/${i(e)}/transfer/${i(t)}`;return r.client.post(s,void 0,n?.signal)}async function ae(r,e,t,n){let s=`/v2/games/${i(r.gameId())}/game-rooms/${i(e)}`;return r.client.patch(s,t,n?.signal,{...n?.ifMatch===void 0?{}:{ifMatch:n.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,v as deleteSession,h as executeEntityRecipe,S as finalizeSaveUpload,x as getDropRates,P as getEntityCurrency,A as getEntityGameSetting,w as getEntityInventory,k as getEntityInventoryItem,$ as getEntityLeaderboard,G as getEntityOrder,O as getEntityProgression,I as getEntityRecipeAvailability,q as getEntityRecipeUsage,C as getEntitySave,E as getEvent,T as getGameRoomV2,L as getLeaderboard,B as getPurchaseCatalog,U as getResolvedTemplate,M as getRoomArgs,D as getTransferDetails,V as ingestAnalyticsEvents,N as initiateInventoryTransfer,j as invokeFunction,F as kickPlayer,z as listChallenges,W as listEntityGameSettings,K as listEntityOrders,H as listEntityProgressions,J as listEntitySaves,Z as listEvents,Q as listGameRooms,X as listResolvedTemplates,Y as listTransfers,ee as putEntityGameSetting,ne as putRoomArgs,te as rejectTransfer,re as requestSaveUploadUrl,se as resetEntityProgression,ie as simulateEntityOrder,oe as transferHostV2,ae 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 ye=Object.defineProperty;var fe=(n,e)=>{for(var t in e)ye(n,t,{get:e[t],enumerable:true});};globalThis.__gemWebSdkVersion="[gem-web-sdk:sdkVersion:7.1.0]";function he(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 h(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 h("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 h("internal","token arrived for a superseded generation");return this.grant=o,this.rejected=false,this.enter("ready"),o.token}).catch(o=>{let s=_e(o),a=o?.retryable;throw t===this.generation&&this.enter(he(s,typeof a=="boolean"?a:void 0)?"lost":"degraded",s),o instanceof h?o:new h(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)}},h=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 _e(n){if(n instanceof h)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}},$=["if-match","if-none-match"],V=4096;function ve(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 s=typeof r=="string"?be(r):r;if(typeof s!="string"||s.length>V||!Re(s))throw new p(`the ${o} header value cannot be sent \u2014 it is not a string, is longer than ${V} 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 be(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 Re(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 xe(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=ve(o.headers),a=xe(o),l=Object.freeze({...o,headers:s,...a===void 0?{}:{bytes:a}}),u=await e.tokenSource.get(),c=await n(l,u);if(c.status!==401||!t)return c;e.tokenSource.invalidate(u);let m=await e.tokenSource.get(),_=await n(l,m);if(_.status===401)throw e.tokenSource.close("unavailable"),new h("unavailable","the server refused a freshly minted token");return _}}}function W(n){let e=typeof n=="string"?new TextEncoder().encode(n):n;return btoa(Se(e))}function Se(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,a){super(`${t} (${r}): ${o}`);this.reason=t;this.status=r;this.detail=o;this.retryAfterSeconds=s;this.code=a;this.name="GemApiError";}reason;status;detail;retryAfterSeconds;code;get retryable(){return this.reason==="unavailable"||this.reason==="rate_limited"}},J=new WeakMap;function Y(n){return J.get(n)??{}}var ke=new Set([408,429,500,502,503,504]),we=6e4;function Ae(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,...I(o)},o.replaySafe===true)}async post(e,t,r,o={}){return this.send({method:"POST",path:e,body:t,signal:r,...I(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,...I(o)},o.replaySafe===true);return {bytes:Te(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,...I(o)},o.replaySafe===true)}async delete(e,t,r={}){return this.send({method:"DELETE",path:e,signal:t,...I(r)},r.replaySafe===true)}async send(e,t){return (await this.sendRaw(e,t)).body}async sendRaw(e,t){let r=t?Ae(this.options.maxRetries)+1:1,o=null;if(e.signal?.aborted)throw K(e.signal);for(let s=0;s<r;s++){if(s>0&&await this.backoff(s,o,e.signal),e.signal?.aborted)throw K(e.signal);let a;try{a=await this.options.transport.request(e);}catch(u){if(h.isAuthError(u)||p.isRefusal(u)||e.signal?.aborted||Oe(u))throw u;o=new g("unavailable",0,String(u));continue}if(a.status>=200&&a.status<300||a.status===304)return a;let l=Pe(a);if(!ke.has(a.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,a=2**(e-1)*250,l=Math.min(Math.max(s,a),we);return new Promise(u=>{let c=this.options.clock,m=false,_=false,b,y=()=>{m||(m=true,_&&c.clearTimeout(b),r?.removeEventListener("abort",y),u());};r?.addEventListener("abort",y,{once:true}),b=c.setTimeout(y,l),_=true,m&&c.clearTimeout(b);})}};function Te(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 I(n){return {...n.keepalive===void 0?{}:{keepalive:n.keepalive},...n.ifMatch===void 0?{}:{headers:{"if-match":n.ifMatch}}}}function K(n){return n.reason!==void 0?n.reason:new DOMException("The operation was aborted.","AbortError")}function Oe(n){let e=n?.name;return e==="AbortError"||e==="TimeoutError"}function Pe(n){let e=Ge(n),t=Ee(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}function Ge(n){let{status:e,body:t}=n,r=Ie(t),o=n.retryAfterSeconds??qe(t),s=Ce(t);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 Ie(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 Ee(n){let t=n?.error?.details;return t===null?void 0:t}function Ce(n){let t=n?.error?.code;return typeof t=="string"&&t.length>0?t:void 0}function qe(n){let e=n?.retryAfterSeconds;return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function Le(n){let e=n.lastIndexOf("@");return (e===-1?n:`***@${n.slice(e+1)}`).slice(0,200)}var $e=new Set($);function je(n){if(!n)return {};let e={};for(let[t,r]of Object.entries(n))$e.has(t.toLowerCase())&&(e[t.toLowerCase()]=r);return e}function X(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"?Le(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 y=o.username!==""||o.password!=="",R=s.username!==o.username||s.password!==o.password,f=y?R?"baseUrl (and possibly the request path)":"baseUrl":"request path";throw new p(`the ${f} 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[y,R]of Object.entries(n.defaultQuery??{}))s.searchParams.has(y)||s.searchParams.set(y,R);let a=t.bytes,l=t.bytes===void 0?void 0:"application/octet-stream";try{t.body!==void 0&&(a=JSON.stringify(t.body),l="application/json");}catch(y){throw new p(`the body of ${t.method} ${JSON.stringify(s.pathname)} could not be serialised to JSON: ${String(y)}. This is a bug in the request, not a server failure \u2014 retrying sends the same unserialisable value.`)}let u=await e(s.toString(),{method:t.method,headers:{authorization:`Bearer ${r}`,...l===void 0?{}:{"content-type":l},...je(t.headers)},body:a,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"&&u.status>=200&&u.status<300)c=new Uint8Array(await u.arrayBuffer());else {let y=await u.text();if(y.length>0)try{c=JSON.parse(y);}catch{c=y;}}let m=u.headers.get("etag"),_=Me(u.headers.get("retry-after")),b=u.headers.get("x-gem-invocation-id");return {status:u.status,body:c,...m===null?{}:{etag:m},..._===void 0?{}:{retryAfterSeconds:_},...b===null||b===""?{}:{invocationId:b}}},n)}function Me(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 Fe="gem-web-bridge";var O=65536,Q=8,j=5e3,Z=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.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.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.frameStats":120,"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,__malformed:60});U({"gem.requestAd":"ads","gem.adResult":"ads","gem.requestSignIn":"signIn","gem.signInResult":"signIn","gem.requestPurchase":"purchases","gem.purchaseResult":"purchases","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.viewport":"viewport","gem.requestLocalServer":"localHost","gem.localServer":"localHost","gem.localServer.denied":"localHost","gem.cohorts":"cohorts","gem.deviceSettings":"deviceSettings","gem.deviceSettings.put":"deviceSettings","gem.deviceSettings.result":"deviceSettings"});function Be(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 He(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 Ne(n){return /^[a-z]{2,8}(-[a-z0-9]{1,8})*$/i.test(n)}function F(n,e,t){if(e>Q)return `nesting deeper than ${Q}`;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>Z)return `an array of ${n.length} entries, over the ${Z} limit`;t.bytes+=2;for(let l of n){let u=F(l,e+1,t);if(u)return u}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 a=n;for(let l in a){if(!Object.prototype.hasOwnProperty.call(a,l))continue;if(++t.nodes>j)return `more than ${j} values`;if(t.bytes+=l.length*3+4,t.bytes>O)return `over the ${O} byte limit`;let u=F(a[l],e+1,t);if(u)return u}return null}function De(n){let e={nodes:0,bytes:0,seen:new Set},t=F(n,0,e);return t?`message contains ${t}`:e.bytes>O?`message is over the ${O} byte limit`:null}var Ve={origin:[Be,"not a well-formed origin"],url:[He,"not a safe absolute http(s) URL"],bcp47:[Ne,"not a well-formed BCP 47 tag"]};function ee(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 a=ne(s,r,o);if(a)return a}return null}function ne(n,e,t){switch(e.k){case "string":{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]=Ve[e.f];if(!r(n))return `${t}: ${o}`}return null}case "int":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 "boolean":return typeof n=="boolean"?null:`${t}: expected boolean`;case "enum":{let r=e.v;return r.includes(n)?null:`${t}: not one of ${r.join("|")}`}case "object":return typeof n!="object"||n===null||Array.isArray(n)?`${t}: expected object`:ee(n,e.fs,t);case "json":return typeof n!="object"||n===null||Array.isArray(n)?`${t}: expected a plain object`:null;case "array":{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 a=ne(s,r,o);if(a)return a}return null}default:{let r=e.k;return `${t}: unknown kind ${String(r)}`}}}function d(n,e){return t=>{let r=De(t);if(r)return r;if(typeof t!="object"||t===null||Array.isArray(t))return "message: expected object";let o=t;return o.gem!==Fe?"gem: wrong protocol marker":o.type!==n?`type: expected ${n}`:ee(o,e,"")}}var ze=d("gem.handshake",[{n:"versions",k:"object",fs:[{n:"min",k:"int",lo:1,hi:1e3},{n:"max",k:"int",lo:1,hi:1e3}]},{n:"capabilities",k:"array",o:1,max:64,it:{n:"",k:"string",max:64}},{n:"embedder",k:"string",max:2048,f:"origin"}]),We=d("gem.handshake.accept",[{n:"v",k:"int",lo:1,hi:1e3},{n:"capabilities",k:"array",o:1,max:64,it:{n:"",k:"string",max:64}}]),Ke=d("gem.token",[{n:"token",k:"string",max:4096},{n:"requestId",k:"string",o:1,max:64},{n:"generation",k:"int",lo:0,hi:2147483647},{n:"apiBaseUrl",k:"string",o:1,max:512,f:"url"},{n:"playerId",k:"string",max:64},{n:"gameId",k:"string",max:64},{n:"channel",k:"enum",v:["dev","test","release"]},{n:"gameVersion",k:"string",o:1,max:64},{n:"expiresAt",k:"int",lo:0,hi:4102444800},{n:"chainEndsAt",k:"int",lo:0,hi:4102444800},{n:"allowDevTools",k:"boolean",o:1}]),Je=d("gem.token.denied",[{n:"requestId",k:"string",max:64},{n:"retryable",k:"boolean"},{n:"retryAfterMs",k:"int",o:1,lo:0,hi:36e5},{n:"reason",k:"enum",v:["chain_exhausted","unavailable"]},{n:"correlationId",k:"string",max:64}]),Ye=d("gem.player",[{n:"untrusted",k:"object",fs:[{n:"displayName",k:"string",max:64},{n:"displayTag",k:"string",o:1,max:80},{n:"displayHandle",k:"string",max:80}]},{n:"playerId",k:"string",o:1,max:64},{n:"discriminator",k:"string",o:1,max:8},{n:"avatarIconUrl",k:"string",o:1,max:2048,f:"url"},{n:"badges",k:"array",o:1,max:2,it:{n:"",k:"object",fs:[{n:"itemId",k:"string",max:64},{n:"iconUrl",k:"string",max:2048,f:"url"}]}},{n:"displayTag",k:"string",max:8},{n:"avatarUrl",k:"string",o:1,max:2048,f:"url"},{n:"boost",k:"object",o:1,fs:[{n:"multipliers",k:"array",max:8,it:{n:"",k:"object",fs:[{n:"currencyId",k:"string",max:64},{n:"currencySlug",k:"string",max:32},{n:"multiplierBp",k:"int",lo:1e4,hi:1e6}]}},{n:"expiresInDays",k:"int",o:1,lo:1,hi:7}]}]),Xe=d("gem.pause",[{n:"paused",k:"boolean"}]),Qe=d("gem.prefs",[{n:"reducedMotion",k:"boolean"},{n:"muted",k:"boolean"},{n:"showFrameStats",k:"boolean",o:1},{n:"locale",k:"string",max:35,f:"bcp47"}]),Ze=d("gem.cohorts",[{n:"cohorts",k:"array",max:8,it:{n:"",k:"object",fs:[{n:"experimentId",k:"string",max:36},{n:"variantKey",k:"string",max:32}]}}]),en=d("gem.viewport",[{n:"insets",k:"object",fs:[{n:"top",k:"int",lo:0,hi:4096},{n:"right",k:"int",lo:0,hi:4096},{n:"bottom",k:"int",lo:0,hi:4096},{n:"left",k:"int",lo:0,hi:4096}]}]),nn=d("gem.deviceSettings",[{n:"settings",k:"json",o:1}]),tn=d("gem.willTerminate",[{n:"reason",k:"enum",v:["grant_expiring","session_ended","navigating","kill_switch"]},{n:"graceMs",k:"int",lo:0,hi:6e4}]),rn=d("gem.roomEvent",[{n:"event",k:"enum",v:["updated","match_started","match_ready","match_failed","version_stale"]},{n:"roomId",k:"string",max:64},{n:"matchId",k:"string",o:1,max:64},{n:"version",k:"int",o:1,lo:0,hi:2147483647},{n:"reason",k:"string",o:1,max:64},{n:"platform",k:"enum",o:1,v:["universal","mobile"]}]),on=d("gem.socketState",[{n:"connected",k:"boolean"},{n:"reason",k:"enum",o:1,v:["connecting","dropped","watchdog","terminal"]}]),sn=d("gem.seatedEvent",[{n:"roomId",k:"string",max:64}]),an=d("gem.autoStartFailedEvent",[{n:"roomId",k:"string",max:64},{n:"code",k:"string",max:64}]),ln=d("gem.signalEvent",[{n:"event",k:"enum",v:["hello","offer","answer","ice","peerJoined","peerLeft","migration","matchEnded","error"]},{n:"matchId",k:"string",max:64},{n:"data",k:"json"}]),un=d("gem.dedicatedEvent",[{n:"event",k:"enum",v:["answer","error","matchEnded"]},{n:"matchId",k:"string",max:64},{n:"sdp",k:"string",o:1,max:10240},{n:"sessionId",k:"string",o:1,max:64},{n:"code",k:"string",o:1,max:64},{n:"message",k:"string",o:1,max:256},{n:"reason",k:"string",o:1,max:64}]),dn=d("gem.partyResult",[{n:"requestId",k:"string",max:64},{n:"partyId",k:"string",o:1,max:64}]),cn=d("gem.clusterTarget",[{n:"clusterTargetId",k:"string",max:64},{n:"clusterTargetIds",k:"array",o:1,max:3,it:{n:"",k:"string",max:64}}]),mn=d("gem.devtools",[{n:"action",k:"enum",v:["open","close","toggle"]}]),gn=d("gem.screenshot",[{n:"maxWidth",k:"int",lo:1,hi:7680},{n:"maxHeight",k:"int",lo:1,hi:4320}]),pn=d("gem.screenshot.denied",[{n:"reason",k:"enum",v:["not_wired","no_source","unsupported","unreadable","tainted","too_large","busy","declined","failed"]},{n:"retryable",k:"boolean"}]),yn=d("gem.requestContext",[]),fn=d("gem.gameContext",[{n:"context",k:"json"}]),hn=d("gem.signal",[{n:"signal",k:"enum",v:["join","offer","answer","ice","migrationAck","hostUnreachable"]},{n:"matchId",k:"string",max:64},{n:"data",k:"json"}]),_n=d("gem.dedicatedOffer",[{n:"matchId",k:"string",max:64},{n:"sdp",k:"string",max:10240},{n:"intent",k:"enum",v:["initial","ice_restart","full_reconnect"]}]),vn=d("gem.partyRequest",[{n:"requestId",k:"string",max:64}]),bn=d("gem.ready",[]),Rn=d("gem.progress",[{n:"loaded",k:"int",lo:0,hi:1099511627776},{n:"total",k:"int",lo:0,hi:1099511627776}]),xn=d("gem.requestToken",[{n:"requestId",k:"string",max:64},{n:"reason",k:"enum",v:["initial","expiring","rejected"]}]),Sn=d("gem.requestLocalServer",[{n:"requestId",k:"string",max:64},{n:"gameRoomId",k:"string",max:64}]),kn=d("gem.localServer",[{n:"requestId",k:"string",max:64},{n:"serverId",k:"string",o:1,max:128}]),wn=d("gem.localServer.denied",[{n:"requestId",k:"string",max:64},{n:"retryable",k:"boolean"},{n:"reason",k:"enum",v:["refused","unavailable"]}]),An=d("gem.exit",[{n:"reason",k:"string",o:1,max:64}]),Tn=d("gem.openExternal",[{n:"url",k:"string",max:2048,f:"url"}]),On=d("gem.requestFullscreen",[{n:"enabled",k:"boolean"}]),Pn=d("gem.audioState",[{n:"muted",k:"boolean"}]),Gn=d("gem.rewardCue",[{n:"currencySlug",k:"string",max:32},{n:"expected",k:"int",o:1,lo:1,hi:1e9},{n:"origin",k:"object",o:1,fs:[{n:"x",k:"int",lo:0,hi:16384},{n:"y",k:"int",lo:0,hi:16384}]}]),In=d("gem.frameStats",[{n:"fps",k:"int",lo:0,hi:1e3},{n:"frameTimeP95Ms",k:"int",lo:0,hi:1e5}]),En=d("gem.error",[{n:"code",k:"enum",v:["version_mismatch","handshake_timeout","handshake_duplicate","invalid_message","rate_limited","token_unavailable","unsupported","unsupported_capability","internal"]},{n:"message",k:"string",o:1,max:256}]),Cn=d("gem.requestPurchase",[{n:"requestId",k:"string",max:64},{n:"purchaseKind",k:"enum",v:["item","recipe"]},{n:"targetId",k:"string",max:64},{n:"currencySlug",k:"string",max:32},{n:"quantity",k:"int",o:1,lo:1,hi:10},{n:"catalogId",k:"string",o:1,max:64}]),qn=d("gem.purchaseResult",[{n:"requestId",k:"string",max:64},{n:"outcome",k:"enum",v:["ok","declined","unavailable"]},{n:"purchaseId",k:"string",o:1,max:64}]),Ln=d("gem.deviceSettings.put",[{n:"requestId",k:"string",max:64},{n:"settings",k:"json"}]),$n=d("gem.deviceSettings.result",[{n:"requestId",k:"string",max:64},{n:"outcome",k:"enum",v:["stored","too_large","unavailable"]}]),jn=d("gem.requestAd",[{n:"requestId",k:"string",max:64},{n:"placement",k:"string",max:32},{n:"format",k:"enum",v:["interstitial","rewarded"]}]),Mn=d("gem.adResult",[{n:"requestId",k:"string",max:64},{n:"outcome",k:"enum",v:["shown","no_ad","unavailable"]}]),Fn=d("gem.requestSignIn",[{n:"requestId",k:"string",max:64}]),Un=d("gem.signInResult",[{n:"requestId",k:"string",max:64},{n:"outcome",k:"enum",v:["signed_in","declined","unavailable"]}]);U({"gem.handshake":ze,"gem.handshake.accept":We,"gem.token":Ke,"gem.token.denied":Je,"gem.player":Ye,"gem.pause":Xe,"gem.prefs":Qe,"gem.cohorts":Ze,"gem.viewport":en,"gem.deviceSettings":nn,"gem.willTerminate":tn,"gem.roomEvent":rn,"gem.socketState":on,"gem.seatedEvent":sn,"gem.autoStartFailedEvent":an,"gem.signalEvent":ln,"gem.dedicatedEvent":un,"gem.partyResult":dn,"gem.clusterTarget":cn,"gem.devtools":mn,"gem.screenshot":gn,"gem.screenshot.denied":pn,"gem.requestContext":yn,"gem.gameContext":fn,"gem.signal":hn,"gem.dedicatedOffer":_n,"gem.partyRequest":vn,"gem.ready":bn,"gem.progress":Rn,"gem.requestToken":xn,"gem.requestLocalServer":Sn,"gem.localServer":kn,"gem.localServer.denied":wn,"gem.exit":An,"gem.openExternal":Tn,"gem.requestFullscreen":On,"gem.audioState":Pn,"gem.rewardCue":Gn,"gem.frameStats":In,"gem.error":En,"gem.requestPurchase":Cn,"gem.purchaseResult":qn,"gem.deviceSettings.put":Ln,"gem.deviceSettings.result":$n,"gem.requestAd":jn,"gem.adResult":Mn,"gem.requestSignIn":Fn,"gem.signInResult":Un});var P={now:()=>Date.now(),setTimeout:(n,e)=>setTimeout(n,e),clearTimeout:n=>clearTimeout(n)};var Bn=1e4;function te(n,e){return B(n,e)}function B(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=a=>({token:a.token,expiresAt:a.expiresAt,chainEndsAt:Number.POSITIVE_INFINITY}),r=null,o=new L({clock:e.clock,...e.onStateChange===void 0?{}:{onStateChange:e.onStateChange},request:()=>new Promise((a,l)=>{let u=e.clock.setTimeout(()=>{r=null,l({reason:"unavailable",retryable:true});},e.timeoutMs??Bn);r={resolve:c=>{e.clock.clearTimeout(u),a(c);},reject:l,timer:u};})}),s=n.onServerToken(a=>{let l=t(a),u=r;if(u){r=null,u.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 N={};fe(N,{acceptTransfer:()=>Hn,addEntityProgression:()=>Nn,adminAction:()=>Dn,cancelInventoryTransfer:()=>Vn,claimEntityProgressionRewards:()=>zn,closeGameRoom:()=>Wn,createEntityBatchOrder:()=>Kn,createEntityOrder:()=>Jn,createSession:()=>Yn,deleteEntityGameSetting:()=>Xn,deleteEntitySave:()=>Qn,deleteSession:()=>Zn,executeEntityRecipe:()=>et,finalizeSaveUpload:()=>nt,getDropRates:()=>tt,getEntityCurrency:()=>rt,getEntityGameSetting:()=>ot,getEntityInventory:()=>st,getEntityInventoryItem:()=>it,getEntityLeaderboard:()=>at,getEntityOrder:()=>lt,getEntityProgression:()=>ut,getEntityRecipeAvailability:()=>dt,getEntityRecipeUsage:()=>ct,getEntitySave:()=>mt,getEvent:()=>gt,getGameRoomV2:()=>pt,getLeaderboard:()=>yt,getPurchaseCatalog:()=>ft,getResolvedTemplate:()=>ht,getRoomArgs:()=>_t,getTransferDetails:()=>vt,ingestAnalyticsEvents:()=>H,initiateInventoryTransfer:()=>bt,invokeFunction:()=>Rt,kickPlayer:()=>xt,listChallenges:()=>St,listEntityGameSettings:()=>kt,listEntityOrders:()=>wt,listEntityProgressions:()=>At,listEntitySaves:()=>Tt,listEvents:()=>Ot,listGameRooms:()=>Pt,listResolvedTemplates:()=>Gt,listTransfers:()=>It,putEntityGameSetting:()=>Et,putRoomArgs:()=>Ct,rejectTransfer:()=>qt,requestSaveUploadUrl:()=>Lt,resetEntityProgression:()=>$t,simulateEntityOrder:()=>jt,transferHostV2:()=>Mt,updateGameRoomV2:()=>Ft});function i(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 Hn(n,e,t){let r=`/v1/inventory/transfers/${i(e)}/accept`;return n.client.post(r,void 0,t?.signal)}async function Nn(n,e,t,r,o,s){let a=`/v1/inventory/${i(e)}/${i(t)}/progressions/${i(r)}/add`;return n.client.post(a,o,s?.signal)}async function Dn(n,e,t,r){let o=`/v1/voice/sessions/${i(e)}/admin`;return n.client.post(o,t,r?.signal)}async function Vn(n,e,t){let r=`/v1/inventory/transfers/${i(e)}/cancel`;return n.client.post(r,void 0,t?.signal)}async function zn(n,e,t,r,o,s){let a=`/v1/inventory/${i(e)}/${i(t)}/progressions/${i(r)}/claim`;return n.client.post(a,o,s?.signal)}async function Wn(n,e,t){let r=`/v1/games/${i(n.gameId())}/game-rooms/${i(e)}`;return n.client.delete(r,t?.signal)}async function Kn(n,e,t,r,o){let s=`/v1/inventory/${i(e)}/${i(t)}/orders/batch`;return n.client.post(s,r,o?.signal,{...o?.ifMatch===void 0?{}:{ifMatch:o.ifMatch}})}async function Jn(n,e,t,r,o){let s=`/v1/inventory/${i(e)}/${i(t)}/orders`;return n.client.post(s,r,o?.signal,{...o?.ifMatch===void 0?{}:{ifMatch:o.ifMatch}})}async function Yn(n,e,t){return n.client.post("/v1/voice/sessions",e,t?.signal)}async function Xn(n,e,t,r,o){let s=`/v1/settings/${i(e)}/${i(t)}/${i(r)}`;return n.client.delete(s,o?.signal)}async function Qn(n,e,t,r,o){let s=`/v1/saves/${i(e)}/${i(t)}/${i(r)}`;return n.client.delete(s,o?.signal)}async function Zn(n,e,t){let r=`/v1/voice/sessions/${i(e)}`;return n.client.delete(r,t?.signal)}async function et(n,e,t,r,o){let s=`/v1/inventory/${i(e)}/${i(t)}/recipes/execute`;return n.client.post(s,r,o?.signal,{...o?.ifMatch===void 0?{}:{ifMatch:o.ifMatch}})}async function nt(n,e,t,r,o,s){let a=`/v1/saves/${i(e)}/${i(t)}/${i(r)}/finalize`;return n.client.post(a,o,s?.signal)}async function tt(n,e,t){let r=`/v1/inventory/loot-tables/${i(e)}/drop-rates`;return n.client.get(r,t?.signal)}async function rt(n,e,t,r,o){let s=`/v1/inventory/${i(e)}/${i(t)}/currencies/${i(r)}`;return n.client.get(s,o?.signal)}async function ot(n,e,t,r,o){let s=`/v1/settings/${i(e)}/${i(t)}/${i(r)}`;return n.client.getWithEtag(s,{...o?.signal===void 0?{}:{signal:o.signal},...o?.ifNoneMatch===void 0?{}:{ifNoneMatch:o.ifNoneMatch}})}async function st(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(),a=`/v1/inventory/${i(e)}/${i(t)}`+(s?`?${s}`:"");return n.client.get(a,r?.signal)}async function it(n,e,t,r,o){let s=`/v1/inventory/${i(e)}/${i(t)}/items/${i(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));let a=s.toString(),l=`/v1/leaderboards/${i(e)}/${i(t)}/${i(r)}`+(a?`?${a}`:"");return n.client.get(l,o?.signal)}async function lt(n,e,t,r,o){let s=`/v1/inventory/${i(e)}/${i(t)}/orders/${i(r)}`;return n.client.get(s,o?.signal)}async function ut(n,e,t,r,o){let s=`/v1/inventory/${i(e)}/${i(t)}/progressions/${i(r)}`;return n.client.get(s,o?.signal)}async function dt(n,e,t,r,o,s){let a=`/v1/inventory/${i(e)}/${i(t)}/catalogs/${i(r)}/recipes/${i(o)}/availability`;return n.client.get(a,s?.signal)}async function ct(n,e,t,r){let o=new URLSearchParams;r?.limit!==void 0&&o.set("limit",String(r?.limit));let s=o.toString(),a=`/v1/inventory/${i(e)}/${i(t)}/recipe-usage`+(s?`?${s}`:"");return n.client.get(a,r?.signal)}async function mt(n,e,t,r,o){let s=`/v1/saves/${i(e)}/${i(t)}/${i(r)}`;return n.client.getWithEtag(s,{...o?.signal===void 0?{}:{signal:o.signal},...o?.ifNoneMatch===void 0?{}:{ifNoneMatch:o.ifNoneMatch}})}async function gt(n,e,t){let r=`/v1/events/${i(e)}`;return n.client.get(r,t?.signal)}async function pt(n,e,t){let r=`/v2/games/${i(n.gameId())}/game-rooms/${i(e)}`;return n.client.getWithEtag(r,{...t?.signal===void 0?{}:{signal:t.signal},...t?.ifNoneMatch===void 0?{}:{ifNoneMatch:t.ifNoneMatch}})}async function yt(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));let o=r.toString(),s=`/v1/leaderboards/${i(e)}`+(o?`?${o}`:"");return n.client.get(s,t?.signal)}async function ft(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 ht(n,e,t){let r=`/v1/game-room-templates/${i(e)}`;return n.client.get(r,t?.signal)}async function _t(n,e,t){let r=`/v1/games/${i(n.gameId())}/game-rooms/${i(e)}/room-args`;return n.client.get(r,t?.signal)}async function vt(n,e,t){let r=`/v1/inventory/transfers/${i(e)}`;return n.client.get(r,t?.signal)}async function H(n,e,t){let r=`/v1/games/${i(n.gameId())}/analytics/events`;return n.client.post(r,e,t?.signal,{replaySafe:true})}async function bt(n,e,t){return n.client.post("/v1/inventory/transfers",e,t?.signal)}async function Rt(n,e,t){return n.client.postBytes("/v1/functions/invoke",e,t?.signal)}async function xt(n,e,t,r){let o=`/v1/games/${i(n.gameId())}/game-rooms/${i(e)}/kick/${i(t)}`;return n.client.post(o,void 0,r?.signal)}async function St(n,e){let t=new URLSearchParams;e?.periods_back!==void 0&&t.set("periods_back",String(e?.periods_back));let r=t.toString(),o="/v1/challenges"+(r?`?${r}`:"");return n.client.get(o,e?.signal)}async function kt(n,e,t,r){let o=`/v1/settings/${i(e)}/${i(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(),a=`/v1/inventory/${i(e)}/${i(t)}/orders`+(s?`?${s}`:"");return n.client.get(a,r?.signal)}async function At(n,e,t,r){let o=`/v1/inventory/${i(e)}/${i(t)}/progressions`;return n.client.get(o,r?.signal)}async function Tt(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(),a=`/v1/saves/${i(e)}/${i(t)}`+(s?`?${s}`:"");return n.client.get(a,r?.signal)}async function Ot(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 Pt(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/${i(n.gameId())}/game-rooms`+(r?`?${r}`:"");return n.client.get(o,e?.signal)}async function Gt(n,e){return n.client.get("/v1/game-room-templates",e?.signal)}async function It(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 Et(n,e,t,r,o,s){let a=`/v1/settings/${i(e)}/${i(t)}/${i(r)}`;return n.client.put(a,o,s?.signal,{...s?.ifMatch===void 0?{}:{ifMatch:s.ifMatch}})}async function Ct(n,e,t,r){let o=`/v1/games/${i(n.gameId())}/game-rooms/${i(e)}/room-args`;return n.client.put(o,t,r?.signal)}async function qt(n,e,t){let r=`/v1/inventory/transfers/${i(e)}/reject`;return n.client.post(r,void 0,t?.signal)}async function Lt(n,e,t,r,o,s){let a=`/v1/saves/${i(e)}/${i(t)}/${i(r)}/upload-url`;return n.client.post(a,o,s?.signal,{replaySafe:true})}async function $t(n,e,t,r,o,s){let a=`/v1/inventory/${i(e)}/${i(t)}/progressions/${i(r)}/reset`;return n.client.post(a,o,s?.signal)}async function jt(n,e,t,r,o){let s=`/v1/inventory/${i(e)}/${i(t)}/orders/simulate`;return n.client.post(s,r,o?.signal)}async function Mt(n,e,t,r){let o=`/v2/games/${i(n.gameId())}/game-rooms/${i(e)}/transfer/${i(t)}`;return n.client.post(o,void 0,r?.signal)}async function Ft(n,e,t,r){let o=`/v2/games/${i(n.gameId())}/game-rooms/${i(e)}`;return n.client.patch(o,t,r?.signal,{...r?.ifMatch===void 0?{}:{ifMatch:r.ifMatch}})}var re="gem_";var Ht=1e4,Nt=50,Dt=1e3,Vt=65536-4*1024,oe=n=>typeof n=="number"?n:0,zt=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 Wt(n){return n?.retryable===true}function Kt(n,e){let t=n??{},r=Array.isArray(t.rejected)?t.rejected.map(o=>{let s=o??{};return {index:oe(s.index),code:zt(s.code)}}):[];return {accepted:oe(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 ae(n){let e=Math.max(1,Math.floor(n.maxQueue??Dt)),t={client:n.client,gameId:()=>n.gameId},r=[],o=0,s=null,a=false,l=false,u=false,c=false,m=f=>{n.log?.(f);},_=()=>{s!==null&&(n.clock.clearTimeout(s),s=null);},b=()=>{s!==null||a||l||(s=n.clock.setTimeout(()=>{s=null,R().catch(()=>{});},Ht));},y=()=>{let f=Math.min(r.length,100),x=128;for(let k=0;k<f;k+=1){let w=r[k];if(w===void 0)break;if(x+=JSON.stringify(ie(w,0)).length+1,x>Vt)return Math.max(1,k)}return f};async function R(f){if(r.length===0)return {accepted:0,rejected:[],dropped:0,duplicate:false};_();let x=r.splice(0,y()),k=o;o=0;let w=Math.round(n.clock.now()),q={batch_id:se(),sent_at_ms:w,events:x.map(S=>ie(S,w))};l=true;try{let S=await H(t,q,f===void 0?void 0:{signal:f}),A=Kt(S,k);for(let pe of A.rejected)m(`[gem] analytics: an event was refused (${pe.code}). See the analytics_events section of your game config.`);return A}catch(S){if(Wt(S))for(r=[...x,...r],o+=k;r.length>e;)r.shift(),o+=1;else m(`[gem] analytics: ${x.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&&b();}}return {track(f,x,k={}){if(a)return;if(typeof f!="string"||f===""){c||(c=true,m(`[gem] analytics: '${x}' 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(x.startsWith(re)){u||(u=true,m(`[gem] analytics: '${x}' 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 w={},q={};for(let[S,A]of Object.entries(k))typeof A=="string"?w[S]=A:typeof A=="number"&&Number.isFinite(A)&&(q[S]=A);for(;r.length>=e;)r.shift(),o+=1;r.push({uid:se(),playerId:f,name:x,atMs:n.clock.now(),dimensions:w,measures:q}),r.length>=Nt?R().catch(()=>{}):b();},flush:f=>R(f),get pending(){return r.length},dispose(){a=true,_(),r=[],o=0;}}}var Jt=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]]),E=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:Jt.get(this.code))??super.retryable}},G=class{#e;constructor(e){this.#e=e;}async invoke(e,t={}){let r=Yt(e),o;try{o=await this.#e(r,t.signal===void 0?{}:{signal:t.signal});}catch(s){throw s instanceof g?Qt(s):s}return Xt(o)}};function Yt(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 Xt(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 Qt(n){let{details:e,invocationId:t}=Y(n),o=e?.untrusted?.message,s=e?.reason;return new E(n,{...t===void 0?{}:{invocationId:t},...n.code==="function_error"&&typeof o=="string"?{functionMessage:o}:{},...n.code==="function_failed"&&typeof s=="string"?{failure:s}:{}})}function Zt(n){let e={};for(let[t,r]of Object.entries(N))if(typeof r=="function"){let o=r;e[t]=(...s)=>o(n,...s);}return e}function M(n,e={}){let t=e.clock??P,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=B(n,{clock:t,...e.onAuthStateChange===void 0?{}:{onStateChange:e.onAuthStateChange}}),s=X({baseUrl:r,tokenSource:o.source,defaultQuery:{game_id:n.gameId,channel:n.channel},...e.fetch===void 0?{}:{fetch:e.fetch}}),a=new T({transport:s,clock:t}),l={gameId:n.gameId,channel:n.channel,matchId:n.matchId,...n.gameRoomId===void 0?{}:{gameRoomId:n.gameRoomId}},u=Zt({client:a,gameId:()=>l.gameId}),c=l.gameRoomId,m=n.endMatch,_=n.log,b=ae({client:a,clock:t,gameId:l.gameId,...typeof _=="function"?{log:R=>_.call(n,R)}:{}});return {identity:l,client:a,api:u,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:b,functions:new G(u.invokeFunction),...c===void 0?{}:{room:{get:R=>u.getGameRoomV2(c,R),args:R=>u.getRoomArgs(c,R)}},dispose:()=>{b.dispose(),o.dispose();}}}var er=["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"],nr=new Set(er);function le(n){return typeof n=="string"&&nr.has(n)?n:"unknown"}var v=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 C(n){return new v(n)}var ue={toPlain(n){return v.unwrap(n)},compare(n,e,t){let r=n instanceof v?v.unwrap(n):n,o=e instanceof v?v.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 v?v.unwrap(n):n,r=e instanceof v?v.unwrap(e):e;return t.normalize("NFC")===r.normalize("NFC")}};var de="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 D(n,e={}){let t=e.clock??P,r=()=>{let l=n();if(l===null)throw new Error(de);return l},o=null,s=()=>{if(o===null)throw new Error(de);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 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:C(m),...typeof c.displayTag=="string"&&c.displayTag!==""?{displayTag:C(c.displayTag)}:{},...typeof c.discriminator=="string"?{discriminator:c.discriminator}:{}}},playerNumber(l){return r().playerNumber?.(l)},send(l,u,c){c===void 0?r().send(l,u):r().send(l,u,c);},broadcast(l,u){u===void 0?r().broadcast(l):r().broadcast(l,u);},kick(l,u){u===void 0?r().kick(l):r().kick(l,u);},log(l){r().log(l);},warn(l){r().warn(l);}},attach:()=>{o=M(r(),{...e,clock:t});}}}function ce(n,e={}){let{server:t,attach:r}=D(()=>n,e);return r(),t}function tr(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:le(e)}}}function me(n,e={}){return ()=>{let t=null,{server:r,attach:o}=D(()=>t,e),s=n(r),a={async init(l){t=l,o(),await s.init?.();},async shutdown(l){let u=tr(l);try{await s.shutdown?.(u);}finally{r.dispose();}}};return s.join&&(a.join=(l,u)=>s.join?.(l,u)),s.leave&&(a.leave=(l,u)=>s.leave?.(l,u)),s.message&&(a.message=(l,u,c,m)=>s.message?.(l,u,c,m)),a}}var rr=new Set(["unlocked","already_unlocked","suppressed"]);function ge(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"||!rr.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{h as AuthError,$ as CONDITIONAL_HEADERS,G as FunctionsApi,g as GemApiError,T as GemClient,
|
|
1
|
+
var ye=Object.defineProperty;var fe=(n,e)=>{for(var t in e)ye(n,t,{get:e[t],enumerable:true});};globalThis.__gemWebSdkVersion="[gem-web-sdk:sdkVersion:7.2.0]";function he(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 h(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 h("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 h("internal","token arrived for a superseded generation");return this.grant=o,this.rejected=false,this.enter("ready"),o.token}).catch(o=>{let s=_e(o),a=o?.retryable;throw t===this.generation&&this.enter(he(s,typeof a=="boolean"?a:void 0)?"lost":"degraded",s),o instanceof h?o:new h(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)}},h=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 _e(n){if(n instanceof h)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}},$=["if-match","if-none-match"],V=4096;function ve(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 s=typeof r=="string"?be(r):r;if(typeof s!="string"||s.length>V||!Re(s))throw new p(`the ${o} header value cannot be sent \u2014 it is not a string, is longer than ${V} 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 be(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 Re(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 xe(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=ve(o.headers),a=xe(o),l=Object.freeze({...o,headers:s,...a===void 0?{}:{bytes:a}}),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(),_=await n(l,m);if(_.status===401)throw e.tokenSource.close("unavailable"),new h("unavailable","the server refused a freshly minted token");return _}}}function W(n){let e=typeof n=="string"?new TextEncoder().encode(n):n;return btoa(Se(e))}function Se(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,a){super(`${t} (${r}): ${o}`);this.reason=t;this.status=r;this.detail=o;this.retryAfterSeconds=s;this.code=a;this.name="GemApiError";}reason;status;detail;retryAfterSeconds;code;get retryable(){return this.reason==="unavailable"||this.reason==="rate_limited"}},J=new WeakMap;function Y(n){return J.get(n)??{}}var ke=new Set([408,429,500,502,503,504]),we=6e4;function Ae(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:Te(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?Ae(this.options.maxRetries)+1:1,o=null;if(e.signal?.aborted)throw K(e.signal);for(let s=0;s<r;s++){if(s>0&&await this.backoff(s,o,e.signal),e.signal?.aborted)throw K(e.signal);let a;try{a=await this.options.transport.request(e);}catch(d){if(h.isAuthError(d)||p.isRefusal(d)||e.signal?.aborted||Oe(d))throw d;o=new g("unavailable",0,String(d));continue}if(a.status>=200&&a.status<300||a.status===304)return a;let l=Pe(a);if(!ke.has(a.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,a=2**(e-1)*250,l=Math.min(Math.max(s,a),we);return new Promise(d=>{let c=this.options.clock,m=false,_=false,b,y=()=>{m||(m=true,_&&c.clearTimeout(b),r?.removeEventListener("abort",y),d());};r?.addEventListener("abort",y,{once:true}),b=c.setTimeout(y,l),_=true,m&&c.clearTimeout(b);})}};function Te(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 K(n){return n.reason!==void 0?n.reason:new DOMException("The operation was aborted.","AbortError")}function Oe(n){let e=n?.name;return e==="AbortError"||e==="TimeoutError"}function Pe(n){let e=Ee(n),t=Ce(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 Ge=new Map([["insufficient_funds","insufficient_funds"]]);function Ee(n){let{status:e,body:t}=n,r=Ie(t),o=n.retryAfterSeconds??Le(t),s=qe(t),a=s===void 0?void 0:Ge.get(s);if(a!==void 0)return new g(a,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 Ie(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 Ce(n){let t=n?.error?.details;return t===null?void 0:t}function qe(n){let t=n?.error?.code;return typeof t=="string"&&t.length>0?t:void 0}function Le(n){let e=n?.retryAfterSeconds;return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function $e(n){let e=n.lastIndexOf("@");return (e===-1?n:`***@${n.slice(e+1)}`).slice(0,200)}var je=new Set($);function Me(n){if(!n)return {};let e={};for(let[t,r]of Object.entries(n))je.has(t.toLowerCase())&&(e[t.toLowerCase()]=r);return e}function X(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"?$e(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 y=o.username!==""||o.password!=="",R=s.username!==o.username||s.password!==o.password,f=y?R?"baseUrl (and possibly the request path)":"baseUrl":"request path";throw new p(`the ${f} 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[y,R]of Object.entries(n.defaultQuery??{}))s.searchParams.has(y)||s.searchParams.set(y,R);let a=t.bytes,l=t.bytes===void 0?void 0:"application/octet-stream";try{t.body!==void 0&&(a=JSON.stringify(t.body),l="application/json");}catch(y){throw new p(`the body of ${t.method} ${JSON.stringify(s.pathname)} could not be serialised to JSON: ${String(y)}. 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},...Me(t.headers)},body:a,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 y=await d.text();if(y.length>0)try{c=JSON.parse(y);}catch{c=y;}}let m=d.headers.get("etag"),_=Fe(d.headers.get("retry-after")),b=d.headers.get("x-gem-invocation-id");return {status:d.status,body:c,...m===null?{}:{etag:m},..._===void 0?{}:{retryAfterSeconds:_},...b===null||b===""?{}:{invocationId:b}}},n)}function Fe(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 Ue="gem-web-bridge";var O=65536,Q=8,j=5e3,Z=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.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.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.frameStats":120,"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,__malformed:60});U({"gem.requestAd":"ads","gem.adResult":"ads","gem.requestSignIn":"signIn","gem.signInResult":"signIn","gem.requestPurchase":"purchases","gem.purchaseResult":"purchases","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.viewport":"viewport","gem.requestLocalServer":"localHost","gem.localServer":"localHost","gem.localServer.denied":"localHost","gem.cohorts":"cohorts","gem.deviceSettings":"deviceSettings","gem.deviceSettings.put":"deviceSettings","gem.deviceSettings.result":"deviceSettings"});function He(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 Ne(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 De(n){return /^[a-z]{2,8}(-[a-z0-9]{1,8})*$/i.test(n)}function Ve(n){return /^[a-z_]+$/.test(n)}function F(n,e,t){if(e>Q)return `nesting deeper than ${Q}`;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>Z)return `an array of ${n.length} entries, over the ${Z} limit`;t.bytes+=2;for(let l of n){let d=F(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 a=n;for(let l in a){if(!Object.prototype.hasOwnProperty.call(a,l))continue;if(++t.nodes>j)return `more than ${j} values`;if(t.bytes+=l.length*3+4,t.bytes>O)return `over the ${O} byte limit`;let d=F(a[l],e+1,t);if(d)return d}return null}function ze(n){let e={nodes:0,bytes:0,seen:new Set},t=F(n,0,e);return t?`message contains ${t}`:e.bytes>O?`message is over the ${O} byte limit`:null}var We={origin:[He,"not a well-formed origin"],url:[Ne,"not a safe absolute http(s) URL"],bcp47:[De,"not a well-formed BCP 47 tag"],code:[Ve,"not a code of lower-case letters and underscores"]};function ee(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 a=ne(s,r,o);if(a)return a}return null}function ne(n,e,t){switch(e.k){case "string":{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]=We[e.f];if(!r(n))return `${t}: ${o}`}return null}case "int":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 "boolean":return typeof n=="boolean"?null:`${t}: expected boolean`;case "enum":{let r=e.v;return r.includes(n)?null:`${t}: not one of ${r.join("|")}`}case "object":return typeof n!="object"||n===null||Array.isArray(n)?`${t}: expected object`:ee(n,e.fs,t);case "json":return typeof n!="object"||n===null||Array.isArray(n)?`${t}: expected a plain object`:null;case "array":{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 a=ne(s,r,o);if(a)return a}return null}default:{let r=e.k;return `${t}: unknown kind ${String(r)}`}}}function u(n,e){return t=>{let r=ze(t);if(r)return r;if(typeof t!="object"||t===null||Array.isArray(t))return "message: expected object";let o=t;return o.gem!==Ue?"gem: wrong protocol marker":o.type!==n?`type: expected ${n}`:ee(o,e,"")}}var Ke=u("gem.handshake",[{n:"versions",k:"object",fs:[{n:"min",k:"int",lo:1,hi:1e3},{n:"max",k:"int",lo:1,hi:1e3}]},{n:"capabilities",k:"array",o:1,max:64,it:{n:"",k:"string",max:64}},{n:"embedder",k:"string",max:2048,f:"origin"}]),Je=u("gem.handshake.accept",[{n:"v",k:"int",lo:1,hi:1e3},{n:"capabilities",k:"array",o:1,max:64,it:{n:"",k:"string",max:64}}]),Ye=u("gem.token",[{n:"token",k:"string",max:4096},{n:"requestId",k:"string",o:1,max:64},{n:"generation",k:"int",lo:0,hi:2147483647},{n:"apiBaseUrl",k:"string",o:1,max:512,f:"url"},{n:"playerId",k:"string",max:64},{n:"gameId",k:"string",max:64},{n:"channel",k:"enum",v:["dev","test","release"]},{n:"gameVersion",k:"string",o:1,max:64},{n:"expiresAt",k:"int",lo:0,hi:4102444800},{n:"chainEndsAt",k:"int",lo:0,hi:4102444800},{n:"allowDevTools",k:"boolean",o:1}]),Xe=u("gem.token.denied",[{n:"requestId",k:"string",max:64},{n:"retryable",k:"boolean"},{n:"retryAfterMs",k:"int",o:1,lo:0,hi:36e5},{n:"reason",k:"enum",v:["chain_exhausted","unavailable"]},{n:"correlationId",k:"string",max:64}]),Qe=u("gem.player",[{n:"untrusted",k:"object",fs:[{n:"displayName",k:"string",max:64},{n:"displayTag",k:"string",o:1,max:80},{n:"displayHandle",k:"string",max:80}]},{n:"playerId",k:"string",o:1,max:64},{n:"discriminator",k:"string",o:1,max:8},{n:"avatarIconUrl",k:"string",o:1,max:2048,f:"url"},{n:"badges",k:"array",o:1,max:2,it:{n:"",k:"object",fs:[{n:"itemId",k:"string",max:64},{n:"iconUrl",k:"string",max:2048,f:"url"}]}},{n:"displayTag",k:"string",max:8},{n:"avatarUrl",k:"string",o:1,max:2048,f:"url"},{n:"boost",k:"object",o:1,fs:[{n:"multipliers",k:"array",max:8,it:{n:"",k:"object",fs:[{n:"currencyId",k:"string",max:64},{n:"currencySlug",k:"string",max:32},{n:"multiplierBp",k:"int",lo:1e4,hi:1e6}]}},{n:"expiresInDays",k:"int",o:1,lo:1,hi:7}]}]),Ze=u("gem.pause",[{n:"paused",k:"boolean"}]),en=u("gem.prefs",[{n:"reducedMotion",k:"boolean"},{n:"muted",k:"boolean"},{n:"showFrameStats",k:"boolean",o:1},{n:"locale",k:"string",max:35,f:"bcp47"}]),nn=u("gem.cohorts",[{n:"cohorts",k:"array",max:8,it:{n:"",k:"object",fs:[{n:"experimentId",k:"string",max:36},{n:"variantKey",k:"string",max:32}]}}]),tn=u("gem.viewport",[{n:"insets",k:"object",fs:[{n:"top",k:"int",lo:0,hi:4096},{n:"right",k:"int",lo:0,hi:4096},{n:"bottom",k:"int",lo:0,hi:4096},{n:"left",k:"int",lo:0,hi:4096}]}]),rn=u("gem.deviceSettings",[{n:"settings",k:"json",o:1}]),on=u("gem.willTerminate",[{n:"reason",k:"enum",v:["grant_expiring","session_ended","navigating","kill_switch"]},{n:"graceMs",k:"int",lo:0,hi:6e4}]),sn=u("gem.roomEvent",[{n:"event",k:"enum",v:["updated","match_started","match_ready","match_failed","version_stale"]},{n:"roomId",k:"string",max:64},{n:"matchId",k:"string",o:1,max:64},{n:"version",k:"int",o:1,lo:0,hi:2147483647},{n:"reason",k:"string",o:1,max:64},{n:"platform",k:"enum",o:1,v:["universal","mobile"]}]),an=u("gem.socketState",[{n:"connected",k:"boolean"},{n:"reason",k:"enum",o:1,v:["connecting","dropped","watchdog","terminal"]}]),ln=u("gem.seatedEvent",[{n:"roomId",k:"string",max:64}]),dn=u("gem.autoStartFailedEvent",[{n:"roomId",k:"string",max:64},{n:"code",k:"string",max:64}]),un=u("gem.signalEvent",[{n:"event",k:"enum",v:["hello","offer","answer","ice","peerJoined","peerLeft","migration","matchEnded","error"]},{n:"matchId",k:"string",max:64},{n:"data",k:"json"}]),cn=u("gem.dedicatedEvent",[{n:"event",k:"enum",v:["answer","error","matchEnded"]},{n:"matchId",k:"string",max:64},{n:"sdp",k:"string",o:1,max:10240},{n:"sessionId",k:"string",o:1,max:64},{n:"code",k:"string",o:1,max:64},{n:"message",k:"string",o:1,max:256},{n:"reason",k:"string",o:1,max:64}]),mn=u("gem.partyResult",[{n:"requestId",k:"string",max:64},{n:"partyId",k:"string",o:1,max:64}]),gn=u("gem.clusterTarget",[{n:"clusterTargetId",k:"string",max:64},{n:"clusterTargetIds",k:"array",o:1,max:3,it:{n:"",k:"string",max:64}}]),pn=u("gem.devtools",[{n:"action",k:"enum",v:["open","close","toggle"]}]),yn=u("gem.screenshot",[{n:"maxWidth",k:"int",lo:1,hi:7680},{n:"maxHeight",k:"int",lo:1,hi:4320}]),fn=u("gem.screenshot.denied",[{n:"reason",k:"enum",v:["not_wired","no_source","unsupported","unreadable","tainted","too_large","busy","declined","failed"]},{n:"retryable",k:"boolean"}]),hn=u("gem.requestContext",[]),_n=u("gem.gameContext",[{n:"context",k:"json"}]),vn=u("gem.signal",[{n:"signal",k:"enum",v:["join","offer","answer","ice","migrationAck","hostUnreachable"]},{n:"matchId",k:"string",max:64},{n:"data",k:"json"}]),bn=u("gem.dedicatedOffer",[{n:"matchId",k:"string",max:64},{n:"sdp",k:"string",max:10240},{n:"intent",k:"enum",v:["initial","ice_restart","full_reconnect"]}]),Rn=u("gem.partyRequest",[{n:"requestId",k:"string",max:64}]),xn=u("gem.ready",[]),Sn=u("gem.progress",[{n:"loaded",k:"int",lo:0,hi:1099511627776},{n:"total",k:"int",lo:0,hi:1099511627776}]),kn=u("gem.requestToken",[{n:"requestId",k:"string",max:64},{n:"reason",k:"enum",v:["initial","expiring","rejected"]}]),wn=u("gem.requestLocalServer",[{n:"requestId",k:"string",max:64},{n:"gameRoomId",k:"string",max:64}]),An=u("gem.localServer",[{n:"requestId",k:"string",max:64},{n:"serverId",k:"string",o:1,max:128}]),Tn=u("gem.localServer.denied",[{n:"requestId",k:"string",max:64},{n:"retryable",k:"boolean"},{n:"reason",k:"enum",v:["refused","unavailable"]}]),On=u("gem.exit",[{n:"reason",k:"string",o:1,max:64}]),Pn=u("gem.openExternal",[{n:"url",k:"string",max:2048,f:"url"}]),Gn=u("gem.requestFullscreen",[{n:"enabled",k:"boolean"}]),En=u("gem.audioState",[{n:"muted",k:"boolean"}]),In=u("gem.rewardCue",[{n:"currencySlug",k:"string",max:32},{n:"expected",k:"int",o:1,lo:1,hi:1e9},{n:"origin",k:"object",o:1,fs:[{n:"x",k:"int",lo:0,hi:16384},{n:"y",k:"int",lo:0,hi:16384}]}]),Cn=u("gem.frameStats",[{n:"fps",k:"int",lo:0,hi:1e3},{n:"frameTimeP95Ms",k:"int",lo:0,hi:1e5}]),qn=u("gem.error",[{n:"code",k:"enum",v:["version_mismatch","handshake_timeout","handshake_duplicate","invalid_message","rate_limited","token_unavailable","unsupported","unsupported_capability","internal"]},{n:"message",k:"string",o:1,max:256}]),Ln=u("gem.requestPurchase",[{n:"requestId",k:"string",max:64},{n:"purchaseKind",k:"enum",v:["item","recipe"]},{n:"targetId",k:"string",max:64},{n:"currencySlug",k:"string",max:32},{n:"quantity",k:"int",o:1,lo:1,hi:10},{n:"catalogId",k:"string",o:1,max:64}]),$n=u("gem.purchaseResult",[{n:"requestId",k:"string",max:64},{n:"outcome",k:"enum",v:["ok","declined","unavailable"]},{n:"reason",k:"string",o:1,max:64,f:"code"},{n:"purchaseId",k:"string",o:1,max:64}]),jn=u("gem.deviceSettings.put",[{n:"requestId",k:"string",max:64},{n:"settings",k:"json"}]),Mn=u("gem.deviceSettings.result",[{n:"requestId",k:"string",max:64},{n:"outcome",k:"enum",v:["stored","too_large","unavailable"]}]),Fn=u("gem.requestAd",[{n:"requestId",k:"string",max:64},{n:"placement",k:"string",max:32},{n:"format",k:"enum",v:["interstitial","rewarded"]}]),Un=u("gem.adResult",[{n:"requestId",k:"string",max:64},{n:"outcome",k:"enum",v:["shown","no_ad","unavailable"]}]),Bn=u("gem.requestSignIn",[{n:"requestId",k:"string",max:64}]),Hn=u("gem.signInResult",[{n:"requestId",k:"string",max:64},{n:"outcome",k:"enum",v:["signed_in","declined","unavailable"]}]);U({"gem.handshake":Ke,"gem.handshake.accept":Je,"gem.token":Ye,"gem.token.denied":Xe,"gem.player":Qe,"gem.pause":Ze,"gem.prefs":en,"gem.cohorts":nn,"gem.viewport":tn,"gem.deviceSettings":rn,"gem.willTerminate":on,"gem.roomEvent":sn,"gem.socketState":an,"gem.seatedEvent":ln,"gem.autoStartFailedEvent":dn,"gem.signalEvent":un,"gem.dedicatedEvent":cn,"gem.partyResult":mn,"gem.clusterTarget":gn,"gem.devtools":pn,"gem.screenshot":yn,"gem.screenshot.denied":fn,"gem.requestContext":hn,"gem.gameContext":_n,"gem.signal":vn,"gem.dedicatedOffer":bn,"gem.partyRequest":Rn,"gem.ready":xn,"gem.progress":Sn,"gem.requestToken":kn,"gem.requestLocalServer":wn,"gem.localServer":An,"gem.localServer.denied":Tn,"gem.exit":On,"gem.openExternal":Pn,"gem.requestFullscreen":Gn,"gem.audioState":En,"gem.rewardCue":In,"gem.frameStats":Cn,"gem.error":qn,"gem.requestPurchase":Ln,"gem.purchaseResult":$n,"gem.deviceSettings.put":jn,"gem.deviceSettings.result":Mn,"gem.requestAd":Fn,"gem.adResult":Un,"gem.requestSignIn":Bn,"gem.signInResult":Hn});var P={now:()=>Date.now(),setTimeout:(n,e)=>setTimeout(n,e),clearTimeout:n=>clearTimeout(n)};var Nn=1e4;function te(n,e){return B(n,e)}function B(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=a=>({token:a.token,expiresAt:a.expiresAt,chainEndsAt:Number.POSITIVE_INFINITY}),r=null,o=new L({clock:e.clock,...e.onStateChange===void 0?{}:{onStateChange:e.onStateChange},request:()=>new Promise((a,l)=>{let d=e.clock.setTimeout(()=>{r=null,l({reason:"unavailable",retryable:true});},e.timeoutMs??Nn);r={resolve:c=>{e.clock.clearTimeout(d),a(c);},reject:l,timer:d};})}),s=n.onServerToken(a=>{let l=t(a),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 N={};fe(N,{acceptTransfer:()=>Dn,addEntityProgression:()=>Vn,adminAction:()=>zn,cancelInventoryTransfer:()=>Wn,claimEntityProgressionRewards:()=>Kn,closeGameRoom:()=>Jn,createEntityBatchOrder:()=>Yn,createEntityOrder:()=>Xn,createSession:()=>Qn,deleteEntityGameSetting:()=>Zn,deleteEntitySave:()=>et,deleteSession:()=>nt,executeEntityRecipe:()=>tt,finalizeSaveUpload:()=>rt,getDropRates:()=>ot,getEntityCurrency:()=>st,getEntityGameSetting:()=>it,getEntityInventory:()=>at,getEntityInventoryItem:()=>lt,getEntityLeaderboard:()=>dt,getEntityOrder:()=>ut,getEntityProgression:()=>ct,getEntityRecipeAvailability:()=>mt,getEntityRecipeUsage:()=>gt,getEntitySave:()=>pt,getEvent:()=>yt,getGameRoomV2:()=>ft,getLeaderboard:()=>ht,getPurchaseCatalog:()=>_t,getResolvedTemplate:()=>vt,getRoomArgs:()=>bt,getTransferDetails:()=>Rt,ingestAnalyticsEvents:()=>H,initiateInventoryTransfer:()=>xt,invokeFunction:()=>St,kickPlayer:()=>kt,listChallenges:()=>wt,listEntityGameSettings:()=>At,listEntityOrders:()=>Tt,listEntityProgressions:()=>Ot,listEntitySaves:()=>Pt,listEvents:()=>Gt,listGameRooms:()=>Et,listResolvedTemplates:()=>It,listTransfers:()=>Ct,putEntityGameSetting:()=>qt,putRoomArgs:()=>Lt,rejectTransfer:()=>$t,requestSaveUploadUrl:()=>jt,resetEntityProgression:()=>Mt,simulateEntityOrder:()=>Ft,transferHostV2:()=>Ut,updateGameRoomV2:()=>Bt});function i(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 Dn(n,e,t){let r=`/v1/inventory/transfers/${i(e)}/accept`;return n.client.post(r,void 0,t?.signal)}async function Vn(n,e,t,r,o,s){let a=`/v1/inventory/${i(e)}/${i(t)}/progressions/${i(r)}/add`;return n.client.post(a,o,s?.signal)}async function zn(n,e,t,r){let o=`/v1/voice/sessions/${i(e)}/admin`;return n.client.post(o,t,r?.signal)}async function Wn(n,e,t){let r=`/v1/inventory/transfers/${i(e)}/cancel`;return n.client.post(r,void 0,t?.signal)}async function Kn(n,e,t,r,o,s){let a=`/v1/inventory/${i(e)}/${i(t)}/progressions/${i(r)}/claim`;return n.client.post(a,o,s?.signal)}async function Jn(n,e,t){let r=`/v1/games/${i(n.gameId())}/game-rooms/${i(e)}`;return n.client.delete(r,t?.signal)}async function Yn(n,e,t,r,o){let s=`/v1/inventory/${i(e)}/${i(t)}/orders/batch`;return n.client.post(s,r,o?.signal,{...o?.ifMatch===void 0?{}:{ifMatch:o.ifMatch}})}async function Xn(n,e,t,r,o){let s=`/v1/inventory/${i(e)}/${i(t)}/orders`;return n.client.post(s,r,o?.signal,{...o?.ifMatch===void 0?{}:{ifMatch:o.ifMatch}})}async function Qn(n,e,t){return n.client.post("/v1/voice/sessions",e,t?.signal)}async function Zn(n,e,t,r,o){let s=`/v1/settings/${i(e)}/${i(t)}/${i(r)}`;return n.client.delete(s,o?.signal)}async function et(n,e,t,r,o){let s=`/v1/saves/${i(e)}/${i(t)}/${i(r)}`;return n.client.delete(s,o?.signal)}async function nt(n,e,t){let r=`/v1/voice/sessions/${i(e)}`;return n.client.delete(r,t?.signal)}async function tt(n,e,t,r,o){let s=`/v1/inventory/${i(e)}/${i(t)}/recipes/execute`;return n.client.post(s,r,o?.signal,{...o?.ifMatch===void 0?{}:{ifMatch:o.ifMatch}})}async function rt(n,e,t,r,o,s){let a=`/v1/saves/${i(e)}/${i(t)}/${i(r)}/finalize`;return n.client.post(a,o,s?.signal)}async function ot(n,e,t){let r=`/v1/inventory/loot-tables/${i(e)}/drop-rates`;return n.client.get(r,t?.signal)}async function st(n,e,t,r,o){let s=`/v1/inventory/${i(e)}/${i(t)}/currencies/${i(r)}`;return n.client.get(s,o?.signal)}async function it(n,e,t,r,o){let s=`/v1/settings/${i(e)}/${i(t)}/${i(r)}`;return n.client.getWithEtag(s,{...o?.signal===void 0?{}:{signal:o.signal},...o?.ifNoneMatch===void 0?{}:{ifNoneMatch:o.ifNoneMatch}})}async function at(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(),a=`/v1/inventory/${i(e)}/${i(t)}`+(s?`?${s}`:"");return n.client.get(a,r?.signal)}async function lt(n,e,t,r,o){let s=`/v1/inventory/${i(e)}/${i(t)}/items/${i(r)}`;return n.client.get(s,o?.signal)}async function dt(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));let a=s.toString(),l=`/v1/leaderboards/${i(e)}/${i(t)}/${i(r)}`+(a?`?${a}`:"");return n.client.get(l,o?.signal)}async function ut(n,e,t,r,o){let s=`/v1/inventory/${i(e)}/${i(t)}/orders/${i(r)}`;return n.client.get(s,o?.signal)}async function ct(n,e,t,r,o){let s=`/v1/inventory/${i(e)}/${i(t)}/progressions/${i(r)}`;return n.client.get(s,o?.signal)}async function mt(n,e,t,r,o,s){let a=`/v1/inventory/${i(e)}/${i(t)}/catalogs/${i(r)}/recipes/${i(o)}/availability`;return n.client.get(a,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(),a=`/v1/inventory/${i(e)}/${i(t)}/recipe-usage`+(s?`?${s}`:"");return n.client.get(a,r?.signal)}async function pt(n,e,t,r,o){let s=`/v1/saves/${i(e)}/${i(t)}/${i(r)}`;return n.client.getWithEtag(s,{...o?.signal===void 0?{}:{signal:o.signal},...o?.ifNoneMatch===void 0?{}:{ifNoneMatch:o.ifNoneMatch}})}async function yt(n,e,t){let r=`/v1/events/${i(e)}`;return n.client.get(r,t?.signal)}async function ft(n,e,t){let r=`/v2/games/${i(n.gameId())}/game-rooms/${i(e)}`;return n.client.getWithEtag(r,{...t?.signal===void 0?{}:{signal:t.signal},...t?.ifNoneMatch===void 0?{}:{ifNoneMatch:t.ifNoneMatch}})}async function ht(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));let o=r.toString(),s=`/v1/leaderboards/${i(e)}`+(o?`?${o}`:"");return n.client.get(s,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 vt(n,e,t){let r=`/v1/game-room-templates/${i(e)}`;return n.client.get(r,t?.signal)}async function bt(n,e,t){let r=`/v1/games/${i(n.gameId())}/game-rooms/${i(e)}/room-args`;return n.client.get(r,t?.signal)}async function Rt(n,e,t){let r=`/v1/inventory/transfers/${i(e)}`;return n.client.get(r,t?.signal)}async function H(n,e,t){let r=`/v1/games/${i(n.gameId())}/analytics/events`;return n.client.post(r,e,t?.signal,{replaySafe:true})}async function xt(n,e,t){return n.client.post("/v1/inventory/transfers",e,t?.signal)}async function St(n,e,t){return n.client.postBytes("/v1/functions/invoke",e,t?.signal)}async function kt(n,e,t,r){let o=`/v1/games/${i(n.gameId())}/game-rooms/${i(e)}/kick/${i(t)}`;return n.client.post(o,void 0,r?.signal)}async function wt(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 At(n,e,t,r){let o=`/v1/settings/${i(e)}/${i(t)}`;return n.client.get(o,r?.signal)}async function Tt(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(),a=`/v1/inventory/${i(e)}/${i(t)}/orders`+(s?`?${s}`:"");return n.client.get(a,r?.signal)}async function Ot(n,e,t,r){let o=`/v1/inventory/${i(e)}/${i(t)}/progressions`;return n.client.get(o,r?.signal)}async function Pt(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(),a=`/v1/saves/${i(e)}/${i(t)}`+(s?`?${s}`:"");return n.client.get(a,r?.signal)}async function Gt(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 Et(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/${i(n.gameId())}/game-rooms`+(r?`?${r}`:"");return n.client.get(o,e?.signal)}async function It(n,e){return n.client.get("/v1/game-room-templates",e?.signal)}async function Ct(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 qt(n,e,t,r,o,s){let a=`/v1/settings/${i(e)}/${i(t)}/${i(r)}`;return n.client.put(a,o,s?.signal,{...s?.ifMatch===void 0?{}:{ifMatch:s.ifMatch}})}async function Lt(n,e,t,r){let o=`/v1/games/${i(n.gameId())}/game-rooms/${i(e)}/room-args`;return n.client.put(o,t,r?.signal)}async function $t(n,e,t){let r=`/v1/inventory/transfers/${i(e)}/reject`;return n.client.post(r,void 0,t?.signal)}async function jt(n,e,t,r,o,s){let a=`/v1/saves/${i(e)}/${i(t)}/${i(r)}/upload-url`;return n.client.post(a,o,s?.signal,{replaySafe:true})}async function Mt(n,e,t,r,o,s){let a=`/v1/inventory/${i(e)}/${i(t)}/progressions/${i(r)}/reset`;return n.client.post(a,o,s?.signal)}async function Ft(n,e,t,r,o){let s=`/v1/inventory/${i(e)}/${i(t)}/orders/simulate`;return n.client.post(s,r,o?.signal)}async function Ut(n,e,t,r){let o=`/v2/games/${i(n.gameId())}/game-rooms/${i(e)}/transfer/${i(t)}`;return n.client.post(o,void 0,r?.signal)}async function Bt(n,e,t,r){let o=`/v2/games/${i(n.gameId())}/game-rooms/${i(e)}`;return n.client.patch(o,t,r?.signal,{...r?.ifMatch===void 0?{}:{ifMatch:r.ifMatch}})}var re="gem_";var Dt=1e4,Vt=50,zt=1e3,Wt=65536-4*1024,oe=n=>typeof n=="number"?n:0,Kt=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 Jt(n){return n?.retryable===true}function Yt(n,e){let t=n??{},r=Array.isArray(t.rejected)?t.rejected.map(o=>{let s=o??{};return {index:oe(s.index),code:Kt(s.code)}}):[];return {accepted:oe(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 ae(n){let e=Math.max(1,Math.floor(n.maxQueue??zt)),t={client:n.client,gameId:()=>n.gameId},r=[],o=0,s=null,a=false,l=false,d=false,c=false,m=f=>{n.log?.(f);},_=()=>{s!==null&&(n.clock.clearTimeout(s),s=null);},b=()=>{s!==null||a||l||(s=n.clock.setTimeout(()=>{s=null,R().catch(()=>{});},Dt));},y=()=>{let f=Math.min(r.length,100),x=128;for(let k=0;k<f;k+=1){let w=r[k];if(w===void 0)break;if(x+=JSON.stringify(ie(w,0)).length+1,x>Wt)return Math.max(1,k)}return f};async function R(f){if(r.length===0)return {accepted:0,rejected:[],dropped:0,duplicate:false};_();let x=r.splice(0,y()),k=o;o=0;let w=Math.round(n.clock.now()),q={batch_id:se(),sent_at_ms:w,events:x.map(S=>ie(S,w))};l=true;try{let S=await H(t,q,f===void 0?void 0:{signal:f}),A=Yt(S,k);for(let pe of A.rejected)m(`[gem] analytics: an event was refused (${pe.code}). See the analytics_events section of your game config.`);return A}catch(S){if(Jt(S))for(r=[...x,...r],o+=k;r.length>e;)r.shift(),o+=1;else m(`[gem] analytics: ${x.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&&b();}}return {track(f,x,k={}){if(a)return;if(typeof f!="string"||f===""){c||(c=true,m(`[gem] analytics: '${x}' 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(x.startsWith(re)){d||(d=true,m(`[gem] analytics: '${x}' 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 w={},q={};for(let[S,A]of Object.entries(k))typeof A=="string"?w[S]=A:typeof A=="number"&&Number.isFinite(A)&&(q[S]=A);for(;r.length>=e;)r.shift(),o+=1;r.push({uid:se(),playerId:f,name:x,atMs:n.clock.now(),dimensions:w,measures:q}),r.length>=Vt?R().catch(()=>{}):b();},flush:f=>R(f),get pending(){return r.length},dispose(){a=true,_(),r=[],o=0;}}}var Xt=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:Xt.get(this.code))??super.retryable}},G=class{#e;constructor(e){this.#e=e;}async invoke(e,t={}){let r=Qt(e),o;try{o=await this.#e(r,t.signal===void 0?{}:{signal:t.signal});}catch(s){throw s instanceof g?er(s):s}return Zt(o)}};function Qt(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 Zt(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 er(n){let{details:e,invocationId:t}=Y(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}:{}})}function nr(n){let e={};for(let[t,r]of Object.entries(N))if(typeof r=="function"){let o=r;e[t]=(...s)=>o(n,...s);}return e}function M(n,e={}){let t=e.clock??P,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=B(n,{clock:t,...e.onAuthStateChange===void 0?{}:{onStateChange:e.onAuthStateChange}}),s=X({baseUrl:r,tokenSource:o.source,defaultQuery:{game_id:n.gameId,channel:n.channel},...e.fetch===void 0?{}:{fetch:e.fetch}}),a=new T({transport:s,clock:t}),l={gameId:n.gameId,channel:n.channel,matchId:n.matchId,...n.gameRoomId===void 0?{}:{gameRoomId:n.gameRoomId}},d=nr({client:a,gameId:()=>l.gameId}),c=l.gameRoomId,m=n.endMatch,_=n.log,b=ae({client:a,clock:t,gameId:l.gameId,...typeof _=="function"?{log:R=>_.call(n,R)}:{}});return {identity:l,client:a,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:b,functions:new G(d.invokeFunction),...c===void 0?{}:{room:{get:R=>d.getGameRoomV2(c,R),args:R=>d.getRoomArgs(c,R)}},dispose:()=>{b.dispose(),o.dispose();}}}var tr=["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"],rr=new Set(tr);function le(n){return typeof n=="string"&&rr.has(n)?n:"unknown"}var v=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 C(n){return new v(n)}var de={toPlain(n){return v.unwrap(n)},compare(n,e,t){let r=n instanceof v?v.unwrap(n):n,o=e instanceof v?v.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 v?v.unwrap(n):n,r=e instanceof v?v.unwrap(e):e;return t.normalize("NFC")===r.normalize("NFC")}};var ue="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 D(n,e={}){let t=e.clock??P,r=()=>{let l=n();if(l===null)throw new Error(ue);return l},o=null,s=()=>{if(o===null)throw new Error(ue);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 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:C(m),...typeof c.displayTag=="string"&&c.displayTag!==""?{displayTag:C(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=M(r(),{...e,clock:t});}}}function ce(n,e={}){let{server:t,attach:r}=D(()=>n,e);return r(),t}function or(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:le(e)}}}function me(n,e={}){return ()=>{let t=null,{server:r,attach:o}=D(()=>t,e),s=n(r),a={async init(l){t=l,o(),await s.init?.();},async shutdown(l){let d=or(l);try{await s.shutdown?.(d);}finally{r.dispose();}}};return s.join&&(a.join=(l,d)=>s.join?.(l,d)),s.leave&&(a.leave=(l,d)=>s.leave?.(l,d)),s.message&&(a.message=(l,d,c,m)=>s.message?.(l,d,c,m)),a}}var sr=new Set(["unlocked","already_unlocked","suppressed"]);function ge(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"||!sr.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{h as AuthError,$ as CONDITIONAL_HEADERS,G as FunctionsApi,g as GemApiError,T as GemClient,I as GemFunctionError,v as PlayerText,p as TransportRefusal,ge as achievementReceipts,C as asPlayerText,M as createGemServer,te as createHostTokenSource,ce as createMatchServer,me as defineServer,P as systemClock,de as text,W as toBase64};//# sourceMappingURL=gem-web-sdk.server.js.map
|
|
3
3
|
//# sourceMappingURL=gem-web-sdk.server.js.map
|
package/dist/index.d.ts
CHANGED
|
@@ -373,6 +373,7 @@ interface GemPurchaseResult {
|
|
|
373
373
|
readonly type: "gem.purchaseResult";
|
|
374
374
|
readonly requestId: string;
|
|
375
375
|
readonly outcome: "ok" | "declined" | "unavailable";
|
|
376
|
+
readonly reason?: string;
|
|
376
377
|
readonly purchaseId?: string;
|
|
377
378
|
}
|
|
378
379
|
interface GemDeviceSettingsPut {
|
|
@@ -466,6 +467,7 @@ declare const validateGemAdResult: (raw: unknown) => Rejection;
|
|
|
466
467
|
declare const validateGemRequestSignIn: (raw: unknown) => Rejection;
|
|
467
468
|
declare const validateGemSignInResult: (raw: unknown) => Rejection;
|
|
468
469
|
declare const VALIDATORS: Readonly<Record<string, (raw: unknown) => Rejection>>;
|
|
470
|
+
type PurchaseRefusalCode = "unknown_currency" | "currency_not_in_game_payable" | "not_purchasable" | "no_price_in_currency" | "busy" | "cancelled" | "insufficient_funds" | "price_mismatch" | "config_version_stale" | "platform_currency_unavailable" | "not_available" | "recipe_locked" | "recipe_on_cooldown" | "recipe_max_uses_exceeded" | "item_max_stack_exceeded" | "recipe_costs_unmet" | "quantity_invalid" | "error";
|
|
469
471
|
interface OfferRefusal {
|
|
470
472
|
readonly reason: string;
|
|
471
473
|
}
|
|
@@ -704,7 +706,7 @@ declare class GemHost {
|
|
|
704
706
|
private rememberMatch;
|
|
705
707
|
private rememberAsked;
|
|
706
708
|
answerPartyRequest(requestId: string, partyId?: string): boolean;
|
|
707
|
-
answerPurchase(requestId: string, outcome: "ok" | "declined" | "unavailable", purchaseId?: string): boolean;
|
|
709
|
+
answerPurchase(requestId: string, outcome: "ok" | "declined" | "unavailable", purchaseId?: string, reason?: PurchaseRefusalCode): boolean;
|
|
708
710
|
answerDeviceSettingsPut(requestId: string, outcome: "stored" | "too_large" | "unavailable"): boolean;
|
|
709
711
|
sendDeviceSettings(settings?: Readonly<Record<string, unknown>>): boolean;
|
|
710
712
|
answerAd(requestId: string, outcome: "shown" | "no_ad" | "unavailable"): boolean;
|
|
@@ -2072,4 +2074,4 @@ interface P2pMatchApi {
|
|
|
2072
2074
|
session(matchId: string): P2pSession | null;
|
|
2073
2075
|
}
|
|
2074
2076
|
declare function createP2pApi(options: P2pApiOptions): P2pMatchApi;
|
|
2075
|
-
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 GemError, type GemErrorCode, type GemExit, GemFrame, type GemFrameStats, type GemGameContext, type GemHandshake, type GemHandshakeAccept, GemHost, type GemLocalServer, type GemLocalServerDenied, type GemMessage, type GemOpenExternal, type GemPartyRequest, type GemPartyResult, type GemPause, type GemPlayer, type GemPrefs, type GemProgress, type GemPurchaseResult, type GemReady, type GemRequestAd, type GemRequestContext, type GemRequestFullscreen, type GemRequestLocalServer, type GemRequestPurchase, 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 GemViewport, 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 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 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, validateGemError, validateGemExit, validateGemFrameStats, validateGemGameContext, validateGemHandshake, validateGemHandshakeAccept, validateGemLocalServer, validateGemLocalServerDenied, validateGemOpenExternal, validateGemPartyRequest, validateGemPartyResult, validateGemPause, validateGemPlayer, validateGemPrefs, validateGemProgress, validateGemPurchaseResult, validateGemReady, validateGemRequestAd, validateGemRequestContext, validateGemRequestFullscreen, validateGemRequestLocalServer, validateGemRequestPurchase, validateGemRequestSignIn, validateGemRequestToken, validateGemRewardCue, validateGemRoomEvent, validateGemScreenshot, validateGemScreenshotDenied, validateGemSeatedEvent, validateGemSignInResult, validateGemSignal, validateGemSignalEvent, validateGemSocketState, validateGemToken, validateGemTokenDenied, validateGemViewport, validateGemWillTerminate, validateSize, verifyCredential };
|
|
2077
|
+
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 GemError, type GemErrorCode, type GemExit, GemFrame, type GemFrameStats, type GemGameContext, type GemHandshake, type GemHandshakeAccept, GemHost, type GemLocalServer, type GemLocalServerDenied, type GemMessage, type GemOpenExternal, type GemPartyRequest, type GemPartyResult, type GemPause, type GemPlayer, type GemPrefs, type GemProgress, type GemPurchaseResult, type GemReady, type GemRequestAd, type GemRequestContext, type GemRequestFullscreen, type GemRequestLocalServer, type GemRequestPurchase, 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 GemViewport, 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 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 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, validateGemError, validateGemExit, validateGemFrameStats, validateGemGameContext, validateGemHandshake, validateGemHandshakeAccept, validateGemLocalServer, validateGemLocalServerDenied, validateGemOpenExternal, validateGemPartyRequest, validateGemPartyResult, validateGemPause, validateGemPlayer, validateGemPrefs, validateGemProgress, validateGemPurchaseResult, validateGemReady, validateGemRequestAd, validateGemRequestContext, validateGemRequestFullscreen, validateGemRequestLocalServer, validateGemRequestPurchase, validateGemRequestSignIn, validateGemRequestToken, validateGemRewardCue, validateGemRoomEvent, validateGemScreenshot, validateGemScreenshotDenied, validateGemSeatedEvent, validateGemSignInResult, validateGemSignal, validateGemSignalEvent, validateGemSocketState, validateGemToken, validateGemTokenDenied, validateGemViewport, validateGemWillTerminate, validateSize, verifyCredential };
|
package/dist/sdk.d.ts
CHANGED
|
@@ -157,8 +157,12 @@ type AffixSelection = {
|
|
|
157
157
|
"pool": AffixPoolRef;
|
|
158
158
|
"respect_groups"?: boolean;
|
|
159
159
|
};
|
|
160
|
+
type Boundary = {
|
|
161
|
+
"boundary"?: string;
|
|
162
|
+
"reset_time"?: string;
|
|
163
|
+
};
|
|
160
164
|
type BucketColumn = "bucket_1" | "bucket_2";
|
|
161
|
-
type BucketConfig = {
|
|
165
|
+
type BucketConfig = Boundary & {
|
|
162
166
|
"grant_sources"?: OrderSource$1[];
|
|
163
167
|
"name": string;
|
|
164
168
|
"priority": number;
|
|
@@ -330,11 +334,11 @@ type ResetSchedule = {
|
|
|
330
334
|
} | {
|
|
331
335
|
"event_id": string;
|
|
332
336
|
"type": "event_window";
|
|
333
|
-
} | {
|
|
337
|
+
} | Boundary & {
|
|
334
338
|
"type": "daily";
|
|
335
|
-
} | {
|
|
339
|
+
} | Boundary & {
|
|
336
340
|
"type": "weekly";
|
|
337
|
-
} | {
|
|
341
|
+
} | Boundary & {
|
|
338
342
|
"type": "monthly";
|
|
339
343
|
};
|
|
340
344
|
type RoomArgType$2 = "string" | "int" | "float" | "bool";
|
|
@@ -1068,13 +1072,16 @@ declare class GameConfigApi {
|
|
|
1068
1072
|
private fetchConfig;
|
|
1069
1073
|
}
|
|
1070
1074
|
declare const MAX_PERIODS_BACK = 400;
|
|
1071
|
-
type ChallengeWindow = "daily" | "weekly" | "monthly" | (string & {});
|
|
1075
|
+
type ChallengeWindow = "daily" | "weekly" | "monthly" | "cron" | (string & {});
|
|
1072
1076
|
interface Challenge {
|
|
1073
1077
|
readonly id: string;
|
|
1074
1078
|
readonly slug?: string;
|
|
1075
1079
|
readonly window: ChallengeWindow;
|
|
1076
1080
|
readonly periodStartAt: number;
|
|
1077
1081
|
readonly periodEndsAt: number;
|
|
1082
|
+
readonly periodLocalDate?: string;
|
|
1083
|
+
readonly boundary: string;
|
|
1084
|
+
readonly resetTime: string;
|
|
1078
1085
|
readonly seed: string;
|
|
1079
1086
|
readonly data?: string;
|
|
1080
1087
|
readonly dataHash?: string;
|
|
@@ -1949,6 +1956,7 @@ interface GemPurchaseResult {
|
|
|
1949
1956
|
readonly type: "gem.purchaseResult";
|
|
1950
1957
|
readonly requestId: string;
|
|
1951
1958
|
readonly outcome: "ok" | "declined" | "unavailable";
|
|
1959
|
+
readonly reason?: string;
|
|
1952
1960
|
readonly purchaseId?: string;
|
|
1953
1961
|
}
|
|
1954
1962
|
interface GemDeviceSettingsResult {
|
|
@@ -2475,11 +2483,14 @@ type ChallengeListResponse = {
|
|
|
2475
2483
|
"challenges": ChallengePeriodResponse[];
|
|
2476
2484
|
};
|
|
2477
2485
|
type ChallengePeriodResponse = {
|
|
2486
|
+
"boundary": string;
|
|
2478
2487
|
"challenge_data"?: string | null;
|
|
2479
2488
|
"challenge_data_hash"?: string | null;
|
|
2480
2489
|
"period_ends_at": string;
|
|
2490
|
+
"period_local_date"?: string | null;
|
|
2481
2491
|
"period_start_at": string;
|
|
2482
2492
|
"progression_definition_id": string;
|
|
2493
|
+
"reset_time": string;
|
|
2483
2494
|
"seed": string;
|
|
2484
2495
|
"slug"?: string | null;
|
|
2485
2496
|
"window": WindowKind;
|
|
@@ -2954,9 +2965,12 @@ type PaginatedResponseSaveDataResponse = {
|
|
|
2954
2965
|
"next_cursor"?: string | null;
|
|
2955
2966
|
};
|
|
2956
2967
|
type PeriodProgressResponse = {
|
|
2968
|
+
"boundary": string;
|
|
2957
2969
|
"completed": boolean;
|
|
2958
2970
|
"current_value": number;
|
|
2959
2971
|
"period_ends_at": number;
|
|
2972
|
+
"period_id": string;
|
|
2973
|
+
"period_local_date"?: string | null;
|
|
2960
2974
|
"period_start_at": number;
|
|
2961
2975
|
"progression_definition_id": string;
|
|
2962
2976
|
"target": number;
|
|
@@ -3012,6 +3026,7 @@ type ProgressionResetRequest = {
|
|
|
3012
3026
|
};
|
|
3013
3027
|
type ProgressionStateOverride = {
|
|
3014
3028
|
"last_reset_at"?: string | null;
|
|
3029
|
+
"last_reset_period_id"?: string | null;
|
|
3015
3030
|
"last_window_id"?: string | null;
|
|
3016
3031
|
"progression_definition_id": string;
|
|
3017
3032
|
"rewards_claimed_through"?: Record<string, unknown> | null;
|
|
@@ -3207,9 +3222,11 @@ type SuppliedItems = {
|
|
|
3207
3222
|
"next_cursor"?: string | null;
|
|
3208
3223
|
};
|
|
3209
3224
|
type SuppliedPeriodProgressRow = {
|
|
3225
|
+
"boundary"?: string | null;
|
|
3210
3226
|
"completed"?: boolean;
|
|
3211
3227
|
"current_value"?: number;
|
|
3212
3228
|
"period_ends_at": number;
|
|
3229
|
+
"period_id"?: string | null;
|
|
3213
3230
|
"period_start_at": number;
|
|
3214
3231
|
"progression_definition_id": string;
|
|
3215
3232
|
"target": number;
|
|
@@ -3445,6 +3462,7 @@ declare function kickPlayer(api: GameApi, game_room_id: string, player_id: strin
|
|
|
3445
3462
|
}): Promise<void>;
|
|
3446
3463
|
declare function listChallenges(api: GameApi, options?: {
|
|
3447
3464
|
"periods_back"?: number;
|
|
3465
|
+
"player_id"?: string;
|
|
3448
3466
|
signal?: AbortSignal;
|
|
3449
3467
|
}): Promise<ChallengeListResponse>;
|
|
3450
3468
|
declare function listEntityGameSettings(api: GameApi, entity_type: string, entity_id: string, options?: {
|
|
@@ -3831,6 +3849,12 @@ interface GemMatchApi {
|
|
|
3831
3849
|
serve(server: GemMatchServerModule, options?: MatchServeOptions): Promise<MatchHosting>;
|
|
3832
3850
|
connect(options?: MatchConnectOptions): Promise<MatchConnection>;
|
|
3833
3851
|
}
|
|
3852
|
+
type PurchaseRefusalCode = "unknown_currency" | "currency_not_in_game_payable" | "not_purchasable" | "no_price_in_currency" | "busy" | "cancelled" | "insufficient_funds" | "price_mismatch" | "config_version_stale" | "platform_currency_unavailable" | "not_available" | "recipe_locked" | "recipe_on_cooldown" | "recipe_max_uses_exceeded" | "item_max_stack_exceeded" | "recipe_costs_unmet" | "quantity_invalid" | "error";
|
|
3853
|
+
declare class PurchaseRefusal extends RangeError {
|
|
3854
|
+
readonly code: Extract<PurchaseRefusalCode, "unknown_currency" | "not_purchasable" | "no_price_in_currency" | "quantity_invalid">;
|
|
3855
|
+
readonly retryable: false;
|
|
3856
|
+
constructor(code: Extract<PurchaseRefusalCode, "unknown_currency" | "not_purchasable" | "no_price_in_currency" | "quantity_invalid">, message: string);
|
|
3857
|
+
}
|
|
3834
3858
|
interface PurchaseRequest {
|
|
3835
3859
|
kind: "item" | "recipe";
|
|
3836
3860
|
targetId: string;
|
|
@@ -3843,6 +3867,7 @@ type PurchaseOutcome = {
|
|
|
3843
3867
|
readonly purchaseId?: string;
|
|
3844
3868
|
} | {
|
|
3845
3869
|
readonly outcome: "declined" | "unavailable";
|
|
3870
|
+
readonly reason?: PurchaseRefusalCode | (string & {});
|
|
3846
3871
|
};
|
|
3847
3872
|
interface PurchaseApi {
|
|
3848
3873
|
request(req: PurchaseRequest): Promise<PurchaseOutcome>;
|
|
@@ -4116,4 +4141,4 @@ interface ExitAnalytics {
|
|
|
4116
4141
|
}
|
|
4117
4142
|
declare function leaveAndExit(rooms: ExitRooms, bridge: ExitBridge | null, reason?: string, analytics?: ExitAnalytics): Promise<void>;
|
|
4118
4143
|
declare function createGem(options?: GemOptions): Gem;
|
|
4119
|
-
export { ARCADE_EMBEDDERS, type AccountApi, type AdFormat, type AdOutcome, type AdOutcomeKind, type AdRequest, type AdsApi, AnalyticsApi, type AnalyticsFlushOptions, type AnalyticsFlushResult, type AnalyticsOptions, type AnalyticsRejection$1 as AnalyticsRejection, type AnalyticsValue, AuthError, type AuthFailure, type AuthState, type Base64String, type BootMark, type BootTimeline, type BroadcastOptions, type BytesResponse, CONDITIONAL_HEADERS, type Challenge, type ChallengeWindow, ChallengesApi, type ClientOptions, type Clock, type ConditionalRequestHeaders, type ConfiguredPurchasePayment, type ConfiguredPurchaseRequest, type ConfiguredPurchaseResult, DEVICE_SETTINGS_MAX_BYTES, DedicatedServerError, type DedicatedServerFailure, type DedicatedServerSession, type DevToolsOpener, type DeviceSettings, type DeviceSettingsApi, type DeviceSettingsPutOutcome, type DirectPurchaseRequest, type DirectPurchaseResult, type EntityLeaderboard, type EntityLeaderboardEntry, type EntityLeaderboardOptions, type EntityType$1 as EntityType, type ExitAnalytics, type ExitBridge, type ExitRooms, type FrameState, type Friend, FriendsApi, type FriendsPage, type FunctionFailure, type FunctionInvokeOptions, type FunctionResult, FunctionsApi, type GameApi, type GameConfig, type GameServerLink, type Gem, GemApiError, GemClient, type GemCohort, type GemCohorts, GemConfigError, type GemDevTools, type GemErrorReason, GemFrame, GemFunctionError, type GemIdentity, type GemInsets, type GemMatchApi, type GemMatchServer, type GemMatchServerModule, type GemOptions, type GemPlayer, type GemPrefs, GemSaveError, type GemServer, type GemServerBundle, type GemServerFactory, type GemServerHost, type GemServerHostProfile, type GemServerIdentity, type GemServerLifecycle, type GemServerOptions, type GemServerProfile, type GemTerminationNotice, type GemViewport, type GetLeaderboardOptions, type HostTokenSource, type HostTokenSourceOptions, type JoinWelcome, type Leaderboard, type LeaderboardEntry, LeaderboardsApi, type ListChallengesOptions, type ListFriendsOptions, MAX_PERIODS_BACK, type MatchConnectOptions, type MatchConnection, type MatchHosting, type MatchHostingMode, type MatchServeOptions, type MatchTransport, type MessageMeta, type MultiTransportSession, PLATFORM_EVENTS, PlatformApi, PlatformCurrenciesApi, type PlatformCurrency, type PlatformCurrencyAccess, type PlatformCurrencyPurchasePayment, type PlatformCurrencyPurchaseRequest, type PlatformCurrencyPurchaseResult, type PlatformCurrencyReadOptions, type PlatformEventName, type PlayerBadge$1 as PlayerBadge, type PlayerBoost, type PlayerBoostMultiplier, type PlayerIdentity, type PlayerProfile, PlayerText, type ProfileCallOptions, type ProfileShowcaseEntry, ProfilesApi, type PurchaseApi, type PurchaseOptions, type PurchaseOutcome, type PurchaseRequest, type PutBytesOptions, type PutSaveOptions, type RankedRow, type RecipeAvailability, type RecipeLock, type RequestOptions, type RewardCue, type RoomArgValue, type SavePage, type SaveRecord, type SendOptions$1 as SendOptions, type ServerApi, type ServerBundleHost, type ServerTokenGrant, type SessionEndReason, ShowcaseApi, type ShowcaseCallOptions, type ShowcaseFriendEntry, type ShowcaseFriends, type ShowcaseValue, type SignInOutcome, type SignInOutcomeKind, type SnapshotCurrency, type SnapshotItem, type TokenGrant, type Transport, type TransportAdvert, type TransportKind, TransportRefusal, type TransportRequest, type TransportResponse, UNRELIABLE_CHANNEL_LABEL, type VersionedGetOptions, type VersionedResponse, asPlayerText, createBootTimeline, createGem, createGemServer, createHostTokenSource, createMatchServer, defineServer, leaveAndExit, mapIdentity, markOnResolve, platformIconUrl, presentJoinCredential, readTemplateTransports, readTransportAdvert, reportOnResolve, systemClock, text, toBase64, webTransportAvailable };
|
|
4144
|
+
export { ARCADE_EMBEDDERS, type AccountApi, type AdFormat, type AdOutcome, type AdOutcomeKind, type AdRequest, type AdsApi, AnalyticsApi, type AnalyticsFlushOptions, type AnalyticsFlushResult, type AnalyticsOptions, type AnalyticsRejection$1 as AnalyticsRejection, type AnalyticsValue, AuthError, type AuthFailure, type AuthState, type Base64String, type BootMark, type BootTimeline, type BroadcastOptions, type BytesResponse, CONDITIONAL_HEADERS, type Challenge, type ChallengeWindow, ChallengesApi, type ClientOptions, type Clock, type ConditionalRequestHeaders, type ConfiguredPurchasePayment, type ConfiguredPurchaseRequest, type ConfiguredPurchaseResult, DEVICE_SETTINGS_MAX_BYTES, DedicatedServerError, type DedicatedServerFailure, type DedicatedServerSession, type DevToolsOpener, type DeviceSettings, type DeviceSettingsApi, type DeviceSettingsPutOutcome, type DirectPurchaseRequest, type DirectPurchaseResult, type EntityLeaderboard, type EntityLeaderboardEntry, type EntityLeaderboardOptions, type EntityType$1 as EntityType, type ExitAnalytics, type ExitBridge, type ExitRooms, type FrameState, type Friend, FriendsApi, type FriendsPage, type FunctionFailure, type FunctionInvokeOptions, type FunctionResult, FunctionsApi, type GameApi, type GameConfig, type GameServerLink, type Gem, GemApiError, GemClient, type GemCohort, type GemCohorts, GemConfigError, type GemDevTools, type GemErrorReason, GemFrame, GemFunctionError, type GemIdentity, type GemInsets, type GemMatchApi, type GemMatchServer, type GemMatchServerModule, type GemOptions, type GemPlayer, type GemPrefs, GemSaveError, type GemServer, type GemServerBundle, type GemServerFactory, type GemServerHost, type GemServerHostProfile, type GemServerIdentity, type GemServerLifecycle, type GemServerOptions, type GemServerProfile, type GemTerminationNotice, type GemViewport, type GetLeaderboardOptions, type HostTokenSource, type HostTokenSourceOptions, type JoinWelcome, type Leaderboard, type LeaderboardEntry, LeaderboardsApi, type ListChallengesOptions, type ListFriendsOptions, MAX_PERIODS_BACK, type MatchConnectOptions, type MatchConnection, type MatchHosting, type MatchHostingMode, type MatchServeOptions, type MatchTransport, type MessageMeta, type MultiTransportSession, PLATFORM_EVENTS, PlatformApi, PlatformCurrenciesApi, type PlatformCurrency, type PlatformCurrencyAccess, type PlatformCurrencyPurchasePayment, type PlatformCurrencyPurchaseRequest, type PlatformCurrencyPurchaseResult, type PlatformCurrencyReadOptions, type PlatformEventName, type PlayerBadge$1 as PlayerBadge, type PlayerBoost, type PlayerBoostMultiplier, type PlayerIdentity, type PlayerProfile, PlayerText, type ProfileCallOptions, type ProfileShowcaseEntry, ProfilesApi, type PurchaseApi, type PurchaseOptions, type PurchaseOutcome, PurchaseRefusal, type PurchaseRefusalCode, type PurchaseRequest, type PutBytesOptions, type PutSaveOptions, type RankedRow, type RecipeAvailability, type RecipeLock, type RequestOptions, type RewardCue, type RoomArgValue, type SavePage, type SaveRecord, type SendOptions$1 as SendOptions, type ServerApi, type ServerBundleHost, type ServerTokenGrant, type SessionEndReason, ShowcaseApi, type ShowcaseCallOptions, type ShowcaseFriendEntry, type ShowcaseFriends, type ShowcaseValue, type SignInOutcome, type SignInOutcomeKind, type SnapshotCurrency, type SnapshotItem, type TokenGrant, type Transport, type TransportAdvert, type TransportKind, TransportRefusal, type TransportRequest, type TransportResponse, UNRELIABLE_CHANNEL_LABEL, type VersionedGetOptions, type VersionedResponse, asPlayerText, createBootTimeline, createGem, createGemServer, createHostTokenSource, createMatchServer, defineServer, leaveAndExit, mapIdentity, markOnResolve, platformIconUrl, presentJoinCredential, readTemplateTransports, readTransportAdvert, reportOnResolve, systemClock, text, toBase64, webTransportAvailable };
|
package/dist/server-api.d.ts
CHANGED
|
@@ -186,11 +186,14 @@ type ChallengeListResponse = {
|
|
|
186
186
|
"challenges": ChallengePeriodResponse[];
|
|
187
187
|
};
|
|
188
188
|
type ChallengePeriodResponse = {
|
|
189
|
+
"boundary": string;
|
|
189
190
|
"challenge_data"?: string | null;
|
|
190
191
|
"challenge_data_hash"?: string | null;
|
|
191
192
|
"period_ends_at": string;
|
|
193
|
+
"period_local_date"?: string | null;
|
|
192
194
|
"period_start_at": string;
|
|
193
195
|
"progression_definition_id": string;
|
|
196
|
+
"reset_time": string;
|
|
194
197
|
"seed": string;
|
|
195
198
|
"slug"?: string | null;
|
|
196
199
|
"window": WindowKind;
|
|
@@ -665,9 +668,12 @@ type PaginatedResponseSaveDataResponse = {
|
|
|
665
668
|
"next_cursor"?: string | null;
|
|
666
669
|
};
|
|
667
670
|
type PeriodProgressResponse = {
|
|
671
|
+
"boundary": string;
|
|
668
672
|
"completed": boolean;
|
|
669
673
|
"current_value": number;
|
|
670
674
|
"period_ends_at": number;
|
|
675
|
+
"period_id": string;
|
|
676
|
+
"period_local_date"?: string | null;
|
|
671
677
|
"period_start_at": number;
|
|
672
678
|
"progression_definition_id": string;
|
|
673
679
|
"target": number;
|
|
@@ -723,6 +729,7 @@ type ProgressionResetRequest = {
|
|
|
723
729
|
};
|
|
724
730
|
type ProgressionStateOverride = {
|
|
725
731
|
"last_reset_at"?: string | null;
|
|
732
|
+
"last_reset_period_id"?: string | null;
|
|
726
733
|
"last_window_id"?: string | null;
|
|
727
734
|
"progression_definition_id": string;
|
|
728
735
|
"rewards_claimed_through"?: Record<string, unknown> | null;
|
|
@@ -918,9 +925,11 @@ type SuppliedItems = {
|
|
|
918
925
|
"next_cursor"?: string | null;
|
|
919
926
|
};
|
|
920
927
|
type SuppliedPeriodProgressRow = {
|
|
928
|
+
"boundary"?: string | null;
|
|
921
929
|
"completed"?: boolean;
|
|
922
930
|
"current_value"?: number;
|
|
923
931
|
"period_ends_at": number;
|
|
932
|
+
"period_id"?: string | null;
|
|
924
933
|
"period_start_at": number;
|
|
925
934
|
"progression_definition_id": string;
|
|
926
935
|
"target": number;
|
|
@@ -1156,6 +1165,7 @@ declare function kickPlayer(api: GameApi, game_room_id: string, player_id: strin
|
|
|
1156
1165
|
}): Promise<void>;
|
|
1157
1166
|
declare function listChallenges(api: GameApi, options?: {
|
|
1158
1167
|
"periods_back"?: number;
|
|
1168
|
+
"player_id"?: string;
|
|
1159
1169
|
signal?: AbortSignal;
|
|
1160
1170
|
}): Promise<ChallengeListResponse>;
|
|
1161
1171
|
declare function listEntityGameSettings(api: GameApi, entity_type: string, entity_id: string, options?: {
|