@indiegems/gem-web-sdk 7.4.2 → 7.6.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.
@@ -0,0 +1,3 @@
1
+ globalThis.__gemWebSdkVersion="[gem-web-sdk:sdkVersion:7.6.0]";function Be(){let t=globalThis.__gemWebSdkVersion;if(typeof t!="string")return "";let e=t.lastIndexOf(":"),n=t.lastIndexOf("]");return e<0||n<=e+1?"":t.slice(e+1,n)}function a(t){let e=String(t);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 De(t,e,n){let r=`/v1/inventory/transfers/${a(e)}/accept`;return t.client.post(r,void 0,n?.signal)}async function Ve(t,e,n,r,i,o){let s=`/v1/inventory/${a(e)}/${a(n)}/progressions/${a(r)}/add`;return t.client.post(s,i,o?.signal)}async function He(t,e,n){let r=`/v1/inventory/transfers/${a(e)}/cancel`;return t.client.post(r,void 0,n?.signal)}async function We(t,e,n,r,i,o){let s=`/v1/inventory/${a(e)}/${a(n)}/progressions/${a(r)}/claim`;return t.client.post(s,i,o?.signal)}async function Je(t,e,n){return t.client.post("/v1/characters",e,n?.signal)}async function Ke(t,e,n,r,i){let o=`/v1/inventory/${a(e)}/${a(n)}/orders/batch`;return t.client.post(o,r,i?.signal,{...i?.ifMatch===void 0?{}:{ifMatch:i.ifMatch}})}async function ze(t,e,n,r,i){let o=`/v1/inventory/${a(e)}/${a(n)}/orders`;return t.client.post(o,r,i?.signal,{...i?.ifMatch===void 0?{}:{ifMatch:i.ifMatch}})}async function Ye(t,e,n,r,i){let o=`/v1/settings/${a(e)}/${a(n)}/${a(r)}`;return t.client.delete(o,i?.signal)}async function Xe(t,e,n,r,i){let o=`/v1/saves/${a(e)}/${a(n)}/${a(r)}`;return t.client.delete(o,i?.signal)}async function Qe(t,e,n,r){let i=`/v1/showcase/players/${a(e)}/${a(n)}`;return t.client.delete(i,r?.signal)}async function Ze(t,e,n,r,i){let o=`/v1/inventory/${a(e)}/${a(n)}/recipes/execute`;return t.client.post(o,r,i?.signal,{...i?.ifMatch===void 0?{}:{ifMatch:i.ifMatch}})}async function en(t,e,n,r,i,o){let s=`/v1/saves/${a(e)}/${a(n)}/${a(r)}/finalize`;return t.client.post(s,i,o?.signal)}async function nn(t,e,n){let r=`/v1/characters/${a(e)}`;return t.client.get(r,n?.signal)}async function tn(t,e,n,r,i){let o=`/v1/settings/${a(e)}/${a(n)}/${a(r)}`;return t.client.getWithEtag(o,{...i?.signal===void 0?{}:{signal:i.signal},...i?.ifNoneMatch===void 0?{}:{ifNoneMatch:i.ifNoneMatch}})}async function rn(t,e,n,r){let i=new URLSearchParams;r?.include_buckets!==void 0&&i.set("include_buckets",String(r?.include_buckets)),r?.include_custom_data!==void 0&&i.set("include_custom_data",String(r?.include_custom_data)),r?.currency_limit!==void 0&&i.set("currency_limit",String(r?.currency_limit)),r?.currency_cursor!==void 0&&i.set("currency_cursor",String(r?.currency_cursor)),r?.item_limit!==void 0&&i.set("item_limit",String(r?.item_limit)),r?.item_cursor!==void 0&&i.set("item_cursor",String(r?.item_cursor)),r?.progression_limit!==void 0&&i.set("progression_limit",String(r?.progression_limit)),r?.progression_cursor!==void 0&&i.set("progression_cursor",String(r?.progression_cursor));let o=i.toString(),s=`/v1/inventory/${a(e)}/${a(n)}`+(o?`?${o}`:"");return t.client.get(s,r?.signal)}async function on(t,e,n,r,i){let o=`/v1/inventory/${a(e)}/${a(n)}/items/${a(r)}`;return t.client.get(o,i?.signal)}async function sn(t,e,n,r,i){let o=new URLSearchParams;i?.bucket_1!==void 0&&o.set("bucket_1",String(i?.bucket_1)),i?.bucket_2!==void 0&&o.set("bucket_2",String(i?.bucket_2)),i?.limit!==void 0&&o.set("limit",String(i?.limit));let s=o.toString(),l=`/v1/leaderboards/${a(e)}/${a(n)}/${a(r)}`+(s?`?${s}`:"");return t.client.get(l,i?.signal)}async function an(t,e,n,r,i){let o=`/v1/inventory/${a(e)}/${a(n)}/orders/${a(r)}`;return t.client.get(o,i?.signal)}async function ln(t,e,n,r,i){let o=`/v1/inventory/${a(e)}/${a(n)}/progressions/${a(r)}`;return t.client.get(o,i?.signal)}async function dn(t,e,n,r,i,o){let s=`/v1/inventory/${a(e)}/${a(n)}/catalogs/${a(r)}/recipes/${a(i)}/availability`;return t.client.get(s,o?.signal)}async function un(t,e,n,r){let i=new URLSearchParams;i.set("limit",String(r?.limit));let o=i.toString(),s=`/v1/inventory/${a(e)}/${a(n)}/recipe-usage`+(o?`?${o}`:"");return t.client.get(s,r?.signal)}async function xe(t,e,n,r,i){let o=`/v1/saves/${a(e)}/${a(n)}/${a(r)}`;return t.client.getWithEtag(o,{...i?.signal===void 0?{}:{signal:i.signal},...i?.ifNoneMatch===void 0?{}:{ifNoneMatch:i.ifNoneMatch}})}async function cn(t,e,n){let r=new URLSearchParams;n?.bucket_1!==void 0&&r.set("bucket_1",String(n?.bucket_1)),n?.bucket_2!==void 0&&r.set("bucket_2",String(n?.bucket_2));let i=r.toString(),o=`/v1/leaderboards/${a(e)}/friends`+(i?`?${i}`:"");return t.client.get(o,n?.signal)}async function pn(t,e,n){let r=`/v1/showcase/friends/${a(e)}`;return t.client.get(r,n?.signal)}async function gn(t,e,n){let r=new URLSearchParams;n?.bucket_1!==void 0&&r.set("bucket_1",String(n?.bucket_1)),n?.bucket_2!==void 0&&r.set("bucket_2",String(n?.bucket_2));let i=r.toString(),o=`/v1/leaderboards/${a(e)}`+(i?`?${i}`:"");return t.client.get(o,n?.signal)}async function mn(t,e){let n=`/v1/games/${a(t.gameId())}/players/me/earn-allowance`;return t.client.get(n,e?.signal)}async function se(t,e){return t.client.get("/v1/inventory/players/me/platform-currencies",e?.signal)}async function yn(t,e,n){let r=`/v1/profiles/players/${a(e)}`;return t.client.get(r,n?.signal)}async function fn(t,e){let n=new URLSearchParams;e?.config_version!==void 0&&n.set("config_version",String(e?.config_version));let r=n.toString(),i="/v1/inventory/platform-funded-game-inventory-purchase-catalog"+(r?`?${r}`:"");return t.client.get(i,e?.signal)}async function hn(t,e,n,r){let i=`/v1/showcase/players/${a(e)}/${a(n)}`;return t.client.get(i,r?.signal)}async function _n(t,e){return t.client.get("/v1/characters/slots",e?.signal)}async function bn(t,e,n){let r=`/v1/inventory/transfers/${a(e)}`;return t.client.get(r,n?.signal)}async function Rn(t,e,n){let r=`/v1/games/${a(t.gameId())}/analytics/events`;return t.client.post(r,e,n?.signal,{...n?.keepalive===void 0?{}:{keepalive:n.keepalive},replaySafe:true})}async function wn(t,e,n){return t.client.post("/v1/inventory/transfers",e,n?.signal)}async function xn(t,e,n,r,i){let o=`/v1/inventory/${a(e)}/${a(n)}/platform-funded-game-inventory-purchases`;return t.client.post(o,r,i?.signal)}async function vn(t,e){let n=new URLSearchParams;e?.periods_back!==void 0&&n.set("periods_back",String(e?.periods_back)),e?.player_id!==void 0&&n.set("player_id",String(e?.player_id));let r=n.toString(),i="/v1/challenges"+(r?`?${r}`:"");return t.client.get(i,e?.signal)}async function kn(t,e){return t.client.get("/v1/characters",e?.signal)}async function Sn(t,e,n,r){let i=`/v1/settings/${a(e)}/${a(n)}`;return t.client.get(i,r?.signal)}async function An(t,e,n,r){let i=new URLSearchParams;r?.limit!==void 0&&i.set("limit",String(r?.limit)),r?.cursor!==void 0&&i.set("cursor",String(r?.cursor));let o=i.toString(),s=`/v1/inventory/${a(e)}/${a(n)}/orders`+(o?`?${o}`:"");return t.client.get(s,r?.signal)}async function Pn(t,e,n,r){let i=new URLSearchParams;r?.limit!==void 0&&i.set("limit",String(r?.limit)),r?.cursor!==void 0&&i.set("cursor",String(r?.cursor));let o=i.toString(),s=`/v1/saves/${a(e)}/${a(n)}`+(o?`?${o}`:"");return t.client.get(s,r?.signal)}async function On(t,e){let n=new URLSearchParams;e?.limit!==void 0&&n.set("limit",String(e?.limit)),e?.cursor!==void 0&&n.set("cursor",String(e?.cursor));let r=n.toString(),i="/v1/friends"+(r?`?${r}`:"");return t.client.get(i,e?.signal)}async function In(t,e){let n=new URLSearchParams;e.entity_type!==void 0&&n.set("entity_type",String(e.entity_type)),e.entity_id!==void 0&&n.set("entity_id",String(e.entity_id)),e?.direction!==void 0&&n.set("direction",String(e?.direction)),e?.status!==void 0&&n.set("status",String(e?.status)),e?.cursor!==void 0&&n.set("cursor",String(e?.cursor)),e?.limit!==void 0&&n.set("limit",String(e?.limit));let r=n.toString(),i="/v1/inventory/transfers"+(r?`?${r}`:"");return t.client.get(i,e?.signal)}async function Cn(t,e,n,r,i,o){let s=`/v1/inventory/${a(e)}/${a(n)}/progressions/${a(r)}/max`;return t.client.post(s,i,o?.signal)}async function En(t,e,n,r,i,o){let s=`/v1/settings/${a(e)}/${a(n)}/${a(r)}`;return t.client.put(s,i,o?.signal,{...o?.ifMatch===void 0?{}:{ifMatch:o.ifMatch}})}async function Tn(t,e,n,r,i){let o=`/v1/showcase/players/${a(e)}/${a(n)}`;return t.client.put(o,r,i?.signal)}async function Gn(t,e,n){let r=`/v1/inventory/transfers/${a(e)}/reject`;return t.client.post(r,void 0,n?.signal)}async function qn(t,e,n,r){let i=`/v1/characters/${a(e)}`;return t.client.patch(i,n,r?.signal)}async function Ln(t,e,n,r,i,o){let s=`/v1/saves/${a(e)}/${a(n)}/${a(r)}/upload-url`;return t.client.post(s,i,o?.signal,{replaySafe:true})}async function $n(t,e,n,r,i,o){let s=`/v1/inventory/${a(e)}/${a(n)}/progressions/${a(r)}/reset`;return t.client.post(s,i,o?.signal)}async function Fn(t,e,n){let r=`/v1/characters/${a(e)}`;return t.client.delete(r,n?.signal)}var vt="gem_";function Mn(t){return t.startsWith(vt)}var jn=1e4,Nn=50,At=500,Pt=65536-4*1024,Ot=24*1024;function Un(t){let e={},n={};for(let[r,i]of Object.entries(t))typeof i=="string"?e[r]=i:typeof i=="number"&&Number.isFinite(i)&&(n[r]=i);return {dimensions:e,measures:n}}var Bn=t=>typeof t=="number"?t:0,It=t=>typeof t=="string"?t:"";function ve(t=0){return {accepted:0,rejected:[],dropped:t,duplicate:false}}function Ct(t,e){let n=t??{},r=Array.isArray(n.rejected)?n.rejected.map(i=>{let o=i??{};return {index:Bn(o.index),code:It(o.code)}}):[];return {accepted:Bn(n.accepted),rejected:r,dropped:e,duplicate:n.duplicate===true}}function ke(){let t=globalThis.crypto;return typeof t?.randomUUID=="function"?t.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let n=Math.floor(Math.random()*16);return (e==="x"?n:n&3|8).toString(16)})}function Et(t){return t?.retryable===true}var M=class{#e;#t;#l;#y;#n=[];#f={};#o=0;#s=null;#h=false;#_=false;#b=false;#r=false;#R=null;#a=null;#d=false;#i=false;#p=false;#w=false;#x=false;constructor(e){this.#e=e,this.#t=e.options?.enabled!==false,this.#l=Math.max(jn,e.options?.flushIntervalMs??jn),this.#y=Math.max(1,Math.floor(e.options?.maxQueue??At));}track(e,n={}){if(!(!this.#t||this.#r)){if(Mn(e)){this.#x||(this.#x=true,this.#m(`[gem] analytics: '${e}' was not recorded \u2014 the gem_ prefix is reserved for the platform's own events, which the SDK emits for you. Name your event something else.`));return}this.#v(e,Un({...this.#f,...n}));}}setContext(e){this.#f={...this.#f,...e};}get environment(){let e=this.#e.environment;return {...typeof e=="function"?e():e??{}}}async flush(e={}){if(this.#i)return ve();let n=this.#O();if(n===null||n==="")return this.#n.length>0&&!this.#w&&(this.#w=true,this.#m("[gem] analytics: events are being recorded but no play session has been established, so nothing is being sent. Outside the arcade this is expected.")),ve();if(this.#k(),this.#n.length===0)return ve();let r=e.keepalive===true;this.#c();let i=this.#n.splice(0,this.#A(r)),o=this.#o;this.#o=0;let s=Math.round(this.#e.clock.now()),l={batch_id:ke(),sent_at_ms:s,events:i.map(c=>Dn(c,s))},d={client:this.#e.client(),gameId:()=>n};this.#b=true;try{let c=await Rn(d,l,{...e.signal===void 0?{}:{signal:e.signal},...r?{keepalive:!0}:{}}),g=Ct(c,o);return this.#P(g),g}catch(c){throw Et(c)?this.#S(i,o):this.#m(`[gem] analytics: ${i.length} event(s) were discarded \u2014 the platform refused the batch and will refuse it again: ${String(c)}`),c}finally{this.#b=false,this.#n.length>0&&this.#u();}}trackPlatform(e,n={}){this.#r||this.#i&&(e==="gem_pause"||e==="gem_resume")||this.#v(e,Un(n));}hold(){this.#r||this.#a!==null||(this.#i=true,this.#c());}release(){if(!this.#i||this.#r)return;this.#i=false;let e=this.#e.clock.now(),n=this.#n.map(r=>({...r,atMs:e}));this.#n=n,this.#p&&(this.#p=false,this.#a=e,this.#d=false,this.#n.unshift({uid:ke(),name:"gem_session_start",atMs:e,dimensions:{},measures:{}})),this.#n.length>=Nn?this.#g():this.#n.length>0&&this.#u();}get held(){return this.#i}startSession(){if(!(this.#r||this.#a!==null)){if(this.#i){this.#p=true;return}this.#a=this.#e.clock.now(),this.#d=false,this.trackPlatform("gem_session_start");}}endSession(e){if(this.#r||this.#d)return;if(this.#d=true,this.#i){this.#p=false,this.#n=[],this.#o=0;return}let n=this.#a;this.trackPlatform("gem_session_end",{reason:e,...n===null?{}:{duration_ms:Math.max(0,Math.round(this.#e.clock.now()-n))}}),this.#g({keepalive:true});}setPaused(e){this.#r||e===this.#h||(this.#h=e,this.trackPlatform(e?"gem_pause":"gem_resume"),e?this.#c():this.#n.length>0&&this.#u());}setHidden(e){this.#r||e===this.#_||(this.#_=e,e?this.#c():this.#n.length>0&&this.#u());}dispose(){this.#r=true,this.#c(),this.#n=[],this.#o=0;}get pending(){return this.#n.length}#v(e,n){let{dimensions:r,measures:i}=n;for(this.#k();this.#n.length>=this.#y;)this.#n.shift(),this.#o+=1;this.#n.push({uid:ke(),name:e,atMs:this.#e.clock.now(),dimensions:r,measures:i}),this.#n.length>=Nn?this.#g():this.#u();}#g(e={}){this.flush(e).catch(()=>{});}#S(e,n){for(this.#n=[...e,...this.#n],this.#o+=n;this.#n.length>this.#y;)this.#n.shift(),this.#o+=1;}#A(e){let n=e?Ot:Pt,r=Math.min(this.#n.length,100),i=128;for(let o=0;o<r;o+=1){let s=this.#n[o];if(s===void 0)break;if(i+=JSON.stringify(Dn(s,0)).length+1,i>n)return Math.max(1,o)}return r}#u(){this.#s!==null||this.#h||this.#_||this.#i||this.#r||this.#b||(this.#s=this.#e.clock.setTimeout(()=>{this.#s=null,this.#g();},this.#l));}#c(){this.#s!==null&&(this.#e.clock.clearTimeout(this.#s),this.#s=null);}#k(){let e=this.#I();e===null||e===""||(this.#R!==null&&this.#R!==e&&(this.#n=[],this.#o=0,this.#a=null,this.#d=false),this.#R=e);}#P(e){for(let n of e.rejected)this.#m(`[gem] analytics: an event was refused (${n.code}). `+Tt(n.code));}#m(e){let n=this.#e.log;n!==null&&(n===void 0?console.warn(e):n(e));}#O(){try{return this.#e.gameId()}catch{return null}}#I(){try{return this.#e.playerId()}catch{return null}}};function Dn(t,e){return {event_uid:t.uid,name:t.name,offset_ms:Math.round(t.atMs)-e,dimensions:t.dimensions,measures:t.measures}}function Tt(t){switch(t){case "analytics_not_declared":return "This channel has no analytics_events section at all \u2014 promote a game config that declares one. The gem_* events in the same batch were still recorded.";case "unknown_event":return "This channel declares a set of events and this name is not in it \u2014 check the spelling, or declare it in analytics_events.";case "unknown_dimension":return "A string property on this event is not declared as one of its dimensions.";case "missing_dimension":return "A dimension this event declares was not supplied.";case "dimension_value_not_declared":return "A dimension value is outside the closed set the config declares for it.";case "unknown_measure":return "A numeric property on this event is not declared as one of its measures.";case "measure_wrong_type":return "A measure was the wrong shape \u2014 an int measure refuses a fractional value.";case "source_not_permitted":return "This event is declared for the server only, so a client may not emit it.";default:return "See the analytics_events section of your game config."}}function Gt(t,e){return e!==void 0?!e:t==="chain_exhausted"}var ae=class{constructor(e){this.options=e;}options;grant=null;state="pending";failure=null;generation=0;inFlight=null;rejected=false;get currentState(){return this.state}get lastFailure(){return this.failure}async get(){if(this.state==="lost")throw new R(this.failure??"unavailable","the session cannot be renewed");let e=this.seconds();if(this.grant&&e<this.grant.expiresAt-this.renewBefore())return this.grant.token;if(this.grant&&e>=this.grant.chainEndsAt)throw this.enter("lost","chain_exhausted"),new R("chain_exhausted","the token chain reached its ceiling");return this.refresh(this.nextReason())}nextReason(){return this.rejected?"rejected":this.grant?"expiring":"initial"}invalidate(e){e!==void 0&&this.grant!==null&&this.grant.token!==e||this.rejected&&this.grant===null||(this.grant=null,this.generation+=1,this.inFlight=null,this.rejected=true,this.state!=="lost"&&this.enter("pending"));}accept(e){this.state!=="lost"&&(this.grant=e,this.rejected=false,this.enter("ready"));}close(e="unavailable"){this.grant=null,this.generation+=1,this.inFlight=null,this.enter("lost",e);}refresh(e){if(this.inFlight)return this.inFlight;let n=this.generation;this.enter("pending");let r=this.options.request(e).then(i=>{if(n!==this.generation)throw new R("internal","token arrived for a superseded generation");return this.grant=i,this.rejected=false,this.enter("ready"),i.token}).catch(i=>{let o=qt(i),s=i?.retryable;throw n===this.generation&&this.enter(Gt(o,typeof s=="boolean"?s:void 0)?"lost":"degraded",o),i instanceof R?i:new R(o,String(i))}).finally(()=>{this.inFlight===r&&(this.inFlight=null);});return this.inFlight=r,r}enter(e,n){this.failure=n??(e==="ready"?null:this.failure),this.state!==e&&(this.state=e,this.options.onStateChange?.(e,n));}renewBefore(){return this.options.renewBeforeSeconds??60}seconds(){return Math.floor(this.options.clock.now()/1e3)}},R=class t extends Error{constructor(n,r){super(`auth ${n}: ${r}`);this.reason=n;this.name="AuthError";}reason;static isAuthError(n){if(n instanceof t)return true;let r=n;return r?.name==="AuthError"&&typeof r.reason=="string"}};function qt(t){if(t instanceof R)return t.reason;let e=t?.reason;return typeof e=="string"&&["chain_exhausted","unavailable","timeout","internal"].includes(e)?e:"internal"}var h=class t extends Error{retryable=false;constructor(e){super(e),this.name="TransportRefusal";}static isRefusal(e){if(e instanceof t)return true;let n=e;return n?.name==="TransportRefusal"&&n.retryable===false}},C=["if-match","if-none-match"],Vn=4096;function Lt(t){if(!t)return;let e={};for(let[n,r]of Object.entries(t)){let i=n.toLowerCase();if(!C.includes(i)||r===void 0)continue;let o=typeof r=="string"?$t(r):r;if(typeof o!="string"||o.length>Vn||!Ft(o))throw new h(`the ${i} header value cannot be sent \u2014 it is not a string, is longer than ${Vn} 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.`);o!==""&&(e[i]=o);}return Object.freeze(e)}function $t(t){let e=i=>i===32||i===9||i===10||i===13,n=0,r=t.length;for(;n<r&&e(t.charCodeAt(n));)n++;for(;r>n&&e(t.charCodeAt(r-1));)r--;return t.slice(n,r)}function Ft(t){for(let e=0;e<t.length;e++){let n=t.charCodeAt(e);if(n!==9&&(n<32||n===127||n>255))return false}return true}function Mt(t){let{bytes:e}=t;if(e!==void 0){if(Object.prototype.toString.call(e)!=="[object Uint8Array]")throw new h("the raw body is not a Uint8Array, so it cannot be sent as bytes. This is a malformed request, not a server failure.");if(t.body!==void 0)throw new h("the request carries both a JSON body and a raw body, and only one can be sent. This is a malformed request, not a server failure.");return new Uint8Array(e)}}function Hn(t,e){let n=e.replayUnauthorizedOnce??true;return {async request(r){let i={...r},o=Lt(i.headers),s=Mt(i),l=Object.freeze({...i,headers:o,...s===void 0?{}:{bytes:s}}),d=await e.tokenSource.get(),c=await t(l,d);if(c.status!==401||!n)return c;e.tokenSource.invalidate(d);let g=await e.tokenSource.get(),p=await t(l,g);if(p.status===401)throw e.tokenSource.close("unavailable"),new R("unavailable","the server refused a freshly minted token");return p}}}function le(t){let e=typeof t=="string"?new TextEncoder().encode(t):t;return btoa(jt(e))}function Wn(t){let e=atob(t),n=new Uint8Array(e.length);for(let r=0;r<e.length;r+=1)n[r]=e.charCodeAt(r);return n}function Se(t){return new TextDecoder().decode(Wn(t))}function jt(t){let n="";for(let r=0;r<t.length;r+=32768)n+=String.fromCharCode(...t.subarray(r,r+32768));return n}var f=class extends Error{constructor(n,r,i,o,s){super(`${n} (${r}): ${i}`);this.reason=n;this.status=r;this.detail=i;this.retryAfterSeconds=o;this.code=s;this.name="GemApiError";}reason;status;detail;retryAfterSeconds;code;get retryable(){return this.reason==="unavailable"||this.reason==="rate_limited"}},Nt=new WeakMap;var Ut=new Set([408,429,500,502,503,504]),Bt=6e4;function Dt(t){if(t===void 0)return 2;if(!Number.isInteger(t)||t<0||t>10)throw new h(`maxRetries must be a whole number between 0 and 10; received ${JSON.stringify(t)}. This is a configuration fault, not a server failure.`);return t}var N=class{constructor(e){this.options=e;}options;async get(e,n){return this.send({method:"GET",path:e,signal:n},true)}async getWithEtag(e,n={}){let r=await this.sendRaw({method:"GET",path:e,...n.signal===void 0?{}:{signal:n.signal},...n.ifNoneMatch===void 0?{}:{headers:{"if-none-match":n.ifNoneMatch}}},true),i=r.etag===void 0?{}:{etag:r.etag};return r.status===304?{modified:false,...i}:{modified:true,body:r.body,...i}}async put(e,n,r,i={}){return this.send({method:"PUT",path:e,body:n,signal:r,...j(i)},i.replaySafe===true)}async post(e,n,r,i={}){return this.send({method:"POST",path:e,body:n,signal:r,...j(i)},i.replaySafe===true)}async postBytes(e,n,r,i={}){let o=await this.sendRaw({method:"POST",path:e,bytes:n,responseType:"bytes",signal:r,...j(i)},i.replaySafe===true);return {bytes:Vt(o.body),...o.invocationId===void 0?{}:{invocationId:o.invocationId}}}async patch(e,n,r,i={}){return this.send({method:"PATCH",path:e,body:n,signal:r,...j(i)},i.replaySafe===true)}async delete(e,n,r={}){return this.send({method:"DELETE",path:e,signal:n,...j(r)},r.replaySafe===true)}async send(e,n){return (await this.sendRaw(e,n)).body}async sendRaw(e,n){let r=n?Dt(this.options.maxRetries)+1:1,i=null;if(e.signal?.aborted)throw Jn(e.signal);for(let o=0;o<r;o++){if(o>0&&await this.backoff(o,i,e.signal),e.signal?.aborted)throw Jn(e.signal);let s;try{s=await this.options.transport.request(e);}catch(d){if(R.isAuthError(d)||h.isRefusal(d)||e.signal?.aborted||Ht(d))throw d;i=new f("unavailable",0,String(d));continue}if(s.status>=200&&s.status<300||s.status===304)return s;let l=Wt(s);if(!Ut.has(s.status))throw l;i=l;}throw i??new f("unavailable",0,"no attempt was made")}backoff(e,n,r){if(r?.aborted)return Promise.resolve();let i=n?.retryAfterSeconds,o=i!==void 0?i*1e3:2**(e-1)*250,s=2**(e-1)*250,l=Math.min(Math.max(o,s),Bt);return new Promise(d=>{let c=this.options.clock,g=false,p=false,b,m=()=>{g||(g=true,p&&c.clearTimeout(b),r?.removeEventListener("abort",m),d());};r?.addEventListener("abort",m,{once:true}),b=c.setTimeout(m,l),p=true,g&&c.clearTimeout(b);})}};function Vt(t){if(t instanceof Uint8Array)return t;if(t==null)return new Uint8Array(0);let e=typeof t=="string"?t:JSON.stringify(t);return new TextEncoder().encode(e)}function j(t){return {...t.keepalive===void 0?{}:{keepalive:t.keepalive},...t.ifMatch===void 0?{}:{headers:{"if-match":t.ifMatch}}}}function Jn(t){return t.reason!==void 0?t.reason:new DOMException("The operation was aborted.","AbortError")}function Ht(t){let e=t?.name;return e==="AbortError"||e==="TimeoutError"}function Wt(t){let e=Kt(t),n=Yt(t.body),r={...n===void 0?{}:{details:n},...t.invocationId===void 0?{}:{invocationId:t.invocationId}};return Object.keys(r).length>0&&Nt.set(e,r),e}var Jt=new Map([["insufficient_funds","insufficient_funds"]]);function Kt(t){let{status:e,body:n}=t,r=zt(n),i=t.retryAfterSeconds??Qt(n),o=Xt(n),s=o===void 0?void 0:Jt.get(o);if(s!==void 0)return new f(s,e,r,void 0,o);switch(e){case 304:return new f("not_modified",e,r);case 400:case 422:return new f("invalid",e,r,void 0,o);case 403:return new f("forbidden",e,r,void 0,o);case 404:return new f("not_found",e,r,void 0,o);case 402:return new f("insufficient_funds",e,r,void 0,o);case 409:return new f("conflict",e,r,void 0,o);case 412:return new f("precondition_failed",e,r,void 0,o);case 413:return new f("too_large",e,r,void 0,o);case 429:return new f("rate_limited",e,r,i,o);default:return new f("unavailable",e,r,i,o)}}function zt(t){if(typeof t=="string")return t;let e=t?.message;if(typeof e=="string")return e;let n=t?.error;if(typeof n=="string")return n;let r=n?.message;return typeof r=="string"?r:"no detail"}function Yt(t){let n=t?.error?.details;return n===null?void 0:n}function Xt(t){let n=t?.error?.code;return typeof n=="string"&&n.length>0?n:void 0}function Qt(t){let e=t?.retryAfterSeconds;return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function Zt(t){let e=t.lastIndexOf("@");return (e===-1?t:`***@${t.slice(e+1)}`).slice(0,200)}var er=new Set(C);function nr(t){if(!t)return {};let e={};for(let[n,r]of Object.entries(t))er.has(n.toLowerCase())&&(e[n.toLowerCase()]=r);return e}function Kn(t){let e=t.fetch??globalThis.fetch.bind(globalThis);return Hn(async(n,r)=>{let i;try{i=new URL(t.baseUrl.replace(/\/+$/,""));}catch{throw new h("the configured baseUrl is not a valid URL. Its value is withheld here rather than written to logs. This is a configuration fault, not a server failure.")}let o;try{o=new URL(i.href.replace(/\/+$/,"")+n.path);}catch{throw new h(`${JSON.stringify(typeof n.path=="string"?Zt(n.path):"(a non-string path)")} does not form a valid URL against ${i.protocol}//${i.host}. This is a malformed request, not a server failure.`)}if(o.protocol!==i.protocol||o.host!==i.host)throw new h(`${JSON.stringify(o.pathname)} resolves to ${o.protocol}//${o.host}, not ${i.protocol}//${i.host}. A request path may not change the request's origin \u2014 it carries the play token.`);if(o.username!==""||o.password!==""){let m=i.username!==""||i.password!=="",S=o.username!==i.username||o.password!==i.password,we=m?S?"baseUrl (and possibly the request path)":"baseUrl":"request path";throw new h(`the ${we} puts credentials in the URL, which cannot be fetched (${n.method} ${o.pathname}). The value is withheld here rather than written to logs. This is a malformed request, not a server failure.`)}for(let[m,S]of Object.entries(t.defaultQuery??{}))o.searchParams.has(m)||o.searchParams.set(m,S);let s=n.bytes,l=n.bytes===void 0?void 0:"application/octet-stream";try{n.body!==void 0&&(s=JSON.stringify(n.body),l="application/json");}catch(m){throw new h(`the body of ${n.method} ${JSON.stringify(o.pathname)} could not be serialised to JSON: ${String(m)}. This is a bug in the request, not a server failure \u2014 retrying sends the same unserialisable value.`)}let d=await e(o.toString(),{method:n.method,headers:{authorization:`Bearer ${r}`,...l===void 0?{}:{"content-type":l},...nr(n.headers)},body:s,signal:n.signal,...n.keepalive===void 0?{}:{keepalive:n.keepalive},credentials:"omit",mode:"cors",redirect:"error",cache:"no-store",referrerPolicy:"no-referrer"}),c=null;if(n.responseType==="bytes"&&d.status>=200&&d.status<300)c=new Uint8Array(await d.arrayBuffer());else {let m=await d.text();if(m.length>0)try{c=JSON.parse(m);}catch{c=m;}}let g=d.headers.get("etag"),p=tr(d.headers.get("retry-after")),b=d.headers.get("x-gem-invocation-id");return {status:d.status,body:c,...g===null?{}:{etag:g},...p===void 0?{}:{retryAfterSeconds:p},...b===null||b===""?{}:{invocationId:b}}},t)}function tr(t){if(t===null)return;let e=t.trim();if(!/^\d+$/.test(e))return;let n=Number(e);return Number.isFinite(n)?n:void 0}var Yn=400,x=t=>typeof t=="string"?t:"",rr=/(?:Z|[+-]\d{2}:?\d{2})$/i;function zn(t){let e=x(t);if(!rr.test(e))return 0;let n=Date.parse(e);return Number.isFinite(n)?Math.floor(n/1e3):0}var ir=/^[0-9a-f]{1,64}$/,or=/^[0-9a-f]{16}$/,sr=/^[A-Za-z][A-Za-z0-9_+\-/]{0,63}$/,ar=/^(?:[01]\d|2[0-3]):[0-5]\d$/;function lr(t){let e=x(t),n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!n)return;let[r,i,o]=[Number(n[1]),Number(n[2]),Number(n[3])],s=new Date(Date.UTC(r,i-1,o));return s.getUTCFullYear()===r&&s.getUTCMonth()===i-1&&s.getUTCDate()===o?e:void 0}var dr=4096,ur=new TextEncoder;function cr(t){let e=x(t.challenge_data),n=x(t.challenge_data_hash);return e===""||!or.test(n)?{}:ur.encode(e).length>dr?{}:{data:e,dataHash:n}}function pr(t){let e=t??{},n=zn(e.period_start_at),r=zn(e.period_ends_at);if(n===0||r===0)return;let i=x(e.slug),o=x(e.seed),s=lr(e.period_local_date),l=x(e.boundary),d=x(e.reset_time);return {id:x(e.progression_definition_id),...i===""?{}:{slug:i},window:x(e.window),periodStartAt:n,periodEndsAt:r,...s===void 0?{}:{periodLocalDate:s},boundary:sr.test(l)?l:"",resetTime:ar.test(d)?d:"",seed:ir.test(o)?o:"",...cr(e)}}function Xn(t){if(t!==void 0&&(!Number.isInteger(t)||t<0||t>400))throw new TypeError(`periodsBack must be an integer between 0 and 400, got ${String(t)}`)}function Qn(t){let e=t??{};return Array.isArray(e.challenges)?e.challenges.map(pr).filter(n=>n!==void 0):[]}var U=class{#e;constructor(e){this.#e=e;}async list(e={}){let{periodsBack:n}=e;Xn(n);let r=await vn(this.#e,{...n===void 0?{}:{periods_back:n},...e.signal===void 0?{}:{signal:e.signal}});return Qn(r)}};var gr="gem-web-bridge";var E=65536,Zn=8,de=5e3,et=1024;function Pe(t){return Object.freeze(Object.assign(Object.create(null),t))}Pe({"gem.handshake":30,"gem.handshake.accept":5,"gem.token":30,"gem.token.denied":30,"gem.player":12,"gem.pause":120,"gem.prefs":60,"gem.cohorts":12,"gem.earnAllowanceChanged":30,"gem.viewport":60,"gem.deviceSettings":12,"gem.willTerminate":10,"gem.roomEvent":120,"gem.socketState":12,"gem.seatedEvent":60,"gem.autoStartFailedEvent":30,"gem.signalEvent":1800,"gem.dedicatedEvent":120,"gem.partyResult":30,"gem.clusterTarget":12,"gem.devtools":30,"gem.screenshot":6,"gem.screenshot.denied":12,"gem.requestContext":12,"gem.gameContext":12,"gem.signal":1200,"gem.dedicatedOffer":60,"gem.partyRequest":12,"gem.ready":5,"gem.engaged":5,"gem.progress":600,"gem.requestToken":12,"gem.requestLocalServer":6,"gem.localServer":30,"gem.localServer.denied":30,"gem.exit":5,"gem.openExternal":6,"gem.requestFullscreen":30,"gem.audioState":120,"gem.rewardCue":60,"gem.walletDisplay":60,"gem.requestShare":6,"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,"gem.requestFriendChallenge":12,"gem.friendChallengeResult":30,__malformed:60});Pe({"gem.requestAd":"ads","gem.adResult":"ads","gem.requestSignIn":"signIn","gem.signInResult":"signIn","gem.requestPurchase":"purchases","gem.purchaseResult":"purchases","gem.requestFriendChallenge":"friendChallenges","gem.friendChallengeResult":"friendChallenges","gem.devtools":"devtools","gem.screenshot":"screenshot","gem.screenshot.denied":"screenshot","gem.requestContext":"feedbackContext","gem.gameContext":"feedbackContext","gem.roomEvent":"rooms","gem.signal":"p2p","gem.signalEvent":"p2p","gem.dedicatedOffer":"dedicated","gem.dedicatedEvent":"dedicated","gem.clusterTarget":"clusterTarget","gem.partyRequest":"parties","gem.partyResult":"parties","gem.autoStartFailedEvent":"autoStartFailure","gem.seatedEvent":"partySeating","gem.socketState":"socketState","gem.audioState":"audioState","gem.rewardCue":"rewardCue","gem.frameStats":"frameStats","gem.engaged":"engagement","gem.viewport":"viewport","gem.walletDisplay":"walletDisplay","gem.requestLocalServer":"localHost","gem.localServer":"localHost","gem.localServer.denied":"localHost","gem.cohorts":"cohorts","gem.earnAllowanceChanged":"earnAllowance","gem.deviceSettings":"deviceSettings","gem.deviceSettings.put":"deviceSettings","gem.deviceSettings.result":"deviceSettings","gem.requestShare":"share"});function yr(t){let e=/^([a-z][a-z0-9+.-]*):\/\/([a-z0-9.-]+|\[[0-9a-f:.]+\])(:([0-9]{1,5}))?$/i.exec(t);return e===null?false:e[4]===void 0||Number(e[4])<=65535}function fr(t){let e;try{e=new URL(t);}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 hr(t){return /^[a-z]{2,8}(-[a-z0-9]{1,8})*$/i.test(t)}function _r(t){return /^[a-z_]+$/.test(t)}function Ae(t,e,n){if(e>Zn)return `nesting deeper than ${Zn}`;if(++n.nodes>de)return `more than ${de} values`;if(n.bytes>E)return `over the ${E} byte limit`;if(t==null)return n.bytes+=4,null;let r=typeof t;if(r==="boolean")return n.bytes+=5,null;if(r==="number")return n.bytes+=8,null;if(r==="string")return n.bytes+=t.length*3+2,null;if(r!=="object")return `${r} is not plain data`;let i=t;if(n.seen.has(i))return "a repeated or cyclic object reference";if(n.seen.add(i),Array.isArray(t)){if(t.length>et)return `an array of ${t.length} entries, over the ${et} limit`;n.bytes+=2;for(let l of t){let d=Ae(l,e+1,n);if(d)return d}return null}let o=Object.getPrototypeOf(t);if(o!==Object.prototype&&o!==null)return "a value that is not a plain object";n.bytes+=2;let s=t;for(let l in s){if(!Object.prototype.hasOwnProperty.call(s,l))continue;if(++n.nodes>de)return `more than ${de} values`;if(n.bytes+=l.length*3+4,n.bytes>E)return `over the ${E} byte limit`;let d=Ae(s[l],e+1,n);if(d)return d}return null}function br(t){let e={nodes:0,bytes:0,seen:new Set},n=Ae(t,0,e);return n?`message contains ${n}`:e.bytes>E?`message is over the ${E} byte limit`:null}var Rr={origin:[yr,"not a well-formed origin"],url:[fr,"not a safe absolute http(s) URL"],bcp47:[hr,"not a well-formed BCP 47 tag"],code:[_r,"not a code of lower-case letters and underscores"]};function nt(t,e,n){for(let r of e){let i=n===""?r.n:`${n}.${r.n}`,o=t[r.n];if(o==null){if(r.o)continue;return `${i}: required`}let s=tt(o,r,i);if(s)return s}return null}function tt(t,e,n){switch(e.k){case "string":{if(typeof t!="string")return `${n}: expected string`;if(t.length>e.max)return `${n}: exceeds ${e.max} characters`;if(e.f){let[r,i]=Rr[e.f];if(!r(t))return `${n}: ${i}`}return null}case "int":return typeof t!="number"||!Number.isInteger(t)?`${n}: expected integer`:t<e.lo||t>e.hi?`${n}: out of range ${e.lo}..${e.hi}`:null;case "boolean":return typeof t=="boolean"?null:`${n}: expected boolean`;case "enum":{let r=e.v;return r.includes(t)?null:`${n}: not one of ${r.join("|")}`}case "object":return typeof t!="object"||t===null||Array.isArray(t)?`${n}: expected object`:nt(t,e.fs,n);case "json":return typeof t!="object"||t===null||Array.isArray(t)?`${n}: expected a plain object`:null;case "array":{if(!Array.isArray(t))return `${n}: expected array`;if(t.length>e.max)return `${n}: exceeds ${e.max} items`;let r=e.it,i=`${n}[]`;for(let o of t){if(o==null){if(r.o)continue;return `${i}: required`}let s=tt(o,r,i);if(s)return s}return null}default:{let r=e.k;return `${n}: unknown kind ${String(r)}`}}}function u(t,e){return n=>{let r=br(n);if(r)return r;if(typeof n!="object"||n===null||Array.isArray(n))return "message: expected object";let i=n;return i.gem!==gr?"gem: wrong protocol marker":i.type!==t?`type: expected ${t}`:nt(i,e,"")}}var wr=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"},{n:"unbidden",k:"boolean",o:1}]),xr=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}}]),vr=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}]),kr=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}]),Sr=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}]}]),Ar=u("gem.pause",[{n:"paused",k:"boolean"}]),Pr=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"}]),Or=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}]}}]),Ir=u("gem.earnAllowanceChanged",[]),Cr=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}]},{n:"reserved",k:"array",o:1,max:4,it:{n:"",k:"object",fs:[{n:"x",k:"int",lo:0,hi:16384},{n:"y",k:"int",lo:0,hi:16384},{n:"width",k:"int",lo:0,hi:16384},{n:"height",k:"int",lo:0,hi:16384}]}}]),Er=u("gem.deviceSettings",[{n:"settings",k:"json",o:1}]),Tr=u("gem.willTerminate",[{n:"reason",k:"enum",v:["grant_expiring","session_ended","navigating","kill_switch"]},{n:"graceMs",k:"int",lo:0,hi:6e4}]),Gr=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"]}]),qr=u("gem.socketState",[{n:"connected",k:"boolean"},{n:"reason",k:"enum",o:1,v:["connecting","dropped","watchdog","terminal"]}]),Lr=u("gem.seatedEvent",[{n:"roomId",k:"string",max:64}]),$r=u("gem.autoStartFailedEvent",[{n:"roomId",k:"string",max:64},{n:"code",k:"string",max:64}]),Fr=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"}]),Mr=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}]),jr=u("gem.partyResult",[{n:"requestId",k:"string",max:64},{n:"partyId",k:"string",o:1,max:64}]),Nr=u("gem.clusterTarget",[{n:"clusterTargetId",k:"string",max:64},{n:"clusterTargetIds",k:"array",o:1,max:3,it:{n:"",k:"string",max:64}}]),Ur=u("gem.devtools",[{n:"action",k:"enum",v:["open","close","toggle"]}]),Br=u("gem.screenshot",[{n:"maxWidth",k:"int",lo:1,hi:7680},{n:"maxHeight",k:"int",lo:1,hi:4320}]),Dr=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"}]),Vr=u("gem.requestContext",[]),Hr=u("gem.gameContext",[{n:"context",k:"json"}]),Wr=u("gem.signal",[{n:"signal",k:"enum",v:["join","offer","answer","ice","migrationAck","hostUnreachable"]},{n:"matchId",k:"string",max:64},{n:"data",k:"json"}]),Jr=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"]}]),Kr=u("gem.partyRequest",[{n:"requestId",k:"string",max:64}]),zr=u("gem.ready",[]),Yr=u("gem.engaged",[]),Xr=u("gem.progress",[{n:"loaded",k:"int",lo:0,hi:1099511627776},{n:"total",k:"int",lo:0,hi:1099511627776}]),Qr=u("gem.requestToken",[{n:"requestId",k:"string",max:64},{n:"reason",k:"enum",v:["initial","expiring","rejected"]}]),Zr=u("gem.requestLocalServer",[{n:"requestId",k:"string",max:64},{n:"gameRoomId",k:"string",max:64}]),ei=u("gem.localServer",[{n:"requestId",k:"string",max:64},{n:"serverId",k:"string",o:1,max:128}]),ni=u("gem.localServer.denied",[{n:"requestId",k:"string",max:64},{n:"retryable",k:"boolean"},{n:"reason",k:"enum",v:["refused","unavailable"]}]),ti=u("gem.exit",[{n:"reason",k:"string",o:1,max:64}]),ri=u("gem.openExternal",[{n:"url",k:"string",max:2048,f:"url"}]),ii=u("gem.requestFullscreen",[{n:"enabled",k:"boolean"}]),oi=u("gem.audioState",[{n:"muted",k:"boolean"}]),si=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}]}]),ai=u("gem.walletDisplay",[{n:"visible",k:"boolean"},{n:"currencies",k:"array",o:1,max:8,it:{n:"",k:"string",max:64}},{n:"score",k:"boolean",o:1}]),li=u("gem.requestShare",[{n:"params",k:"array",max:16,it:{n:"",k:"object",fs:[{n:"key",k:"string",max:64},{n:"value",k:"string",max:512}]}}]),di=u("gem.frameStats",[{n:"fps",k:"int",lo:0,hi:1e3},{n:"frameTimeP95Ms",k:"int",lo:0,hi:1e5}]),ui=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}]),ci=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}]),pi=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}]),gi=u("gem.deviceSettings.put",[{n:"requestId",k:"string",max:64},{n:"settings",k:"json"}]),mi=u("gem.deviceSettings.result",[{n:"requestId",k:"string",max:64},{n:"outcome",k:"enum",v:["stored","too_large","unavailable"]}]),yi=u("gem.requestAd",[{n:"requestId",k:"string",max:64},{n:"placement",k:"string",max:32},{n:"format",k:"enum",v:["interstitial","rewarded"]}]),fi=u("gem.adResult",[{n:"requestId",k:"string",max:64},{n:"outcome",k:"enum",v:["shown","no_ad","unavailable"]}]),hi=u("gem.requestSignIn",[{n:"requestId",k:"string",max:64}]),_i=u("gem.signInResult",[{n:"requestId",k:"string",max:64},{n:"outcome",k:"enum",v:["signed_in","declined","unavailable"]}]),bi=u("gem.requestFriendChallenge",[{n:"requestId",k:"string",max:64},{n:"playerId",k:"string",max:64},{n:"template",k:"string",max:64},{n:"params",k:"json",o:1}]),Ri=u("gem.friendChallengeResult",[{n:"requestId",k:"string",max:64},{n:"outcome",k:"enum",v:["accepted","cancelled","refused","unavailable","rate_limited","invalid"]},{n:"code",k:"string",o:1,max:64},{n:"param",k:"string",o:1,max:64},{n:"channel",k:"string",o:1,max:16},{n:"configVersion",k:"int",o:1,lo:0,hi:9007199254740991},{n:"retryAfterMs",k:"int",o:1,lo:0,hi:864e5},{n:"detail",k:"string",o:1,max:300}]);Pe({"gem.handshake":wr,"gem.handshake.accept":xr,"gem.token":vr,"gem.token.denied":kr,"gem.player":Sr,"gem.pause":Ar,"gem.prefs":Pr,"gem.cohorts":Or,"gem.earnAllowanceChanged":Ir,"gem.viewport":Cr,"gem.deviceSettings":Er,"gem.willTerminate":Tr,"gem.roomEvent":Gr,"gem.socketState":qr,"gem.seatedEvent":Lr,"gem.autoStartFailedEvent":$r,"gem.signalEvent":Fr,"gem.dedicatedEvent":Mr,"gem.partyResult":jr,"gem.clusterTarget":Nr,"gem.devtools":Ur,"gem.screenshot":Br,"gem.screenshot.denied":Dr,"gem.requestContext":Vr,"gem.gameContext":Hr,"gem.signal":Wr,"gem.dedicatedOffer":Jr,"gem.partyRequest":Kr,"gem.ready":zr,"gem.engaged":Yr,"gem.progress":Xr,"gem.requestToken":Qr,"gem.requestLocalServer":Zr,"gem.localServer":ei,"gem.localServer.denied":ni,"gem.exit":ti,"gem.openExternal":ri,"gem.requestFullscreen":ii,"gem.audioState":oi,"gem.rewardCue":si,"gem.walletDisplay":ai,"gem.requestShare":li,"gem.frameStats":di,"gem.error":ui,"gem.requestPurchase":ci,"gem.purchaseResult":pi,"gem.deviceSettings.put":gi,"gem.deviceSettings.result":mi,"gem.requestAd":yi,"gem.adResult":fi,"gem.requestSignIn":hi,"gem.signInResult":_i,"gem.requestFriendChallenge":bi,"gem.friendChallengeResult":Ri});var T={now:()=>Date.now(),setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)};var B=class{constructor(e,n){this.inventory=e;this.resolveCurrencyId=n;}inventory;resolveCurrencyId;async list(e={}){return (await this.inventory.snapshot({buckets:e.buckets})).currencies.data.map(r=>({currencyId:r.currencyId,total:r.total,...r.buckets===void 0?{}:{buckets:r.buckets}}))}async get(e,n={}){let i=(await this.inventory.snapshot({buckets:n.buckets})).currencies.data,o=i.find(l=>l.currencyId===e),s;return !o&&this.resolveCurrencyId&&(s=await this.resolveCurrencyId(e).catch(()=>{}),s!==void 0&&(o=i.find(l=>l.currencyId===s))),{currencyId:o?o.currencyId:s??e,total:o?o.total:null,...o?.buckets===void 0?{}:{buckets:o.buckets}}}};function Ie(t){let e=Array.isArray(t.achievements)?t.achievements:[],n=[];for(let r of e){let i=r??{};typeof i.id!="string"||i.id===""||typeof i.threshold!="number"||!Number.isFinite(i.threshold)||n.push({id:i.id,threshold:i.threshold,points:typeof i.points=="number"?i.points:0,hidden:i.hidden===true,...typeof i.unlocked_at=="number"&&Number.isFinite(i.unlocked_at)?{unlockedAt:i.unlocked_at}:{},...i.revoked===true?{revoked:true}:{}});}return {...n.length>0?{achievements:n}:{},...t.achievements_unavailable===true?{achievementsUnavailable:true}:{}}}var rt="inventory",G=t=>typeof t=="number"?t:0,D=t=>typeof t=="string"?t:"";function Oe(t,e){let n=t??{},r=typeof n.next_cursor=="string"?n.next_cursor:void 0;return {data:Array.isArray(n.data)?n.data.map(e):[],...r===void 0?{}:{nextCursor:r}}}function it(t){let e=t??{};return {itemDefinitionId:D(e.item_definition_id),instanceId:D(e.instance_id),quantity:G(e.quantity),acquiredAt:G(e.acquired_at),...e.properties===void 0?{}:{properties:e.properties},...e.custom_data===void 0?{}:{customData:e.custom_data}}}function wi(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0;return {currencies:Oe(e.currencies,r=>{let i=r??{},o=Array.isArray(i.buckets)?i.buckets.map(s=>{let l=s??{};return {bucket:D(l.bucket),balance:G(l.balance)}}):void 0;return {currencyId:D(i.currency_id),total:G(i.total),...o===void 0?{}:{buckets:o}}}),items:Oe(e.items,it),progressions:Oe(e.progressions,r=>{let i=r??{};return {progressionDefinitionId:D(i.progression_definition_id),currentValue:G(i.current_value),completionCount:G(i.completion_count),isCompleted:i.is_completed===true,...Ie(i)}}),...n===void 0?{}:{etag:n}}}var V=class{constructor(e,n,r){this.api=e;this.entity=n;this.cache=r;}api;entity;cache;snapshot(e={}){let n=e.buckets?`${rt}#buckets`:rt;return this.cache.read(n,[],()=>this.fetch({includeBuckets:e.buckets}))}async instances(e,n){let r=await this.snapshot();if(r.items.nextCursor===void 0){let o=r.items.data.filter(s=>s.itemDefinitionId===e);if(o.length>0)return o}let i=await on(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return Array.isArray(i)?i.map(it):[]}page(e){return this.fetch(e)}refresh(){this.invalidate();}onChanged(e){return this.cache.onInvalidate(e)}invalidate(){this.cache.invalidate();}async fetch(e){let n=await rn(this.api,this.entity.type,this.entity.id,{...e.includeBuckets?{include_buckets:true}:{},...e.currencyCursor===void 0?{}:{currency_cursor:e.currencyCursor},...e.itemCursor===void 0?{}:{item_cursor:e.itemCursor},...e.progressionCursor===void 0?{}:{progression_cursor:e.progressionCursor},...e.currencyLimit===void 0?{}:{currency_limit:e.currencyLimit},...e.itemLimit===void 0?{}:{item_limit:e.itemLimit},...e.progressionLimit===void 0?{}:{progression_limit:e.progressionLimit},...e.signal===void 0?{}:{signal:e.signal}});return wi(n)}};var xi={unknown_currency:1,currency_not_in_game_payable:1,not_purchasable:1,no_price_in_currency:1,busy:1,cancelled:1,insufficient_funds:1,price_mismatch:1,config_version_stale:1,platform_currency_unavailable:1,not_available:1,recipe_locked:1,recipe_on_cooldown:1,recipe_max_uses_exceeded:1,item_max_stack_exceeded:1,recipe_costs_unmet:1,quantity_invalid:1,error:1};new Set(Object.keys(xi));var P=class extends RangeError{constructor(n,r){super(r);this.code=n;this.name="PurchaseRefusal";}code;retryable=false};var y=t=>typeof t=="string"?t:"",vi=t=>typeof t=="string"?t:y(t&&typeof t=="object"?t.type:void 0),v=t=>typeof t=="number"?t:0;function ki(t){let e=t??{};return {prerequisiteType:y(e.prerequisite_type),referenceId:y(e.reference_id),required:v(e.required),current:v(e.current)}}function H(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0;return {orderId:y(e.order_id),status:y(e.status),...n===void 0?{}:{etag:n}}}function ue(){return crypto.randomUUID()}var Si="recipe-usage",ot=100;function ce(t){let e=t??{};switch(e.type){case "currency":return {kind:"currency",currencyId:y(e.currency_id),bucket:y(e.bucket),delta:v(e.delta),balanceAfter:v(e.balance_after)};case "item":return {kind:"item",itemDefinitionId:y(e.item_definition_id),instanceId:y(e.instance_id),delta:v(e.delta),quantityAfter:v(e.quantity_after)};case "progression":return {kind:"progression",progressionDefinitionId:y(e.progression_definition_id),delta:v(e.delta),valueAfter:v(e.value_after),completed:e.completed===true};default:return {kind:"other",type:y(e.type)}}}function Ai(t){let e=t??{},n=typeof e.rarity_tier=="string"?e.rarity_tier:void 0;return {entryId:y(e.entry_id),...n===void 0?{}:{rarityTier:n},rollNumber:v(e.roll_number),wasReplacement:e.was_replacement===true,grants:Array.isArray(e.grants)?e.grants.map(ce):[]}}function Pi(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0,r=Array.isArray(e.loot_results)?e.loot_results.map(Ai):void 0;return {orderId:y(e.order_id),status:y(e.status),...n===void 0?{}:{etag:n},granted:Array.isArray(e.granted)?e.granted.map(ce):[],consumed:Array.isArray(e.consumed)?e.consumed.map(ce):[],autoClaimedRewards:Array.isArray(e.auto_claimed_rewards)?e.auto_claimed_rewards.map(ce):[],...r===void 0||r.length===0?{}:{lootResults:r}}}function Oi(t){let e=t??{},n=e.price??{};return {payment:"platform_currency",orderId:y(e.target_order_id)||y(e.source_order_id),status:y(e.status),purchaseId:y(e.purchase_id),sourceOrderId:y(e.source_order_id),price:{currencyId:y(n.platform_currency_id),amount:v(n.price)}}}function Ii(t){let e=t??{},n=typeof e.last_used_at=="string"?e.last_used_at:void 0,r=typeof e.cooldown_expires_at=="string"?e.cooldown_expires_at:void 0;return {recipeId:y(e.recipe_id),useCount:typeof e.use_count=="number"?e.use_count:0,isOnCooldown:e.is_on_cooldown===true,...n===void 0?{}:{lastUsedAt:n},...r===void 0?{}:{cooldownExpiresAt:r}}}function st(t){switch(t.type){case "currency_grant":case "currency_consume":return {type:t.type,currency_id:t.currencyId,amount:t.amount};default:return {type:t.type,item_definition_id:t.itemDefinitionId,quantity:t.quantity}}}var W=class{constructor(e,n,r){this.api=e;this.entity=n;this.cache=r;}api;entity;cache;async create(e,n={}){let r=await this.write(()=>ze(this.api,this.entity.type,this.entity.id,{operations:e.map(st),source:n.source??"play",nonce:ue()},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}));return H(r)}async createMany(e,n={}){return this.write(()=>Ke(this.api,this.entity.type,this.entity.id,{orders:e.map(r=>({operations:r.map(st),nonce:ue()})),source:n.source??"play"},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}))}async recipeAvailability(e,n,r){let o=await dn(this.api,this.entity.type,this.entity.id,e,n,r===void 0?{}:{signal:r})??{},s=typeof o.uses_remaining=="number"?o.uses_remaining:void 0,l=typeof o.cooldown_expires_at=="string"?o.cooldown_expires_at:void 0,d=Array.isArray(o.lock_reasons)?o.lock_reasons.map(ki):[];return {canExecute:o.can_execute===true,locked:o.locked===true||d.length>0,lockReasons:d,reasons:Array.isArray(o.reasons)?o.reasons.map(c=>vi(c)):[],...s===void 0?{}:{usesRemaining:s},...l===void 0?{}:{cooldownExpiresAt:l}}}async recipeUsageAll(){return this.cache.read(Si,[],async()=>{let n=await un(this.api,this.entity.type,this.entity.id,{limit:ot})??{},r=Array.isArray(n.usages)?n.usages:[];return {usages:r.map(Ii),truncated:r.length>=ot}})}async recipeUsage(e){return (await this.recipeUsageAll()).usages.find(r=>r.recipeId===e)??null}async purchase(e,n={}){if(e.payment.kind==="configured"){let p=e,b=await this.write(()=>Ze(this.api,this.entity.type,this.entity.id,{catalog_id:p.catalogId,recipe_id:p.targetId,game_id:this.api.gameId(),nonce:ue()},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}));return {payment:"configured",...Pi(b)}}if(this.entity.type!=="players"||this.entity.id!=="me")throw new TypeError("platform-currency purchases are available only on gem.me.mutations");let[r,i]=await Promise.all([fn(this.api,n.signal===void 0?{}:{signal:n.signal}),se(this.api,n.signal===void 0?{}:{signal:n.signal})]),o=e.payment.currencySlug.toLowerCase(),s=i.currencies.find(p=>p.currency_id.toLowerCase()===o||p.slug.toLowerCase()===o);if(s===void 0){let p=i.currencies.map(b=>b.slug);throw new P("unknown_currency",`platform currency ${JSON.stringify(e.payment.currencySlug)} is not an active platform currency. Active: ${p.length===0?"none":p.join(", ")}`)}let l=e.kind==="item"?r.items.find(p=>p.item_id===e.targetId):r.recipes.find(p=>p.recipe_id===e.targetId&&p.catalog_id===e.catalogId);if(l===void 0)throw new P("not_purchasable",`purchase target ${JSON.stringify(e.targetId)}`+(e.kind==="recipe"?` in catalog ${JSON.stringify(e.catalogId)}`:"")+` is not purchasable in config version ${r.config_version} on this channel. Send the ${e.kind==="item"?"item":"recipe"} id (not its slug), and check that it has platform_prices and that this config version is promoted`);let d=l.platform_prices.find(p=>p.platform_currency_id===s.currency_id);if(d===void 0){let p=m=>i.currencies.find(S=>S.currency_id===m)?.slug??m,b=l.platform_prices.map(m=>`${p(m.platform_currency_id)} ${m.price}`);throw new P("no_price_in_currency",`purchase target ${JSON.stringify(e.targetId)} has no ${s.slug} price. It is priced in: ${b.length===0?"nothing":b.join(", ")}`)}let c=e.kind==="item"?e.quantity??1:1;if(!Number.isInteger(c)||c<1||c>10)throw new P("quantity_invalid","item purchase quantity must be an integer from 1 through 10");let g=await this.write(()=>xn(this.api,this.entity.type,this.entity.id,{purchase_kind:e.kind,target_id:e.targetId,...e.kind==="recipe"?{catalog_id:e.catalogId}:{},quantity:c,expected_price:{platform_currency_id:s.currency_id,price:d.price*c},expected_config_version:r.config_version,nonce:ue(),confirmation:"none"},n.signal===void 0?{}:{signal:n.signal}));return Oi(g)}async executeRecipe(e,n,r={}){return await this.purchase({kind:"recipe",catalogId:e,targetId:n,payment:{kind:"configured"}},r)}async addProgression(e,n,r){let i=await this.write(()=>Ve(this.api,this.entity.type,this.entity.id,e,{amount:n,game_id:this.api.gameId()},r===void 0?{}:{signal:r}));return H(i)}async maxProgression(e,n,r){let i=await this.write(()=>Cn(this.api,this.entity.type,this.entity.id,e,{value:n,game_id:this.api.gameId()},r===void 0?{}:{signal:r}));return H(i)}async claimProgression(e,n){let r=await this.write(()=>We(this.api,this.entity.type,this.entity.id,e,{game_id:this.api.gameId()},n===void 0?{}:{signal:n}));return H(r)}async resetProgression(e,n){let r=await this.write(()=>$n(this.api,this.entity.type,this.entity.id,e,{game_id:this.api.gameId()},n===void 0?{}:{signal:n}));return H(r)}async write(e){return this.cache.invalidate(),e()}};var Ce=t=>typeof t=="string"?t:"",Ci=t=>typeof t=="number"?t:0;function at(t){let e=t??{};return {orderId:Ce(e.order_id),status:Ce(e.status),source:Ce(e.source),createdAt:Ci(e.created_at)}}var J=class{constructor(e,n){this.api=e;this.entity=n;}api;entity;async list(e={}){let r=await An(this.api,this.entity.type,this.entity.id,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}})??{},i=typeof r.next_cursor=="string"?r.next_cursor:void 0;return {data:Array.isArray(r.orders)?r.orders.map(at):[],...i===void 0?{}:{nextCursor:i}}}async get(e,n){let r=await an(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return at(r)}};var lt=t=>typeof t=="number"?t:0,Ei=t=>typeof t=="string"?t:"";function Ti(t){let e=t??{};return {progressionDefinitionId:Ei(e.progression_definition_id),currentValue:lt(e.current_value),completionCount:lt(e.completion_count),isCompleted:e.is_completed===true,...Ie(e)}}var K=class{constructor(e,n,r){this.api=e;this.entity=n;this.inventory=r;}api;entity;inventory;async list(){return (await this.inventory.snapshot()).progressions.data}async get(e,n){let i=(await this.inventory.snapshot()).progressions.data.find(o=>o.progressionDefinitionId===e);if(i&&i.achievementsUnavailable!==true)return i;try{let o=await ln(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return Ti(o)}catch{return i??null}}};var pe=class{constructor(e,n){this.clock=e;this.identity=n;}clock;identity;generation=0;slots=new Map;listeners=new Set;boundTo=null;read(e,n,r,i){this.rebind();let o=n.length===0,s=o?e:e+"\0"+n.join("\0"),l=this.slots.get(s);if(l){let p=l.filledAt;if(p!==void 0&&(i===void 0||this.clock.now()-p<=i))return Promise.resolve(l.value);if(l.inFlight)return l.inFlight}let d=l??{};this.slots.set(s,d);let c=this.generation,g=r().then(p=>(o&&this.generation===c&&(d.value=p,d.filledAt=this.clock.now()),p)).finally(()=>{d.inFlight===g&&(d.inFlight=void 0,d.filledAt===void 0&&this.slots.get(s)===d&&this.slots.delete(s));});return d.inFlight=g,g}invalidate(){this.slots.clear(),this.generation+=1;for(let e of [...this.listeners])e();}onInvalidate(e){return this.listeners.add(e),()=>{this.listeners.delete(e);}}rebind(){if(!this.identity)return;let e=this.identity();e!==this.boundTo&&(this.boundTo=e,this.invalidate());}};function Gi(t){let e=i=>new RegExp(`<${i}>([^<]{0,300})</${i}>`).exec(t)?.[1]?.trim()||void 0,n=[e("Code"),e("AuthenticationErrorDetail")??e("Message")].filter(Boolean);if(n.length>0)return n.join(" \u2014 ");let r=t.trim();return r?r.slice(0,300):""}async function Ee(t){try{let e=Gi(await t.text());return e?`Storage said: ${e}`:""}catch{return ""}}var _=class extends Error{constructor(n,r){super(r);this.reason=n;this.name="GemSaveError";}reason},qi=3e4,dt="the save payload could not reach storage. From a browser this is almost always the storage account's CORS rule, which the platform owns and your game cannot change. If every save fails this way, report it rather than working around it",Li=/^[A-Za-z0-9_]{1,64}$/;function k(t){let e=t.length===0?"a save key cannot be empty":t.length>64?`it is ${t.length} characters; a save key is at most 64`:t.startsWith("_")||t.startsWith("$")?`it begins with ${JSON.stringify(t[0])}, and \`_\` and \`$\` are reserved prefixes`:"a save key is ASCII letters, digits and underscores only \u2014 no hyphens, spaces or other punctuation, unlike a template slug";if(!Li.test(t)||t.startsWith("_"))throw new TypeError(`${JSON.stringify(t)} is not a usable save key: ${e}.`);return t}function ut(t,e){let n=new AbortController,r=AbortSignal.timeout(e),i=()=>n.abort(r.reason),o=()=>n.abort(t?.reason);return t?.aborted?n.abort(t.reason):(r.addEventListener("abort",i,{once:true}),t?.addEventListener("abort",o,{once:true})),{signal:n.signal,release:()=>{r.removeEventListener("abort",i),t?.removeEventListener("abort",o);}}}function Te(t,e){return t.aborted&&e?.aborted!==true}var $i=new Set(["x-ms-blob-type"]),Fi=/^[ -~]+$/;function Mi(t,e){if(t==null)return {};if(typeof t!="object"||Array.isArray(t))throw new _("save_malformed",`the grant for save ${JSON.stringify(e)} described its upload headers as ${Array.isArray(t)?"a list":typeof t}, which is not a set of headers.`);let n={};for(let[r,i]of Object.entries(t)){let o=r.toLowerCase();if(!$i.has(o))throw new _("save_malformed",`the grant for save ${JSON.stringify(e)} asked the upload to send ${JSON.stringify(r)}, which this SDK does not put on a storage request. Report it \u2014 a platform that needs a new upload header needs an SDK release too.`);if(typeof i!="string"||!Fi.test(i))throw new _("save_malformed",`the grant for save ${JSON.stringify(e)} gave header ${JSON.stringify(r)} a value that is not usable as one.`);if(o in n)throw new _("save_malformed",`the grant for save ${JSON.stringify(e)} named ${JSON.stringify(o)} twice.`);n[o]=i;}return n}function Ge(t){let e=typeof t.metadata=="object"&&t.metadata!==null&&!Array.isArray(t.metadata)?t.metadata:void 0;return {key:t.key,sizeBytes:t.size_bytes,etag:t.etag,...e===void 0?{}:{metadata:e},createdAt:t.created_at,updatedAt:t.updated_at}}function qe(t){return t?.reason==="not_found"}var z=class{constructor(e,n,r={}){this.api=e;this.entity=n;this.options=r;}api;entity;options;async put(e,n,r={}){let i;try{i=JSON.stringify(n);}catch(o){throw new _("save_malformed",`save ${JSON.stringify(e)} could not be serialised to JSON: ${String(o)}. Retrying stores the same unserialisable value.`)}if(i===void 0)throw new _("save_malformed",`save ${JSON.stringify(e)} is undefined, which is not JSON. Use delete() to remove one.`);return this.putBytes(e,new TextEncoder().encode(i),{...r,contentType:"application/json"})}async putBytes(e,n,r={}){let i=r.contentType??"application/octet-stream",o=this.budget(r.timeoutMs),s=ut(r.signal,o);try{let l=await Ln(this.api,this.entity.type,this.entity.id,k(e),{size_bytes:n.byteLength,content_type:i,...r.metadata===void 0?{}:{metadata:r.metadata}},{signal:s.signal});if(typeof l.upload_url!="string"||typeof l.session_id!="string")throw new _("save_malformed",`the grant for save ${JSON.stringify(e)} named nowhere to put the bytes.`);let d=Mi(l.upload_headers,e),c,g=this.options.fetch??globalThis.fetch.bind(globalThis);try{c=await g(l.upload_url,{method:"PUT",headers:{"content-type":i,...d},body:n,credentials:"omit",signal:s.signal});}catch(p){throw Te(s.signal,r.signal)?this.timeout("upload",o):new _("upload_failed",`${dt} for PUT. Underlying error: ${p}`)}if(!c.ok){let p=await Ee(c);throw new _("upload_failed",c.status===400?"the save upload answered 400. The platform and the service holding the bytes disagree about what this upload must carry, which is not something your game can fix and not worth retrying \u2014 report it. "+p:`the save upload answered ${c.status}. `+(c.status===403?"An upload URL is short-lived, so this is most likely an expired one \u2014 start the save again rather than retrying the upload. ":"")+p)}return Ge(await en(this.api,this.entity.type,this.entity.id,k(e),{session_id:l.session_id},{signal:s.signal}))}catch(l){throw this.rethrow(l,r.signal,s.signal,"save",o)}finally{s.release();}}async get(e,n={}){let r=await this.getBytes(e,n);if(r===null)return null;try{return JSON.parse(new TextDecoder().decode(r))}catch(i){throw new _("save_malformed",`the stored save ${JSON.stringify(e)} is not JSON, so put() did not write it. Read it with getBytes() and decode it yourself. Underlying error: ${i}`)}}async getBytes(e,n={}){let r=this.budget(n.timeoutMs),i=ut(n.signal,r);try{let o;try{let d=await xe(this.api,this.entity.type,this.entity.id,k(e),{signal:i.signal});if(!d.modified)return null;o=d.body;}catch(d){if(qe(d))return null;throw d}if(typeof o.download_url!="string")throw new _("save_malformed",`the record for save ${JSON.stringify(e)} named no link to its stored bytes.`);let s=this.options.fetch??globalThis.fetch.bind(globalThis),l;try{l=await s(o.download_url,{credentials:"omit",signal:i.signal});}catch(d){throw Te(i.signal,n.signal)?this.timeout("download",r):new _("download_failed",`${dt} for GET. Underlying error: ${d}`)}if(!l.ok){let d=await Ee(l);throw new _("download_failed",`the save download answered ${l.status}. `+(l.status===403?"A download link lasts 15 minutes, so this is most likely an expired one \u2014 call get() again for a fresh one. ":"")+d)}return new Uint8Array(await l.arrayBuffer())}catch(o){throw this.rethrow(o,n.signal,i.signal,"load",r)}finally{i.release();}}async describe(e,n={}){try{let r=await xe(this.api,this.entity.type,this.entity.id,k(e),{...n.signal===void 0?{}:{signal:n.signal},...n.ifNoneMatch===void 0?{}:{ifNoneMatch:n.ifNoneMatch}});return r.modified?Ge(r.body):null}catch(r){if(qe(r))return null;throw r}}async list(e={}){let n=await Pn(this.api,this.entity.type,this.entity.id,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}}),r=n.next_cursor;return {saves:(n.data??[]).map(Ge),...typeof r=="string"&&r.length>0?{nextCursor:r}:{}}}async delete(e,n){try{await Xe(this.api,this.entity.type,this.entity.id,k(e),{...n===void 0?{}:{signal:n}});}catch(r){if(!qe(r))throw r}}budget(e){return e??this.options.timeoutMs??qi}timeout(e,n){return new _("save_timeout",`the save ${e} did not finish within ${n}ms`)}rethrow(e,n,r,i,o){return e instanceof _?e:Te(r,n)?this.timeout(i,o):e}};function ji(t){try{return Se(t)}catch{return t}}function Le(t,e){let n=t??{},r=typeof n.etag=="string"?n.etag:e;return {key:typeof n.key=="string"?n.key:"",value:typeof n.value=="string"?ji(n.value):"",...r===void 0?{}:{etag:r},updatedAt:typeof n.updated_at=="number"?n.updated_at:0}}var Y=class{constructor(e,n){this.api=e;this.entity=n;}api;entity;async list(e){let r=(await Sn(this.api,this.entity.type,this.entity.id,e===void 0?{}:{signal:e}))?.settings;return Array.isArray(r)?r.map(i=>Le(i)):[]}async get(e,n={}){try{let r=await tn(this.api,this.entity.type,this.entity.id,e,{...n.signal===void 0?{}:{signal:n.signal},...n.ifNoneMatch===void 0?{}:{ifNoneMatch:n.ifNoneMatch}});return r.modified?Le(r.body,r.etag):null}catch(r){if(ct(r))return null;throw r}}async put(e,n,r={}){let i=await En(this.api,this.entity.type,this.entity.id,e,{value:le(n)},{...r.signal===void 0?{}:{signal:r.signal},...r.ifMatch===void 0?{}:{ifMatch:r.ifMatch}});return Le(i)}async delete(e,n){try{await Ye(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});}catch(r){if(!ct(r))throw r}}};function ct(t){return t?.reason==="not_found"}function ge(t,e,n={}){let r=new pe(T,n.identity);n.onInventoryChanged&&r.onInvalidate(n.onInventoryChanged);let i=new V(t,e,r);return {settings:new Y(t,e),inventory:i,saves:new z(t,e,n.saves??{}),currencies:new B(i,n.resolveCurrencyId),mutations:new W(t,e,r),orders:new J(t,e),progressions:new K(t,e,i)}}var O=t=>typeof t=="string"?t:"",q=t=>typeof t=="number"?t:0;function me(t,e){let n=e??{},r=O(n.character_id);if(r==="")throw new Error("[gem] a character response carried no character_id");return {...t(r),id:r,playerId:O(n.player_id),gameId:O(n.game_id),channel:O(n.channel)||"release",name:O(n.name),slotIndex:q(n.slot_index),isActive:n.is_active!==false,createdAt:O(n.created_at),updatedAt:O(n.updated_at)}}var X=class{constructor(e,n,r,i){this.api=e;this.saves=n;this.identity=r;this.resolveCurrencyId=i;}api;saves;identity;resolveCurrencyId;scopes=new Map;scope=e=>{let n=this.scopes.get(e);return n||(n=ge(this.api,{type:"characters",id:e},{saves:this.saves,identity:this.identity,resolveCurrencyId:this.resolveCurrencyId}),this.scopes.set(e,n)),n};async list(e){let r=(await kn(this.api,e===void 0?{}:{signal:e}))?.characters;return Array.isArray(r)?r.map(i=>me(this.scope,i)):[]}async get(e,n){let r=await nn(this.api,e,n===void 0?{}:{signal:n});return me(this.scope,r)}async create(e){let n=await Je(this.api,{name:e.name},e.signal===void 0?{}:{signal:e.signal});return me(this.scope,n)}async update(e,n,r){let i=await qn(this.api,e,{name:n},r===void 0?{}:{signal:r});return me(this.scope,i)}async delete(e,n){await Fn(this.api,e,n===void 0?{}:{signal:n});}async slots(e){let r=await _n(this.api,e===void 0?{}:{signal:e})??{};return {totalSlots:q(r?.total_slots),availableSlots:q(r?.available_slots),activeCharacterCount:q(r?.active_character_count),defaultMaxSlots:q(r?.default_max_slots),purchasedExtraSlots:q(r?.purchased_extra_slots),canPurchaseMore:r?.can_purchase_more===true}}};var w=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 L(t){return new w(t)}var Ni={toPlain(t){return w.unwrap(t)},compare(t,e,n){let r=t instanceof w?w.unwrap(t):t,i=e instanceof w?w.unwrap(e):e,o;try{o=new Intl.Collator(n);}catch{o=new Intl.Collator;}return o.compare(r,i)},equals(t,e){let n=t instanceof w?w.unwrap(t):t,r=e instanceof w?w.unwrap(e):e;return n.normalize("NFC")===r.normalize("NFC")}};var $=t=>typeof t=="string"?t:"";function ye(t){let e=t??{},n=typeof e.message=="string"&&e.message.length>0?e.message:void 0,r=typeof e.resolved_at=="string"?e.resolved_at:void 0;return {id:$(e.transfer_id),status:$(e.status),sourceEntityId:$(e.source_entity_id),targetEntityId:$(e.target_entity_id),...n===void 0?{}:{message:L(n)},createdAt:$(e.created_at),expiresAt:$(e.expires_at),...r===void 0?{}:{resolvedAt:r}}}function Ui(){return crypto.randomUUID()}var Q=class{constructor(e,n,r){this.api=e;this.self=n;this.inventory=r;}api;self;inventory;async initiate(e){this.inventory.invalidate();let n=await wn(this.api,{source_entity_type:this.self.type,source_entity_id:this.self.id,target_entity_type:e.to.type,target_entity_id:e.to.id,items:(e.items??[]).map(r=>({item_definition_id:r.itemDefinitionId,quantity:r.quantity})),currencies:(e.currencies??[]).map(r=>({currency_id:r.currencyId,amount:r.amount})),...e.message===void 0?{}:{message:e.message},nonce:Ui()},e.signal===void 0?{}:{signal:e.signal});return ye(n)}async list(e={}){let r=await In(this.api,{entity_type:this.self.type,entity_id:this.self.id,...e.direction===void 0?{}:{direction:e.direction},...e.status===void 0?{}:{status:e.status},...e.cursor===void 0?{}:{cursor:e.cursor},...e.limit===void 0?{}:{limit:e.limit},...e.signal===void 0?{}:{signal:e.signal}})??{},i=typeof r.next_cursor=="string"?r.next_cursor:void 0;return {transfers:Array.isArray(r.transfers)?r.transfers.map(ye):[],...i===void 0?{}:{nextCursor:i}}}async get(e,n){let r=await bn(this.api,e,n===void 0?{}:{signal:n});return ye(r)}async accept(e,n){return this.resolve(()=>De(this.api,e,n===void 0?{}:{signal:n}))}async reject(e,n){return this.resolve(()=>Gn(this.api,e,n===void 0?{}:{signal:n}))}async cancel(e,n){return this.resolve(()=>He(this.api,e,n===void 0?{}:{signal:n}))}async resolve(e){return this.inventory.invalidate(),ye(await e())}};function I(t){return typeof t=="string"&&t!==""?t:void 0}var pt=new Set(["localhost","127.0.0.1","[::1]"]);function $e(t){let e=I(t);if(e===void 0)return;let n;try{n=new URL(e);}catch{return}if(!(n.username!==""||n.password!=="")&&(n.protocol==="https:"||n.protocol==="http:"&&pt.has(n.hostname)))return e}function Bi(t){if(!Array.isArray(t))return [];let e=[];for(let n of t){let r=n??{},i=I(r.item_id),o=$e(r.icon_url);i!==void 0&&o!==void 0&&e.push({itemId:i,iconUrl:o});}return e}function A(t){let e=t??{},n=I(e.player_id),r=I(e.display_name),i=I(e.discriminator),o=I(e.display_tag),s=I(e.avatar_icon_id),l=$e(e.avatar_icon_url);return {...n===void 0?{}:{playerId:n},...r===void 0?{}:{displayName:L(r)},...i===void 0?{}:{discriminator:i},...o===void 0?{}:{displayTag:L(o)},...s===void 0?{}:{avatarIconId:s},...l===void 0?{}:{avatarIconUrl:l},badges:Bi(e.badges)}}var Di=new Set(["https://downloads.gemarcade.com","https://cdn.gemarcade.com"]);function Vi(t){if(t===void 0)return;let e=$e(t);if(e===void 0)return;let n=new URL(e);return pt.has(n.hostname)||Di.has(n.origin)?e:void 0}var Fe=class extends f{constructor(e,n={}){super(e.reason,e.status,e.detail,e.retryAfterSeconds,e.code),this.name="FriendChallengeError";for(let[r,i]of Object.entries(n))i!==void 0&&Object.assign(this,{[r]:i});}},gt=t=>typeof t=="string"?t:void 0;function Hi(t){let e=t??{};return {...A(e),playerId:gt(e.player_id)??""}}function Wi(t){let e=t??{},n=e.has_more===true?gt(e.next_cursor):void 0;return {friends:Array.isArray(e.data)?e.data.map(Hi):[],...n===void 0?{}:{nextCursor:n}}}var Z=class{#e;#t;constructor(e,n={}){this.#e=e,this.#t=n.challenge;}async list(e={}){let n=await On(this.#e,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}});return Wi(n)}challenge(e){return this.#t===void 0?Promise.resolve({outcome:"unavailable"}):this.#t(e)}};var mt=100,ee=t=>typeof t=="string"?t:"",F=t=>typeof t=="number"?t:0,ne=t=>typeof t=="string"?t:void 0,Ji=t=>typeof t=="number"?t:void 0,ht={player:"players",character:"characters"};function Ki(t,e){let n=t??{},r=ne(n.entity_id),i=typeof n.entity_type=="string"&&Object.hasOwn(ht,n.entity_type)?n.entity_type:void 0,o=_t(n.stats),s=n.properties!==null&&typeof n.properties=="object"?n.properties:void 0,l=e?n.is_viewer===true:void 0;return {...A(n),rank:F(n.rank),occurredAt:F(n.occurred_at),...l===void 0?{}:{isViewer:l},...r===void 0?{}:{entityId:r},...i===void 0?{}:{entityType:i},...o===void 0?{}:{stats:o},...s===void 0?{}:{properties:s}}}function yt(t,e){let n=t??{},r=ne(n.bucket_1),i=ne(n.bucket_2),o=Ji(n.update_frequency_seconds);return {leaderboardType:ee(n.leaderboard_type),runType:ee(n.run_type),...r===void 0?{}:{bucket1:r},...i===void 0?{}:{bucket2:i},entries:Array.isArray(n.entries)?n.entries.map(s=>Ki(s,e)):[],generatedAt:F(n.generated_at),...o===void 0?{}:{updateFrequencySeconds:o}}}function ft(t){if(t===null||typeof t!="object"||Array.isArray(t))return;let e=t;if(!Number.isFinite(e.rank))return;let n=_t(e.stats),r=e.properties!==null&&typeof e.properties=="object"?e.properties:void 0;return {rank:e.rank,occurredAt:F(e.occurred_at),...n===void 0?{}:{stats:n},...r===void 0?{}:{properties:r}}}function _t(t){if(t===null||typeof t!="object")return;let e={};for(let[n,r]of Object.entries(t))typeof r=="number"&&(e[n]=r);return e}function zi(t,e,n){let r=t??{},i=ne(r.bucket_1),o=ne(r.bucket_2);return {leaderboardType:ee(r.leaderboard_type),runType:ee(r.run_type),entityType:e,entityId:n,...i===void 0?{}:{bucket1:i},...o===void 0?{}:{bucket2:o},entries:Array.isArray(r.entries)?r.entries.map(ft).filter(s=>s!==void 0):[],personalBest:ft(r.personal_best)??null,totalRuns:F(r.total_runs),totalRunsExact:r.total_runs_exact!==false,generatedAt:F(r.generated_at)}}var te=class{#e;constructor(e){this.#e=e;}async get(e,n={}){let r=await gn(this.#e,e,{...n.bucket1===void 0?{}:{bucket_1:n.bucket1},...n.bucket2===void 0?{}:{bucket_2:n.bucket2},...n.signal===void 0?{}:{signal:n.signal}});return yt(r,false)}async friends(e,n={}){let r=await cn(this.#e,e,{...n.bucket1===void 0?{}:{bucket_1:n.bucket1},...n.bucket2===void 0?{}:{bucket_2:n.bucket2},...n.signal===void 0?{}:{signal:n.signal}});return yt(r,true)}async mine(e,n={}){return this.#t(e,"player","me",n)}async character(e,n,r={}){return this.#t(e,"character",n,r)}async#t(e,n,r,i){if(i.limit!==void 0){let{limit:l}=i;if(!Number.isInteger(l)||l<1||l>mt)throw new TypeError(`limit must be an integer between 1 and ${mt}, got ${String(l)}`)}let o=await sn(this.#e,e,ht[n],r,{...i.bucket1===void 0?{}:{bucket_1:i.bucket1},...i.bucket2===void 0?{}:{bucket_2:i.bucket2},...i.limit===void 0?{}:{limit:i.limit},...i.signal===void 0?{}:{signal:i.signal}}),s=n==="player"&&r==="me"&&ee((o??{}).entity_id)||r;return zi(o,n,s)}};var fe=t=>typeof t=="string"?t:void 0;function Yi(t){let e=t??{},n=fe(e.currency_id);if(n===void 0||n==="")return;let r=typeof e.balance=="number"&&Number.isFinite(e.balance)?e.balance:0;return {slug:fe(e.slug)??"",currencyId:n,balance:r,access:e.access==="spend"?"spend":"read"}}var he=class{#e;constructor(e){this.#e=e;}async get(e={}){let r=(await se(this.#e,e))?.currencies;if(!Array.isArray(r))return [];let i=[];for(let o of r){let s=Yi(o);s!==void 0&&i.push(s);}return i}},Me=t=>typeof t=="number"&&Number.isFinite(t)&&t>=0?Math.floor(t):0;function Xi(t){let e=t??{},n=fe(e.currency_id);if(n===void 0||n==="")return;let r=Me(e.limit),i=Math.min(Me(e.earned),r),o=Math.min(Me(e.remaining),r-i),s=e.period_days,l=typeof s=="number"&&Number.isInteger(s)&&s>=1?s:1,d=e.resets_at,c=typeof d=="number"&&Number.isFinite(d)&&d>0?Math.round(d*1e3):void 0;return {currencySlug:fe(e.currency_slug)??"",currencyId:n,limit:r,earned:i,remaining:o,period:e.period==="day"?"day":"window",periodDays:l,...c===void 0?{}:{resetsAt:c}}}var _e=class{#e;#t;#l;constructor(e,n,r){this.#e=e,this.#t=n,this.#l=r;}async get(e={}){let r=(await mn(this.#e,e))?.currencies;if(!Array.isArray(r))return [];let i=[];for(let o of r){let s=Xi(o);s!==void 0&&i.push(s);}return i}on(e,n){return e!=="changed"?(this.#l?.(`[gem] unknown earnAllowance event '${String(e)}'; the only event is 'changed'`),()=>{}):this.#t?.on(n)??(()=>{})}},re=class{currencies;earnAllowance;constructor(e,n,r){this.currencies=new he(e),this.earnAllowance=new _e(e,n,r);}};var je=t=>typeof t=="string"?t:"",bt=t=>typeof t=="number"?t:0;function Qi(t){let e=t??{};return {key:je(e.key),visibility:je(e.visibility),value:e.value,updatedAt:bt(e.updated_at)}}function Zi(t){let e=t??{};return {...A(e),playerId:je(e.player_id),showcase:Array.isArray(e.showcase)?e.showcase.map(Qi):[],generatedAt:bt(e.generated_at)}}function eo(t){return t?.reason==="not_found"}var ie=class{#e;constructor(e){this.#e=e;}async of(e,n={}){try{return Zi(await yn(this.#e,e,{...n.signal===void 0?{}:{signal:n.signal}}))}catch(r){if(eo(r))return null;throw r}}};var be=t=>typeof t=="string"?t:"",Ne=t=>typeof t=="number"?t:0;function Rt(t){let e=t??{};return {playerId:be(e.player_id),key:be(e.key),value:e.value,updatedAt:Ne(e.updated_at)}}function no(t){let e=t??{};return {...A(e),playerId:be(e.player_id),value:e.value,isViewer:e.is_viewer===true,updatedAt:Ne(e.updated_at)}}function to(t){return t?.reason==="not_found"}var oe=class{constructor(e,n){this.api=e;this.selfPlayerId=n;}api;selfPlayerId;async friends(e,n={}){let i=await pn(this.api,k(e),{...n.signal===void 0?{}:{signal:n.signal}})??{};return {key:be(i.key),entries:Array.isArray(i.entries)?i.entries.map(no):[],generatedAt:Ne(i.generated_at)}}async of(e,n,r={}){try{return Rt(await hn(this.api,e,k(n),{...r.signal===void 0?{}:{signal:r.signal}}))}catch(i){if(to(i))return null;throw i}}async set(e,n,r={}){if(k(e),n===void 0)throw new TypeError(`showcase value for ${JSON.stringify(e)} is undefined, which is not JSON. Use clear() to remove one.`);try{JSON.stringify(n);}catch(o){throw new TypeError(`showcase value for ${JSON.stringify(e)} could not be serialised to JSON: ${String(o)}.`,{cause:o})}let i=await this.selfPlayerId();return Rt(await Tn(this.api,i,e,{value:n},{...r.signal===void 0?{}:{signal:r.signal}}))}async clear(e,n={}){let r=await this.selfPlayerId();await Qe(this.api,r,k(e),{...n.signal===void 0?{}:{signal:n.signal}});}};var ro="https://function.gem.invalid",wt={token:"function",expiresAt:Number.POSITIVE_INFINITY,chainEndsAt:Number.POSITIVE_INFINITY},io="createGem() from @indiegems/gem-web-sdk/function only runs inside a serverless function; in a browser import @indiegems/gem-web-sdk/sdk",Re="gem.me is unavailable: this function was invoked by a game server, not a player",oo="gem.functions is unavailable inside a serverless function",so="gem.gameConfig is unavailable inside a serverless function",ao="conditional requests are unavailable inside a serverless function: the platform call carries no headers, so an ifMatch or ifNoneMatch cannot travel. Drop the option, or keep the compare-and-set in the browser.";function lo(t){let e=new Set(C);return {async request(n){let r={...n},i=r.headers;if(i){for(let[o,s]of Object.entries(i))if(s!==void 0&&e.has(o.toLowerCase()))throw new h(ao)}return t.request(r)}}}function xt(t,e,n){Object.defineProperty(t,e,{get(){throw new Error(n)},enumerable:false});}function uo(t){let e=globalThis.__gemFunctionHost;if(e===void 0)throw new Error(io);let n=e.context(),r=new ae({clock:T,request:()=>Promise.resolve(wt)});r.accept(wt);let i=lo(Kn({baseUrl:ro,tokenSource:r,defaultQuery:{game_id:n.gameId,channel:n.channel}})),o=new N({transport:i,clock:T,maxRetries:0}),s={client:o,gameId:()=>n.gameId},l=n.caller.type==="player"?n.caller.playerId:null,d=l===null?null:{playerId:l,gameId:n.gameId,channel:n.channel},c=l===null?null:{type:"players",id:l},g=c===null?null:ge(s,c),p=c===null||g===null?null:new Q(s,c,g.inventory),b=we=>console.info(we),m=new M({client:()=>o,clock:T,gameId:()=>n.gameId,playerId:()=>l,environment:{sdk_version:Be()},log:b}),S={context:n,identity:d,awaitIdentity:()=>d===null?Promise.reject(new Error(Re)):Promise.resolve(d),awaitBridge:()=>Promise.resolve("connected"),client:o,get me(){if(g===null)throw new Error(Re);return g},characters:new X(s),get transfers(){if(p===null)throw new Error(Re);return p},analytics:m,leaderboards:new te(s),challenges:new U(s),showcase:new oe(s,()=>l===null?Promise.reject(new Error(Re)):Promise.resolve(l)),friends:new Z(s),platform:new re(s,void 0,b),profiles:new ie(s)};return xt(S,"functions",oo),xt(S,"gameConfig",so),S}var co=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]]),Ue=class extends f{constructor(e,n){super(e.reason,e.status,e.detail,e.retryAfterSeconds,e.code),this.name="GemFunctionError",Object.assign(this,n);}get retryable(){return (this.code===void 0?void 0:co.get(this.code))??super.retryable}};
2
+ export{M as AnalyticsApi,R as AuthError,C as CONDITIONAL_HEADERS,U as ChallengesApi,X as CharactersApi,B as CurrenciesApi,Fe as FriendChallengeError,Z as FriendsApi,f as GemApiError,N as GemClient,Ue as GemFunctionError,_ as GemSaveError,V as InventoryApi,te as LeaderboardsApi,Yn as MAX_PERIODS_BACK,W as MutationsApi,J as OrdersApi,re as PlatformApi,he as PlatformCurrenciesApi,_e as PlatformEarnAllowanceApi,w as PlayerText,ie as ProfilesApi,K as ProgressionsApi,z as SavesApi,Y as SettingsApi,oe as ShowcaseApi,Q as TransfersApi,h as TransportRefusal,L as asPlayerText,uo as createGem,A as mapIdentity,Vi as platformIconUrl,Ni as text,le as toBase64};//# sourceMappingURL=gem-web-sdk.function.js.map
3
+ //# sourceMappingURL=gem-web-sdk.function.js.map