@indiegems/gem-web-sdk 11.1.2 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
- globalThis.__gemWebSdkVersion="[gem-web-sdk:sdkVersion:11.1.2]";function Je(){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 s(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 ze(t,e,n){let r=`/v1/inventory/transfers/${s(e)}/accept`;return t.client.post(r,void 0,n?.signal)}async function Ke(t,e,n,r,i,a){let o=`/v1/inventory/${s(e)}/${s(n)}/progressions/${s(r)}/add`;return t.client.post(o,i,a?.signal)}async function Ye(t,e,n){let r=`/v1/inventory/transfers/${s(e)}/cancel`;return t.client.post(r,void 0,n?.signal)}async function Qe(t,e,n,r,i,a){let o=`/v1/inventory/${s(e)}/${s(n)}/progressions/${s(r)}/claim`;return t.client.post(o,i,a?.signal)}async function Xe(t,e,n){return t.client.post("/v1/characters",e,n?.signal)}async function Ze(t,e,n,r,i){let a=`/v1/inventory/${s(e)}/${s(n)}/orders/batch`;return t.client.post(a,r,i?.signal,{...i?.ifMatch===void 0?{}:{ifMatch:i.ifMatch}})}async function en(t,e,n,r,i){let a=`/v1/inventory/${s(e)}/${s(n)}/orders`;return t.client.post(a,r,i?.signal,{...i?.ifMatch===void 0?{}:{ifMatch:i.ifMatch}})}async function nn(t,e,n,r,i){let a=`/v1/settings/${s(e)}/${s(n)}/${s(r)}`;return t.client.delete(a,i?.signal)}async function tn(t,e,n,r,i){let a=`/v1/saves/${s(e)}/${s(n)}/${s(r)}`;return t.client.delete(a,i?.signal)}async function rn(t,e,n,r){let i=`/v1/showcase/players/${s(e)}/${s(n)}`;return t.client.delete(i,r?.signal)}async function an(t,e,n,r,i){let a=`/v1/inventory/${s(e)}/${s(n)}/recipes/execute`;return t.client.post(a,r,i?.signal,{...i?.ifMatch===void 0?{}:{ifMatch:i.ifMatch}})}async function on(t,e,n,r,i,a){let o=`/v1/saves/${s(e)}/${s(n)}/${s(r)}/finalize`;return t.client.post(o,i,a?.signal)}async function sn(t,e,n){let r=`/v1/characters/${s(e)}`;return t.client.get(r,n?.signal)}async function ln(t,e,n,r,i){let a=`/v1/settings/${s(e)}/${s(n)}/${s(r)}`;return t.client.getWithEtag(a,{...i?.signal===void 0?{}:{signal:i.signal},...i?.ifNoneMatch===void 0?{}:{ifNoneMatch:i.ifNoneMatch}})}async function dn(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 a=i.toString(),o=`/v1/inventory/${s(e)}/${s(n)}`+(a?`?${a}`:"");return t.client.get(o,r?.signal)}async function un(t,e,n,r,i){let a=`/v1/inventory/${s(e)}/${s(n)}/items/${s(r)}`;return t.client.get(a,i?.signal)}async function cn(t,e,n,r,i){let a=new URLSearchParams;i?.bucket_1!==void 0&&a.set("bucket_1",String(i?.bucket_1)),i?.bucket_2!==void 0&&a.set("bucket_2",String(i?.bucket_2)),i?.limit!==void 0&&a.set("limit",String(i?.limit)),i?.periods_back!==void 0&&a.set("periods_back",String(i?.periods_back)),i?.period!==void 0&&a.set("period",String(i?.period)),i?.player_id!==void 0&&a.set("player_id",String(i?.player_id));let o=a.toString(),l=`/v1/leaderboards/${s(e)}/${s(n)}/${s(r)}`+(o?`?${o}`:"");return t.client.get(l,i?.signal)}async function pn(t,e,n,r,i){let a=`/v1/inventory/${s(e)}/${s(n)}/orders/${s(r)}`;return t.client.get(a,i?.signal)}async function gn(t,e,n,r,i){let a=`/v1/inventory/${s(e)}/${s(n)}/progressions/${s(r)}`;return t.client.get(a,i?.signal)}async function mn(t,e,n,r,i,a){let o=`/v1/inventory/${s(e)}/${s(n)}/catalogs/${s(r)}/recipes/${s(i)}/availability`;return t.client.get(o,a?.signal)}async function yn(t,e,n,r){let i=new URLSearchParams;i.set("limit",String(r?.limit));let a=i.toString(),o=`/v1/inventory/${s(e)}/${s(n)}/recipe-usage`+(a?`?${a}`:"");return t.client.get(o,r?.signal)}async function Ae(t,e,n,r,i){let a=`/v1/saves/${s(e)}/${s(n)}/${s(r)}`;return t.client.getWithEtag(a,{...i?.signal===void 0?{}:{signal:i.signal},...i?.ifNoneMatch===void 0?{}:{ifNoneMatch:i.ifNoneMatch}})}async function fn(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)),n?.periods_back!==void 0&&r.set("periods_back",String(n?.periods_back)),n?.period!==void 0&&r.set("period",String(n?.period)),n?.player_id!==void 0&&r.set("player_id",String(n?.player_id));let i=r.toString(),a=`/v1/leaderboards/${s(e)}/friends`+(i?`?${i}`:"");return t.client.get(a,n?.signal)}async function hn(t,e,n){let r=`/v1/showcase/friends/${s(e)}`;return t.client.get(r,n?.signal)}async function _n(t,e,n){let r=`/v1/inbox/friend-challenges/${s(e)}`;return t.client.get(r,n?.signal)}async function bn(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)),n?.periods_back!==void 0&&r.set("periods_back",String(n?.periods_back)),n?.period!==void 0&&r.set("period",String(n?.period)),n?.player_id!==void 0&&r.set("player_id",String(n?.player_id));let i=r.toString(),a=`/v1/leaderboards/${s(e)}`+(i?`?${i}`:"");return t.client.get(a,n?.signal)}async function Rn(t,e){let n=`/v1/games/${s(t.gameId())}/players/me/earn-allowance`;return t.client.get(n,e?.signal)}async function le(t,e){return t.client.get("/v1/inventory/players/me/platform-currencies",e?.signal)}async function wn(t,e,n){let r=`/v1/profiles/players/${s(e)}`;return t.client.get(r,n?.signal)}async function xn(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 vn(t,e,n,r){let i=`/v1/showcase/players/${s(e)}/${s(n)}`;return t.client.get(i,r?.signal)}async function kn(t,e){return t.client.get("/v1/characters/slots",e?.signal)}async function Sn(t,e,n){let r=`/v1/inventory/transfers/${s(e)}`;return t.client.get(r,n?.signal)}async function An(t,e,n){let r=`/v1/games/${s(t.gameId())}/analytics/events`;return t.client.post(r,e,n?.signal,{...n?.keepalive===void 0?{}:{keepalive:n.keepalive},replaySafe:true})}async function Pn(t,e,n){return t.client.post("/v1/inventory/transfers",e,n?.signal)}async function On(t,e,n,r,i){let a=`/v1/inventory/${s(e)}/${s(n)}/platform-funded-game-inventory-purchases`;return t.client.post(a,r,i?.signal)}async function Cn(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 In(t,e){return t.client.get("/v1/characters",e?.signal)}async function Tn(t,e,n,r){let i=`/v1/settings/${s(e)}/${s(n)}`;return t.client.get(i,r?.signal)}async function En(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 a=i.toString(),o=`/v1/inventory/${s(e)}/${s(n)}/orders`+(a?`?${a}`:"");return t.client.get(o,r?.signal)}async function Gn(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 a=i.toString(),o=`/v1/saves/${s(e)}/${s(n)}`+(a?`?${a}`:"");return t.client.get(o,r?.signal)}async function Ln(t,e){let n=new URLSearchParams;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/inbox/friend-challenges"+(r?`?${r}`:"");return t.client.get(i,e?.signal)}async function qn(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 $n(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 Fn(t,e,n){let r=`/v1/inbox/friend-challenges/${s(e)}/answered`;return t.client.post(r,void 0,n?.signal)}async function Mn(t,e,n,r,i,a){let o=`/v1/inventory/${s(e)}/${s(n)}/progressions/${s(r)}/max`;return t.client.post(o,i,a?.signal)}async function jn(t,e,n,r,i,a){let o=`/v1/settings/${s(e)}/${s(n)}/${s(r)}`;return t.client.put(o,i,a?.signal,{...a?.ifMatch===void 0?{}:{ifMatch:a.ifMatch}})}async function Bn(t,e,n,r,i){let a=`/v1/showcase/players/${s(e)}/${s(n)}`;return t.client.put(a,r,i?.signal)}async function Nn(t,e,n){let r=`/v1/inventory/transfers/${s(e)}/reject`;return t.client.post(r,void 0,n?.signal)}async function Dn(t,e,n,r){let i=`/v1/characters/${s(e)}`;return t.client.patch(i,n,r?.signal)}async function Un(t,e,n,r,i,a){let o=`/v1/saves/${s(e)}/${s(n)}/${s(r)}/upload-url`;return t.client.post(o,i,a?.signal,{replaySafe:true})}async function Vn(t,e,n,r,i,a){let o=`/v1/inventory/${s(e)}/${s(n)}/progressions/${s(r)}/reset`;return t.client.post(o,i,a?.signal)}async function Wn(t,e,n){let r=`/v1/characters/${s(e)}`;return t.client.delete(r,n?.signal)}var $t="gem_";function Hn(t){return t.startsWith($t)}var Jn=1e4,zn=50,jt=500,Bt=65536-4*1024,Nt=24*1024;function Kn(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 Yn=t=>typeof t=="number"?t:0,Dt=t=>typeof t=="string"?t:"";function Pe(t=0){return {accepted:0,rejected:[],dropped:t,duplicate:false}}function Ut(t,e){let n=t??{},r=Array.isArray(n.rejected)?n.rejected.map(i=>{let a=i??{};return {index:Yn(a.index),code:Dt(a.code)}}):[];return {accepted:Yn(n.accepted),rejected:r,dropped:e,duplicate:n.duplicate===true}}function Oe(){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 Vt(t){return t?.retryable===true}var j=class{#e;#t;#a;#y;#n=[];#f={};#o=0;#s=null;#h=false;#_=false;#b=false;#r=false;#R=null;#l=null;#d=false;#i=false;#p=false;#w=false;#x=false;constructor(e){this.#e=e,this.#t=e.options?.enabled!==false,this.#a=Math.max(Jn,e.options?.flushIntervalMs??Jn),this.#y=Math.max(1,Math.floor(e.options?.maxQueue??jt));}track(e,n={}){if(!(!this.#t||this.#r)){if(Hn(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,Kn({...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 Pe();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.")),Pe();if(this.#k(),this.#n.length===0)return Pe();let r=e.keepalive===true;this.#c();let i=this.#n.splice(0,this.#A(r)),a=this.#o;this.#o=0;let o=Math.round(this.#e.clock.now()),l={batch_id:Oe(),sent_at_ms:o,events:i.map(c=>Qn(c,o))},d={client:this.#e.client(),gameId:()=>n};this.#b=true;try{let c=await An(d,l,{...e.signal===void 0?{}:{signal:e.signal},...r?{keepalive:!0}:{}}),g=Ut(c,a);return this.#P(g),g}catch(c){throw Vt(c)?this.#S(i,a):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,Kn(n));}hold(){this.#r||this.#l!==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.#l=e,this.#d=false,this.#n.unshift({uid:Oe(),name:"gem_session_start",atMs:e,dimensions:{},measures:{}})),this.#n.length>=zn?this.#g():this.#n.length>0&&this.#u();}get held(){return this.#i}startSession(){if(!(this.#r||this.#l!==null)){if(this.#i){this.#p=true;return}this.#l=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.#l;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:Oe(),name:e,atMs:this.#e.clock.now(),dimensions:r,measures:i}),this.#n.length>=zn?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?Nt:Bt,r=Math.min(this.#n.length,100),i=128;for(let a=0;a<r;a+=1){let o=this.#n[a];if(o===void 0)break;if(i+=JSON.stringify(Qn(o,0)).length+1,i>n)return Math.max(1,a)}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.#a));}#c(){this.#s!==null&&(this.#e.clock.clearTimeout(this.#s),this.#s=null);}#k(){let e=this.#C();e===null||e===""||(this.#R!==null&&this.#R!==e&&(this.#n=[],this.#o=0,this.#l=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}). `+Wt(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}}#C(){try{return this.#e.playerId()}catch{return null}}};function Qn(t,e){return {event_uid:t.uid,name:t.name,offset_ms:Math.round(t.atMs)-e,dimensions:t.dimensions,measures:t.measures}}function Wt(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 Ht(t,e){return e!==void 0?!e:t==="chain_exhausted"}var de=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 a=Jt(i),o=i?.retryable;throw n===this.generation&&this.enter(Ht(a,typeof o=="boolean"?o:void 0)?"lost":"degraded",a),i instanceof R?i:new R(a,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 Jt(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}},T=["if-match","if-none-match"],Xn=4096;function zt(t){if(!t)return;let e={};for(let[n,r]of Object.entries(t)){let i=n.toLowerCase();if(!T.includes(i)||r===void 0)continue;let a=typeof r=="string"?Kt(r):r;if(typeof a!="string"||a.length>Xn||!Yt(a))throw new h(`the ${i} header value cannot be sent \u2014 it is not a string, is longer than ${Xn} characters, or contains a character outside the range an HTTP header value may carry. This is a malformed request, not a server failure; the value is withheld here rather than written to logs.`);a!==""&&(e[i]=a);}return Object.freeze(e)}function Kt(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 Yt(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 Qt(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 Zn(t,e){let n=e.replayUnauthorizedOnce??true;return {async request(r){let i={...r},a=zt(i.headers),o=Qt(i),l=Object.freeze({...i,headers:a,...o===void 0?{}:{bytes:o}}),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 ue(t){let e=typeof t=="string"?new TextEncoder().encode(t):t;return btoa(Xt(e))}function et(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 Ce(t){return new TextDecoder().decode(et(t))}function Xt(t){let n="";for(let r=0;r<t.length;r+=32768)n+=String.fromCharCode(...t.subarray(r,r+32768));return n}var y=class extends Error{constructor(n,r,i,a,o){super(`${n} (${r}): ${i}`);this.reason=n;this.status=r;this.detail=i;this.retryAfterSeconds=a;this.code=o;this.name="GemApiError";}reason;status;detail;retryAfterSeconds;code;get retryable(){return this.reason==="unavailable"||this.reason==="rate_limited"}},Zt=new WeakMap;var er=new Set([408,429,500,502,503,504]),nr=6e4;function tr(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,...B(i)},i.replaySafe===true)}async post(e,n,r,i={}){return this.send({method:"POST",path:e,body:n,signal:r,...B(i)},i.replaySafe===true)}async postBytes(e,n,r,i={}){let a=await this.sendRaw({method:"POST",path:e,bytes:n,responseType:"bytes",signal:r,...B(i)},i.replaySafe===true);return {bytes:rr(a.body),...a.invocationId===void 0?{}:{invocationId:a.invocationId}}}async patch(e,n,r,i={}){return this.send({method:"PATCH",path:e,body:n,signal:r,...B(i)},i.replaySafe===true)}async delete(e,n,r={}){return this.send({method:"DELETE",path:e,signal:n,...B(r)},r.replaySafe===true)}async send(e,n){return (await this.sendRaw(e,n)).body}async sendRaw(e,n){let r=n?tr(this.options.maxRetries)+1:1,i=null;if(e.signal?.aborted)throw nt(e.signal);for(let a=0;a<r;a++){if(a>0&&await this.backoff(a,i,e.signal),e.signal?.aborted)throw nt(e.signal);let o;try{o=await this.options.transport.request(e);}catch(d){if(R.isAuthError(d)||h.isRefusal(d)||e.signal?.aborted||ir(d))throw d;i=new y("unavailable",0,String(d));continue}if(o.status>=200&&o.status<300||o.status===304)return o;let l=ar(o);if(!er.has(o.status))throw l;i=l;}throw i??new y("unavailable",0,"no attempt was made")}backoff(e,n,r){if(r?.aborted)return Promise.resolve();let i=n?.retryAfterSeconds,a=i!==void 0?i*1e3:2**(e-1)*250,o=2**(e-1)*250,l=Math.min(Math.max(a,o),nr);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 rr(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 B(t){return {...t.keepalive===void 0?{}:{keepalive:t.keepalive},...t.ifMatch===void 0?{}:{headers:{"if-match":t.ifMatch}}}}function nt(t){return t.reason!==void 0?t.reason:new DOMException("The operation was aborted.","AbortError")}function ir(t){let e=t?.name;return e==="AbortError"||e==="TimeoutError"}function ar(t){let e=sr(t),n=dr(t.body),r={...n===void 0?{}:{details:n},...t.invocationId===void 0?{}:{invocationId:t.invocationId}};return Object.keys(r).length>0&&Zt.set(e,r),e}var or=new Map([["insufficient_funds","insufficient_funds"]]);function sr(t){let{status:e,body:n}=t,r=lr(n),i=t.retryAfterSeconds??cr(n),a=ur(n),o=a===void 0?void 0:or.get(a);if(o!==void 0)return new y(o,e,r,void 0,a);switch(e){case 304:return new y("not_modified",e,r);case 400:case 422:return new y("invalid",e,r,void 0,a);case 403:return new y("forbidden",e,r,void 0,a);case 404:return new y("not_found",e,r,void 0,a);case 402:return new y("insufficient_funds",e,r,void 0,a);case 409:return new y("conflict",e,r,void 0,a);case 412:return new y("precondition_failed",e,r,void 0,a);case 413:return new y("too_large",e,r,void 0,a);case 429:return new y("rate_limited",e,r,i,a);default:return new y("unavailable",e,r,i,a)}}function lr(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 dr(t){let n=t?.error?.details;return n===null?void 0:n}function ur(t){let n=t?.error?.code;return typeof n=="string"&&n.length>0?n:void 0}function cr(t){let e=t?.retryAfterSeconds;return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function pr(t){let e=t.lastIndexOf("@");return (e===-1?t:`***@${t.slice(e+1)}`).slice(0,200)}var gr=new Set(T);function mr(t){if(!t)return {};let e={};for(let[n,r]of Object.entries(t))gr.has(n.toLowerCase())&&(e[n.toLowerCase()]=r);return e}function tt(t){let e=t.fetch??globalThis.fetch.bind(globalThis);return Zn(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 a;try{a=new URL(i.href.replace(/\/+$/,"")+n.path);}catch{throw new h(`${JSON.stringify(typeof n.path=="string"?pr(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(a.protocol!==i.protocol||a.host!==i.host)throw new h(`${JSON.stringify(a.pathname)} resolves to ${a.protocol}//${a.host}, not ${i.protocol}//${i.host}. A request path may not change the request's origin \u2014 it carries the play token.`);if(a.username!==""||a.password!==""){let m=i.username!==""||i.password!=="",S=a.username!==i.username||a.password!==i.password,Se=m?S?"baseUrl (and possibly the request path)":"baseUrl":"request path";throw new h(`the ${Se} puts credentials in the URL, which cannot be fetched (${n.method} ${a.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??{}))a.searchParams.has(m)||a.searchParams.set(m,S);let o=n.bytes,l=n.bytes===void 0?void 0:"application/octet-stream";try{n.body!==void 0&&(o=JSON.stringify(n.body),l="application/json");}catch(m){throw new h(`the body of ${n.method} ${JSON.stringify(a.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(a.toString(),{method:n.method,headers:{authorization:`Bearer ${r}`,...l===void 0?{}:{"content-type":l},...mr(n.headers)},body:o,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=yr(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 yr(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 rt=400,x=t=>typeof t=="string"?t:"",fr=/(?:Z|[+-]\d{2}:?\d{2})$/i;function O(t){let e=x(t);if(!fr.test(e))return 0;let n=Date.parse(e);return Number.isFinite(n)?Math.floor(n/1e3):0}var hr=/^[0-9a-f]{1,64}$/,_r=/^[0-9a-f]{16}$/,br=/^[A-Za-z][A-Za-z0-9_+\-/]{0,63}$/,Rr=/^(?:[01]\d|2[0-3]):[0-5]\d$/;function Ie(t){let e=x(t),n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!n)return;let[r,i,a]=[Number(n[1]),Number(n[2]),Number(n[3])],o=new Date(Date.UTC(r,i-1,a));return o.getUTCFullYear()===r&&o.getUTCMonth()===i-1&&o.getUTCDate()===a?e:void 0}var wr=4096,xr=new TextEncoder;function vr(t){let e=x(t.challenge_data),n=x(t.challenge_data_hash);return e===""||!_r.test(n)?{}:xr.encode(e).length>wr?{}:{data:e,dataHash:n}}function kr(t){let e=t??{},n=O(e.period_start_at),r=O(e.period_ends_at);if(n===0||r===0)return;let i=x(e.slug),a=x(e.seed),o=Ie(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,...o===void 0?{}:{periodLocalDate:o},boundary:br.test(l)?l:"",resetTime:Rr.test(d)?d:"",seed:hr.test(a)?a:"",...vr(e)}}function ce(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 it(t){let e=t??{};return Array.isArray(e.challenges)?e.challenges.map(kr).filter(n=>n!==void 0):[]}var D=class{#e;constructor(e){this.#e=e;}async list(e={}){let{periodsBack:n}=e;ce(n);let r=await Cn(this.#e,{...n===void 0?{}:{periods_back:n},...e.signal===void 0?{}:{signal:e.signal}});return it(r)}};var Sr="gem-web-bridge";var E=65536,at=8,pe=5e3,ot=1024;function st(t){return Object.freeze(Object.assign(Object.create(null),t))}st({"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.controlsDeclare":60,"gem.menu":60,"gem.menuSelect":60,"gem.requestShare":6,"gem.requestAvatarPicker":6,"gem.vibrate":600,"gem.frameStats":120,"gem.portraitBorders":60,"gem.error":60,"gem.requestPurchase":12,"gem.purchaseResult":30,"gem.deviceSettings.put":30,"gem.deviceSettings.result":30,"gem.requestAd":6,"gem.adResult":12,"gem.requestSignIn":6,"gem.signInResult":12,"gem.requestFriendChallenge":12,"gem.friendChallengeResult":30,__malformed:60});st({"gem.requestAd":"ads","gem.adResult":"ads","gem.requestSignIn":"signIn","gem.signInResult":"signIn","gem.requestPurchase":"purchases","gem.purchaseResult":"purchases","gem.requestFriendChallenge":"friendChallenges","gem.friendChallengeResult":"friendChallenges","gem.devtools":"devtools","gem.screenshot":"screenshot","gem.screenshot.denied":"screenshot","gem.requestContext":"feedbackContext","gem.gameContext":"feedbackContext","gem.roomEvent":"rooms","gem.signal":"p2p","gem.signalEvent":"p2p","gem.dedicatedOffer":"dedicated","gem.dedicatedEvent":"dedicated","gem.clusterTarget":"clusterTarget","gem.partyRequest":"parties","gem.partyResult":"parties","gem.autoStartFailedEvent":"autoStartFailure","gem.seatedEvent":"partySeating","gem.socketState":"socketState","gem.audioState":"audioState","gem.rewardCue":"rewardCue","gem.frameStats":"frameStats","gem.portraitBorders":"portraitBorders","gem.engaged":"engagement","gem.viewport":"viewport","gem.walletDisplay":"walletDisplay","gem.requestLocalServer":"localHost","gem.localServer":"localHost","gem.localServer.denied":"localHost","gem.cohorts":"cohorts","gem.earnAllowanceChanged":"earnAllowance","gem.deviceSettings":"deviceSettings","gem.deviceSettings.put":"deviceSettings","gem.deviceSettings.result":"deviceSettings","gem.requestShare":"share","gem.requestAvatarPicker":"avatarPicker","gem.vibrate":"vibration","gem.menu":"gameMenu","gem.menuSelect":"gameMenu","gem.controlsDeclare":"controls"});function Pr(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 Or(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 Cr(t){return /^[a-z]{2,8}(-[a-z0-9]{1,8})*$/i.test(t)}function Ir(t){return /^[a-z_]+$/.test(t)}function Te(t,e,n){if(e>at)return `nesting deeper than ${at}`;if(++n.nodes>pe)return `more than ${pe} 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>ot)return `an array of ${t.length} entries, over the ${ot} limit`;n.bytes+=2;for(let l of t){let d=Te(l,e+1,n);if(d)return d}return null}let a=Object.getPrototypeOf(t);if(a!==Object.prototype&&a!==null)return "a value that is not a plain object";n.bytes+=2;let o=t;for(let l in o){if(!Object.prototype.hasOwnProperty.call(o,l))continue;if(++n.nodes>pe)return `more than ${pe} values`;if(n.bytes+=l.length*3+4,n.bytes>E)return `over the ${E} byte limit`;let d=Te(o[l],e+1,n);if(d)return d}return null}function Tr(t){let e={nodes:0,bytes:0,seen:new Set},n=Te(t,0,e);return n?`message contains ${n}`:e.bytes>E?`message is over the ${E} byte limit`:null}var Er={origin:[Pr,"not a well-formed origin"],url:[Or,"not a safe absolute http(s) URL"],bcp47:[Cr,"not a well-formed BCP 47 tag"],code:[Ir,"not a code of lower-case letters and underscores"]};function lt(t,e,n){for(let r of e){let i=n===""?r.n:`${n}.${r.n}`,a=t[r.n];if(a==null){if(r.o)continue;return `${i}: required`}let o=dt(a,r,i);if(o)return o}return null}function dt(t,e,n){switch(e.k){case "s":{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]=Er[e.f];if(!r(t))return `${n}: ${i}`}return null}case "i":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 "b":return typeof t=="boolean"?null:`${n}: expected boolean`;case "e":{let r=e.v;return r.includes(t)?null:`${n}: not one of ${r.join("|")}`}case "o":return typeof t!="object"||t===null||Array.isArray(t)?`${n}: expected object`:lt(t,e.fs,n);case "j":return typeof t!="object"||t===null||Array.isArray(t)?`${n}: expected a plain object`:null;case "a":{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 a of t){if(a==null){if(r.o)continue;return `${i}: required`}let o=dt(a,r,i);if(o)return o}return null}default:{let r=e.k;return `${n}: unknown kind ${String(r)}`}}}var ut=Object.create(null);function u(t,e){return ut[t]=n=>{let r=Tr(n);if(r)return r;if(typeof n!="object"||n===null||Array.isArray(n))return "message: expected object";let i=n;return i.gem!==Sr?"gem: wrong protocol marker":i.type!==t?`type: expected ${t}`:lt(i,e,"")}}u("gem.handshake",[{n:"versions",k:"o",fs:[{n:"min",k:"i",lo:1,hi:1e3},{n:"max",k:"i",lo:1,hi:1e3}]},{n:"capabilities",k:"a",o:1,max:64,it:{n:"",k:"s",max:64}},{n:"embedder",k:"s",max:2048,f:"origin"},{n:"unbidden",k:"b",o:1}]);u("gem.handshake.accept",[{n:"v",k:"i",lo:1,hi:1e3},{n:"capabilities",k:"a",o:1,max:64,it:{n:"",k:"s",max:64}}]);u("gem.token",[{n:"token",k:"s",max:4096},{n:"requestId",k:"s",o:1,max:64},{n:"generation",k:"i",lo:0,hi:2147483647},{n:"apiBaseUrl",k:"s",o:1,max:512,f:"url"},{n:"playerId",k:"s",max:64},{n:"gameId",k:"s",max:64},{n:"channel",k:"e",v:["dev","test","release"]},{n:"gameVersion",k:"s",o:1,max:64},{n:"expiresAt",k:"i",lo:0,hi:4102444800},{n:"chainEndsAt",k:"i",lo:0,hi:4102444800},{n:"allowDevTools",k:"b",o:1}]);u("gem.token.denied",[{n:"requestId",k:"s",max:64},{n:"retryable",k:"b"},{n:"retryAfterMs",k:"i",o:1,lo:0,hi:36e5},{n:"reason",k:"e",v:["chain_exhausted","unavailable"]},{n:"correlationId",k:"s",max:64}]);u("gem.player",[{n:"untrusted",k:"o",fs:[{n:"displayName",k:"s",max:64},{n:"displayTag",k:"s",o:1,max:80},{n:"displayHandle",k:"s",max:80}]},{n:"playerId",k:"s",o:1,max:64},{n:"discriminator",k:"s",o:1,max:8},{n:"avatarIconUrl",k:"s",o:1,max:2048,f:"url"},{n:"avatarIconId",k:"s",o:1,max:64},{n:"avatar3dId",k:"s",o:1,max:64},{n:"avatar3dModelUrl",k:"s",o:1,max:2048,f:"url"},{n:"avatar3dIconUrl",k:"s",o:1,max:2048,f:"url"},{n:"badges",k:"a",o:1,max:2,it:{n:"",k:"o",fs:[{n:"itemId",k:"s",max:64},{n:"iconUrl",k:"s",max:2048,f:"url"}]}},{n:"displayTag",k:"s",max:8},{n:"avatarUrl",k:"s",o:1,max:2048,f:"url"},{n:"boost",k:"o",o:1,fs:[{n:"multipliers",k:"a",max:8,it:{n:"",k:"o",fs:[{n:"currencyId",k:"s",max:64},{n:"currencySlug",k:"s",max:32},{n:"multiplierBp",k:"i",lo:1e4,hi:1e6}]}},{n:"expiresInDays",k:"i",o:1,lo:1,hi:7}]}]);u("gem.pause",[{n:"paused",k:"b"}]);u("gem.prefs",[{n:"reducedMotion",k:"b"},{n:"muted",k:"b"},{n:"showFrameStats",k:"b",o:1},{n:"locale",k:"s",max:35,f:"bcp47"},{n:"recommended",k:"o",o:1,fs:[{n:"volume",k:"i",lo:0,hi:100},{n:"batterySaver",k:"b"},{n:"keyboardLayout",k:"e",v:["wasd","arrows"]},{n:"gamepadConfirm",k:"e",v:["south","east"]},{n:"vibration",k:"b"},{n:"lookSensitivity",k:"i",o:1,lo:20,hi:400},{n:"gamepadLookSensitivity",k:"i",o:1,lo:20,hi:400},{n:"invertLookY",k:"b",o:1},{n:"touchMovement",k:"s",o:1,max:16,f:"code"},{n:"graphicsQuality",k:"s",o:1,max:16,f:"code"},{n:"graphicsQualityAuto",k:"b",o:1}]}]);u("gem.cohorts",[{n:"cohorts",k:"a",max:8,it:{n:"",k:"o",fs:[{n:"experimentId",k:"s",max:36},{n:"variantKey",k:"s",max:32}]}}]);u("gem.earnAllowanceChanged",[]);u("gem.viewport",[{n:"insets",k:"o",fs:[{n:"top",k:"i",lo:0,hi:4096},{n:"right",k:"i",lo:0,hi:4096},{n:"bottom",k:"i",lo:0,hi:4096},{n:"left",k:"i",lo:0,hi:4096}]},{n:"reserved",k:"a",o:1,max:4,it:{n:"",k:"o",fs:[{n:"x",k:"i",lo:0,hi:16384},{n:"y",k:"i",lo:0,hi:16384},{n:"width",k:"i",lo:0,hi:16384},{n:"height",k:"i",lo:0,hi:16384}]}}]);u("gem.deviceSettings",[{n:"settings",k:"j",o:1}]);u("gem.willTerminate",[{n:"reason",k:"e",v:["grant_expiring","session_ended","navigating","kill_switch"]},{n:"graceMs",k:"i",lo:0,hi:6e4}]);u("gem.roomEvent",[{n:"event",k:"e",v:["updated","match_started","match_ready","match_failed","version_stale"]},{n:"roomId",k:"s",max:64},{n:"matchId",k:"s",o:1,max:64},{n:"version",k:"i",o:1,lo:0,hi:2147483647},{n:"reason",k:"s",o:1,max:64},{n:"platform",k:"e",o:1,v:["universal","mobile"]}]);u("gem.socketState",[{n:"connected",k:"b"},{n:"reason",k:"e",o:1,v:["connecting","dropped","watchdog","terminal"]}]);u("gem.seatedEvent",[{n:"roomId",k:"s",max:64}]);u("gem.autoStartFailedEvent",[{n:"roomId",k:"s",max:64},{n:"code",k:"s",max:64}]);u("gem.signalEvent",[{n:"event",k:"e",v:["hello","offer","answer","ice","peerJoined","peerLeft","migration","matchEnded","error"]},{n:"matchId",k:"s",max:64},{n:"data",k:"j"}]);u("gem.dedicatedEvent",[{n:"event",k:"e",v:["answer","error","matchEnded"]},{n:"matchId",k:"s",max:64},{n:"sdp",k:"s",o:1,max:10240},{n:"sessionId",k:"s",o:1,max:64},{n:"code",k:"s",o:1,max:64},{n:"message",k:"s",o:1,max:256},{n:"reason",k:"s",o:1,max:64}]);u("gem.partyResult",[{n:"requestId",k:"s",max:64},{n:"partyId",k:"s",o:1,max:64}]);u("gem.clusterTarget",[{n:"clusterTargetId",k:"s",max:64},{n:"clusterTargetIds",k:"a",o:1,max:3,it:{n:"",k:"s",max:64}}]);u("gem.devtools",[{n:"action",k:"e",v:["open","close","toggle"]}]);u("gem.screenshot",[{n:"maxWidth",k:"i",lo:1,hi:7680},{n:"maxHeight",k:"i",lo:1,hi:4320}]);u("gem.screenshot.denied",[{n:"reason",k:"e",v:["not_wired","no_source","unsupported","unreadable","tainted","too_large","busy","declined","failed"]},{n:"retryable",k:"b"}]);u("gem.requestContext",[]);u("gem.gameContext",[{n:"context",k:"j"}]);u("gem.signal",[{n:"signal",k:"e",v:["join","offer","answer","ice","migrationAck","hostUnreachable"]},{n:"matchId",k:"s",max:64},{n:"data",k:"j"}]);u("gem.dedicatedOffer",[{n:"matchId",k:"s",max:64},{n:"sdp",k:"s",max:10240},{n:"intent",k:"e",v:["initial","ice_restart","full_reconnect"]}]);u("gem.partyRequest",[{n:"requestId",k:"s",max:64}]);u("gem.ready",[]);u("gem.engaged",[]);u("gem.progress",[{n:"loaded",k:"i",lo:0,hi:1099511627776},{n:"total",k:"i",lo:0,hi:1099511627776}]);u("gem.requestToken",[{n:"requestId",k:"s",max:64},{n:"reason",k:"e",v:["initial","expiring","rejected"]}]);u("gem.requestLocalServer",[{n:"requestId",k:"s",max:64},{n:"gameRoomId",k:"s",max:64}]);u("gem.localServer",[{n:"requestId",k:"s",max:64},{n:"serverId",k:"s",o:1,max:128}]);u("gem.localServer.denied",[{n:"requestId",k:"s",max:64},{n:"retryable",k:"b"},{n:"reason",k:"e",v:["refused","unavailable"]}]);u("gem.exit",[{n:"reason",k:"s",o:1,max:64}]);u("gem.openExternal",[{n:"url",k:"s",max:2048,f:"url"}]);u("gem.requestFullscreen",[{n:"enabled",k:"b"}]);u("gem.audioState",[{n:"muted",k:"b"}]);u("gem.rewardCue",[{n:"currencySlug",k:"s",max:32},{n:"expected",k:"i",o:1,lo:1,hi:1e9},{n:"origin",k:"o",o:1,fs:[{n:"x",k:"i",lo:0,hi:16384},{n:"y",k:"i",lo:0,hi:16384}]}]);u("gem.walletDisplay",[{n:"visible",k:"b"},{n:"currencies",k:"a",o:1,max:8,it:{n:"",k:"s",max:64}},{n:"score",k:"b",o:1}]);u("gem.controlsDeclare",[{n:"uses",k:"o",fs:[{n:"lookSensitivity",k:"s",o:1,max:16,f:"code"},{n:"gamepadLookSensitivity",k:"s",o:1,max:16,f:"code"},{n:"invertLookY",k:"s",o:1,max:16,f:"code"},{n:"touchMovement",k:"s",o:1,max:16,f:"code"}]}]);u("gem.menu",[{n:"settings",k:"b"},{n:"items",k:"a",o:1,max:4,it:{n:"",k:"o",fs:[{n:"id",k:"s",max:32},{n:"label",k:"s",max:40}]}}]);u("gem.menuSelect",[{n:"entry",k:"e",v:["settings","item"]},{n:"id",k:"s",o:1,max:32}]);u("gem.requestShare",[{n:"params",k:"a",max:16,it:{n:"",k:"o",fs:[{n:"key",k:"s",max:64},{n:"value",k:"s",max:512}]}}]);u("gem.requestAvatarPicker",[{n:"tab",k:"e",o:1,v:["2d","3d"]}]);u("gem.vibrate",[{n:"pattern",k:"a",max:99,it:{n:"",k:"i",lo:0,hi:1e4}}]);u("gem.frameStats",[{n:"fps",k:"i",lo:0,hi:1e3},{n:"frameTimeP95Ms",k:"i",lo:0,hi:1e5}]);u("gem.portraitBorders",[{n:"name",k:"s",o:1,max:40}]);u("gem.error",[{n:"code",k:"e",v:["version_mismatch","handshake_timeout","handshake_duplicate","invalid_message","rate_limited","token_unavailable","unsupported","unsupported_capability","internal"]},{n:"message",k:"s",o:1,max:256}]);u("gem.requestPurchase",[{n:"requestId",k:"s",max:64},{n:"purchaseKind",k:"e",v:["item","recipe"]},{n:"targetId",k:"s",max:64},{n:"currencySlug",k:"s",max:32},{n:"quantity",k:"i",o:1,lo:1,hi:10},{n:"catalogId",k:"s",o:1,max:64}]);u("gem.purchaseResult",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["ok","declined","unavailable"]},{n:"reason",k:"s",o:1,max:64,f:"code"},{n:"purchaseId",k:"s",o:1,max:64}]);u("gem.deviceSettings.put",[{n:"requestId",k:"s",max:64},{n:"settings",k:"j"}]);u("gem.deviceSettings.result",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["stored","too_large","unavailable"]}]);u("gem.requestAd",[{n:"requestId",k:"s",max:64},{n:"placement",k:"s",max:32},{n:"format",k:"e",v:["interstitial","rewarded"]}]);u("gem.adResult",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["shown","no_ad","unavailable"]}]);u("gem.requestSignIn",[{n:"requestId",k:"s",max:64}]);u("gem.signInResult",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["signed_in","declined","unavailable"]}]);u("gem.requestFriendChallenge",[{n:"requestId",k:"s",max:64},{n:"playerId",k:"s",max:64},{n:"template",k:"s",max:64},{n:"params",k:"j",o:1}]);u("gem.friendChallengeResult",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["accepted","cancelled","refused","unavailable","rate_limited","invalid"]},{n:"code",k:"s",o:1,max:64},{n:"param",k:"s",o:1,max:64},{n:"channel",k:"s",o:1,max:16},{n:"configVersion",k:"i",o:1,lo:0,hi:9007199254740991},{n:"retryAfterMs",k:"i",o:1,lo:0,hi:864e5},{n:"detail",k:"s",o:1,max:300}]);Object.freeze(ut);var G={now:()=>Date.now(),setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)};var U=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,a=i.find(l=>l.currencyId===e),o;return !a&&this.resolveCurrencyId&&(o=await this.resolveCurrencyId(e).catch(()=>{}),o!==void 0&&(a=i.find(l=>l.currencyId===o))),{currencyId:a?a.currencyId:o??e,total:a?a.total:null,...a?.buckets===void 0?{}:{buckets:a.buckets}}}};function Ge(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 ct="inventory",L=t=>typeof t=="number"?t:0,V=t=>typeof t=="string"?t:"";function Ee(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 pt(t){let e=t??{};return {itemDefinitionId:V(e.item_definition_id),instanceId:V(e.instance_id),quantity:L(e.quantity),acquiredAt:L(e.acquired_at),...e.properties===void 0?{}:{properties:e.properties},...e.custom_data===void 0?{}:{customData:e.custom_data}}}function Gr(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0;return {currencies:Ee(e.currencies,r=>{let i=r??{},a=Array.isArray(i.buckets)?i.buckets.map(o=>{let l=o??{};return {bucket:V(l.bucket),balance:L(l.balance)}}):void 0;return {currencyId:V(i.currency_id),total:L(i.total),...a===void 0?{}:{buckets:a}}}),items:Ee(e.items,pt),progressions:Ee(e.progressions,r=>{let i=r??{};return {progressionDefinitionId:V(i.progression_definition_id),currentValue:L(i.current_value),completionCount:L(i.completion_count),isCompleted:i.is_completed===true,...Ge(i)}}),...n===void 0?{}:{etag:n}}}var W=class{constructor(e,n,r){this.api=e;this.entity=n;this.cache=r;}api;entity;cache;snapshot(e={}){let n=e.buckets?`${ct}#buckets`:ct;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 a=r.items.data.filter(o=>o.itemDefinitionId===e);if(a.length>0)return a}let i=await un(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return Array.isArray(i)?i.map(pt):[]}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 dn(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 Gr(n)}};var Lr={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(Lr));var C=class extends RangeError{constructor(n,r){super(r);this.code=n;this.name="PurchaseRefusal";}code;retryable=false};var f=t=>typeof t=="string"?t:"",qr=t=>typeof t=="string"?t:f(t&&typeof t=="object"?t.type:void 0),v=t=>typeof t=="number"?t:0;function $r(t){let e=t??{};return {prerequisiteType:f(e.prerequisite_type),referenceId:f(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:f(e.order_id),status:f(e.status),...n===void 0?{}:{etag:n}}}function ge(){return crypto.randomUUID()}var Fr="recipe-usage",gt=100;function me(t){let e=t??{};switch(e.type){case "currency":return {kind:"currency",currencyId:f(e.currency_id),bucket:f(e.bucket),delta:v(e.delta),balanceAfter:v(e.balance_after)};case "item":return {kind:"item",itemDefinitionId:f(e.item_definition_id),instanceId:f(e.instance_id),delta:v(e.delta),quantityAfter:v(e.quantity_after)};case "progression":return {kind:"progression",progressionDefinitionId:f(e.progression_definition_id),delta:v(e.delta),valueAfter:v(e.value_after),completed:e.completed===true};default:return {kind:"other",type:f(e.type)}}}function Mr(t){let e=t??{},n=typeof e.rarity_tier=="string"?e.rarity_tier:void 0;return {entryId:f(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(me):[]}}function jr(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0,r=Array.isArray(e.loot_results)?e.loot_results.map(Mr):void 0;return {orderId:f(e.order_id),status:f(e.status),...n===void 0?{}:{etag:n},granted:Array.isArray(e.granted)?e.granted.map(me):[],consumed:Array.isArray(e.consumed)?e.consumed.map(me):[],autoClaimedRewards:Array.isArray(e.auto_claimed_rewards)?e.auto_claimed_rewards.map(me):[],...r===void 0||r.length===0?{}:{lootResults:r}}}function Br(t){let e=t??{},n=e.price??{};return {payment:"platform_currency",orderId:f(e.target_order_id)||f(e.source_order_id),status:f(e.status),purchaseId:f(e.purchase_id),sourceOrderId:f(e.source_order_id),price:{currencyId:f(n.platform_currency_id),amount:v(n.price)}}}function Nr(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:f(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 mt(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 J=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(()=>en(this.api,this.entity.type,this.entity.id,{operations:e.map(mt),source:n.source??"play",nonce:ge()},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}));return H(r)}async createMany(e,n={}){return this.write(()=>Ze(this.api,this.entity.type,this.entity.id,{orders:e.map(r=>({operations:r.map(mt),nonce:ge()})),source:n.source??"play"},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}))}async recipeAvailability(e,n,r){let a=await mn(this.api,this.entity.type,this.entity.id,e,n,r===void 0?{}:{signal:r})??{},o=typeof a.uses_remaining=="number"?a.uses_remaining:void 0,l=typeof a.cooldown_expires_at=="string"?a.cooldown_expires_at:void 0,d=Array.isArray(a.lock_reasons)?a.lock_reasons.map($r):[];return {canExecute:a.can_execute===true,locked:a.locked===true||d.length>0,lockReasons:d,reasons:Array.isArray(a.reasons)?a.reasons.map(c=>qr(c)):[],...o===void 0?{}:{usesRemaining:o},...l===void 0?{}:{cooldownExpiresAt:l}}}async recipeUsageAll(){return this.cache.read(Fr,[],async()=>{let n=await yn(this.api,this.entity.type,this.entity.id,{limit:gt})??{},r=Array.isArray(n.usages)?n.usages:[];return {usages:r.map(Nr),truncated:r.length>=gt}})}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(()=>an(this.api,this.entity.type,this.entity.id,{catalog_id:p.catalogId,recipe_id:p.targetId,game_id:this.api.gameId(),nonce:ge()},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}));return {payment:"configured",...jr(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([xn(this.api,n.signal===void 0?{}:{signal:n.signal}),le(this.api,n.signal===void 0?{}:{signal:n.signal})]),a=e.payment.currencySlug.toLowerCase(),o=i.currencies.find(p=>p.currency_id.toLowerCase()===a||p.slug.toLowerCase()===a);if(o===void 0){let p=i.currencies.map(b=>b.slug);throw new C("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 C("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===o.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 C("no_price_in_currency",`purchase target ${JSON.stringify(e.targetId)} has no ${o.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 C("quantity_invalid","item purchase quantity must be an integer from 1 through 10");let g=await this.write(()=>On(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:o.currency_id,price:d.price*c},expected_config_version:r.config_version,nonce:ge(),confirmation:"none"},n.signal===void 0?{}:{signal:n.signal}));return Br(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(()=>Ke(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(()=>Mn(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(()=>Qe(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(()=>Vn(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 Le=t=>typeof t=="string"?t:"",Dr=t=>typeof t=="number"?t:0;function yt(t){let e=t??{};return {orderId:Le(e.order_id),status:Le(e.status),source:Le(e.source),createdAt:Dr(e.created_at)}}var z=class{constructor(e,n){this.api=e;this.entity=n;}api;entity;async list(e={}){let r=await En(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(yt):[],...i===void 0?{}:{nextCursor:i}}}async get(e,n){let r=await pn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return yt(r)}};var ft=t=>typeof t=="number"?t:0,Ur=t=>typeof t=="string"?t:"";function Vr(t){let e=t??{};return {progressionDefinitionId:Ur(e.progression_definition_id),currentValue:ft(e.current_value),completionCount:ft(e.completion_count),isCompleted:e.is_completed===true,...Ge(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(a=>a.progressionDefinitionId===e);if(i&&i.achievementsUnavailable!==true)return i;try{let a=await gn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return Vr(a)}catch{return i??null}}};var ye=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 a=n.length===0,o=a?e:e+"\0"+n.join("\0"),l=this.slots.get(o);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(o,d);let c=this.generation,g=r().then(p=>(a&&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(o)===d&&this.slots.delete(o));});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 Wr(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 qe(t){try{let e=Wr(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},Hr=3e4,ht="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",Jr=/^[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(!Jr.test(t)||t.startsWith("_"))throw new TypeError(`${JSON.stringify(t)} is not a usable save key: ${e}.`);return t}function _t(t,e){let n=new AbortController,r=AbortSignal.timeout(e),i=()=>n.abort(r.reason),a=()=>n.abort(t?.reason);return t?.aborted?n.abort(t.reason):(r.addEventListener("abort",i,{once:true}),t?.addEventListener("abort",a,{once:true})),{signal:n.signal,release:()=>{r.removeEventListener("abort",i),t?.removeEventListener("abort",a);}}}function $e(t,e){return t.aborted&&e?.aborted!==true}var zr=new Set(["x-ms-blob-type"]),Kr=/^[ -~]+$/;function Yr(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 a=r.toLowerCase();if(!zr.has(a))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"||!Kr.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(a in n)throw new _("save_malformed",`the grant for save ${JSON.stringify(e)} named ${JSON.stringify(a)} twice.`);n[a]=i;}return n}function Fe(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 Me(t){return t?.reason==="not_found"}var Y=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(a){throw new _("save_malformed",`save ${JSON.stringify(e)} could not be serialised to JSON: ${String(a)}. 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",a=this.budget(r.timeoutMs),o=_t(r.signal,a);try{let l=await Un(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:o.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=Yr(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:o.signal});}catch(p){throw $e(o.signal,r.signal)?this.timeout("upload",a):new _("upload_failed",`${ht} for PUT. Underlying error: ${p}`)}if(!c.ok){let p=await qe(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 Fe(await on(this.api,this.entity.type,this.entity.id,k(e),{session_id:l.session_id},{signal:o.signal}))}catch(l){throw this.rethrow(l,r.signal,o.signal,"save",a)}finally{o.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=_t(n.signal,r);try{let a;try{let d=await Ae(this.api,this.entity.type,this.entity.id,k(e),{signal:i.signal});if(!d.modified)return null;a=d.body;}catch(d){if(Me(d))return null;throw d}if(typeof a.download_url!="string")throw new _("save_malformed",`the record for save ${JSON.stringify(e)} named no link to its stored bytes.`);let o=this.options.fetch??globalThis.fetch.bind(globalThis),l;try{l=await o(a.download_url,{credentials:"omit",signal:i.signal});}catch(d){throw $e(i.signal,n.signal)?this.timeout("download",r):new _("download_failed",`${ht} for GET. Underlying error: ${d}`)}if(!l.ok){let d=await qe(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(a){throw this.rethrow(a,n.signal,i.signal,"load",r)}finally{i.release();}}async describe(e,n={}){try{let r=await Ae(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?Fe(r.body):null}catch(r){if(Me(r))return null;throw r}}async list(e={}){let n=await Gn(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(Fe),...typeof r=="string"&&r.length>0?{nextCursor:r}:{}}}async delete(e,n){try{await tn(this.api,this.entity.type,this.entity.id,k(e),{...n===void 0?{}:{signal:n}});}catch(r){if(!Me(r))throw r}}budget(e){return e??this.options.timeoutMs??Hr}timeout(e,n){return new _("save_timeout",`the save ${e} did not finish within ${n}ms`)}rethrow(e,n,r,i,a){return e instanceof _?e:$e(r,n)?this.timeout(i,a):e}};function Qr(t){try{return Ce(t)}catch{return t}}function je(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"?Qr(n.value):"",...r===void 0?{}:{etag:r},updatedAt:typeof n.updated_at=="number"?n.updated_at:0}}var Q=class{constructor(e,n){this.api=e;this.entity=n;}api;entity;async list(e){let r=(await Tn(this.api,this.entity.type,this.entity.id,e===void 0?{}:{signal:e}))?.settings;return Array.isArray(r)?r.map(i=>je(i)):[]}async get(e,n={}){try{let r=await ln(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?je(r.body,r.etag):null}catch(r){if(bt(r))return null;throw r}}async put(e,n,r={}){let i=await jn(this.api,this.entity.type,this.entity.id,e,{value:ue(n)},{...r.signal===void 0?{}:{signal:r.signal},...r.ifMatch===void 0?{}:{ifMatch:r.ifMatch}});return je(i)}async delete(e,n){try{await nn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});}catch(r){if(!bt(r))throw r}}};function bt(t){return t?.reason==="not_found"}function fe(t,e,n={}){let r=new ye(G,n.identity);n.onInventoryChanged&&r.onInvalidate(n.onInventoryChanged);let i=new W(t,e,r);return {settings:new Q(t,e),inventory:i,saves:new Y(t,e,n.saves??{}),currencies:new U(i,n.resolveCurrencyId),mutations:new J(t,e,r),orders:new z(t,e),progressions:new K(t,e,i)}}var I=t=>typeof t=="string"?t:"",q=t=>typeof t=="number"?t:0;function he(t,e){let n=e??{},r=I(n.character_id);if(r==="")throw new Error("[gem] a character response carried no character_id");return {...t(r),id:r,playerId:I(n.player_id),gameId:I(n.game_id),channel:I(n.channel)||"release",name:I(n.name),slotIndex:q(n.slot_index),isActive:n.is_active!==false,createdAt:I(n.created_at),updatedAt:I(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=fe(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 In(this.api,e===void 0?{}:{signal:e}))?.characters;return Array.isArray(r)?r.map(i=>he(this.scope,i)):[]}async get(e,n){let r=await sn(this.api,e,n===void 0?{}:{signal:n});return he(this.scope,r)}async create(e){let n=await Xe(this.api,{name:e.name},e.signal===void 0?{}:{signal:e.signal});return he(this.scope,n)}async update(e,n,r){let i=await Dn(this.api,e,{name:n},r===void 0?{}:{signal:r});return he(this.scope,i)}async delete(e,n){await Wn(this.api,e,n===void 0?{}:{signal:n});}async slots(e){let r=await kn(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 $(t){return new w(t)}var Xr={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,a;try{a=new Intl.Collator(n);}catch{a=new Intl.Collator;}return a.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 F=t=>typeof t=="string"?t:"";function _e(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:F(e.transfer_id),status:F(e.status),sourceEntityId:F(e.source_entity_id),targetEntityId:F(e.target_entity_id),...n===void 0?{}:{message:$(n)},createdAt:F(e.created_at),expiresAt:F(e.expires_at),...r===void 0?{}:{resolvedAt:r}}}function Zr(){return crypto.randomUUID()}var Z=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 Pn(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:Zr()},e.signal===void 0?{}:{signal:e.signal});return _e(n)}async list(e={}){let r=await $n(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(_e):[],...i===void 0?{}:{nextCursor:i}}}async get(e,n){let r=await Sn(this.api,e,n===void 0?{}:{signal:n});return _e(r)}async accept(e,n){return this.resolve(()=>ze(this.api,e,n===void 0?{}:{signal:n}))}async reject(e,n){return this.resolve(()=>Nn(this.api,e,n===void 0?{}:{signal:n}))}async cancel(e,n){return this.resolve(()=>Ye(this.api,e,n===void 0?{}:{signal:n}))}async resolve(e){return this.inventory.invalidate(),_e(await e())}};function P(t){return typeof t=="string"&&t!==""?t:void 0}var Rt=new Set(["localhost","127.0.0.1","[::1]"]);function ee(t){let e=P(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:"&&Rt.has(n.hostname)))return e}function ei(t){if(!Array.isArray(t))return [];let e=[];for(let n of t){let r=n??{},i=P(r.item_id),a=ee(r.icon_url);i!==void 0&&a!==void 0&&e.push({itemId:i,iconUrl:a});}return e}function A(t){let e=t??{},n=P(e.player_id),r=P(e.display_name),i=P(e.discriminator),a=P(e.display_tag),o=P(e.avatar_icon_id),l=ee(e.avatar_icon_url),d=P(e.avatar_3d_id),c=ee(e.avatar_3d_model_url),g=ee(e.avatar_3d_icon_url);return {...n===void 0?{}:{playerId:n},...r===void 0?{}:{displayName:$(r)},...i===void 0?{}:{discriminator:i},...a===void 0?{}:{displayTag:$(a)},...o===void 0?{}:{avatarIconId:o},...l===void 0?{}:{avatarIconUrl:l},...d===void 0?{}:{avatar3dId:d},...c===void 0?{}:{avatar3dModelUrl:c},...g===void 0?{}:{avatar3dIconUrl:g},badges:ei(e.badges)}}var ni=new Set(["https://downloads.gemarcade.com","https://cdn.gemarcade.com"]);function ti(t){if(t===void 0)return;let e=ee(t);if(e===void 0)return;let n=new URL(e);return Rt.has(n.hostname)||ni.has(n.origin)?e:void 0}var wt=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;var Ne=class extends y{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});}},be=t=>typeof t=="string"?t:void 0;function xt(t){let e=t??{};return {...A(e),playerId:be(e.player_id)??""}}function vt(t){let e=t.has_more===true?be(t.next_cursor):void 0;return e===void 0?{}:{nextCursor:e}}function ri(t){let e=t??{};return {friends:Array.isArray(e.data)?e.data.map(xt):[],...vt(e)}}var Be=t=>typeof t=="number"&&Number.isFinite(t)?t:void 0;function ii(t){return typeof t!="object"||t===null||Array.isArray(t)?{}:Object.fromEntries(Object.entries(t).filter(e=>typeof e[1]=="string"||typeof e[1]=="number"&&Number.isFinite(e[1])))}function kt(t){let e=t??{},n=Be(e.opened_at),r=Be(e.answered_at);return {id:be(e.item_id)??"",from:xt(e.sender),template:be(e.template)??"",params:ii(e.params),createdAt:Be(e.created_at)??0,...n===void 0?{}:{openedAt:n},...r===void 0?{}:{answeredAt:r}}}function ai(t){let e=t??{};return {challenges:Array.isArray(e.data)?e.data.map(kt):[],...vt(e)}}function oi(t){let e=t;return e?.reason==="not_found"&&e.code==="inbox_item_not_found"}var ne=class{#e;#t;#a;constructor(e,n={}){this.#e=e,this.#t=n.challenge,this.#a=n.launchedChallengeId;}async list(e={}){let n=await qn(this.#e,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}});return ri(n)}challenge(e){return this.#t===void 0?Promise.resolve({outcome:"unavailable"}):this.#t(e)}async inbox(e={}){let n=await Ln(this.#e,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}});return ai(n)}async launchedChallenge(e={}){let n=this.#a;if(n===void 0||!wt.test(n))return null;try{return kt(await _n(this.#e,n,{...e.signal===void 0?{}:{signal:e.signal}}))}catch(r){if(oi(r))return null;throw r}}async markAnswered(e){if(typeof e!="string"||!wt.test(e))throw new y("invalid",400,"id must be a FriendChallenge.id, as gem.friends.launchedChallenge() or inbox() returned it",void 0,"bad_request");await Fn(this.#e,e);}};var St=100,Ot=/^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}Z)?$/;function De(t){let{periodsBack:e,period:n,playerId:r}=t;if(ce(e),e!==void 0&&n!==void 0)throw new TypeError("pass periodsBack or period, not both");if(n!==void 0&&(typeof n!="string"||!Ot.test(n)))throw new TypeError(`period must be a period id such as 2026-10-02 (a result's period.id), got ${String(n)}`);if(r!==void 0&&(typeof r!="string"||r===""))throw new TypeError("playerId must be a player id");return {...e===void 0?{}:{periods_back:e},...n===void 0?{}:{period:n},...r===void 0?{}:{player_id:r}}}function Ct(t){let e=typeof t.period_id=="string"?t.period_id:"";if(!Ot.test(e))return;let n=Ie(t.period_local_date),r=O(t.period_start_at),i=O(t.period_ends_at),a=r>0&&i>0;return {id:e,...n===void 0?{}:{localDate:n},...a?{startAt:r,endsAt:i}:{},opensAt:O(t.opens_at),closesAt:O(t.closes_at),final:t.final===true}}var te=t=>typeof t=="string"?t:"",M=t=>typeof t=="number"?t:0,re=t=>typeof t=="string"?t:void 0,si=t=>typeof t=="number"?t:void 0,It={player:"players",character:"characters"};function li(t,e){let n=t??{},r=re(n.entity_id),i=typeof n.entity_type=="string"&&Object.hasOwn(It,n.entity_type)?n.entity_type:void 0,a=Tt(n.stats),o=n.properties!==null&&typeof n.properties=="object"?n.properties:void 0,l=e?n.is_viewer===true:void 0;return {...A(n),rank:M(n.rank),occurredAt:M(n.occurred_at),...l===void 0?{}:{isViewer:l},...r===void 0?{}:{entityId:r},...i===void 0?{}:{entityType:i},...a===void 0?{}:{stats:a},...o===void 0?{}:{properties:o}}}function At(t,e){let n=t??{},r=re(n.bucket_1),i=re(n.bucket_2),a=si(n.update_frequency_seconds),o=Ct(n);return {leaderboardType:te(n.leaderboard_type),runType:te(n.run_type),...r===void 0?{}:{bucket1:r},...i===void 0?{}:{bucket2:i},entries:Array.isArray(n.entries)?n.entries.map(l=>li(l,e)):[],generatedAt:M(n.generated_at),...a===void 0?{}:{updateFrequencySeconds:a},...o===void 0?{}:{period:o}}}function Pt(t){if(t===null||typeof t!="object"||Array.isArray(t))return;let e=t;if(!Number.isFinite(e.rank))return;let n=Tt(e.stats),r=e.properties!==null&&typeof e.properties=="object"?e.properties:void 0;return {rank:e.rank,occurredAt:M(e.occurred_at),...n===void 0?{}:{stats:n},...r===void 0?{}:{properties:r}}}function Tt(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 di(t,e,n){let r=t??{},i=re(r.bucket_1),a=re(r.bucket_2),o=Ct(r);return {leaderboardType:te(r.leaderboard_type),runType:te(r.run_type),entityType:e,entityId:n,...i===void 0?{}:{bucket1:i},...a===void 0?{}:{bucket2:a},entries:Array.isArray(r.entries)?r.entries.map(Pt).filter(l=>l!==void 0):[],personalBest:Pt(r.personal_best)??null,totalRuns:M(r.total_runs),totalRunsExact:r.total_runs_exact!==false,generatedAt:M(r.generated_at),...o===void 0?{}:{period:o}}}var ie=class{#e;constructor(e){this.#e=e;}async get(e,n={}){let r=De(n),i=await bn(this.#e,e,{...r,...n.bucket1===void 0?{}:{bucket_1:n.bucket1},...n.bucket2===void 0?{}:{bucket_2:n.bucket2},...n.signal===void 0?{}:{signal:n.signal}});return At(i,false)}async friends(e,n={}){let r=De(n),i=await fn(this.#e,e,{...r,...n.bucket1===void 0?{}:{bucket_1:n.bucket1},...n.bucket2===void 0?{}:{bucket_2:n.bucket2},...n.signal===void 0?{}:{signal:n.signal}});return At(i,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:d}=i;if(!Number.isInteger(d)||d<1||d>St)throw new TypeError(`limit must be an integer between 1 and ${St}, got ${String(d)}`)}let a=De(i),o=await cn(this.#e,e,It[n],r,{...a,...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}}),l=n==="player"&&r==="me"&&te((o??{}).entity_id)||r;return di(o,n,l)}};var Re=t=>typeof t=="string"?t:void 0;function ui(t){let e=t??{},n=Re(e.currency_id);if(n===void 0||n==="")return;let r=typeof e.balance=="number"&&Number.isFinite(e.balance)?e.balance:0;return {slug:Re(e.slug)??"",currencyId:n,balance:r,access:e.access==="spend"?"spend":"read"}}var we=class{#e;constructor(e){this.#e=e;}async get(e={}){let r=(await le(this.#e,e))?.currencies;if(!Array.isArray(r))return [];let i=[];for(let a of r){let o=ui(a);o!==void 0&&i.push(o);}return i}},Ue=t=>typeof t=="number"&&Number.isFinite(t)&&t>=0?Math.floor(t):0;function ci(t){let e=t??{},n=Re(e.currency_id);if(n===void 0||n==="")return;let r=Ue(e.limit),i=Math.min(Ue(e.earned),r),a=Math.min(Ue(e.remaining),r-i),o=e.period_days,l=typeof o=="number"&&Number.isInteger(o)&&o>=1?o:1,d=e.resets_at,c=typeof d=="number"&&Number.isFinite(d)&&d>0?Math.round(d*1e3):void 0;return {currencySlug:Re(e.currency_slug)??"",currencyId:n,limit:r,earned:i,remaining:a,period:e.period==="day"?"day":"window",periodDays:l,...c===void 0?{}:{resetsAt:c}}}var xe=class{#e;#t;#a;constructor(e,n,r){this.#e=e,this.#t=n,this.#a=r;}async get(e={}){let r=(await Rn(this.#e,e))?.currencies;if(!Array.isArray(r))return [];let i=[];for(let a of r){let o=ci(a);o!==void 0&&i.push(o);}return i}on(e,n){return e!=="changed"?(this.#a?.(`[gem] unknown earnAllowance event '${String(e)}'; the only event is 'changed'`),()=>{}):this.#t?.on(n)??(()=>{})}},ae=class{currencies;earnAllowance;constructor(e,n,r){this.currencies=new we(e),this.earnAllowance=new xe(e,n,r);}};var Ve=t=>typeof t=="string"?t:"",Et=t=>typeof t=="number"?t:0;function pi(t){let e=t??{};return {key:Ve(e.key),visibility:Ve(e.visibility),value:e.value,updatedAt:Et(e.updated_at)}}function gi(t){let e=t??{};return {...A(e),playerId:Ve(e.player_id),showcase:Array.isArray(e.showcase)?e.showcase.map(pi):[],generatedAt:Et(e.generated_at)}}function mi(t){return t?.reason==="not_found"}var oe=class{#e;constructor(e){this.#e=e;}async of(e,n={}){try{return gi(await wn(this.#e,e,{...n.signal===void 0?{}:{signal:n.signal}}))}catch(r){if(mi(r))return null;throw r}}};var ve=t=>typeof t=="string"?t:"",We=t=>typeof t=="number"?t:0;function Gt(t){let e=t??{};return {playerId:ve(e.player_id),key:ve(e.key),value:e.value,updatedAt:We(e.updated_at)}}function yi(t){let e=t??{};return {...A(e),playerId:ve(e.player_id),value:e.value,isViewer:e.is_viewer===true,updatedAt:We(e.updated_at)}}function fi(t){return t?.reason==="not_found"}var se=class{constructor(e,n){this.api=e;this.selfPlayerId=n;}api;selfPlayerId;async friends(e,n={}){let i=await hn(this.api,k(e),{...n.signal===void 0?{}:{signal:n.signal}})??{};return {key:ve(i.key),entries:Array.isArray(i.entries)?i.entries.map(yi):[],generatedAt:We(i.generated_at)}}async of(e,n,r={}){try{return Gt(await vn(this.api,e,k(n),{...r.signal===void 0?{}:{signal:r.signal}}))}catch(i){if(fi(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(a){throw new TypeError(`showcase value for ${JSON.stringify(e)} could not be serialised to JSON: ${String(a)}.`,{cause:a})}let i=await this.selfPlayerId();return Gt(await Bn(this.api,i,e,{value:n},{...r.signal===void 0?{}:{signal:r.signal}}))}async clear(e,n={}){let r=await this.selfPlayerId();await rn(this.api,r,k(e),{...n.signal===void 0?{}:{signal:n.signal}});}};var hi="https://function.gem.invalid",Lt={token:"function",expiresAt:Number.POSITIVE_INFINITY,chainEndsAt:Number.POSITIVE_INFINITY},_i="createGem() from @indiegems/gem-web-sdk/function only runs inside a serverless function; in a browser import @indiegems/gem-web-sdk/sdk",ke="gem.me is unavailable: this function was invoked by a game server, not a player",bi="gem.functions is unavailable inside a serverless function",Ri="gem.gameConfig is unavailable inside a serverless function",wi="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 xi(t){let e=new Set(T);return {async request(n){let r={...n},i=r.headers;if(i){for(let[a,o]of Object.entries(i))if(o!==void 0&&e.has(a.toLowerCase()))throw new h(wi)}return t.request(r)}}}function qt(t,e,n){Object.defineProperty(t,e,{get(){throw new Error(n)},enumerable:false});}function vi(t){let e=globalThis.__gemFunctionHost;if(e===void 0)throw new Error(_i);let n=e.context(),r=new de({clock:G,request:()=>Promise.resolve(Lt)});r.accept(Lt);let i=xi(tt({baseUrl:hi,tokenSource:r,defaultQuery:{game_id:n.gameId,channel:n.channel}})),a=new N({transport:i,clock:G,maxRetries:0}),o={client:a,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:fe(o,c),p=c===null||g===null?null:new Z(o,c,g.inventory),b=Se=>console.info(Se),m=new j({client:()=>a,clock:G,gameId:()=>n.gameId,playerId:()=>l,environment:{sdk_version:Je()},log:b}),S={context:n,identity:d,awaitIdentity:()=>d===null?Promise.reject(new Error(ke)):Promise.resolve(d),awaitBridge:()=>Promise.resolve("connected"),client:a,get me(){if(g===null)throw new Error(ke);return g},characters:new X(o),get transfers(){if(p===null)throw new Error(ke);return p},analytics:m,leaderboards:new ie(o),challenges:new D(o),showcase:new se(o,()=>l===null?Promise.reject(new Error(ke)):Promise.resolve(l)),friends:new ne(o),platform:new ae(o,void 0,b),profiles:new oe(o)};return qt(S,"functions",bi),qt(S,"gameConfig",Ri),S}var ki=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]]),He=class extends y{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:ki.get(this.code))??super.retryable}};
2
- export{j as AnalyticsApi,R as AuthError,T as CONDITIONAL_HEADERS,D as ChallengesApi,X as CharactersApi,U as CurrenciesApi,Ne as FriendChallengeError,ne as FriendsApi,y as GemApiError,N as GemClient,He as GemFunctionError,_ as GemSaveError,W as InventoryApi,ie as LeaderboardsApi,rt as MAX_PERIODS_BACK,J as MutationsApi,z as OrdersApi,ae as PlatformApi,we as PlatformCurrenciesApi,xe as PlatformEarnAllowanceApi,w as PlayerText,oe as ProfilesApi,K as ProgressionsApi,Y as SavesApi,Q as SettingsApi,se as ShowcaseApi,Z as TransfersApi,h as TransportRefusal,$ as asPlayerText,vi as createGem,A as mapIdentity,ti as platformIconUrl,Xr as text,ue as toBase64};//# sourceMappingURL=gem-web-sdk.function.js.map
1
+ globalThis.__gemWebSdkVersion="[gem-web-sdk:sdkVersion:12.0.0]";function Je(){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 l(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 ze(t,e,n){let r=`/v1/inventory/transfers/${l(e)}/accept`;return t.client.post(r,void 0,n?.signal)}async function Ke(t,e,n,r,i,a){let o=`/v1/inventory/${l(e)}/${l(n)}/progressions/${l(r)}/add`;return t.client.post(o,i,a?.signal)}async function Ye(t,e,n){let r=`/v1/inventory/transfers/${l(e)}/cancel`;return t.client.post(r,void 0,n?.signal)}async function Qe(t,e,n,r,i,a){let o=`/v1/inventory/${l(e)}/${l(n)}/progressions/${l(r)}/claim`;return t.client.post(o,i,a?.signal)}async function Xe(t,e,n){return t.client.post("/v1/characters",e,n?.signal)}async function Ze(t,e,n,r,i){let a=`/v1/inventory/${l(e)}/${l(n)}/orders/batch`;return t.client.post(a,r,i?.signal,{...i?.ifMatch===void 0?{}:{ifMatch:i.ifMatch}})}async function en(t,e,n,r,i){let a=`/v1/inventory/${l(e)}/${l(n)}/orders`;return t.client.post(a,r,i?.signal,{...i?.ifMatch===void 0?{}:{ifMatch:i.ifMatch}})}async function nn(t,e,n,r,i){let a=`/v1/settings/${l(e)}/${l(n)}/${l(r)}`;return t.client.delete(a,i?.signal)}async function tn(t,e,n,r,i){let a=`/v1/saves/${l(e)}/${l(n)}/${l(r)}`;return t.client.delete(a,i?.signal)}async function rn(t,e,n,r){let i=`/v1/showcase/players/${l(e)}/${l(n)}`;return t.client.delete(i,r?.signal)}async function an(t,e,n,r,i){let a=`/v1/inventory/${l(e)}/${l(n)}/recipes/execute`;return t.client.post(a,r,i?.signal,{...i?.ifMatch===void 0?{}:{ifMatch:i.ifMatch}})}async function on(t,e,n,r,i,a){let o=`/v1/saves/${l(e)}/${l(n)}/${l(r)}/finalize`;return t.client.post(o,i,a?.signal)}async function sn(t,e,n){let r=`/v1/characters/${l(e)}`;return t.client.get(r,n?.signal)}async function ln(t,e,n,r,i){let a=`/v1/settings/${l(e)}/${l(n)}/${l(r)}`;return t.client.getWithEtag(a,{...i?.signal===void 0?{}:{signal:i.signal},...i?.ifNoneMatch===void 0?{}:{ifNoneMatch:i.ifNoneMatch}})}async function dn(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 a=i.toString(),o=`/v1/inventory/${l(e)}/${l(n)}`+(a?`?${a}`:"");return t.client.get(o,r?.signal)}async function un(t,e,n,r,i){let a=`/v1/inventory/${l(e)}/${l(n)}/items/${l(r)}`;return t.client.get(a,i?.signal)}async function cn(t,e,n,r,i){let a=new URLSearchParams;i?.bucket_1!==void 0&&a.set("bucket_1",String(i?.bucket_1)),i?.bucket_2!==void 0&&a.set("bucket_2",String(i?.bucket_2)),i?.limit!==void 0&&a.set("limit",String(i?.limit)),i?.periods_back!==void 0&&a.set("periods_back",String(i?.periods_back)),i?.period!==void 0&&a.set("period",String(i?.period)),i?.player_id!==void 0&&a.set("player_id",String(i?.player_id));let o=a.toString(),s=`/v1/leaderboards/${l(e)}/${l(n)}/${l(r)}`+(o?`?${o}`:"");return t.client.get(s,i?.signal)}async function pn(t,e,n,r,i){let a=`/v1/inventory/${l(e)}/${l(n)}/orders/${l(r)}`;return t.client.get(a,i?.signal)}async function gn(t,e,n,r,i){let a=`/v1/inventory/${l(e)}/${l(n)}/progressions/${l(r)}`;return t.client.get(a,i?.signal)}async function mn(t,e,n,r,i,a){let o=`/v1/inventory/${l(e)}/${l(n)}/catalogs/${l(r)}/recipes/${l(i)}/availability`;return t.client.get(o,a?.signal)}async function yn(t,e,n,r){let i=new URLSearchParams;i.set("limit",String(r?.limit));let a=i.toString(),o=`/v1/inventory/${l(e)}/${l(n)}/recipe-usage`+(a?`?${a}`:"");return t.client.get(o,r?.signal)}async function Ae(t,e,n,r,i){let a=`/v1/saves/${l(e)}/${l(n)}/${l(r)}`;return t.client.getWithEtag(a,{...i?.signal===void 0?{}:{signal:i.signal},...i?.ifNoneMatch===void 0?{}:{ifNoneMatch:i.ifNoneMatch}})}async function fn(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)),n?.periods_back!==void 0&&r.set("periods_back",String(n?.periods_back)),n?.period!==void 0&&r.set("period",String(n?.period)),n?.player_id!==void 0&&r.set("player_id",String(n?.player_id));let i=r.toString(),a=`/v1/leaderboards/${l(e)}/friends`+(i?`?${i}`:"");return t.client.get(a,n?.signal)}async function hn(t,e,n){let r=`/v1/showcase/friends/${l(e)}`;return t.client.get(r,n?.signal)}async function _n(t,e,n){let r=`/v1/inbox/friend-challenges/${l(e)}`;return t.client.get(r,n?.signal)}async function bn(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)),n?.periods_back!==void 0&&r.set("periods_back",String(n?.periods_back)),n?.period!==void 0&&r.set("period",String(n?.period)),n?.player_id!==void 0&&r.set("player_id",String(n?.player_id));let i=r.toString(),a=`/v1/leaderboards/${l(e)}`+(i?`?${i}`:"");return t.client.get(a,n?.signal)}async function Rn(t,e){let n=`/v1/games/${l(t.gameId())}/players/me/earn-allowance`;return t.client.get(n,e?.signal)}async function le(t,e){return t.client.get("/v1/inventory/players/me/platform-currencies",e?.signal)}async function wn(t,e,n){let r=`/v1/profiles/players/${l(e)}`;return t.client.get(r,n?.signal)}async function xn(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 vn(t,e,n,r){let i=`/v1/showcase/players/${l(e)}/${l(n)}`;return t.client.get(i,r?.signal)}async function kn(t,e){return t.client.get("/v1/characters/slots",e?.signal)}async function Sn(t,e,n){let r=`/v1/inventory/transfers/${l(e)}`;return t.client.get(r,n?.signal)}async function An(t,e,n){let r=`/v1/games/${l(t.gameId())}/analytics/events`;return t.client.post(r,e,n?.signal,{...n?.keepalive===void 0?{}:{keepalive:n.keepalive},replaySafe:true})}async function Pn(t,e,n){return t.client.post("/v1/inventory/transfers",e,n?.signal)}async function On(t,e,n,r,i){let a=`/v1/inventory/${l(e)}/${l(n)}/platform-funded-game-inventory-purchases`;return t.client.post(a,r,i?.signal)}async function Cn(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 In(t,e){return t.client.get("/v1/characters",e?.signal)}async function Tn(t,e,n,r){let i=`/v1/settings/${l(e)}/${l(n)}`;return t.client.get(i,r?.signal)}async function En(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 a=i.toString(),o=`/v1/inventory/${l(e)}/${l(n)}/orders`+(a?`?${a}`:"");return t.client.get(o,r?.signal)}async function Gn(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 a=i.toString(),o=`/v1/saves/${l(e)}/${l(n)}`+(a?`?${a}`:"");return t.client.get(o,r?.signal)}async function Ln(t,e){let n=new URLSearchParams;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/inbox/friend-challenges"+(r?`?${r}`:"");return t.client.get(i,e?.signal)}async function qn(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 $n(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 Fn(t,e,n){let r=`/v1/inbox/friend-challenges/${l(e)}/answered`;return t.client.post(r,void 0,n?.signal)}async function Mn(t,e,n,r,i,a){let o=`/v1/inventory/${l(e)}/${l(n)}/progressions/${l(r)}/max`;return t.client.post(o,i,a?.signal)}async function jn(t,e,n,r,i,a){let o=`/v1/settings/${l(e)}/${l(n)}/${l(r)}`;return t.client.put(o,i,a?.signal,{...a?.ifMatch===void 0?{}:{ifMatch:a.ifMatch}})}async function Bn(t,e,n,r,i){let a=`/v1/showcase/players/${l(e)}/${l(n)}`;return t.client.put(a,r,i?.signal)}async function Nn(t,e,n){let r=`/v1/inventory/transfers/${l(e)}/reject`;return t.client.post(r,void 0,n?.signal)}async function Dn(t,e,n,r){let i=`/v1/characters/${l(e)}`;return t.client.patch(i,n,r?.signal)}async function Un(t,e,n,r,i,a){let o=`/v1/saves/${l(e)}/${l(n)}/${l(r)}/upload-url`;return t.client.post(o,i,a?.signal,{replaySafe:true})}async function Vn(t,e,n,r,i,a){let o=`/v1/inventory/${l(e)}/${l(n)}/progressions/${l(r)}/reset`;return t.client.post(o,i,a?.signal)}async function Wn(t,e,n){let r=`/v1/characters/${l(e)}`;return t.client.delete(r,n?.signal)}var $t="gem_";function Hn(t){return t.startsWith($t)}var Jn=1e4,zn=50,jt=500,Bt=65536-4*1024,Nt=24*1024;function Kn(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 Yn=t=>typeof t=="number"?t:0,Dt=t=>typeof t=="string"?t:"";function Pe(t=0){return {accepted:0,rejected:[],dropped:t,duplicate:false}}function Ut(t,e){let n=t??{},r=Array.isArray(n.rejected)?n.rejected.map(i=>{let a=i??{};return {index:Yn(a.index),code:Dt(a.code)}}):[];return {accepted:Yn(n.accepted),rejected:r,dropped:e,duplicate:n.duplicate===true}}function Oe(){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 Vt(t){return t?.retryable===true}var j=class{#e;#t;#a;#y;#n=[];#f={};#o=0;#s=null;#h=false;#_=false;#b=false;#r=false;#R=null;#l=null;#d=false;#i=false;#p=false;#w=false;#x=false;constructor(e){this.#e=e,this.#t=e.options?.enabled!==false,this.#a=Math.max(Jn,e.options?.flushIntervalMs??Jn),this.#y=Math.max(1,Math.floor(e.options?.maxQueue??jt));}track(e,n={}){if(!(!this.#t||this.#r)){if(Hn(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,Kn({...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 Pe();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.")),Pe();if(this.#k(),this.#n.length===0)return Pe();let r=e.keepalive===true;this.#c();let i=this.#n.splice(0,this.#A(r)),a=this.#o;this.#o=0;let o=Math.round(this.#e.clock.now()),s={batch_id:Oe(),sent_at_ms:o,events:i.map(c=>Qn(c,o))},d={client:this.#e.client(),gameId:()=>n};this.#b=true;try{let c=await An(d,s,{...e.signal===void 0?{}:{signal:e.signal},...r?{keepalive:!0}:{}}),g=Ut(c,a);return this.#P(g),g}catch(c){throw Vt(c)?this.#S(i,a):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,Kn(n));}hold(){this.#r||this.#l!==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.#l=e,this.#d=false,this.#n.unshift({uid:Oe(),name:"gem_session_start",atMs:e,dimensions:{},measures:{}})),this.#n.length>=zn?this.#g():this.#n.length>0&&this.#u();}get held(){return this.#i}startSession(){if(!(this.#r||this.#l!==null)){if(this.#i){this.#p=true;return}this.#l=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.#l;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:Oe(),name:e,atMs:this.#e.clock.now(),dimensions:r,measures:i}),this.#n.length>=zn?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?Nt:Bt,r=Math.min(this.#n.length,100),i=128;for(let a=0;a<r;a+=1){let o=this.#n[a];if(o===void 0)break;if(i+=JSON.stringify(Qn(o,0)).length+1,i>n)return Math.max(1,a)}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.#a));}#c(){this.#s!==null&&(this.#e.clock.clearTimeout(this.#s),this.#s=null);}#k(){let e=this.#C();e===null||e===""||(this.#R!==null&&this.#R!==e&&(this.#n=[],this.#o=0,this.#l=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}). `+Wt(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}}#C(){try{return this.#e.playerId()}catch{return null}}};function Qn(t,e){return {event_uid:t.uid,name:t.name,offset_ms:Math.round(t.atMs)-e,dimensions:t.dimensions,measures:t.measures}}function Wt(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."}}var Ht={initialDelayMs:2e3,maxDelayMs:6e4};function Jt(t,e){return e!==void 0?!e:t==="chain_exhausted"}var de=class{constructor(e){this.options=e;}options;grant=null;state="pending";failure=null;generation=0;inFlight=null;rejected=false;retry=null;failures=0;notBefore=0;disposed=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.pastChainCeiling())throw new R("chain_exhausted","the token chain reached its ceiling");if(this.inFlight===null&&this.options.clock.now()<this.notBefore)throw new R(this.failure??"unavailable","the embedder asked for no new token yet; one is asked for when that wait is over");return this.refresh(this.nextReason())}pastChainCeiling(){return this.grant===null||this.seconds()<this.grant.chainEndsAt?false:(this.enter("lost","chain_exhausted"),true)}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);}dispose(){this.disposed=true,this.cancelRetry();}scheduleRetry(e){if(this.cancelRetry(),this.failures+=1,this.notBefore=e===void 0?0:this.options.clock.now()+e,this.disposed)return;let{initialDelayMs:n,maxDelayMs:r}=Ht,i=Math.min(r,n*2**(this.failures-1)),a=Math.max(i/2,e??0)+Math.random()*(i/2);this.retry={handle:this.options.clock.setTimeout(()=>this.retryNow(),a)};}retryNow(){this.retry=null,this.notBefore=0,!(this.state==="lost"||this.pastChainCeiling())&&this.refresh(this.nextReason()).catch(()=>{});}cancelRetry(){this.retry!==null&&(this.options.clock.clearTimeout(this.retry.handle),this.retry=null);}refresh(e){if(this.inFlight)return this.inFlight;this.cancelRetry();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 a=zt(i),{retryable:o,retryAfterMs:s}=i??{};throw n===this.generation&&(Jt(a,typeof o=="boolean"?o:void 0)?this.enter("lost",a):(this.scheduleRetry(typeof s=="number"&&Number.isFinite(s)&&s>0?s:void 0),this.enter("degraded",a))),i instanceof R?i:new R(a,String(i))}).finally(()=>{this.inFlight===r&&(this.inFlight=null);});return this.inFlight=r,r}enter(e,n){(e==="ready"||e==="lost")&&this.cancelRetry(),e==="ready"&&(this.failures=0,this.notBefore=0),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 zt(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}},T=["if-match","if-none-match"],Xn=4096;function Kt(t){if(!t)return;let e={};for(let[n,r]of Object.entries(t)){let i=n.toLowerCase();if(!T.includes(i)||r===void 0)continue;let a=typeof r=="string"?Yt(r):r;if(typeof a!="string"||a.length>Xn||!Qt(a))throw new h(`the ${i} header value cannot be sent \u2014 it is not a string, is longer than ${Xn} characters, or contains a character outside the range an HTTP header value may carry. This is a malformed request, not a server failure; the value is withheld here rather than written to logs.`);a!==""&&(e[i]=a);}return Object.freeze(e)}function Yt(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 Qt(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 Xt(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 Zn(t,e){let n=e.replayUnauthorizedOnce??true;return {async request(r){let i={...r},a=Kt(i.headers),o=Xt(i),s=Object.freeze({...i,headers:a,...o===void 0?{}:{bytes:o}}),d=await e.tokenSource.get(),c=await t(s,d);if(c.status!==401||!n)return c;e.tokenSource.invalidate(d);let g=await e.tokenSource.get(),p=await t(s,g);if(p.status===401)throw e.tokenSource.close("unavailable"),new R("unavailable","the server refused a freshly minted token");return p}}}function ue(t){let e=typeof t=="string"?new TextEncoder().encode(t):t;return btoa(Zt(e))}function et(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 Ce(t){return new TextDecoder().decode(et(t))}function Zt(t){let n="";for(let r=0;r<t.length;r+=32768)n+=String.fromCharCode(...t.subarray(r,r+32768));return n}var y=class extends Error{constructor(n,r,i,a,o){super(`${n} (${r}): ${i}`);this.reason=n;this.status=r;this.detail=i;this.retryAfterSeconds=a;this.code=o;this.name="GemApiError";}reason;status;detail;retryAfterSeconds;code;get retryable(){return this.reason==="unavailable"||this.reason==="rate_limited"}},er=new WeakMap;var nr=new Set([408,429,500,502,503,504]),tr=6e4;function rr(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,...B(i)},i.replaySafe===true)}async post(e,n,r,i={}){return this.send({method:"POST",path:e,body:n,signal:r,...B(i)},i.replaySafe===true)}async postBytes(e,n,r,i={}){let a=await this.sendRaw({method:"POST",path:e,bytes:n,responseType:"bytes",signal:r,...B(i)},i.replaySafe===true);return {bytes:ir(a.body),...a.invocationId===void 0?{}:{invocationId:a.invocationId}}}async patch(e,n,r,i={}){return this.send({method:"PATCH",path:e,body:n,signal:r,...B(i)},i.replaySafe===true)}async delete(e,n,r={}){return this.send({method:"DELETE",path:e,signal:n,...B(r)},r.replaySafe===true)}async send(e,n){return (await this.sendRaw(e,n)).body}async sendRaw(e,n){let r=n?rr(this.options.maxRetries)+1:1,i=null;if(e.signal?.aborted)throw nt(e.signal);for(let a=0;a<r;a++){if(a>0&&await this.backoff(a,i,e.signal),e.signal?.aborted)throw nt(e.signal);let o;try{o=await this.options.transport.request(e);}catch(d){if(R.isAuthError(d)||h.isRefusal(d)||e.signal?.aborted||ar(d))throw d;i=new y("unavailable",0,String(d));continue}if(o.status>=200&&o.status<300||o.status===304)return o;let s=or(o);if(!nr.has(o.status))throw s;i=s;}throw i??new y("unavailable",0,"no attempt was made")}backoff(e,n,r){if(r?.aborted)return Promise.resolve();let i=n?.retryAfterSeconds,a=i!==void 0?i*1e3:2**(e-1)*250,o=2**(e-1)*250,s=Math.min(Math.max(a,o),tr);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,s),p=true,g&&c.clearTimeout(b);})}};function ir(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 B(t){return {...t.keepalive===void 0?{}:{keepalive:t.keepalive},...t.ifMatch===void 0?{}:{headers:{"if-match":t.ifMatch}}}}function nt(t){return t.reason!==void 0?t.reason:new DOMException("The operation was aborted.","AbortError")}function ar(t){let e=t?.name;return e==="AbortError"||e==="TimeoutError"}function or(t){let e=lr(t),n=ur(t.body),r={...n===void 0?{}:{details:n},...t.invocationId===void 0?{}:{invocationId:t.invocationId}};return Object.keys(r).length>0&&er.set(e,r),e}var sr=new Map([["insufficient_funds","insufficient_funds"]]);function lr(t){let{status:e,body:n}=t,r=dr(n),i=t.retryAfterSeconds??pr(n),a=cr(n),o=a===void 0?void 0:sr.get(a);if(o!==void 0)return new y(o,e,r,void 0,a);switch(e){case 304:return new y("not_modified",e,r);case 400:case 422:return new y("invalid",e,r,void 0,a);case 403:return new y("forbidden",e,r,void 0,a);case 404:return new y("not_found",e,r,void 0,a);case 402:return new y("insufficient_funds",e,r,void 0,a);case 409:return new y("conflict",e,r,void 0,a);case 412:return new y("precondition_failed",e,r,void 0,a);case 413:return new y("too_large",e,r,void 0,a);case 429:return new y("rate_limited",e,r,i,a);default:return new y("unavailable",e,r,i,a)}}function dr(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 ur(t){let n=t?.error?.details;return n===null?void 0:n}function cr(t){let n=t?.error?.code;return typeof n=="string"&&n.length>0?n:void 0}function pr(t){let e=t?.retryAfterSeconds;return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function gr(t){let e=t.lastIndexOf("@");return (e===-1?t:`***@${t.slice(e+1)}`).slice(0,200)}var mr=new Set(T);function yr(t){if(!t)return {};let e={};for(let[n,r]of Object.entries(t))mr.has(n.toLowerCase())&&(e[n.toLowerCase()]=r);return e}function tt(t){let e=t.fetch??globalThis.fetch.bind(globalThis);return Zn(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 a;try{a=new URL(i.href.replace(/\/+$/,"")+n.path);}catch{throw new h(`${JSON.stringify(typeof n.path=="string"?gr(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(a.protocol!==i.protocol||a.host!==i.host)throw new h(`${JSON.stringify(a.pathname)} resolves to ${a.protocol}//${a.host}, not ${i.protocol}//${i.host}. A request path may not change the request's origin \u2014 it carries the play token.`);if(a.username!==""||a.password!==""){let m=i.username!==""||i.password!=="",S=a.username!==i.username||a.password!==i.password,Se=m?S?"baseUrl (and possibly the request path)":"baseUrl":"request path";throw new h(`the ${Se} puts credentials in the URL, which cannot be fetched (${n.method} ${a.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??{}))a.searchParams.has(m)||a.searchParams.set(m,S);let o=n.bytes,s=n.bytes===void 0?void 0:"application/octet-stream";try{n.body!==void 0&&(o=JSON.stringify(n.body),s="application/json");}catch(m){throw new h(`the body of ${n.method} ${JSON.stringify(a.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(a.toString(),{method:n.method,headers:{authorization:`Bearer ${r}`,...s===void 0?{}:{"content-type":s},...yr(n.headers)},body:o,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=fr(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 fr(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 rt=400,x=t=>typeof t=="string"?t:"",hr=/(?:Z|[+-]\d{2}:?\d{2})$/i;function O(t){let e=x(t);if(!hr.test(e))return 0;let n=Date.parse(e);return Number.isFinite(n)?Math.floor(n/1e3):0}var _r=/^[0-9a-f]{1,64}$/,br=/^[0-9a-f]{16}$/,Rr=/^[A-Za-z][A-Za-z0-9_+\-/]{0,63}$/,wr=/^(?:[01]\d|2[0-3]):[0-5]\d$/;function Ie(t){let e=x(t),n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e);if(!n)return;let[r,i,a]=[Number(n[1]),Number(n[2]),Number(n[3])],o=new Date(Date.UTC(r,i-1,a));return o.getUTCFullYear()===r&&o.getUTCMonth()===i-1&&o.getUTCDate()===a?e:void 0}var xr=4096,vr=new TextEncoder;function kr(t){let e=x(t.challenge_data),n=x(t.challenge_data_hash);return e===""||!br.test(n)?{}:vr.encode(e).length>xr?{}:{data:e,dataHash:n}}function Sr(t){let e=t??{},n=O(e.period_start_at),r=O(e.period_ends_at);if(n===0||r===0)return;let i=x(e.slug),a=x(e.seed),o=Ie(e.period_local_date),s=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,...o===void 0?{}:{periodLocalDate:o},boundary:Rr.test(s)?s:"",resetTime:wr.test(d)?d:"",seed:_r.test(a)?a:"",...kr(e)}}function ce(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 it(t){let e=t??{};return Array.isArray(e.challenges)?e.challenges.map(Sr).filter(n=>n!==void 0):[]}var D=class{#e;constructor(e){this.#e=e;}async list(e={}){let{periodsBack:n}=e;ce(n);let r=await Cn(this.#e,{...n===void 0?{}:{periods_back:n},...e.signal===void 0?{}:{signal:e.signal}});return it(r)}};var Ar="gem-web-bridge";var E=65536,at=8,pe=5e3,ot=1024;function st(t){return Object.freeze(Object.assign(Object.create(null),t))}st({"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.ticketEvent":60,"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.controlsDeclare":60,"gem.menu":60,"gem.menuSelect":60,"gem.requestShare":6,"gem.requestAvatarPicker":6,"gem.vibrate":600,"gem.frameStats":120,"gem.portraitBorders":60,"gem.error":60,"gem.requestPurchase":12,"gem.purchaseResult":30,"gem.deviceSettings.put":30,"gem.deviceSettings.result":30,"gem.requestAd":6,"gem.adResult":12,"gem.requestSignIn":6,"gem.signInResult":12,"gem.requestFriendChallenge":12,"gem.friendChallengeResult":30,__malformed:60});st({"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.ticketEvent":"ticketEvents","gem.seatedEvent":"partySeating","gem.socketState":"socketState","gem.audioState":"audioState","gem.rewardCue":"rewardCue","gem.frameStats":"frameStats","gem.portraitBorders":"portraitBorders","gem.engaged":"engagement","gem.viewport":"viewport","gem.walletDisplay":"walletDisplay","gem.requestLocalServer":"localHost","gem.localServer":"localHost","gem.localServer.denied":"localHost","gem.cohorts":"cohorts","gem.earnAllowanceChanged":"earnAllowance","gem.deviceSettings":"deviceSettings","gem.deviceSettings.put":"deviceSettings","gem.deviceSettings.result":"deviceSettings","gem.requestShare":"share","gem.requestAvatarPicker":"avatarPicker","gem.vibrate":"vibration","gem.menu":"gameMenu","gem.menuSelect":"gameMenu","gem.controlsDeclare":"controls"});function Or(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 Cr(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 Ir(t){return /^[a-z]{2,8}(-[a-z0-9]{1,8})*$/i.test(t)}function Tr(t){return /^[a-z_]+$/.test(t)}function Te(t,e,n){if(e>at)return `nesting deeper than ${at}`;if(++n.nodes>pe)return `more than ${pe} 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>ot)return `an array of ${t.length} entries, over the ${ot} limit`;n.bytes+=2;for(let s of t){let d=Te(s,e+1,n);if(d)return d}return null}let a=Object.getPrototypeOf(t);if(a!==Object.prototype&&a!==null)return "a value that is not a plain object";n.bytes+=2;let o=t;for(let s in o){if(!Object.prototype.hasOwnProperty.call(o,s))continue;if(++n.nodes>pe)return `more than ${pe} values`;if(n.bytes+=s.length*3+4,n.bytes>E)return `over the ${E} byte limit`;let d=Te(o[s],e+1,n);if(d)return d}return null}function Er(t){let e={nodes:0,bytes:0,seen:new Set},n=Te(t,0,e);return n?`message contains ${n}`:e.bytes>E?`message is over the ${E} byte limit`:null}var Gr={origin:[Or,"not a well-formed origin"],url:[Cr,"not a safe absolute http(s) URL"],bcp47:[Ir,"not a well-formed BCP 47 tag"],code:[Tr,"not a code of lower-case letters and underscores"]};function lt(t,e,n){for(let r of e){let i=n===""?r.n:`${n}.${r.n}`,a=t[r.n];if(a==null){if(r.o)continue;return `${i}: required`}let o=dt(a,r,i);if(o)return o}return null}function dt(t,e,n){switch(e.k){case "s":{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]=Gr[e.f];if(!r(t))return `${n}: ${i}`}return null}case "i":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 "b":return typeof t=="boolean"?null:`${n}: expected boolean`;case "e":{let r=e.v;return r.includes(t)?null:`${n}: not one of ${r.join("|")}`}case "o":return typeof t!="object"||t===null||Array.isArray(t)?`${n}: expected object`:lt(t,e.fs,n);case "j":return typeof t!="object"||t===null||Array.isArray(t)?`${n}: expected a plain object`:null;case "a":{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 a of t){if(a==null){if(r.o)continue;return `${i}: required`}let o=dt(a,r,i);if(o)return o}return null}default:{let r=e.k;return `${n}: unknown kind ${String(r)}`}}}var ut=Object.create(null);function u(t,e){return ut[t]=n=>{let r=Er(n);if(r)return r;if(typeof n!="object"||n===null||Array.isArray(n))return "message: expected object";let i=n;return i.gem!==Ar?"gem: wrong protocol marker":i.type!==t?`type: expected ${t}`:lt(i,e,"")}}u("gem.handshake",[{n:"versions",k:"o",fs:[{n:"min",k:"i",lo:1,hi:1e3},{n:"max",k:"i",lo:1,hi:1e3}]},{n:"capabilities",k:"a",o:1,max:64,it:{n:"",k:"s",max:64}},{n:"embedder",k:"s",max:2048,f:"origin"},{n:"unbidden",k:"b",o:1}]);u("gem.handshake.accept",[{n:"v",k:"i",lo:1,hi:1e3},{n:"capabilities",k:"a",o:1,max:64,it:{n:"",k:"s",max:64}}]);u("gem.token",[{n:"token",k:"s",max:4096},{n:"requestId",k:"s",o:1,max:64},{n:"generation",k:"i",lo:0,hi:2147483647},{n:"apiBaseUrl",k:"s",o:1,max:512,f:"url"},{n:"playerId",k:"s",max:64},{n:"gameId",k:"s",max:64},{n:"channel",k:"e",v:["dev","test","release"]},{n:"gameVersion",k:"s",o:1,max:64},{n:"expiresAt",k:"i",lo:0,hi:4102444800},{n:"chainEndsAt",k:"i",lo:0,hi:4102444800},{n:"allowDevTools",k:"b",o:1}]);u("gem.token.denied",[{n:"requestId",k:"s",max:64},{n:"retryable",k:"b"},{n:"retryAfterMs",k:"i",o:1,lo:0,hi:36e5},{n:"reason",k:"e",v:["chain_exhausted","unavailable"]},{n:"correlationId",k:"s",max:64}]);u("gem.player",[{n:"untrusted",k:"o",fs:[{n:"displayName",k:"s",max:64},{n:"displayTag",k:"s",o:1,max:80},{n:"displayHandle",k:"s",max:80}]},{n:"playerId",k:"s",o:1,max:64},{n:"discriminator",k:"s",o:1,max:8},{n:"avatarIconUrl",k:"s",o:1,max:2048,f:"url"},{n:"avatarIconId",k:"s",o:1,max:64},{n:"avatar3dId",k:"s",o:1,max:64},{n:"avatar3dModelUrl",k:"s",o:1,max:2048,f:"url"},{n:"avatar3dIconUrl",k:"s",o:1,max:2048,f:"url"},{n:"badges",k:"a",o:1,max:2,it:{n:"",k:"o",fs:[{n:"itemId",k:"s",max:64},{n:"iconUrl",k:"s",max:2048,f:"url"}]}},{n:"displayTag",k:"s",max:8},{n:"avatarUrl",k:"s",o:1,max:2048,f:"url"},{n:"boost",k:"o",o:1,fs:[{n:"multipliers",k:"a",max:8,it:{n:"",k:"o",fs:[{n:"currencyId",k:"s",max:64},{n:"currencySlug",k:"s",max:32},{n:"multiplierBp",k:"i",lo:1e4,hi:1e6}]}},{n:"expiresInDays",k:"i",o:1,lo:1,hi:7}]}]);u("gem.pause",[{n:"paused",k:"b"}]);u("gem.prefs",[{n:"reducedMotion",k:"b"},{n:"muted",k:"b"},{n:"showFrameStats",k:"b",o:1},{n:"locale",k:"s",max:35,f:"bcp47"},{n:"recommended",k:"o",o:1,fs:[{n:"volume",k:"i",lo:0,hi:100},{n:"batterySaver",k:"b"},{n:"keyboardLayout",k:"e",v:["wasd","arrows"]},{n:"gamepadConfirm",k:"e",v:["south","east"]},{n:"vibration",k:"b"},{n:"lookSensitivity",k:"i",o:1,lo:20,hi:400},{n:"gamepadLookSensitivity",k:"i",o:1,lo:20,hi:400},{n:"invertLookY",k:"b",o:1},{n:"touchMovement",k:"s",o:1,max:16,f:"code"},{n:"graphicsQuality",k:"s",o:1,max:16,f:"code"},{n:"graphicsQualityAuto",k:"b",o:1}]}]);u("gem.cohorts",[{n:"cohorts",k:"a",max:8,it:{n:"",k:"o",fs:[{n:"experimentId",k:"s",max:36},{n:"variantKey",k:"s",max:32}]}}]);u("gem.earnAllowanceChanged",[]);u("gem.viewport",[{n:"insets",k:"o",fs:[{n:"top",k:"i",lo:0,hi:4096},{n:"right",k:"i",lo:0,hi:4096},{n:"bottom",k:"i",lo:0,hi:4096},{n:"left",k:"i",lo:0,hi:4096}]},{n:"reserved",k:"a",o:1,max:4,it:{n:"",k:"o",fs:[{n:"x",k:"i",lo:0,hi:16384},{n:"y",k:"i",lo:0,hi:16384},{n:"width",k:"i",lo:0,hi:16384},{n:"height",k:"i",lo:0,hi:16384}]}}]);u("gem.deviceSettings",[{n:"settings",k:"j",o:1}]);u("gem.willTerminate",[{n:"reason",k:"e",v:["grant_expiring","session_ended","navigating","kill_switch"]},{n:"graceMs",k:"i",lo:0,hi:6e4}]);u("gem.roomEvent",[{n:"event",k:"e",v:["updated","match_started","match_ready","match_failed","version_stale"]},{n:"roomId",k:"s",max:64},{n:"matchId",k:"s",o:1,max:64},{n:"version",k:"i",o:1,lo:0,hi:2147483647},{n:"reason",k:"s",o:1,max:64},{n:"platform",k:"e",o:1,v:["universal","mobile"]}]);u("gem.socketState",[{n:"connected",k:"b"},{n:"reason",k:"e",o:1,v:["connecting","dropped","watchdog","terminal"]}]);u("gem.seatedEvent",[{n:"roomId",k:"s",max:64}]);u("gem.autoStartFailedEvent",[{n:"roomId",k:"s",max:64},{n:"code",k:"s",max:64}]);u("gem.ticketEvent",[{n:"event",k:"e",v:["queued","matched","expired","cancelled","failed"]},{n:"ticketId",k:"s",max:64},{n:"partySize",k:"i",o:1,lo:1,hi:64},{n:"queuedAt",k:"i",o:1,lo:0,hi:4102444800},{n:"expiresAt",k:"i",o:1,lo:0,hi:4102444800},{n:"reason",k:"s",o:1,max:64},{n:"roomId",k:"s",o:1,max:64}]);u("gem.signalEvent",[{n:"event",k:"e",v:["hello","offer","answer","ice","peerJoined","peerLeft","migration","matchEnded","error"]},{n:"matchId",k:"s",max:64},{n:"data",k:"j"}]);u("gem.dedicatedEvent",[{n:"event",k:"e",v:["answer","error","matchEnded"]},{n:"matchId",k:"s",max:64},{n:"sdp",k:"s",o:1,max:10240},{n:"sessionId",k:"s",o:1,max:64},{n:"code",k:"s",o:1,max:64},{n:"message",k:"s",o:1,max:256},{n:"reason",k:"s",o:1,max:64}]);u("gem.partyResult",[{n:"requestId",k:"s",max:64},{n:"partyId",k:"s",o:1,max:64}]);u("gem.clusterTarget",[{n:"clusterTargetId",k:"s",max:64},{n:"clusterTargetIds",k:"a",o:1,max:3,it:{n:"",k:"s",max:64}}]);u("gem.devtools",[{n:"action",k:"e",v:["open","close","toggle"]}]);u("gem.screenshot",[{n:"maxWidth",k:"i",lo:1,hi:7680},{n:"maxHeight",k:"i",lo:1,hi:4320}]);u("gem.screenshot.denied",[{n:"reason",k:"e",v:["not_wired","no_source","unsupported","unreadable","tainted","too_large","busy","declined","failed"]},{n:"retryable",k:"b"}]);u("gem.requestContext",[]);u("gem.gameContext",[{n:"context",k:"j"}]);u("gem.signal",[{n:"signal",k:"e",v:["join","offer","answer","ice","migrationAck","hostUnreachable"]},{n:"matchId",k:"s",max:64},{n:"data",k:"j"}]);u("gem.dedicatedOffer",[{n:"matchId",k:"s",max:64},{n:"sdp",k:"s",max:10240},{n:"intent",k:"e",v:["initial","ice_restart","full_reconnect"]}]);u("gem.partyRequest",[{n:"requestId",k:"s",max:64}]);u("gem.ready",[]);u("gem.engaged",[]);u("gem.progress",[{n:"loaded",k:"i",lo:0,hi:1099511627776},{n:"total",k:"i",lo:0,hi:1099511627776}]);u("gem.requestToken",[{n:"requestId",k:"s",max:64},{n:"reason",k:"e",v:["initial","expiring","rejected"]}]);u("gem.requestLocalServer",[{n:"requestId",k:"s",max:64},{n:"gameRoomId",k:"s",max:64}]);u("gem.localServer",[{n:"requestId",k:"s",max:64},{n:"serverId",k:"s",o:1,max:128}]);u("gem.localServer.denied",[{n:"requestId",k:"s",max:64},{n:"retryable",k:"b"},{n:"reason",k:"e",v:["refused","unavailable"]}]);u("gem.exit",[{n:"reason",k:"s",o:1,max:64}]);u("gem.openExternal",[{n:"url",k:"s",max:2048,f:"url"}]);u("gem.requestFullscreen",[{n:"enabled",k:"b"}]);u("gem.audioState",[{n:"muted",k:"b"}]);u("gem.rewardCue",[{n:"currencySlug",k:"s",max:32},{n:"expected",k:"i",o:1,lo:1,hi:1e9},{n:"origin",k:"o",o:1,fs:[{n:"x",k:"i",lo:0,hi:16384},{n:"y",k:"i",lo:0,hi:16384}]}]);u("gem.walletDisplay",[{n:"visible",k:"b"},{n:"currencies",k:"a",o:1,max:8,it:{n:"",k:"s",max:64}},{n:"score",k:"b",o:1}]);u("gem.controlsDeclare",[{n:"uses",k:"o",fs:[{n:"lookSensitivity",k:"s",o:1,max:16,f:"code"},{n:"gamepadLookSensitivity",k:"s",o:1,max:16,f:"code"},{n:"invertLookY",k:"s",o:1,max:16,f:"code"},{n:"touchMovement",k:"s",o:1,max:16,f:"code"}]}]);u("gem.menu",[{n:"settings",k:"b"},{n:"items",k:"a",o:1,max:4,it:{n:"",k:"o",fs:[{n:"id",k:"s",max:32},{n:"label",k:"s",max:40}]}}]);u("gem.menuSelect",[{n:"entry",k:"e",v:["settings","item"]},{n:"id",k:"s",o:1,max:32}]);u("gem.requestShare",[{n:"params",k:"a",max:16,it:{n:"",k:"o",fs:[{n:"key",k:"s",max:64},{n:"value",k:"s",max:512}]}}]);u("gem.requestAvatarPicker",[{n:"tab",k:"e",o:1,v:["2d","3d"]}]);u("gem.vibrate",[{n:"pattern",k:"a",max:99,it:{n:"",k:"i",lo:0,hi:1e4}}]);u("gem.frameStats",[{n:"fps",k:"i",lo:0,hi:1e3},{n:"frameTimeP95Ms",k:"i",lo:0,hi:1e5}]);u("gem.portraitBorders",[{n:"name",k:"s",o:1,max:40}]);u("gem.error",[{n:"code",k:"e",v:["version_mismatch","handshake_timeout","handshake_duplicate","invalid_message","rate_limited","token_unavailable","unsupported","unsupported_capability","internal"]},{n:"message",k:"s",o:1,max:256}]);u("gem.requestPurchase",[{n:"requestId",k:"s",max:64},{n:"purchaseKind",k:"e",v:["item","recipe"]},{n:"targetId",k:"s",max:64},{n:"currencySlug",k:"s",max:32},{n:"quantity",k:"i",o:1,lo:1,hi:10},{n:"catalogId",k:"s",o:1,max:64}]);u("gem.purchaseResult",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["ok","declined","unavailable"]},{n:"reason",k:"s",o:1,max:64,f:"code"},{n:"purchaseId",k:"s",o:1,max:64}]);u("gem.deviceSettings.put",[{n:"requestId",k:"s",max:64},{n:"settings",k:"j"}]);u("gem.deviceSettings.result",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["stored","too_large","unavailable"]}]);u("gem.requestAd",[{n:"requestId",k:"s",max:64},{n:"placement",k:"s",max:32},{n:"format",k:"e",v:["interstitial","rewarded"]}]);u("gem.adResult",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["shown","no_ad","unavailable"]}]);u("gem.requestSignIn",[{n:"requestId",k:"s",max:64}]);u("gem.signInResult",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["signed_in","declined","unavailable"]}]);u("gem.requestFriendChallenge",[{n:"requestId",k:"s",max:64},{n:"playerId",k:"s",max:64},{n:"template",k:"s",max:64},{n:"params",k:"j",o:1}]);u("gem.friendChallengeResult",[{n:"requestId",k:"s",max:64},{n:"outcome",k:"e",v:["accepted","cancelled","refused","unavailable","rate_limited","invalid"]},{n:"code",k:"s",o:1,max:64},{n:"param",k:"s",o:1,max:64},{n:"channel",k:"s",o:1,max:16},{n:"configVersion",k:"i",o:1,lo:0,hi:9007199254740991},{n:"retryAfterMs",k:"i",o:1,lo:0,hi:864e5},{n:"detail",k:"s",o:1,max:300}]);Object.freeze(ut);var G={now:()=>Date.now(),setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)};var U=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,a=i.find(s=>s.currencyId===e),o;return !a&&this.resolveCurrencyId&&(o=await this.resolveCurrencyId(e).catch(()=>{}),o!==void 0&&(a=i.find(s=>s.currencyId===o))),{currencyId:a?a.currencyId:o??e,total:a?a.total:null,...a?.buckets===void 0?{}:{buckets:a.buckets}}}};function Ge(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 ct="inventory",L=t=>typeof t=="number"?t:0,V=t=>typeof t=="string"?t:"";function Ee(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 pt(t){let e=t??{};return {itemDefinitionId:V(e.item_definition_id),instanceId:V(e.instance_id),quantity:L(e.quantity),acquiredAt:L(e.acquired_at),...e.properties===void 0?{}:{properties:e.properties},...e.custom_data===void 0?{}:{customData:e.custom_data}}}function Lr(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0;return {currencies:Ee(e.currencies,r=>{let i=r??{},a=Array.isArray(i.buckets)?i.buckets.map(o=>{let s=o??{};return {bucket:V(s.bucket),balance:L(s.balance)}}):void 0;return {currencyId:V(i.currency_id),total:L(i.total),...a===void 0?{}:{buckets:a}}}),items:Ee(e.items,pt),progressions:Ee(e.progressions,r=>{let i=r??{};return {progressionDefinitionId:V(i.progression_definition_id),currentValue:L(i.current_value),completionCount:L(i.completion_count),isCompleted:i.is_completed===true,...Ge(i)}}),...n===void 0?{}:{etag:n}}}var W=class{constructor(e,n,r){this.api=e;this.entity=n;this.cache=r;}api;entity;cache;snapshot(e={}){let n=e.buckets?`${ct}#buckets`:ct;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 a=r.items.data.filter(o=>o.itemDefinitionId===e);if(a.length>0)return a}let i=await un(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return Array.isArray(i)?i.map(pt):[]}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 dn(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 Lr(n)}};var qr={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(qr));var C=class extends RangeError{constructor(n,r){super(r);this.code=n;this.name="PurchaseRefusal";}code;retryable=false};var f=t=>typeof t=="string"?t:"",$r=t=>typeof t=="string"?t:f(t&&typeof t=="object"?t.type:void 0),v=t=>typeof t=="number"?t:0;function Fr(t){let e=t??{};return {prerequisiteType:f(e.prerequisite_type),referenceId:f(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:f(e.order_id),status:f(e.status),...n===void 0?{}:{etag:n}}}function ge(){return crypto.randomUUID()}var Mr="recipe-usage",gt=100;function me(t){let e=t??{};switch(e.type){case "currency":return {kind:"currency",currencyId:f(e.currency_id),bucket:f(e.bucket),delta:v(e.delta),balanceAfter:v(e.balance_after)};case "item":return {kind:"item",itemDefinitionId:f(e.item_definition_id),instanceId:f(e.instance_id),delta:v(e.delta),quantityAfter:v(e.quantity_after)};case "progression":return {kind:"progression",progressionDefinitionId:f(e.progression_definition_id),delta:v(e.delta),valueAfter:v(e.value_after),completed:e.completed===true};default:return {kind:"other",type:f(e.type)}}}function jr(t){let e=t??{},n=typeof e.rarity_tier=="string"?e.rarity_tier:void 0;return {entryId:f(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(me):[]}}function Br(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0,r=Array.isArray(e.loot_results)?e.loot_results.map(jr):void 0;return {orderId:f(e.order_id),status:f(e.status),...n===void 0?{}:{etag:n},granted:Array.isArray(e.granted)?e.granted.map(me):[],consumed:Array.isArray(e.consumed)?e.consumed.map(me):[],autoClaimedRewards:Array.isArray(e.auto_claimed_rewards)?e.auto_claimed_rewards.map(me):[],...r===void 0||r.length===0?{}:{lootResults:r}}}function Nr(t){let e=t??{},n=e.price??{};return {payment:"platform_currency",orderId:f(e.target_order_id)||f(e.source_order_id),status:f(e.status),purchaseId:f(e.purchase_id),sourceOrderId:f(e.source_order_id),price:{currencyId:f(n.platform_currency_id),amount:v(n.price)}}}function Dr(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:f(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 mt(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 J=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(()=>en(this.api,this.entity.type,this.entity.id,{operations:e.map(mt),source:n.source??"play",nonce:ge()},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}));return H(r)}async createMany(e,n={}){return this.write(()=>Ze(this.api,this.entity.type,this.entity.id,{orders:e.map(r=>({operations:r.map(mt),nonce:ge()})),source:n.source??"play"},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}))}async recipeAvailability(e,n,r){let a=await mn(this.api,this.entity.type,this.entity.id,e,n,r===void 0?{}:{signal:r})??{},o=typeof a.uses_remaining=="number"?a.uses_remaining:void 0,s=typeof a.cooldown_expires_at=="string"?a.cooldown_expires_at:void 0,d=Array.isArray(a.lock_reasons)?a.lock_reasons.map(Fr):[];return {canExecute:a.can_execute===true,locked:a.locked===true||d.length>0,lockReasons:d,reasons:Array.isArray(a.reasons)?a.reasons.map(c=>$r(c)):[],...o===void 0?{}:{usesRemaining:o},...s===void 0?{}:{cooldownExpiresAt:s}}}async recipeUsageAll(){return this.cache.read(Mr,[],async()=>{let n=await yn(this.api,this.entity.type,this.entity.id,{limit:gt})??{},r=Array.isArray(n.usages)?n.usages:[];return {usages:r.map(Dr),truncated:r.length>=gt}})}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(()=>an(this.api,this.entity.type,this.entity.id,{catalog_id:p.catalogId,recipe_id:p.targetId,game_id:this.api.gameId(),nonce:ge()},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}));return {payment:"configured",...Br(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([xn(this.api,n.signal===void 0?{}:{signal:n.signal}),le(this.api,n.signal===void 0?{}:{signal:n.signal})]),a=e.payment.currencySlug.toLowerCase(),o=i.currencies.find(p=>p.currency_id.toLowerCase()===a||p.slug.toLowerCase()===a);if(o===void 0){let p=i.currencies.map(b=>b.slug);throw new C("unknown_currency",`platform currency ${JSON.stringify(e.payment.currencySlug)} is not an active platform currency. Active: ${p.length===0?"none":p.join(", ")}`)}let s=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(s===void 0)throw new C("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=s.platform_prices.find(p=>p.platform_currency_id===o.currency_id);if(d===void 0){let p=m=>i.currencies.find(S=>S.currency_id===m)?.slug??m,b=s.platform_prices.map(m=>`${p(m.platform_currency_id)} ${m.price}`);throw new C("no_price_in_currency",`purchase target ${JSON.stringify(e.targetId)} has no ${o.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 C("quantity_invalid","item purchase quantity must be an integer from 1 through 10");let g=await this.write(()=>On(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:o.currency_id,price:d.price*c},expected_config_version:r.config_version,nonce:ge(),confirmation:"none"},n.signal===void 0?{}:{signal:n.signal}));return Nr(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(()=>Ke(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(()=>Mn(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(()=>Qe(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(()=>Vn(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 Le=t=>typeof t=="string"?t:"",Ur=t=>typeof t=="number"?t:0;function yt(t){let e=t??{};return {orderId:Le(e.order_id),status:Le(e.status),source:Le(e.source),createdAt:Ur(e.created_at)}}var z=class{constructor(e,n){this.api=e;this.entity=n;}api;entity;async list(e={}){let r=await En(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(yt):[],...i===void 0?{}:{nextCursor:i}}}async get(e,n){let r=await pn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return yt(r)}};var ft=t=>typeof t=="number"?t:0,Vr=t=>typeof t=="string"?t:"";function Wr(t){let e=t??{};return {progressionDefinitionId:Vr(e.progression_definition_id),currentValue:ft(e.current_value),completionCount:ft(e.completion_count),isCompleted:e.is_completed===true,...Ge(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(a=>a.progressionDefinitionId===e);if(i&&i.achievementsUnavailable!==true)return i;try{let a=await gn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return Wr(a)}catch{return i??null}}};var ye=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 a=n.length===0,o=a?e:e+"\0"+n.join("\0"),s=this.slots.get(o);if(s){let p=s.filledAt;if(p!==void 0&&(i===void 0||this.clock.now()-p<=i))return Promise.resolve(s.value);if(s.inFlight)return s.inFlight}let d=s??{};this.slots.set(o,d);let c=this.generation,g=r().then(p=>(a&&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(o)===d&&this.slots.delete(o));});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 Hr(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 qe(t){try{let e=Hr(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},Jr=3e4,ht="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",zr=/^[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(!zr.test(t)||t.startsWith("_"))throw new TypeError(`${JSON.stringify(t)} is not a usable save key: ${e}.`);return t}function _t(t,e){let n=new AbortController,r=AbortSignal.timeout(e),i=()=>n.abort(r.reason),a=()=>n.abort(t?.reason);return t?.aborted?n.abort(t.reason):(r.addEventListener("abort",i,{once:true}),t?.addEventListener("abort",a,{once:true})),{signal:n.signal,release:()=>{r.removeEventListener("abort",i),t?.removeEventListener("abort",a);}}}function $e(t,e){return t.aborted&&e?.aborted!==true}var Kr=new Set(["x-ms-blob-type"]),Yr=/^[ -~]+$/;function Qr(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 a=r.toLowerCase();if(!Kr.has(a))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"||!Yr.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(a in n)throw new _("save_malformed",`the grant for save ${JSON.stringify(e)} named ${JSON.stringify(a)} twice.`);n[a]=i;}return n}function Fe(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 Me(t){return t?.reason==="not_found"}var Y=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(a){throw new _("save_malformed",`save ${JSON.stringify(e)} could not be serialised to JSON: ${String(a)}. 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",a=this.budget(r.timeoutMs),o=_t(r.signal,a);try{let s=await Un(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:o.signal});if(typeof s.upload_url!="string"||typeof s.session_id!="string")throw new _("save_malformed",`the grant for save ${JSON.stringify(e)} named nowhere to put the bytes.`);let d=Qr(s.upload_headers,e),c,g=this.options.fetch??globalThis.fetch.bind(globalThis);try{c=await g(s.upload_url,{method:"PUT",headers:{"content-type":i,...d},body:n,credentials:"omit",signal:o.signal});}catch(p){throw $e(o.signal,r.signal)?this.timeout("upload",a):new _("upload_failed",`${ht} for PUT. Underlying error: ${p}`)}if(!c.ok){let p=await qe(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 Fe(await on(this.api,this.entity.type,this.entity.id,k(e),{session_id:s.session_id},{signal:o.signal}))}catch(s){throw this.rethrow(s,r.signal,o.signal,"save",a)}finally{o.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=_t(n.signal,r);try{let a;try{let d=await Ae(this.api,this.entity.type,this.entity.id,k(e),{signal:i.signal});if(!d.modified)return null;a=d.body;}catch(d){if(Me(d))return null;throw d}if(typeof a.download_url!="string")throw new _("save_malformed",`the record for save ${JSON.stringify(e)} named no link to its stored bytes.`);let o=this.options.fetch??globalThis.fetch.bind(globalThis),s;try{s=await o(a.download_url,{credentials:"omit",signal:i.signal});}catch(d){throw $e(i.signal,n.signal)?this.timeout("download",r):new _("download_failed",`${ht} for GET. Underlying error: ${d}`)}if(!s.ok){let d=await qe(s);throw new _("download_failed",`the save download answered ${s.status}. `+(s.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 s.arrayBuffer())}catch(a){throw this.rethrow(a,n.signal,i.signal,"load",r)}finally{i.release();}}async describe(e,n={}){try{let r=await Ae(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?Fe(r.body):null}catch(r){if(Me(r))return null;throw r}}async list(e={}){let n=await Gn(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(Fe),...typeof r=="string"&&r.length>0?{nextCursor:r}:{}}}async delete(e,n){try{await tn(this.api,this.entity.type,this.entity.id,k(e),{...n===void 0?{}:{signal:n}});}catch(r){if(!Me(r))throw r}}budget(e){return e??this.options.timeoutMs??Jr}timeout(e,n){return new _("save_timeout",`the save ${e} did not finish within ${n}ms`)}rethrow(e,n,r,i,a){return e instanceof _?e:$e(r,n)?this.timeout(i,a):e}};function Xr(t){try{return Ce(t)}catch{return t}}function je(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"?Xr(n.value):"",...r===void 0?{}:{etag:r},updatedAt:typeof n.updated_at=="number"?n.updated_at:0}}var Q=class{constructor(e,n){this.api=e;this.entity=n;}api;entity;async list(e){let r=(await Tn(this.api,this.entity.type,this.entity.id,e===void 0?{}:{signal:e}))?.settings;return Array.isArray(r)?r.map(i=>je(i)):[]}async get(e,n={}){try{let r=await ln(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?je(r.body,r.etag):null}catch(r){if(bt(r))return null;throw r}}async put(e,n,r={}){let i=await jn(this.api,this.entity.type,this.entity.id,e,{value:ue(n)},{...r.signal===void 0?{}:{signal:r.signal},...r.ifMatch===void 0?{}:{ifMatch:r.ifMatch}});return je(i)}async delete(e,n){try{await nn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});}catch(r){if(!bt(r))throw r}}};function bt(t){return t?.reason==="not_found"}function fe(t,e,n={}){let r=new ye(G,n.identity);n.onInventoryChanged&&r.onInvalidate(n.onInventoryChanged);let i=new W(t,e,r);return {settings:new Q(t,e),inventory:i,saves:new Y(t,e,n.saves??{}),currencies:new U(i,n.resolveCurrencyId),mutations:new J(t,e,r),orders:new z(t,e),progressions:new K(t,e,i)}}var I=t=>typeof t=="string"?t:"",q=t=>typeof t=="number"?t:0;function he(t,e){let n=e??{},r=I(n.character_id);if(r==="")throw new Error("[gem] a character response carried no character_id");return {...t(r),id:r,playerId:I(n.player_id),gameId:I(n.game_id),channel:I(n.channel)||"release",name:I(n.name),slotIndex:q(n.slot_index),isActive:n.is_active!==false,createdAt:I(n.created_at),updatedAt:I(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=fe(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 In(this.api,e===void 0?{}:{signal:e}))?.characters;return Array.isArray(r)?r.map(i=>he(this.scope,i)):[]}async get(e,n){let r=await sn(this.api,e,n===void 0?{}:{signal:n});return he(this.scope,r)}async create(e){let n=await Xe(this.api,{name:e.name},e.signal===void 0?{}:{signal:e.signal});return he(this.scope,n)}async update(e,n,r){let i=await Dn(this.api,e,{name:n},r===void 0?{}:{signal:r});return he(this.scope,i)}async delete(e,n){await Wn(this.api,e,n===void 0?{}:{signal:n});}async slots(e){let r=await kn(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 $(t){return new w(t)}var Zr={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,a;try{a=new Intl.Collator(n);}catch{a=new Intl.Collator;}return a.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 F=t=>typeof t=="string"?t:"";function _e(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:F(e.transfer_id),status:F(e.status),sourceEntityId:F(e.source_entity_id),targetEntityId:F(e.target_entity_id),...n===void 0?{}:{message:$(n)},createdAt:F(e.created_at),expiresAt:F(e.expires_at),...r===void 0?{}:{resolvedAt:r}}}function ei(){return crypto.randomUUID()}var Z=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 Pn(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:ei()},e.signal===void 0?{}:{signal:e.signal});return _e(n)}async list(e={}){let r=await $n(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(_e):[],...i===void 0?{}:{nextCursor:i}}}async get(e,n){let r=await Sn(this.api,e,n===void 0?{}:{signal:n});return _e(r)}async accept(e,n){return this.resolve(()=>ze(this.api,e,n===void 0?{}:{signal:n}))}async reject(e,n){return this.resolve(()=>Nn(this.api,e,n===void 0?{}:{signal:n}))}async cancel(e,n){return this.resolve(()=>Ye(this.api,e,n===void 0?{}:{signal:n}))}async resolve(e){return this.inventory.invalidate(),_e(await e())}};function P(t){return typeof t=="string"&&t!==""?t:void 0}var Rt=new Set(["localhost","127.0.0.1","[::1]"]);function ee(t){let e=P(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:"&&Rt.has(n.hostname)))return e}function ni(t){if(!Array.isArray(t))return [];let e=[];for(let n of t){let r=n??{},i=P(r.item_id),a=ee(r.icon_url);i!==void 0&&a!==void 0&&e.push({itemId:i,iconUrl:a});}return e}function A(t){let e=t??{},n=P(e.player_id),r=P(e.display_name),i=P(e.discriminator),a=P(e.display_tag),o=P(e.avatar_icon_id),s=ee(e.avatar_icon_url),d=P(e.avatar_3d_id),c=ee(e.avatar_3d_model_url),g=ee(e.avatar_3d_icon_url);return {...n===void 0?{}:{playerId:n},...r===void 0?{}:{displayName:$(r)},...i===void 0?{}:{discriminator:i},...a===void 0?{}:{displayTag:$(a)},...o===void 0?{}:{avatarIconId:o},...s===void 0?{}:{avatarIconUrl:s},...d===void 0?{}:{avatar3dId:d},...c===void 0?{}:{avatar3dModelUrl:c},...g===void 0?{}:{avatar3dIconUrl:g},badges:ni(e.badges)}}var ti=new Set(["https://downloads.gemarcade.com","https://cdn.gemarcade.com"]);function ri(t){if(t===void 0)return;let e=ee(t);if(e===void 0)return;let n=new URL(e);return Rt.has(n.hostname)||ti.has(n.origin)?e:void 0}var wt=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;var Ne=class extends y{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});}},be=t=>typeof t=="string"?t:void 0;function xt(t){let e=t??{};return {...A(e),playerId:be(e.player_id)??""}}function vt(t){let e=t.has_more===true?be(t.next_cursor):void 0;return e===void 0?{}:{nextCursor:e}}function ii(t){let e=t??{};return {friends:Array.isArray(e.data)?e.data.map(xt):[],...vt(e)}}var Be=t=>typeof t=="number"&&Number.isFinite(t)?t:void 0;function ai(t){return typeof t!="object"||t===null||Array.isArray(t)?{}:Object.fromEntries(Object.entries(t).filter(e=>typeof e[1]=="string"||typeof e[1]=="number"&&Number.isFinite(e[1])))}function kt(t){let e=t??{},n=Be(e.opened_at),r=Be(e.answered_at);return {id:be(e.item_id)??"",from:xt(e.sender),template:be(e.template)??"",params:ai(e.params),createdAt:Be(e.created_at)??0,...n===void 0?{}:{openedAt:n},...r===void 0?{}:{answeredAt:r}}}function oi(t){let e=t??{};return {challenges:Array.isArray(e.data)?e.data.map(kt):[],...vt(e)}}function si(t){let e=t;return e?.reason==="not_found"&&e.code==="inbox_item_not_found"}var ne=class{#e;#t;#a;constructor(e,n={}){this.#e=e,this.#t=n.challenge,this.#a=n.launchedChallengeId;}async list(e={}){let n=await qn(this.#e,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}});return ii(n)}challenge(e){return this.#t===void 0?Promise.resolve({outcome:"unavailable"}):this.#t(e)}async inbox(e={}){let n=await Ln(this.#e,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}});return oi(n)}async launchedChallenge(e={}){let n=this.#a;if(n===void 0||!wt.test(n))return null;try{return kt(await _n(this.#e,n,{...e.signal===void 0?{}:{signal:e.signal}}))}catch(r){if(si(r))return null;throw r}}async markAnswered(e){if(typeof e!="string"||!wt.test(e))throw new y("invalid",400,"id must be a FriendChallenge.id, as gem.friends.launchedChallenge() or inbox() returned it",void 0,"bad_request");await Fn(this.#e,e);}};var St=100,Ot=/^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}Z)?$/;function De(t){let{periodsBack:e,period:n,playerId:r}=t;if(ce(e),e!==void 0&&n!==void 0)throw new TypeError("pass periodsBack or period, not both");if(n!==void 0&&(typeof n!="string"||!Ot.test(n)))throw new TypeError(`period must be a period id such as 2026-10-02 (a result's period.id), got ${String(n)}`);if(r!==void 0&&(typeof r!="string"||r===""))throw new TypeError("playerId must be a player id");return {...e===void 0?{}:{periods_back:e},...n===void 0?{}:{period:n},...r===void 0?{}:{player_id:r}}}function Ct(t){let e=typeof t.period_id=="string"?t.period_id:"";if(!Ot.test(e))return;let n=Ie(t.period_local_date),r=O(t.period_start_at),i=O(t.period_ends_at),a=r>0&&i>0;return {id:e,...n===void 0?{}:{localDate:n},...a?{startAt:r,endsAt:i}:{},opensAt:O(t.opens_at),closesAt:O(t.closes_at),final:t.final===true}}var te=t=>typeof t=="string"?t:"",M=t=>typeof t=="number"?t:0,re=t=>typeof t=="string"?t:void 0,li=t=>typeof t=="number"?t:void 0,It={player:"players",character:"characters"};function di(t,e){let n=t??{},r=re(n.entity_id),i=typeof n.entity_type=="string"&&Object.hasOwn(It,n.entity_type)?n.entity_type:void 0,a=Tt(n.stats),o=n.properties!==null&&typeof n.properties=="object"?n.properties:void 0,s=e?n.is_viewer===true:void 0;return {...A(n),rank:M(n.rank),occurredAt:M(n.occurred_at),...s===void 0?{}:{isViewer:s},...r===void 0?{}:{entityId:r},...i===void 0?{}:{entityType:i},...a===void 0?{}:{stats:a},...o===void 0?{}:{properties:o}}}function At(t,e){let n=t??{},r=re(n.bucket_1),i=re(n.bucket_2),a=li(n.update_frequency_seconds),o=Ct(n);return {leaderboardType:te(n.leaderboard_type),runType:te(n.run_type),...r===void 0?{}:{bucket1:r},...i===void 0?{}:{bucket2:i},entries:Array.isArray(n.entries)?n.entries.map(s=>di(s,e)):[],generatedAt:M(n.generated_at),...a===void 0?{}:{updateFrequencySeconds:a},...o===void 0?{}:{period:o}}}function Pt(t){if(t===null||typeof t!="object"||Array.isArray(t))return;let e=t;if(!Number.isFinite(e.rank))return;let n=Tt(e.stats),r=e.properties!==null&&typeof e.properties=="object"?e.properties:void 0;return {rank:e.rank,occurredAt:M(e.occurred_at),...n===void 0?{}:{stats:n},...r===void 0?{}:{properties:r}}}function Tt(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 ui(t,e,n){let r=t??{},i=re(r.bucket_1),a=re(r.bucket_2),o=Ct(r);return {leaderboardType:te(r.leaderboard_type),runType:te(r.run_type),entityType:e,entityId:n,...i===void 0?{}:{bucket1:i},...a===void 0?{}:{bucket2:a},entries:Array.isArray(r.entries)?r.entries.map(Pt).filter(s=>s!==void 0):[],personalBest:Pt(r.personal_best)??null,totalRuns:M(r.total_runs),totalRunsExact:r.total_runs_exact!==false,generatedAt:M(r.generated_at),...o===void 0?{}:{period:o}}}var ie=class{#e;constructor(e){this.#e=e;}async get(e,n={}){let r=De(n),i=await bn(this.#e,e,{...r,...n.bucket1===void 0?{}:{bucket_1:n.bucket1},...n.bucket2===void 0?{}:{bucket_2:n.bucket2},...n.signal===void 0?{}:{signal:n.signal}});return At(i,false)}async friends(e,n={}){let r=De(n),i=await fn(this.#e,e,{...r,...n.bucket1===void 0?{}:{bucket_1:n.bucket1},...n.bucket2===void 0?{}:{bucket_2:n.bucket2},...n.signal===void 0?{}:{signal:n.signal}});return At(i,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:d}=i;if(!Number.isInteger(d)||d<1||d>St)throw new TypeError(`limit must be an integer between 1 and ${St}, got ${String(d)}`)}let a=De(i),o=await cn(this.#e,e,It[n],r,{...a,...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"&&te((o??{}).entity_id)||r;return ui(o,n,s)}};var Re=t=>typeof t=="string"?t:void 0;function ci(t){let e=t??{},n=Re(e.currency_id);if(n===void 0||n==="")return;let r=typeof e.balance=="number"&&Number.isFinite(e.balance)?e.balance:0;return {slug:Re(e.slug)??"",currencyId:n,balance:r,access:e.access==="spend"?"spend":"read"}}var we=class{#e;constructor(e){this.#e=e;}async get(e={}){let r=(await le(this.#e,e))?.currencies;if(!Array.isArray(r))return [];let i=[];for(let a of r){let o=ci(a);o!==void 0&&i.push(o);}return i}},Ue=t=>typeof t=="number"&&Number.isFinite(t)&&t>=0?Math.floor(t):0;function pi(t){let e=t??{},n=Re(e.currency_id);if(n===void 0||n==="")return;let r=Ue(e.limit),i=Math.min(Ue(e.earned),r),a=Math.min(Ue(e.remaining),r-i),o=e.period_days,s=typeof o=="number"&&Number.isInteger(o)&&o>=1?o:1,d=e.resets_at,c=typeof d=="number"&&Number.isFinite(d)&&d>0?Math.round(d*1e3):void 0;return {currencySlug:Re(e.currency_slug)??"",currencyId:n,limit:r,earned:i,remaining:a,period:e.period==="day"?"day":"window",periodDays:s,...c===void 0?{}:{resetsAt:c}}}var xe=class{#e;#t;#a;constructor(e,n,r){this.#e=e,this.#t=n,this.#a=r;}async get(e={}){let r=(await Rn(this.#e,e))?.currencies;if(!Array.isArray(r))return [];let i=[];for(let a of r){let o=pi(a);o!==void 0&&i.push(o);}return i}on(e,n){return e!=="changed"?(this.#a?.(`[gem] unknown earnAllowance event '${String(e)}'; the only event is 'changed'`),()=>{}):this.#t?.on(n)??(()=>{})}},ae=class{currencies;earnAllowance;constructor(e,n,r){this.currencies=new we(e),this.earnAllowance=new xe(e,n,r);}};var Ve=t=>typeof t=="string"?t:"",Et=t=>typeof t=="number"?t:0;function gi(t){let e=t??{};return {key:Ve(e.key),visibility:Ve(e.visibility),value:e.value,updatedAt:Et(e.updated_at)}}function mi(t){let e=t??{};return {...A(e),playerId:Ve(e.player_id),showcase:Array.isArray(e.showcase)?e.showcase.map(gi):[],generatedAt:Et(e.generated_at)}}function yi(t){return t?.reason==="not_found"}var oe=class{#e;constructor(e){this.#e=e;}async of(e,n={}){try{return mi(await wn(this.#e,e,{...n.signal===void 0?{}:{signal:n.signal}}))}catch(r){if(yi(r))return null;throw r}}};var ve=t=>typeof t=="string"?t:"",We=t=>typeof t=="number"?t:0;function Gt(t){let e=t??{};return {playerId:ve(e.player_id),key:ve(e.key),value:e.value,updatedAt:We(e.updated_at)}}function fi(t){let e=t??{};return {...A(e),playerId:ve(e.player_id),value:e.value,isViewer:e.is_viewer===true,updatedAt:We(e.updated_at)}}function hi(t){return t?.reason==="not_found"}var se=class{constructor(e,n){this.api=e;this.selfPlayerId=n;}api;selfPlayerId;async friends(e,n={}){let i=await hn(this.api,k(e),{...n.signal===void 0?{}:{signal:n.signal}})??{};return {key:ve(i.key),entries:Array.isArray(i.entries)?i.entries.map(fi):[],generatedAt:We(i.generated_at)}}async of(e,n,r={}){try{return Gt(await vn(this.api,e,k(n),{...r.signal===void 0?{}:{signal:r.signal}}))}catch(i){if(hi(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(a){throw new TypeError(`showcase value for ${JSON.stringify(e)} could not be serialised to JSON: ${String(a)}.`,{cause:a})}let i=await this.selfPlayerId();return Gt(await Bn(this.api,i,e,{value:n},{...r.signal===void 0?{}:{signal:r.signal}}))}async clear(e,n={}){let r=await this.selfPlayerId();await rn(this.api,r,k(e),{...n.signal===void 0?{}:{signal:n.signal}});}};var _i="https://function.gem.invalid",Lt={token:"function",expiresAt:Number.POSITIVE_INFINITY,chainEndsAt:Number.POSITIVE_INFINITY},bi="createGem() from @indiegems/gem-web-sdk/function only runs inside a serverless function; in a browser import @indiegems/gem-web-sdk/sdk",ke="gem.me is unavailable: this function was invoked by a game server, not a player",Ri="gem.functions is unavailable inside a serverless function",wi="gem.gameConfig is unavailable inside a serverless function",xi="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 vi(t){let e=new Set(T);return {async request(n){let r={...n},i=r.headers;if(i){for(let[a,o]of Object.entries(i))if(o!==void 0&&e.has(a.toLowerCase()))throw new h(xi)}return t.request(r)}}}function qt(t,e,n){Object.defineProperty(t,e,{get(){throw new Error(n)},enumerable:false});}function ki(t){let e=globalThis.__gemFunctionHost;if(e===void 0)throw new Error(bi);let n=e.context(),r=new de({clock:G,request:()=>Promise.resolve(Lt)});r.accept(Lt);let i=vi(tt({baseUrl:_i,tokenSource:r,defaultQuery:{game_id:n.gameId,channel:n.channel}})),a=new N({transport:i,clock:G,maxRetries:0}),o={client:a,gameId:()=>n.gameId},s=n.caller.type==="player"?n.caller.playerId:null,d=s===null?null:{playerId:s,gameId:n.gameId,channel:n.channel},c=s===null?null:{type:"players",id:s},g=c===null?null:fe(o,c),p=c===null||g===null?null:new Z(o,c,g.inventory),b=Se=>console.info(Se),m=new j({client:()=>a,clock:G,gameId:()=>n.gameId,playerId:()=>s,environment:{sdk_version:Je()},log:b}),S={context:n,identity:d,awaitIdentity:()=>d===null?Promise.reject(new Error(ke)):Promise.resolve(d),awaitBridge:()=>Promise.resolve("connected"),client:a,get me(){if(g===null)throw new Error(ke);return g},characters:new X(o),get transfers(){if(p===null)throw new Error(ke);return p},analytics:m,leaderboards:new ie(o),challenges:new D(o),showcase:new se(o,()=>s===null?Promise.reject(new Error(ke)):Promise.resolve(s)),friends:new ne(o),platform:new ae(o,void 0,b),profiles:new oe(o)};return qt(S,"functions",Ri),qt(S,"gameConfig",wi),S}var Si=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]]),He=class extends y{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:Si.get(this.code))??super.retryable}};
2
+ export{j as AnalyticsApi,R as AuthError,T as CONDITIONAL_HEADERS,D as ChallengesApi,X as CharactersApi,U as CurrenciesApi,Ne as FriendChallengeError,ne as FriendsApi,y as GemApiError,N as GemClient,He as GemFunctionError,_ as GemSaveError,W as InventoryApi,ie as LeaderboardsApi,rt as MAX_PERIODS_BACK,J as MutationsApi,z as OrdersApi,ae as PlatformApi,we as PlatformCurrenciesApi,xe as PlatformEarnAllowanceApi,w as PlayerText,oe as ProfilesApi,K as ProgressionsApi,Y as SavesApi,Q as SettingsApi,se as ShowcaseApi,Z as TransfersApi,h as TransportRefusal,$ as asPlayerText,ki as createGem,A as mapIdentity,ri as platformIconUrl,Zr as text,ue as toBase64};//# sourceMappingURL=gem-web-sdk.function.js.map
3
3
  //# sourceMappingURL=gem-web-sdk.function.js.map