@indiegems/gem-web-sdk 15.3.3 → 16.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.
- package/CHANGELOG.md +20 -0
- package/dist/conformance.d.ts +7 -1
- package/dist/game.d.ts +187 -1
- package/dist/gem-web-sdk.bridge.js +2 -2
- package/dist/gem-web-sdk.conformance.js +3 -3
- package/dist/gem-web-sdk.esm.js +3 -3
- package/dist/gem-web-sdk.function.js +3 -3
- package/dist/gem-web-sdk.game.js +3 -3
- package/dist/gem-web-sdk.min.js +3 -3
- package/dist/gem-web-sdk.sdk.js +3 -3
- package/dist/gem-web-sdk.server.js +2 -2
- package/dist/index.d.ts +171 -7
- package/dist/sdk.d.ts +187 -1
- package/docs/api/api-reference-function.md +1 -1
- package/docs/api/api-reference-game.md +762 -3
- package/docs/api/api-reference-server.md +1 -1
- package/docs/api/reference.json +1203 -190
- package/docs/arcade-and-store.md +289 -0
- package/docs/arcade-economy.md +13 -9
- package/docs/changelog.md +20 -0
- package/docs/getting-started.md +1 -1
- package/docs/inventory-and-catalogs.md +8 -4
- package/docs/manifest.json +15 -10
- package/docs/player-text-fields.json +45 -4
- package/docs/server-bundles.md +2 -2
- package/package.json +1 -1
- package/schema/bridge.v1.json +735 -5
- package/schema/capabilities.public.json +28 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
globalThis.__gemWebSdkVersion="[gem-web-sdk:sdkVersion:15.3.3]";function Qe(){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 en(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 nn(t,e,n){let r=`/v1/inventory/transfers/${l(e)}/cancel`;return t.client.post(r,void 0,n?.signal)}async function tn(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 rn(t,e,n){return t.client.post("/v1/characters",e,n?.signal)}async function an(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 on(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 sn(t,e,n,r,i){let a=`/v1/settings/${l(e)}/${l(n)}/${l(r)}`;return t.client.delete(a,i?.signal)}async function ln(t,e,n,r,i){let a=`/v1/saves/${l(e)}/${l(n)}/${l(r)}`;return t.client.delete(a,i?.signal)}async function dn(t,e,n,r){let i=`/v1/showcase/players/${l(e)}/${l(n)}`;return t.client.delete(i,r?.signal)}async function un(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 cn(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 pn(t,e,n){let r=`/v1/characters/${l(e)}`;return t.client.get(r,n?.signal)}async function gn(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 mn(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 yn(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 fn(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 hn(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 _n(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 bn(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 Rn(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 Ce(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 xn(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 wn(t,e,n){let r=`/v1/showcase/friends/${l(e)}`;return t.client.get(r,n?.signal)}async function vn(t,e,n){let r=`/v1/inbox/friend-challenges/${l(e)}`;return t.client.get(r,n?.signal)}async function kn(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 Sn(t,e){let n=`/v1/games/${l(t.gameId())}/players/me/earn-allowance`;return t.client.get(n,e?.signal)}async function de(t,e){return t.client.get("/v1/inventory/players/me/platform-currencies",e?.signal)}async function An(t,e,n){let r=`/v1/profiles/players/${l(e)}`;return t.client.get(r,n?.signal)}async function Pn(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 On(t,e,n,r){let i=`/v1/showcase/players/${l(e)}/${l(n)}`;return t.client.get(i,r?.signal)}async function Cn(t,e){return t.client.get("/v1/characters/slots",e?.signal)}async function In(t,e,n){let r=`/v1/inventory/transfers/${l(e)}`;return t.client.get(r,n?.signal)}async function Tn(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,retryRateLimited:false})}async function En(t,e,n){return t.client.post("/v1/inventory/transfers",e,n?.signal)}async function Gn(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 Ln(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 Mn(t,e){return t.client.get("/v1/characters",e?.signal)}async function Fn(t,e,n,r){let i=`/v1/settings/${l(e)}/${l(n)}`;return t.client.get(i,r?.signal)}async function $n(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 qn(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 jn(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 Nn(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 Bn(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 Dn(t,e,n){let r=`/v1/inbox/friend-challenges/${l(e)}/answered`;return t.client.post(r,void 0,n?.signal)}async function Un(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 Vn(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 Wn(t,e,n,r,i){let a=`/v1/showcase/players/${l(e)}/${l(n)}`;return t.client.put(a,r,i?.signal)}async function Hn(t,e,n){let r=`/v1/inventory/transfers/${l(e)}/reject`;return t.client.post(r,void 0,n?.signal)}async function Jn(t,e,n,r){let i=`/v1/characters/${l(e)}`;return t.client.patch(i,n,r?.signal)}async function zn(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 Kn(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 Yn(t,e,n){let r=`/v1/characters/${l(e)}`;return t.client.delete(r,n?.signal)}function Xn(t,e){let n=e?.retryAfterSeconds,r=typeof n=="number"&&Number.isFinite(n)&&n>0?n*1e3:0,i=1e4*2**Math.min(Math.max(0,t-1),16);return Math.min(Math.max(r,i),3e5)}var Wt="gem_";function Qn(t){return t.startsWith(Wt)}function Ht(t){let e=2166136261;for(let n of new TextEncoder().encode(t))e^=n,e=Math.imul(e,16777619);return e>>>0}function Jt(t){let e=t;return e^=e>>>16,e=Math.imul(e,2246822507),e^=e>>>13,e=Math.imul(e,3266489909),e^=e>>>16,e>>>0}function Ie(t,e,n){if(Te(t,n),typeof e!="string"||e==="")throw new TypeError("[gem] experiment: playerId must be a non-empty string");let r=typeof n=="number"?n:n.length,i=Jt(Ht(`${t}:${e}`))%r;return typeof n=="number"?i:n[i]}function Te(t,e){if(typeof t!="string"||t==="")throw new TypeError("[gem] experiment: key must be a non-empty string");if(typeof e=="number"){if(!Number.isInteger(e)||e<1||e>2048)throw new RangeError(`[gem] experiment '${t}': the count must be an integer from 1 to 2048; got ${String(e)}`);return}if(!Array.isArray(e))throw new TypeError(`[gem] experiment '${t}': pass a count or a list of strings; got ${typeof e}`);let n=e;if(n.length<1||n.length>2048)throw new RangeError(`[gem] experiment '${t}': the list must hold 1 to 2048 strings; got ${n.length}`);if(!n.every(r=>typeof r=="string"))throw new TypeError(`[gem] experiment '${t}': every option must be a string`)}var Zn=1e4,et=50,Yt=500,Xt=65536-4*1024,Qt=24*1024;function nt(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 tt=t=>typeof t=="number"?t:0,Zt=t=>typeof t=="string"?t:"";function ue(t=0){return {accepted:0,rejected:[],dropped:t,duplicate:false}}function er(t,e){let n=t??{},r=Array.isArray(n.rejected)?n.rejected.map(i=>{let a=i??{};return {index:tt(a.index),code:Zt(a.code)}}):[];return {accepted:tt(n.accepted),rejected:r,dropped:e,duplicate:n.duplicate===true}}function Ee(){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 nr(t){return t?.retryable===true}var B=class{#e;#t;#a;#f;#n=[];#h={};#o=0;#s=null;#_=false;#b=false;#p=0;#R=0;#x=0;#r=false;#w=null;#l=null;#u=false;#i=false;#g=false;#v=false;#k=false;constructor(e){this.#e=e,this.#t=e.options?.enabled!==false,this.#a=Math.max(Zn,e.options?.flushIntervalMs??Zn),this.#f=Math.max(1,Math.floor(e.options?.maxQueue??Yt));}track(e,n={}){if(!(!this.#t||this.#r)){if(Qn(e)){this.#k||(this.#k=true,this.#y(`[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.#S(e,nt({...this.#h,...n}));}}setContext(e){this.#h={...this.#h,...e};}async experiment(e,n){Te(e,n);let r=this.#e.awaitPlayerId===void 0?this.#e.playerId():await this.#e.awaitPlayerId();if(r===null)throw new Error(`[gem] experiment '${e}': no player to select for \u2014 this call was not made by a player.`);return typeof n=="number"?Ie(e,r,n):Ie(e,r,n)}get environment(){let e=this.#e.environment;return {...typeof e=="function"?e():e??{}}}async flush(e={}){if(this.#i)return ue();let n=this.#T();if(n===null||n==="")return this.#n.length>0&&!this.#v&&(this.#v=true,this.#y("[gem] analytics: events are being recorded but no play session has been established, so nothing is being sent. Outside the arcade this is expected.")),ue();if(this.#P(),this.#n.length===0)return ue();let r=e.keepalive===true;if(this.#p>0&&!r)return ue();this.#c();let i=this.#n.splice(0,this.#C(r)),a=this.#o;this.#o=0;let o=Math.round(this.#e.clock.now()),s={batch_id:Ee(),sent_at_ms:o,events:i.map(c=>rt(c,o))},d={client:this.#e.client(),gameId:()=>n};this.#p+=1;try{let c=await Tn(d,s,{...e.signal===void 0?{}:{signal:e.signal},...r?{keepalive:!0}:{}}),g=er(c,a);return this.#R=0,this.#x=0,this.#I(g),g}catch(c){throw nr(c)?(this.#O(i,a),this.#R+=1,this.#x=this.#e.clock.now()+Xn(this.#R,c)):this.#y(`[gem] analytics: ${i.length} event(s) were discarded \u2014 the platform refused the batch and will refuse it again: ${String(c)}`),c}finally{this.#p-=1,this.#n.length>0&&this.#d();}}trackPlatform(e,n={}){this.#r||this.#i&&(e==="gem_pause"||e==="gem_resume")||this.#S(e,nt(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.#g&&(this.#g=false,this.#l=e,this.#u=false,this.#n.unshift({uid:Ee(),name:"gem_session_start",atMs:e,dimensions:{},measures:{}})),this.#n.length>=et?this.#m():this.#n.length>0&&this.#d();}get held(){return this.#i}startSession(){if(!(this.#r||this.#l!==null)){if(this.#i){this.#g=true;return}this.#l=this.#e.clock.now(),this.#u=false,this.trackPlatform("gem_session_start");}}endSession(e){if(this.#r||this.#u)return;if(this.#u=true,this.#i){this.#g=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.#m({keepalive:true});}setPaused(e){this.#r||e===this.#_||(this.#_=e,this.trackPlatform(e?"gem_pause":"gem_resume"),e?this.#c():this.#n.length>0&&this.#d());}setHidden(e){this.#r||e===this.#b||(this.#b=e,e?this.#c():this.#n.length>0&&this.#d());}dispose(){this.#r=true,this.#c(),this.#n=[],this.#o=0;}get pending(){return this.#n.length}#S(e,n){let{dimensions:r,measures:i}=n;for(this.#P();this.#n.length>=this.#f;)this.#n.shift(),this.#o+=1;this.#n.push({uid:Ee(),name:e,atMs:this.#e.clock.now(),dimensions:r,measures:i}),this.#n.length>=et?this.#m():this.#d();}#m(e={}){if(e.keepalive!==true&&this.#A()>0){this.#d();return}this.flush(e).catch(()=>{});}#A(){return Math.max(0,this.#x-this.#e.clock.now())}#O(e,n){for(this.#n=[...e,...this.#n],this.#o+=n;this.#n.length>this.#f;)this.#n.shift(),this.#o+=1;}#C(e){let n=e?Qt:Xt,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(rt(o,0)).length+1,i>n)return Math.max(1,a)}return r}#d(){this.#s!==null||this.#_||this.#b||this.#i||this.#r||this.#p>0||(this.#s=this.#e.clock.setTimeout(()=>{this.#s=null,this.#m();},Math.max(this.#a,this.#A())));}#c(){this.#s!==null&&(this.#e.clock.clearTimeout(this.#s),this.#s=null);}#P(){let e=this.#E();e===null||e===""||(this.#w!==null&&this.#w!==e&&(this.#n=[],this.#o=0,this.#l=null,this.#u=false),this.#w=e);}#I(e){for(let n of e.rejected)this.#y(`[gem] analytics: an event was refused (${n.code}). `+tr(n.code));}#y(e){let n=this.#e.log;n!==null&&(n===void 0?console.warn(e):n(e));}#T(){try{return this.#e.gameId()}catch{return null}}#E(){try{return this.#e.playerId()}catch{return null}}};function rt(t,e){return {event_uid:t.uid,name:t.name,offset_ms:Math.round(t.atMs)-e,dimensions:t.dimensions,measures:t.measures}}function tr(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 rr={initialDelayMs:2e3,maxDelayMs:6e4};function ir(t,e){return e!==void 0?!e:t==="chain_exhausted"}var ce=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 x(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 x("chain_exhausted","the token chain reached its ceiling");if(this.inFlight===null&&this.options.clock.now()<this.notBefore)throw new x(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}=rr,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 x("internal","token arrived for a superseded generation");return this.grant=i,this.rejected=false,this.enter("ready"),i.token}).catch(i=>{let a=ar(i),{retryable:o,retryAfterMs:s}=i??{};throw n===this.generation&&(ir(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 x?i:new x(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)}},x=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 ar(t){if(t instanceof x)return t.reason;let e=t?.reason;return typeof e=="string"&&["chain_exhausted","unavailable","timeout","internal"].includes(e)?e:"internal"}var _=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}},G=["if-match","if-none-match"],it=4096;function or(t){if(!t)return;let e={};for(let[n,r]of Object.entries(t)){let i=n.toLowerCase();if(!G.includes(i)||r===void 0)continue;let a=typeof r=="string"?sr(r):r;if(typeof a!="string"||a.length>it||!lr(a))throw new _(`the ${i} header value cannot be sent \u2014 it is not a string, is longer than ${it} 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 sr(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 lr(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 dr(t){let{bytes:e}=t;if(e!==void 0){if(Object.prototype.toString.call(e)!=="[object Uint8Array]")throw new _("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 _("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 at(t,e){let n=e.replayUnauthorizedOnce??true;return {async request(r){let i={...r},a=or(i.headers),o=dr(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 x("unavailable","the server refused a freshly minted token");return p}}}function pe(t){let e=typeof t=="string"?new TextEncoder().encode(t):t;return btoa(ur(e))}function ot(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 Ge(t){return new TextDecoder().decode(ot(t))}function ur(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"}},cr=new WeakMap;var pr=new Set([408,429,500,502,503,504]),gr=6e4;function mr(t){if(t===void 0)return 2;if(!Number.isInteger(t)||t<0||t>10)throw new _(`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 U=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,...D(i)},i.replaySafe===true,i.retryRateLimited!==false)}async post(e,n,r,i={}){return this.send({method:"POST",path:e,body:n,signal:r,...D(i)},i.replaySafe===true,i.retryRateLimited!==false)}async postBytes(e,n,r,i={}){let a=await this.sendRaw({method:"POST",path:e,bytes:n,responseType:"bytes",signal:r,...D(i)},i.replaySafe===true,i.retryRateLimited!==false);return {bytes:yr(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,...D(i)},i.replaySafe===true,i.retryRateLimited!==false)}async delete(e,n,r={}){return this.send({method:"DELETE",path:e,signal:n,...D(r)},r.replaySafe===true,r.retryRateLimited!==false)}async send(e,n,r=true){return (await this.sendRaw(e,n,r)).body}async sendRaw(e,n,r=true){let i=n?mr(this.options.maxRetries)+1:1,a=null;if(e.signal?.aborted)throw st(e.signal);for(let o=0;o<i;o++){if(o>0&&await this.backoff(o,a,e.signal),e.signal?.aborted)throw st(e.signal);let s;try{s=await this.options.transport.request(e);}catch(c){if(x.isAuthError(c)||_.isRefusal(c)||e.signal?.aborted||fr(c))throw c;a=new y("unavailable",0,String(c));continue}if(s.status>=200&&s.status<300||s.status===304)return s;let d=hr(s);if(!pr.has(s.status)||s.status===429&&!r)throw d;a=d;}throw a??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),gr);return new Promise(d=>{let c=this.options.clock,g=false,p=false,R,m=()=>{g||(g=true,p&&c.clearTimeout(R),r?.removeEventListener("abort",m),d());};r?.addEventListener("abort",m,{once:true}),R=c.setTimeout(m,s),p=true,g&&c.clearTimeout(R);})}};function yr(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 D(t){return {...t.keepalive===void 0?{}:{keepalive:t.keepalive},...t.ifMatch===void 0?{}:{headers:{"if-match":t.ifMatch}}}}function st(t){return t.reason!==void 0?t.reason:new DOMException("The operation was aborted.","AbortError")}function fr(t){let e=t?.name;return e==="AbortError"||e==="TimeoutError"}function hr(t){let e=br(t),n=xr(t.body),r={...n===void 0?{}:{details:n},...t.invocationId===void 0?{}:{invocationId:t.invocationId}};return Object.keys(r).length>0&&cr.set(e,r),e}var _r=new Map([["insufficient_funds","insufficient_funds"]]);function br(t){let{status:e,body:n}=t,r=Rr(n),i=t.retryAfterSeconds??vr(n),a=wr(n),o=a===void 0?void 0:_r.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 Rr(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 xr(t){let n=t?.error?.details;return n===null?void 0:n}function wr(t){let n=t?.error?.code;return typeof n=="string"&&n.length>0?n:void 0}function vr(t){let e=t?.retryAfterSeconds;return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function kr(t){let e=t.lastIndexOf("@");return (e===-1?t:`***@${t.slice(e+1)}`).slice(0,200)}var Sr=new Set(G);function Ar(t){if(!t)return {};let e={};for(let[n,r]of Object.entries(t))Sr.has(n.toLowerCase())&&(e[n.toLowerCase()]=r);return e}function lt(t){let e=t.fetch??globalThis.fetch.bind(globalThis);return at(async(n,r)=>{let i;try{i=new URL(t.baseUrl.replace(/\/+$/,""));}catch{throw new _("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 _(`${JSON.stringify(typeof n.path=="string"?kr(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 _(`${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!=="",P=a.username!==i.username||a.password!==i.password,Oe=m?P?"baseUrl (and possibly the request path)":"baseUrl":"request path";throw new _(`the ${Oe} 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,P]of Object.entries(t.defaultQuery??{}))a.searchParams.has(m)||a.searchParams.set(m,P);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 _(`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},...Ar(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=Pr(d.headers.get("retry-after")),R=d.headers.get("x-gem-invocation-id");return {status:d.status,body:c,...g===null?{}:{etag:g},...p===void 0?{}:{retryAfterSeconds:p},...R===null||R===""?{}:{invocationId:R}}},t)}function Pr(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 dt=400,v=t=>typeof t=="string"?t:"",Or=/(?:Z|[+-]\d{2}:?\d{2})$/i;function C(t){let e=v(t);if(!Or.test(e))return 0;let n=Date.parse(e);return Number.isFinite(n)?Math.floor(n/1e3):0}var Cr=/^[0-9a-f]{1,64}$/,Ir=/^[0-9a-f]{16}$/,Tr=/^[A-Za-z][A-Za-z0-9_+\-/]{0,63}$/,Er=/^(?:[01]\d|2[0-3]):[0-5]\d$/;function Le(t){let e=v(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 Gr=4096,Lr=new TextEncoder;function Mr(t){let e=v(t.challenge_data),n=v(t.challenge_data_hash);return e===""||!Ir.test(n)?{}:Lr.encode(e).length>Gr?{}:{data:e,dataHash:n}}function Fr(t){let e=t??{},n=C(e.period_start_at),r=C(e.period_ends_at);if(n===0||r===0)return;let i=v(e.slug),a=v(e.seed),o=Le(e.period_local_date),s=v(e.boundary),d=v(e.reset_time);return {id:v(e.progression_definition_id),...i===""?{}:{slug:i},window:v(e.window),periodStartAt:n,periodEndsAt:r,...o===void 0?{}:{periodLocalDate:o},boundary:Tr.test(s)?s:"",resetTime:Er.test(d)?d:"",seed:Cr.test(a)?a:"",...Mr(e)}}function ge(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 ut(t){let e=t??{};return Array.isArray(e.challenges)?e.challenges.map(Fr).filter(n=>n!==void 0):[]}var V=class{#e;constructor(e){this.#e=e;}async list(e={}){let{periodsBack:n}=e;ge(n);let r=await Ln(this.#e,{...n===void 0?{}:{periods_back:n},...e.signal===void 0?{}:{signal:e.signal}});return ut(r)}};var $r="gem-web-bridge";var L=65536,ct=8,me=5e3,pt=1024;var ye=Object.create(null);var gt=Object.create(null);function qr(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 jr(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 Nr(t){return /^[a-z]{2,8}(-[a-z0-9]{1,8})*$/i.test(t)}function Br(t){return /^[a-z_]+$/.test(t)}function Me(t,e,n){if(e>ct)return `nesting deeper than ${ct}`;if(++n.nodes>me)return `more than ${me} values`;if(n.bytes>L)return `over the ${L} 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>pt)return `an array of ${t.length} entries, over the ${pt} limit`;n.bytes+=2;for(let s of t){let d=Me(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>me)return `more than ${me} values`;if(n.bytes+=s.length*3+4,n.bytes>L)return `over the ${L} byte limit`;let d=Me(o[s],e+1,n);if(d)return d}return null}function Dr(t){let e={nodes:0,bytes:0,seen:new Set},n=Me(t,0,e);return n?`message contains ${n}`:e.bytes>L?`message is over the ${L} byte limit`:null}var Ur={origin:[qr,"not a well-formed origin"],url:[jr,"not a safe absolute http(s) URL"],bcp47:[Nr,"not a well-formed BCP 47 tag"],code:[Br,"not a code of lower-case letters and underscores"]};function mt(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=Fe(a,r,i);if(o)return o}return null}function Fe(t,e,n){switch(e.k){case "u":return typeof t=="boolean"?null:Fe(t,{...e,k:typeof t=="string"?"s":"n"},n);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]=Ur[e.f];if(!r(t))return `${n}: ${i}`}return null}case "n":case "i":return typeof t!="number"||!(e.k=="i"?Number.isInteger:Number.isFinite)(t)?`${n}: expected ${e.k=="i"?"integer":"number"}`: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`:mt(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=Fe(a,r,i);if(o)return o}return null}default:{let r=e.k;return `${n}: unknown kind ${String(r)}`}}}var yt=Object.create(null);function u(t,e,n,r){return ye[t]=n,r&&(gt[t]=r),yt[t]=i=>{let a=Dr(i);if(a)return a;if(typeof i!="object"||i===null||Array.isArray(i))return "message: expected object";let o=i;return o.gem!==$r?"gem: wrong protocol marker":o.type!==t?`type: expected ${t}`:mt(o,e,"")}}var h={n:"requestId",k:"s",max:64};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}],30);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}}],5);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}],30);u("gem.token.denied",[h,{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}],30);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:"avatars3d",k:"a",o:1,max:8,it:{n:"",k:"o",fs:[{n:"family",k:"s",max:32},{n:"id",k:"s",max:64},{n:"modelUrl",k:"s",max:256,f:"url"},{n:"iconUrl",k:"s",max:256,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}]}],12);u("gem.pause",[{n:"paused",k:"b"}],120);u("gem.prefs",[{n:"reducedMotion",k:"b"},{n:"muted",k:"b"},{n:"showFrameStats",k:"b",o:1},{n:"music",k:"b",o:1},{n:"sounds",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},{n:"colorHelp",k:"b",o:1}]}],60);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}]}}],12,"cohorts");u("gem.earnAllowanceChanged",[],30,"earnAllowance");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},{n:"control",k:"o",o:1,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}]}]}}],60,"viewport");u("gem.deviceSettings",[{n:"settings",k:"j",o:1}],12,"deviceSettings");u("gem.willTerminate",[{n:"reason",k:"e",v:["grant_expiring","session_ended","navigating","kill_switch"]},{n:"graceMs",k:"i",lo:0,hi:6e4}],10);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"]}],120,"rooms");u("gem.socketState",[{n:"connected",k:"b"},{n:"reason",k:"e",o:1,v:["connecting","dropped","watchdog","terminal"]}],12,"socketState");u("gem.seatedEvent",[{n:"roomId",k:"s",max:64}],60,"partySeating");u("gem.autoStartFailedEvent",[{n:"roomId",k:"s",max:64},{n:"code",k:"s",max:64}],30,"autoStartFailure");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}],60,"ticketEvents");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"}],1800,"p2p");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}],120,"dedicated");u("gem.partyResult",[h,{n:"partyId",k:"s",o:1,max:64}],30,"parties");u("gem.clusterTarget",[{n:"clusterTargetId",k:"s",max:64},{n:"clusterTargetIds",k:"a",o:1,max:3,it:{n:"",k:"s",max:64}}],12,"clusterTarget");u("gem.devtools",[{n:"action",k:"e",v:["open","close","toggle"]}],30,"devtools");u("gem.screenshot",[{n:"maxWidth",k:"i",lo:1,hi:7680},{n:"maxHeight",k:"i",lo:1,hi:4320}],6,"screenshot");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"}],12,"screenshot");u("gem.requestContext",[],12,"feedbackContext");u("gem.gameContext",[{n:"context",k:"j"}],12,"feedbackContext");u("gem.signal",[{n:"signal",k:"e",v:["join","offer","answer","ice","migrationAck","hostUnreachable"]},{n:"matchId",k:"s",max:64},{n:"data",k:"j"}],1200,"p2p");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"]}],60,"dedicated");u("gem.partyRequest",[h],12,"parties");u("gem.ready",[],5);u("gem.engaged",[],5,"engagement");u("gem.progress",[{n:"loaded",k:"i",lo:0,hi:1099511627776},{n:"total",k:"i",lo:0,hi:1099511627776}],600);u("gem.requestToken",[h,{n:"reason",k:"e",v:["initial","expiring","rejected"]}],12);u("gem.requestLocalServer",[h,{n:"gameRoomId",k:"s",max:64}],6,"localHost");u("gem.localServer",[h,{n:"serverId",k:"s",o:1,max:128}],30,"localHost");u("gem.localServer.denied",[h,{n:"retryable",k:"b"},{n:"reason",k:"e",v:["refused","unavailable"]}],30,"localHost");u("gem.exit",[{n:"reason",k:"s",o:1,max:64}],5);u("gem.openExternal",[{n:"url",k:"s",max:2048,f:"url"}],6);u("gem.requestFullscreen",[{n:"enabled",k:"b"}],30);u("gem.audioState",[{n:"muted",k:"b"}],120,"audioState");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}]}],60,"rewardCue");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}],60,"walletDisplay");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"}]}],60,"controls");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}]}}],60,"gameMenu");u("gem.menuSelect",[{n:"entry",k:"e",v:["settings","item"]},{n:"id",k:"s",o:1,max:32}],60,"gameMenu");u("gem.gemCorner",[{n:"corner",k:"e",v:["top-left","top-right","bottom-left","bottom-right"]}],12,"gemCorner");u("gem.settingsDeclare",[{n:"settings",k:"a",max:8,it:{n:"",k:"o",fs:[{n:"id",k:"s",max:40},{n:"label",k:"s",max:40},{n:"kind",k:"e",v:["toggle","slider","choice"]},{n:"value",k:"u",max:40,lo:-1e6,hi:1e6},{n:"quick",k:"b",o:1},{n:"icon",k:"s",o:1,max:16,f:"code"},{n:"min",k:"n",o:1,lo:-1e6,hi:1e6},{n:"max",k:"n",o:1,lo:-1e6,hi:1e6},{n:"step",k:"n",o:1,lo:0,hi:1e6},{n:"options",k:"a",o:1,max:4,it:{n:"",k:"o",fs:[{n:"id",k:"s",max:40},{n:"label",k:"s",max:40}]}}]}}],120,"gameSettings");u("gem.settingChange",[{n:"id",k:"s",max:40},{n:"value",k:"u",max:40,lo:-1e6,hi:1e6}],120,"gameSettings");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}]}}],6,"share");u("gem.requestAvatarPicker",[{n:"tab",k:"e",o:1,v:["2d","3d"]}],6,"avatarPicker");u("gem.vibrate",[{n:"pattern",k:"a",max:99,it:{n:"",k:"i",lo:0,hi:1e4}}],600,"vibration");u("gem.frameStats",[{n:"fps",k:"i",lo:0,hi:1e3},{n:"frameTimeP95Ms",k:"i",lo:0,hi:1e5},{n:"counts",k:"e",o:1,v:["pageFrames","gameDraws"]}],120,"frameStats");u("gem.portraitBorders",[{n:"name",k:"s",o:1,max:40}],60,"portraitBorders");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}],60);u("gem.requestPurchase",[h,{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}],12,"purchases");u("gem.requestAvatar3dPurchase",[h,{n:"itemId",k:"s",max:64},{n:"currencySlug",k:"s",max:32}],12,"avatar3dPurchases");u("gem.purchaseResult",[h,{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}],30,"purchases");u("gem.deviceSettings.put",[h,{n:"settings",k:"j"}],30,"deviceSettings");u("gem.deviceSettings.result",[h,{n:"outcome",k:"e",v:["stored","too_large","unavailable"]}],30,"deviceSettings");u("gem.requestAd",[h,{n:"placement",k:"s",max:32},{n:"format",k:"e",v:["interstitial","rewarded"]}],6,"ads");u("gem.adResult",[h,{n:"outcome",k:"e",v:["shown","no_ad","unavailable"]}],12,"ads");u("gem.signalMoment",[h,{n:"kind",k:"e",v:["level_end","run_end","match_end","menu_return","other_break"]},{n:"placement",k:"s",o:1,max:32}],6,"moments");u("gem.momentResult",[h,{n:"shown",k:"b"}],12,"moments");u("gem.requestSignIn",[h],6,"signIn");u("gem.signInResult",[h,{n:"outcome",k:"e",v:["signed_in","declined","unavailable"]}],12,"signIn");u("gem.requestFriendChallenge",[h,{n:"playerId",k:"s",max:64},{n:"template",k:"s",max:64},{n:"params",k:"j",o:1}],12,"friendChallenges");u("gem.friendChallengeResult",[h,{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}],30,"friendChallenges");Object.freeze(yt);ye.__malformed=60;Object.freeze(ye);Object.freeze(gt);var M={now:()=>Date.now(),setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)};function ft(t){let e=t.toLowerCase();return e==="localhost"||e.endsWith(".localhost")||e==="[::1]"||e==="::1"?true:/^127(\.\d{1,3}){3}$/.test(e)}var W=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 qe(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 ht="inventory",F=t=>typeof t=="number"?t:0,H=t=>typeof t=="string"?t:"";function $e(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 _t(t){let e=t??{};return {itemDefinitionId:H(e.item_definition_id),instanceId:H(e.instance_id),quantity:F(e.quantity),acquiredAt:F(e.acquired_at),...e.properties===void 0?{}:{properties:e.properties},...e.custom_data===void 0?{}:{customData:e.custom_data}}}function Vr(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0;return {currencies:$e(e.currencies,r=>{let i=r??{},a=Array.isArray(i.buckets)?i.buckets.map(o=>{let s=o??{};return {bucket:H(s.bucket),balance:F(s.balance)}}):void 0;return {currencyId:H(i.currency_id),total:F(i.total),...a===void 0?{}:{buckets:a}}}),items:$e(e.items,_t),progressions:$e(e.progressions,r=>{let i=r??{};return {progressionDefinitionId:H(i.progression_definition_id),currentValue:F(i.current_value),completionCount:F(i.completion_count),isCompleted:i.is_completed===true,...qe(i)}}),...n===void 0?{}:{etag:n}}}var J=class{constructor(e,n,r){this.api=e;this.entity=n;this.cache=r;}api;entity;cache;snapshot(e={}){let n=e.buckets?`${ht}#buckets`:ht;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 yn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return Array.isArray(i)?i.map(_t):[]}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 mn(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 Vr(n)}};var Wr={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,already_owned: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(Wr));var I=class extends RangeError{constructor(n,r){super(r);this.code=n;this.name="PurchaseRefusal";}code;retryable=false};var f=t=>typeof t=="string"?t:"",Hr=t=>typeof t=="string"?t:f(t&&typeof t=="object"?t.type:void 0),k=t=>typeof t=="number"?t:0;function Jr(t){let e=t??{};return {prerequisiteType:f(e.prerequisite_type),referenceId:f(e.reference_id),required:k(e.required),current:k(e.current)}}function z(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 fe(){return crypto.randomUUID()}var zr="recipe-usage",bt=100;function he(t){let e=t??{};switch(e.type){case "currency":return {kind:"currency",currencyId:f(e.currency_id),bucket:f(e.bucket),delta:k(e.delta),balanceAfter:k(e.balance_after)};case "item":return {kind:"item",itemDefinitionId:f(e.item_definition_id),instanceId:f(e.instance_id),delta:k(e.delta),quantityAfter:k(e.quantity_after)};case "progression":return {kind:"progression",progressionDefinitionId:f(e.progression_definition_id),delta:k(e.delta),valueAfter:k(e.value_after),completed:e.completed===true};default:return {kind:"other",type:f(e.type)}}}function Kr(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:k(e.roll_number),wasReplacement:e.was_replacement===true,grants:Array.isArray(e.grants)?e.grants.map(he):[]}}function Yr(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0,r=Array.isArray(e.loot_results)?e.loot_results.map(Kr):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(he):[],consumed:Array.isArray(e.consumed)?e.consumed.map(he):[],autoClaimedRewards:Array.isArray(e.auto_claimed_rewards)?e.auto_claimed_rewards.map(he):[],...r===void 0||r.length===0?{}:{lootResults:r}}}function Xr(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:k(n.price)}}}function Qr(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 Rt(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 K=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(()=>on(this.api,this.entity.type,this.entity.id,{operations:e.map(Rt),source:n.source??"play",nonce:fe()},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}));return z(r)}async createMany(e,n={}){return this.write(()=>an(this.api,this.entity.type,this.entity.id,{orders:e.map(r=>({operations:r.map(Rt),nonce:fe()})),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 bn(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(Jr):[];return {canExecute:a.can_execute===true,locked:a.locked===true||d.length>0,lockReasons:d,reasons:Array.isArray(a.reasons)?a.reasons.map(c=>Hr(c)):[],...o===void 0?{}:{usesRemaining:o},...s===void 0?{}:{cooldownExpiresAt:s}}}async recipeUsageAll(){return this.cache.read(zr,[],async()=>{let n=await Rn(this.api,this.entity.type,this.entity.id,{limit:bt})??{},r=Array.isArray(n.usages)?n.usages:[];return {usages:r.map(Qr),truncated:r.length>=bt}})}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,R=await this.write(()=>un(this.api,this.entity.type,this.entity.id,{catalog_id:p.catalogId,recipe_id:p.targetId,game_id:this.api.gameId(),nonce:fe()},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}));return {payment:"configured",...Yr(R)}}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([Pn(this.api,n.signal===void 0?{}:{signal:n.signal}),de(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(R=>R.slug);throw new I("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 I("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(P=>P.currency_id===m)?.slug??m,R=s.platform_prices.map(m=>`${p(m.platform_currency_id)} ${m.price}`);throw new I("no_price_in_currency",`purchase target ${JSON.stringify(e.targetId)} has no ${o.slug} price. It is priced in: ${R.length===0?"nothing":R.join(", ")}`)}let c=e.kind==="item"?e.quantity??1:1;if(!Number.isInteger(c)||c<1||c>10)throw new I("quantity_invalid","item purchase quantity must be an integer from 1 through 10");let g=await this.write(()=>Gn(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:fe(),confirmation:"none"},n.signal===void 0?{}:{signal:n.signal}));return Xr(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(()=>en(this.api,this.entity.type,this.entity.id,e,{amount:n,game_id:this.api.gameId()},r===void 0?{}:{signal:r}));return z(i)}async maxProgression(e,n,r){let i=await this.write(()=>Un(this.api,this.entity.type,this.entity.id,e,{value:n,game_id:this.api.gameId()},r===void 0?{}:{signal:r}));return z(i)}async claimProgression(e,n){let r=await this.write(()=>tn(this.api,this.entity.type,this.entity.id,e,{game_id:this.api.gameId()},n===void 0?{}:{signal:n}));return z(r)}async resetProgression(e,n){let r=await this.write(()=>Kn(this.api,this.entity.type,this.entity.id,e,{game_id:this.api.gameId()},n===void 0?{}:{signal:n}));return z(r)}async write(e){return this.cache.invalidate(),e()}};var je=t=>typeof t=="string"?t:"",Zr=t=>typeof t=="number"?t:0;function xt(t){let e=t??{};return {orderId:je(e.order_id),status:je(e.status),source:je(e.source),createdAt:Zr(e.created_at)}}var Y=class{constructor(e,n){this.api=e;this.entity=n;}api;entity;async list(e={}){let r=await $n(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(xt):[],...i===void 0?{}:{nextCursor:i}}}async get(e,n){let r=await hn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return xt(r)}};var wt=t=>typeof t=="number"?t:0,ei=t=>typeof t=="string"?t:"";function ni(t){let e=t??{};return {progressionDefinitionId:ei(e.progression_definition_id),currentValue:wt(e.current_value),completionCount:wt(e.completion_count),isCompleted:e.is_completed===true,...qe(e)}}var X=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 _n(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return ni(a)}catch{return i??null}}};var _e=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 ti(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 Ne(t){try{let e=ti(await t.text());return e?`Storage said: ${e}`:""}catch{return ""}}var b=class extends Error{constructor(n,r){super(r);this.reason=n;this.name="GemSaveError";}reason},ri=3e4,vt="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",ii=/^[A-Za-z0-9_]{1,64}$/;function S(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(!ii.test(t)||t.startsWith("_"))throw new TypeError(`${JSON.stringify(t)} is not a usable save key: ${e}.`);return t}function kt(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 Be(t,e){return t.aborted&&e?.aborted!==true}var ai=new Set(["x-ms-blob-type"]),oi=/^[ -~]+$/;function si(t,e){if(t==null)return {};if(typeof t!="object"||Array.isArray(t))throw new b("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(!ai.has(a))throw new b("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"||!oi.test(i))throw new b("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 b("save_malformed",`the grant for save ${JSON.stringify(e)} named ${JSON.stringify(a)} twice.`);n[a]=i;}return n}function De(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 Ue(t){return t?.reason==="not_found"}var Q=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 b("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 b("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=kt(r.signal,a);try{let s=await zn(this.api,this.entity.type,this.entity.id,S(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 b("save_malformed",`the grant for save ${JSON.stringify(e)} named nowhere to put the bytes.`);let d=si(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 Be(o.signal,r.signal)?this.timeout("upload",a):new b("upload_failed",`${vt} for PUT. Underlying error: ${p}`)}if(!c.ok){let p=await Ne(c);throw new b("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 De(await cn(this.api,this.entity.type,this.entity.id,S(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 b("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=kt(n.signal,r);try{let a;try{let d=await Ce(this.api,this.entity.type,this.entity.id,S(e),{signal:i.signal});if(!d.modified)return null;a=d.body;}catch(d){if(Ue(d))return null;throw d}if(typeof a.download_url!="string")throw new b("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 Be(i.signal,n.signal)?this.timeout("download",r):new b("download_failed",`${vt} for GET. Underlying error: ${d}`)}if(!s.ok){let d=await Ne(s);throw new b("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 Ce(this.api,this.entity.type,this.entity.id,S(e),{...n.signal===void 0?{}:{signal:n.signal},...n.ifNoneMatch===void 0?{}:{ifNoneMatch:n.ifNoneMatch}});return r.modified?De(r.body):null}catch(r){if(Ue(r))return null;throw r}}async list(e={}){let n=await qn(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(De),...typeof r=="string"&&r.length>0?{nextCursor:r}:{}}}async delete(e,n){try{await ln(this.api,this.entity.type,this.entity.id,S(e),{...n===void 0?{}:{signal:n}});}catch(r){if(!Ue(r))throw r}}budget(e){return e??this.options.timeoutMs??ri}timeout(e,n){return new b("save_timeout",`the save ${e} did not finish within ${n}ms`)}rethrow(e,n,r,i,a){return e instanceof b?e:Be(r,n)?this.timeout(i,a):e}};function li(t){try{return Ge(t)}catch{return t}}function Ve(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"?li(n.value):"",...r===void 0?{}:{etag:r},updatedAt:typeof n.updated_at=="number"?n.updated_at:0}}var Z=class{constructor(e,n){this.api=e;this.entity=n;}api;entity;async list(e){let r=(await Fn(this.api,this.entity.type,this.entity.id,e===void 0?{}:{signal:e}))?.settings;return Array.isArray(r)?r.map(i=>Ve(i)):[]}async get(e,n={}){try{let r=await gn(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?Ve(r.body,r.etag):null}catch(r){if(St(r))return null;throw r}}async put(e,n,r={}){let i=await Vn(this.api,this.entity.type,this.entity.id,e,{value:pe(n)},{...r.signal===void 0?{}:{signal:r.signal},...r.ifMatch===void 0?{}:{ifMatch:r.ifMatch}});return Ve(i)}async delete(e,n){try{await sn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});}catch(r){if(!St(r))throw r}}};function St(t){return t?.reason==="not_found"}function be(t,e,n={}){let r=new _e(M,n.identity);n.onInventoryChanged&&r.onInvalidate(n.onInventoryChanged);let i=new J(t,e,r);return {settings:new Z(t,e),inventory:i,saves:new Q(t,e,n.saves??{}),currencies:new W(i,n.resolveCurrencyId),mutations:new K(t,e,r),orders:new Y(t,e),progressions:new X(t,e,i)}}var T=t=>typeof t=="string"?t:"",$=t=>typeof t=="number"?t:0;function Re(t,e){let n=e??{},r=T(n.character_id);if(r==="")throw new Error("[gem] a character response carried no character_id");return {...t(r),id:r,playerId:T(n.player_id),gameId:T(n.game_id),channel:T(n.channel)||"release",name:T(n.name),slotIndex:$(n.slot_index),isActive:n.is_active!==false,createdAt:T(n.created_at),updatedAt:T(n.updated_at)}}var ee=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=be(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 Mn(this.api,e===void 0?{}:{signal:e}))?.characters;return Array.isArray(r)?r.map(i=>Re(this.scope,i)):[]}async get(e,n){let r=await pn(this.api,e,n===void 0?{}:{signal:n});return Re(this.scope,r)}async create(e){let n=await rn(this.api,{name:e.name},e.signal===void 0?{}:{signal:e.signal});return Re(this.scope,n)}async update(e,n,r){let i=await Jn(this.api,e,{name:n},r===void 0?{}:{signal:r});return Re(this.scope,i)}async delete(e,n){await Yn(this.api,e,n===void 0?{}:{signal:n});}async slots(e){let r=await Cn(this.api,e===void 0?{}:{signal:e})??{};return {totalSlots:$(r?.total_slots),availableSlots:$(r?.available_slots),activeCharacterCount:$(r?.active_character_count),defaultMaxSlots:$(r?.default_max_slots),purchasedExtraSlots:$(r?.purchased_extra_slots),canPurchaseMore:r?.can_purchase_more===true}}};var Ot="[gem: use gem.text.toPlain()]",At=new Set,Pt;function di(t){try{if(At.has(t))return;let e=globalThis.location;if(Pt??=!!e?.port&&ft(e.hostname??""),!Pt)return;At.add(t),console.warn(`[gem] ${t} is PlayerText, turned into a string: players see ${Ot}. Render text.toPlain(value) (text is in @indiegems/gem-web-sdk/sdk).
|
|
2
|
-
${new Error().stack}`);}catch{}}var w=class{#e;#t;constructor(e,n="player text"){this.#e=e,this.#t=n,Object.freeze(this);}toString(){return di(this.#t),Ot}toJSON(){return this.toString()}get[Symbol.toStringTag](){return "PlayerText"}static unwrap(e){return e.#e}};function q(t,e){return new w(t,e)}var ui={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;if(typeof Intl>"u"||typeof Intl.Collator!="function")return r<i?-1:r>i?1:0;let 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 j=t=>typeof t=="string"?t:"";function xe(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:j(e.transfer_id),status:j(e.status),sourceEntityId:j(e.source_entity_id),targetEntityId:j(e.target_entity_id),...n===void 0?{}:{message:q(n,"transfer.message")},createdAt:j(e.created_at),expiresAt:j(e.expires_at),...r===void 0?{}:{resolvedAt:r}}}function ci(){return crypto.randomUUID()}var ne=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 En(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:ci()},e.signal===void 0?{}:{signal:e.signal});return xe(n)}async list(e={}){let r=await Bn(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(xe):[],...i===void 0?{}:{nextCursor:i}}}async get(e,n){let r=await In(this.api,e,n===void 0?{}:{signal:n});return xe(r)}async accept(e,n){return this.resolve(()=>Ze(this.api,e,n===void 0?{}:{signal:n}))}async reject(e,n){return this.resolve(()=>Hn(this.api,e,n===void 0?{}:{signal:n}))}async cancel(e,n){return this.resolve(()=>nn(this.api,e,n===void 0?{}:{signal:n}))}async resolve(e){return this.inventory.invalidate(),xe(await e())}};function A(t){return typeof t=="string"&&t!==""?t:void 0}var Ct=new Set(["localhost","127.0.0.1","[::1]"]);function E(t){return pi(t)}function pi(t){let e=A(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:"&&Ct.has(n.hostname)))return e}var gi=/^[\da-f]{8}(-[\da-f]{4}){3}-[\da-f]{12}$/i,mi=/^[a-z][a-z0-9_]{0,31}$/;function yi(t){if(!Array.isArray(t))return;let e=[],n=new Set;for(let r of t.slice(0,8)){let i=r??{},a=A(i.family),o=A(i.avatar_3d_id),s=E(i.model_url),d=E(i.icon_url);a===void 0||!mi.test(a)||n.has(a)||o===void 0||!gi.test(o)||s===void 0||d===void 0||(n.add(a),e.push({family:a,id:o,modelUrl:s,iconUrl:d}));}return e}function fi(t){if(!Array.isArray(t))return [];let e=[];for(let n of t){let r=n??{},i=A(r.item_id),a=E(r.icon_url);i!==void 0&&a!==void 0&&e.push({itemId:i,iconUrl:a});}return e}function O(t){let e=t??{},n=A(e.player_id),r=A(e.display_name),i=A(e.discriminator),a=A(e.display_tag),o=A(e.avatar_icon_id),s=E(e.avatar_icon_url),d=A(e.avatar_3d_id),c=E(e.avatar_3d_model_url),g=E(e.avatar_3d_icon_url),p=yi(e.avatars_3d);return {...n===void 0?{}:{playerId:n},...r===void 0?{}:{displayName:q(r,"displayName")},...i===void 0?{}:{discriminator:i},...a===void 0?{}:{displayTag:q(a,"displayTag")},...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},...p===void 0?{}:{avatars3d:p},badges:fi(e.badges)}}var hi=new Set(["https://downloads.gemarcade.com","https://cdn.gemarcade.com"]);function _i(t){if(t===void 0)return;let e=E(t);if(e===void 0)return;let n=new URL(e);return Ct.has(n.hostname)||hi.has(n.origin)?e:void 0}var It=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;var He=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});}},we=t=>typeof t=="string"?t:void 0;function Tt(t){let e=t??{};return {...O(e),playerId:we(e.player_id)??""}}function Et(t){let e=t.has_more===true?we(t.next_cursor):void 0;return e===void 0?{}:{nextCursor:e}}function bi(t){let e=t??{};return {friends:Array.isArray(e.data)?e.data.map(Tt):[],...Et(e)}}var We=t=>typeof t=="number"&&Number.isFinite(t)?t:void 0;function Ri(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 Gt(t){let e=t??{},n=We(e.opened_at),r=We(e.answered_at);return {id:we(e.item_id)??"",from:Tt(e.sender),template:we(e.template)??"",params:Ri(e.params),createdAt:We(e.created_at)??0,...n===void 0?{}:{openedAt:n},...r===void 0?{}:{answeredAt:r}}}function xi(t){let e=t??{};return {challenges:Array.isArray(e.data)?e.data.map(Gt):[],...Et(e)}}function wi(t){let e=t;return e?.reason==="not_found"&&e.code==="inbox_item_not_found"}var te=class{#e;#t;#a;constructor(e,n={}){this.#e=e,this.#t=n.challenge,this.#a=n.launchedChallengeId;}async list(e={}){let n=await Nn(this.#e,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}});return bi(n)}challenge(e){return this.#t===void 0?Promise.resolve({outcome:"unavailable"}):this.#t(e)}async inbox(e={}){let n=await jn(this.#e,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}});return xi(n)}async launchedChallenge(e={}){let n=this.#a;if(n===void 0||!It.test(n))return null;try{return Gt(await vn(this.#e,n,{...e.signal===void 0?{}:{signal:e.signal}}))}catch(r){if(wi(r))return null;throw r}}async markAnswered(e){if(typeof e!="string"||!It.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 Dn(this.#e,e);}};var Lt=100,$t=/^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}Z)?$/;function Je(t){let{periodsBack:e,period:n,playerId:r}=t;if(ge(e),e!==void 0&&n!==void 0)throw new TypeError("pass periodsBack or period, not both");if(n!==void 0&&(typeof n!="string"||!$t.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 qt(t){let e=typeof t.period_id=="string"?t.period_id:"";if(!$t.test(e))return;let n=Le(t.period_local_date),r=C(t.period_start_at),i=C(t.period_ends_at),a=r>0&&i>0;return {id:e,...n===void 0?{}:{localDate:n},...a?{startAt:r,endsAt:i}:{},opensAt:C(t.opens_at),closesAt:C(t.closes_at),final:t.final===true}}var re=t=>typeof t=="string"?t:"",N=t=>typeof t=="number"?t:0,ie=t=>typeof t=="string"?t:void 0,vi=t=>typeof t=="number"?t:void 0,jt={player:"players",character:"characters"};function ki(t,e){let n=t??{},r=ie(n.entity_id),i=typeof n.entity_type=="string"&&Object.hasOwn(jt,n.entity_type)?n.entity_type:void 0,a=Nt(n.stats),o=n.properties!==null&&typeof n.properties=="object"?n.properties:void 0,s=e?n.is_viewer===true:void 0;return {...O(n),rank:N(n.rank),occurredAt:N(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 Mt(t,e){let n=t??{},r=ie(n.bucket_1),i=ie(n.bucket_2),a=vi(n.update_frequency_seconds),o=qt(n);return {leaderboardType:re(n.leaderboard_type),runType:re(n.run_type),...r===void 0?{}:{bucket1:r},...i===void 0?{}:{bucket2:i},entries:Array.isArray(n.entries)?n.entries.map(s=>ki(s,e)):[],generatedAt:N(n.generated_at),...a===void 0?{}:{updateFrequencySeconds:a},...o===void 0?{}:{period:o}}}function Ft(t){if(t===null||typeof t!="object"||Array.isArray(t))return;let e=t;if(!Number.isFinite(e.rank))return;let n=Nt(e.stats),r=e.properties!==null&&typeof e.properties=="object"?e.properties:void 0;return {rank:e.rank,occurredAt:N(e.occurred_at),...n===void 0?{}:{stats:n},...r===void 0?{}:{properties:r}}}function Nt(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 Si(t,e,n){let r=t??{},i=ie(r.bucket_1),a=ie(r.bucket_2),o=qt(r);return {leaderboardType:re(r.leaderboard_type),runType:re(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(Ft).filter(s=>s!==void 0):[],personalBest:Ft(r.personal_best)??null,totalRuns:N(r.total_runs),totalRunsExact:r.total_runs_exact!==false,generatedAt:N(r.generated_at),...o===void 0?{}:{period:o}}}var ae=class{#e;constructor(e){this.#e=e;}async get(e,n={}){let r=Je(n),i=await kn(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 Mt(i,false)}async friends(e,n={}){let r=Je(n),i=await xn(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 Mt(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>Lt)throw new TypeError(`limit must be an integer between 1 and ${Lt}, got ${String(d)}`)}let a=Je(i),o=await fn(this.#e,e,jt[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"&&re((o??{}).entity_id)||r;return Si(o,n,s)}};var ve=t=>typeof t=="string"?t:void 0;function Ai(t){let e=t??{},n=ve(e.currency_id);if(n===void 0||n==="")return;let r=typeof e.balance=="number"&&Number.isFinite(e.balance)?e.balance:0;return {slug:ve(e.slug)??"",currencyId:n,balance:r,access:e.access==="spend"?"spend":"read"}}var ke=class{#e;constructor(e){this.#e=e;}async get(e={}){let r=(await de(this.#e,e))?.currencies;if(!Array.isArray(r))return [];let i=[];for(let a of r){let o=Ai(a);o!==void 0&&i.push(o);}return i}},ze=t=>typeof t=="number"&&Number.isFinite(t)&&t>=0?Math.floor(t):0;function Pi(t){let e=t??{},n=ve(e.currency_id);if(n===void 0||n==="")return;let r=ze(e.limit),i=Math.min(ze(e.earned),r),a=Math.min(ze(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:ve(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 Se=class{#e;#t;#a;constructor(e,n,r){this.#e=e,this.#t=n,this.#a=r;}async get(e={}){let r=(await Sn(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)??(()=>{})}},oe=class{currencies;earnAllowance;constructor(e,n,r){this.currencies=new ke(e),this.earnAllowance=new Se(e,n,r);}};var Ke=t=>typeof t=="string"?t:"",Bt=t=>typeof t=="number"?t:0;function Oi(t){let e=t??{};return {key:Ke(e.key),visibility:Ke(e.visibility),value:e.value,updatedAt:Bt(e.updated_at)}}function Ci(t){let e=t??{};return {...O(e),playerId:Ke(e.player_id),showcase:Array.isArray(e.showcase)?e.showcase.map(Oi):[],generatedAt:Bt(e.generated_at)}}function Ii(t){return t?.reason==="not_found"}var se=class{#e;constructor(e){this.#e=e;}async of(e,n={}){try{return Ci(await An(this.#e,e,{...n.signal===void 0?{}:{signal:n.signal}}))}catch(r){if(Ii(r))return null;throw r}}};var Ae=t=>typeof t=="string"?t:"",Ye=t=>typeof t=="number"?t:0;function Dt(t){let e=t??{};return {playerId:Ae(e.player_id),key:Ae(e.key),value:e.value,updatedAt:Ye(e.updated_at)}}function Ti(t){let e=t??{};return {...O(e),playerId:Ae(e.player_id),value:e.value,isViewer:e.is_viewer===true,updatedAt:Ye(e.updated_at)}}function Ei(t){return t?.reason==="not_found"}var le=class{constructor(e,n){this.api=e;this.selfPlayerId=n;}api;selfPlayerId;async friends(e,n={}){let i=await wn(this.api,S(e),{...n.signal===void 0?{}:{signal:n.signal}})??{};return {key:Ae(i.key),entries:Array.isArray(i.entries)?i.entries.map(Ti):[],generatedAt:Ye(i.generated_at)}}async of(e,n,r={}){try{return Dt(await On(this.api,e,S(n),{...r.signal===void 0?{}:{signal:r.signal}}))}catch(i){if(Ei(i))return null;throw i}}async set(e,n,r={}){if(S(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 Dt(await Wn(this.api,i,e,{value:n},{...r.signal===void 0?{}:{signal:r.signal}}))}async clear(e,n={}){let r=await this.selfPlayerId();await dn(this.api,r,S(e),{...n.signal===void 0?{}:{signal:n.signal}});}};var Gi="https://function.gem.invalid",Ut={token:"function",expiresAt:Number.POSITIVE_INFINITY,chainEndsAt:Number.POSITIVE_INFINITY},Li="createGem() from @indiegems/gem-web-sdk/function only runs inside a serverless function; in a browser import @indiegems/gem-web-sdk/sdk",Pe="gem.me is unavailable: this function was invoked by a game server, not a player",Mi="gem.functions is unavailable inside a serverless function",Fi="gem.gameConfig is unavailable inside a serverless function",$i="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 qi(t){let e=new Set(G);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 _($i)}return t.request(r)}}}function Vt(t,e,n){Object.defineProperty(t,e,{get(){throw new Error(n)},enumerable:false});}function ji(t){let e=globalThis.__gemFunctionHost;if(e===void 0)throw new Error(Li);let n=e.context(),r=new ce({clock:M,request:()=>Promise.resolve(Ut)});r.accept(Ut);let i=qi(lt({baseUrl:Gi,tokenSource:r,defaultQuery:{game_id:n.gameId,channel:n.channel}})),a=new U({transport:i,clock:M,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:be(o,c),p=c===null||g===null?null:new ne(o,c,g.inventory),R=Oe=>console.info(Oe),m=new B({client:()=>a,clock:M,gameId:()=>n.gameId,playerId:()=>s,environment:{sdk_version:Qe()},log:R}),P={context:n,identity:d,awaitIdentity:()=>d===null?Promise.reject(new Error(Pe)):Promise.resolve(d),awaitBridge:()=>Promise.resolve("connected"),client:a,get me(){if(g===null)throw new Error(Pe);return g},characters:new ee(o),get transfers(){if(p===null)throw new Error(Pe);return p},analytics:m,leaderboards:new ae(o),challenges:new V(o),showcase:new le(o,()=>s===null?Promise.reject(new Error(Pe)):Promise.resolve(s)),friends:new te(o),platform:new oe(o,void 0,R),profiles:new se(o)};return Vt(P,"functions",Mi),Vt(P,"gameConfig",Fi),P}var Ni=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]]),Xe=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:Ni.get(this.code))??super.retryable}};
|
|
3
|
-
export{
|
|
1
|
+
globalThis.__gemWebSdkVersion="[gem-web-sdk:sdkVersion:16.0.0]";function Ze(){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 en(t,e,n){let r=`/v1/inventory/transfers/${l(e)}/accept`;return t.client.post(r,void 0,n?.signal)}async function nn(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 tn(t,e,n){let r=`/v1/inventory/transfers/${l(e)}/cancel`;return t.client.post(r,void 0,n?.signal)}async function rn(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 an(t,e,n){return t.client.post("/v1/characters",e,n?.signal)}async function on(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 sn(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 ln(t,e,n,r,i){let a=`/v1/settings/${l(e)}/${l(n)}/${l(r)}`;return t.client.delete(a,i?.signal)}async function dn(t,e,n,r,i){let a=`/v1/saves/${l(e)}/${l(n)}/${l(r)}`;return t.client.delete(a,i?.signal)}async function un(t,e,n,r){let i=`/v1/showcase/players/${l(e)}/${l(n)}`;return t.client.delete(i,r?.signal)}async function cn(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 pn(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 gn(t,e,n){let r=`/v1/characters/${l(e)}`;return t.client.get(r,n?.signal)}async function mn(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 yn(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 fn(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 hn(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 _n(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 bn(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 Rn(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 wn(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 Ie(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 vn(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 xn(t,e,n){let r=`/v1/showcase/friends/${l(e)}`;return t.client.get(r,n?.signal)}async function Sn(t,e,n){let r=`/v1/inbox/friend-challenges/${l(e)}`;return t.client.get(r,n?.signal)}async function kn(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 An(t,e){let n=`/v1/games/${l(t.gameId())}/players/me/earn-allowance`;return t.client.get(n,e?.signal)}async function ue(t,e){return t.client.get("/v1/inventory/players/me/platform-currencies",e?.signal)}async function Pn(t,e,n){let r=`/v1/profiles/players/${l(e)}`;return t.client.get(r,n?.signal)}async function On(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 Cn(t,e,n,r){let i=`/v1/showcase/players/${l(e)}/${l(n)}`;return t.client.get(i,r?.signal)}async function In(t,e){return t.client.get("/v1/characters/slots",e?.signal)}async function Gn(t,e,n){let r=`/v1/inventory/transfers/${l(e)}`;return t.client.get(r,n?.signal)}async function Tn(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,retryRateLimited:false})}async function En(t,e,n){return t.client.post("/v1/inventory/transfers",e,n?.signal)}async function Ln(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 qn(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 Mn(t,e){return t.client.get("/v1/characters",e?.signal)}async function Fn(t,e,n,r){let i=`/v1/settings/${l(e)}/${l(n)}`;return t.client.get(i,r?.signal)}async function $n(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 jn(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 Bn(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 Nn(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 Un(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 Dn(t,e,n){let r=`/v1/inbox/friend-challenges/${l(e)}/answered`;return t.client.post(r,void 0,n?.signal)}async function Vn(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 Wn(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 Hn(t,e,n,r,i){let a=`/v1/showcase/players/${l(e)}/${l(n)}`;return t.client.put(a,r,i?.signal)}async function Jn(t,e,n){let r=`/v1/inventory/transfers/${l(e)}/reject`;return t.client.post(r,void 0,n?.signal)}async function Kn(t,e,n,r){let i=`/v1/characters/${l(e)}`;return t.client.patch(i,n,r?.signal)}async function zn(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 Yn(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 Xn(t,e,n){let r=`/v1/characters/${l(e)}`;return t.client.delete(r,n?.signal)}function Qn(t,e){let n=e?.retryAfterSeconds,r=typeof n=="number"&&Number.isFinite(n)&&n>0?n*1e3:0,i=1e4*2**Math.min(Math.max(0,t-1),16);return Math.min(Math.max(r,i),3e5)}var Ht="gem_";function Zn(t){return t.startsWith(Ht)}function Jt(t){let e=2166136261;for(let n of new TextEncoder().encode(t))e^=n,e=Math.imul(e,16777619);return e>>>0}function Kt(t){let e=t;return e^=e>>>16,e=Math.imul(e,2246822507),e^=e>>>13,e=Math.imul(e,3266489909),e^=e>>>16,e>>>0}function Ge(t,e,n){if(Te(t,n),typeof e!="string"||e==="")throw new TypeError("[gem] experiment: playerId must be a non-empty string");let r=typeof n=="number"?n:n.length,i=Kt(Jt(`${t}:${e}`))%r;return typeof n=="number"?i:n[i]}function Te(t,e){if(typeof t!="string"||t==="")throw new TypeError("[gem] experiment: key must be a non-empty string");if(typeof e=="number"){if(!Number.isInteger(e)||e<1||e>2048)throw new RangeError(`[gem] experiment '${t}': the count must be an integer from 1 to 2048; got ${String(e)}`);return}if(!Array.isArray(e))throw new TypeError(`[gem] experiment '${t}': pass a count or a list of strings; got ${typeof e}`);let n=e;if(n.length<1||n.length>2048)throw new RangeError(`[gem] experiment '${t}': the list must hold 1 to 2048 strings; got ${n.length}`);if(!n.every(r=>typeof r=="string"))throw new TypeError(`[gem] experiment '${t}': every option must be a string`)}var et=1e4,nt=50,Xt=500,Qt=65536-4*1024,Zt=24*1024;function tt(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 rt=t=>typeof t=="number"?t:0,er=t=>typeof t=="string"?t:"";function ce(t=0){return {accepted:0,rejected:[],dropped:t,duplicate:false}}function nr(t,e){let n=t??{},r=Array.isArray(n.rejected)?n.rejected.map(i=>{let a=i??{};return {index:rt(a.index),code:er(a.code)}}):[];return {accepted:rt(n.accepted),rejected:r,dropped:e,duplicate:n.duplicate===true}}function Ee(){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 tr(t){return t?.retryable===true}var U=class{#e;#t;#a;#f;#n=[];#h={};#o=0;#s=null;#_=false;#b=false;#p=0;#R=0;#w=0;#r=false;#v=null;#l=null;#u=false;#i=false;#g=false;#x=false;#S=false;constructor(e){this.#e=e,this.#t=e.options?.enabled!==false,this.#a=Math.max(et,e.options?.flushIntervalMs??et),this.#f=Math.max(1,Math.floor(e.options?.maxQueue??Xt));}track(e,n={}){if(!(!this.#t||this.#r)){if(Zn(e)){this.#S||(this.#S=true,this.#y(`[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.#k(e,tt({...this.#h,...n}));}}setContext(e){this.#h={...this.#h,...e};}async experiment(e,n){Te(e,n);let r=this.#e.awaitPlayerId===void 0?this.#e.playerId():await this.#e.awaitPlayerId();if(r===null)throw new Error(`[gem] experiment '${e}': no player to select for \u2014 this call was not made by a player.`);return typeof n=="number"?Ge(e,r,n):Ge(e,r,n)}get environment(){let e=this.#e.environment;return {...typeof e=="function"?e():e??{}}}async flush(e={}){if(this.#i)return ce();let n=this.#G();if(n===null||n==="")return this.#n.length>0&&!this.#x&&(this.#x=true,this.#y("[gem] analytics: events are being recorded but no play session has been established, so nothing is being sent. Outside the arcade this is expected.")),ce();if(this.#P(),this.#n.length===0)return ce();let r=e.keepalive===true;if(this.#p>0&&!r)return ce();this.#c();let i=this.#n.splice(0,this.#C(r)),a=this.#o;this.#o=0;let o=Math.round(this.#e.clock.now()),s={batch_id:Ee(),sent_at_ms:o,events:i.map(c=>it(c,o))},u={client:this.#e.client(),gameId:()=>n};this.#p+=1;try{let c=await Tn(u,s,{...e.signal===void 0?{}:{signal:e.signal},...r?{keepalive:!0}:{}}),m=nr(c,a);return this.#R=0,this.#w=0,this.#I(m),m}catch(c){throw tr(c)?(this.#O(i,a),this.#R+=1,this.#w=this.#e.clock.now()+Qn(this.#R,c)):this.#y(`[gem] analytics: ${i.length} event(s) were discarded \u2014 the platform refused the batch and will refuse it again: ${String(c)}`),c}finally{this.#p-=1,this.#n.length>0&&this.#d();}}trackPlatform(e,n={}){this.#r||this.#i&&(e==="gem_pause"||e==="gem_resume")||this.#k(e,tt(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.#g&&(this.#g=false,this.#l=e,this.#u=false,this.#n.unshift({uid:Ee(),name:"gem_session_start",atMs:e,dimensions:{},measures:{}})),this.#n.length>=nt?this.#m():this.#n.length>0&&this.#d();}get held(){return this.#i}startSession(){if(!(this.#r||this.#l!==null)){if(this.#i){this.#g=true;return}this.#l=this.#e.clock.now(),this.#u=false,this.trackPlatform("gem_session_start");}}endSession(e){if(this.#r||this.#u)return;if(this.#u=true,this.#i){this.#g=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.#m({keepalive:true});}setPaused(e){this.#r||e===this.#_||(this.#_=e,this.trackPlatform(e?"gem_pause":"gem_resume"),e?this.#c():this.#n.length>0&&this.#d());}setHidden(e){this.#r||e===this.#b||(this.#b=e,e?this.#c():this.#n.length>0&&this.#d());}dispose(){this.#r=true,this.#c(),this.#n=[],this.#o=0;}get pending(){return this.#n.length}#k(e,n){let{dimensions:r,measures:i}=n;for(this.#P();this.#n.length>=this.#f;)this.#n.shift(),this.#o+=1;this.#n.push({uid:Ee(),name:e,atMs:this.#e.clock.now(),dimensions:r,measures:i}),this.#n.length>=nt?this.#m():this.#d();}#m(e={}){if(e.keepalive!==true&&this.#A()>0){this.#d();return}this.flush(e).catch(()=>{});}#A(){return Math.max(0,this.#w-this.#e.clock.now())}#O(e,n){for(this.#n=[...e,...this.#n],this.#o+=n;this.#n.length>this.#f;)this.#n.shift(),this.#o+=1;}#C(e){let n=e?Zt:Qt,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(it(o,0)).length+1,i>n)return Math.max(1,a)}return r}#d(){this.#s!==null||this.#_||this.#b||this.#i||this.#r||this.#p>0||(this.#s=this.#e.clock.setTimeout(()=>{this.#s=null,this.#m();},Math.max(this.#a,this.#A())));}#c(){this.#s!==null&&(this.#e.clock.clearTimeout(this.#s),this.#s=null);}#P(){let e=this.#T();e===null||e===""||(this.#v!==null&&this.#v!==e&&(this.#n=[],this.#o=0,this.#l=null,this.#u=false),this.#v=e);}#I(e){for(let n of e.rejected)this.#y(`[gem] analytics: an event was refused (${n.code}). `+rr(n.code));}#y(e){let n=this.#e.log;n!==null&&(n===void 0?console.warn(e):n(e));}#G(){try{return this.#e.gameId()}catch{return null}}#T(){try{return this.#e.playerId()}catch{return null}}};function it(t,e){return {event_uid:t.uid,name:t.name,offset_ms:Math.round(t.atMs)-e,dimensions:t.dimensions,measures:t.measures}}function rr(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 ir={initialDelayMs:2e3,maxDelayMs:6e4};function ar(t,e){return e!==void 0?!e:t==="chain_exhausted"}var pe=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 w(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 w("chain_exhausted","the token chain reached its ceiling");if(this.inFlight===null&&this.options.clock.now()<this.notBefore)throw new w(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}=ir,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 w("internal","token arrived for a superseded generation");return this.grant=i,this.rejected=false,this.enter("ready"),i.token}).catch(i=>{let a=or(i),{retryable:o,retryAfterMs:s}=i??{};throw n===this.generation&&(ar(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 w?i:new w(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)}},w=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 or(t){if(t instanceof w)return t.reason;let e=t?.reason;return typeof e=="string"&&["chain_exhausted","unavailable","timeout","internal"].includes(e)?e:"internal"}var _=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}},q=["if-match","if-none-match"],at=4096;function sr(t){if(!t)return;let e={};for(let[n,r]of Object.entries(t)){let i=n.toLowerCase();if(!q.includes(i)||r===void 0)continue;let a=typeof r=="string"?lr(r):r;if(typeof a!="string"||a.length>at||!dr(a))throw new _(`the ${i} header value cannot be sent \u2014 it is not a string, is longer than ${at} 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 lr(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 dr(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 ur(t){let{bytes:e}=t;if(e!==void 0){if(Object.prototype.toString.call(e)!=="[object Uint8Array]")throw new _("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 _("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 ot(t,e){let n=e.replayUnauthorizedOnce??true;return {async request(r){let i={...r},a=sr(i.headers),o=ur(i),s=Object.freeze({...i,headers:a,...o===void 0?{}:{bytes:o}}),u=await e.tokenSource.get(),c=await t(s,u);if(c.status!==401||!n)return c;e.tokenSource.invalidate(u);let m=await e.tokenSource.get(),p=await t(s,m);if(p.status===401)throw e.tokenSource.close("unavailable"),new w("unavailable","the server refused a freshly minted token");return p}}}function ge(t){let e=typeof t=="string"?new TextEncoder().encode(t):t;return btoa(cr(e))}function st(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 Le(t){return new TextDecoder().decode(st(t))}function cr(t){let n="";for(let r=0;r<t.length;r+=32768)n+=String.fromCharCode(...t.subarray(r,r+32768));return n}var f=class extends Error{constructor(n,r,i,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"}},pr=new WeakMap;var gr=new Set([408,429,500,502,503,504]),mr=6e4;function yr(t){if(t===void 0)return 2;if(!Number.isInteger(t)||t<0||t>10)throw new _(`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 V=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,...D(i)},i.replaySafe===true,i.retryRateLimited!==false)}async post(e,n,r,i={}){return this.send({method:"POST",path:e,body:n,signal:r,...D(i)},i.replaySafe===true,i.retryRateLimited!==false)}async postBytes(e,n,r,i={}){let a=await this.sendRaw({method:"POST",path:e,bytes:n,responseType:"bytes",signal:r,...D(i)},i.replaySafe===true,i.retryRateLimited!==false);return {bytes:fr(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,...D(i)},i.replaySafe===true,i.retryRateLimited!==false)}async delete(e,n,r={}){return this.send({method:"DELETE",path:e,signal:n,...D(r)},r.replaySafe===true,r.retryRateLimited!==false)}async send(e,n,r=true){return (await this.sendRaw(e,n,r)).body}async sendRaw(e,n,r=true){let i=n?yr(this.options.maxRetries)+1:1,a=null;if(e.signal?.aborted)throw lt(e.signal);for(let o=0;o<i;o++){if(o>0&&await this.backoff(o,a,e.signal),e.signal?.aborted)throw lt(e.signal);let s;try{s=await this.options.transport.request(e);}catch(c){if(w.isAuthError(c)||_.isRefusal(c)||e.signal?.aborted||hr(c))throw c;a=new f("unavailable",0,String(c));continue}if(s.status>=200&&s.status<300||s.status===304)return s;let u=_r(s);if(!gr.has(s.status)||s.status===429&&!r)throw u;a=u;}throw a??new f("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),mr);return new Promise(u=>{let c=this.options.clock,m=false,p=false,R,y=()=>{m||(m=true,p&&c.clearTimeout(R),r?.removeEventListener("abort",y),u());};r?.addEventListener("abort",y,{once:true}),R=c.setTimeout(y,s),p=true,m&&c.clearTimeout(R);})}};function fr(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 D(t){return {...t.keepalive===void 0?{}:{keepalive:t.keepalive},...t.ifMatch===void 0?{}:{headers:{"if-match":t.ifMatch}}}}function lt(t){return t.reason!==void 0?t.reason:new DOMException("The operation was aborted.","AbortError")}function hr(t){let e=t?.name;return e==="AbortError"||e==="TimeoutError"}function _r(t){let e=Rr(t),n=vr(t.body),r={...n===void 0?{}:{details:n},...t.invocationId===void 0?{}:{invocationId:t.invocationId}};return Object.keys(r).length>0&&pr.set(e,r),e}var br=new Map([["insufficient_funds","insufficient_funds"]]);function Rr(t){let{status:e,body:n}=t,r=wr(n),i=t.retryAfterSeconds??Sr(n),a=xr(n),o=a===void 0?void 0:br.get(a);if(o!==void 0)return new f(o,e,r,void 0,a);switch(e){case 304:return new f("not_modified",e,r);case 400:case 422:return new f("invalid",e,r,void 0,a);case 403:return new f("forbidden",e,r,void 0,a);case 404:return new f("not_found",e,r,void 0,a);case 402:return new f("insufficient_funds",e,r,void 0,a);case 409:return new f("conflict",e,r,void 0,a);case 412:return new f("precondition_failed",e,r,void 0,a);case 413:return new f("too_large",e,r,void 0,a);case 429:return new f("rate_limited",e,r,i,a);default:return new f("unavailable",e,r,i,a)}}function wr(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 vr(t){let n=t?.error?.details;return n===null?void 0:n}function xr(t){let n=t?.error?.code;return typeof n=="string"&&n.length>0?n:void 0}function Sr(t){let e=t?.retryAfterSeconds;return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function kr(t){let e=t.lastIndexOf("@");return (e===-1?t:`***@${t.slice(e+1)}`).slice(0,200)}var Ar=new Set(q);function Pr(t){if(!t)return {};let e={};for(let[n,r]of Object.entries(t))Ar.has(n.toLowerCase())&&(e[n.toLowerCase()]=r);return e}function dt(t){let e=t.fetch??globalThis.fetch.bind(globalThis);return ot(async(n,r)=>{let i;try{i=new URL(t.baseUrl.replace(/\/+$/,""));}catch{throw new _("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 _(`${JSON.stringify(typeof n.path=="string"?kr(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 _(`${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 y=i.username!==""||i.password!=="",P=a.username!==i.username||a.password!==i.password,Ce=y?P?"baseUrl (and possibly the request path)":"baseUrl":"request path";throw new _(`the ${Ce} 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[y,P]of Object.entries(t.defaultQuery??{}))a.searchParams.has(y)||a.searchParams.set(y,P);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(y){throw new _(`the body of ${n.method} ${JSON.stringify(a.pathname)} could not be serialised to JSON: ${String(y)}. This is a bug in the request, not a server failure \u2014 retrying sends the same unserialisable value.`)}let u=await e(a.toString(),{method:n.method,headers:{authorization:`Bearer ${r}`,...s===void 0?{}:{"content-type":s},...Pr(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"&&u.status>=200&&u.status<300)c=new Uint8Array(await u.arrayBuffer());else {let y=await u.text();if(y.length>0)try{c=JSON.parse(y);}catch{c=y;}}let m=u.headers.get("etag"),p=Or(u.headers.get("retry-after")),R=u.headers.get("x-gem-invocation-id");return {status:u.status,body:c,...m===null?{}:{etag:m},...p===void 0?{}:{retryAfterSeconds:p},...R===null||R===""?{}:{invocationId:R}}},t)}function Or(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 ut=400,x=t=>typeof t=="string"?t:"",Cr=/(?:Z|[+-]\d{2}:?\d{2})$/i;function C(t){let e=x(t);if(!Cr.test(e))return 0;let n=Date.parse(e);return Number.isFinite(n)?Math.floor(n/1e3):0}var Ir=/^[0-9a-f]{1,64}$/,Gr=/^[0-9a-f]{16}$/,Tr=/^[A-Za-z][A-Za-z0-9_+\-/]{0,63}$/,Er=/^(?:[01]\d|2[0-3]):[0-5]\d$/;function qe(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 Lr=4096,qr=new TextEncoder;function Mr(t){let e=x(t.challenge_data),n=x(t.challenge_data_hash);return e===""||!Gr.test(n)?{}:qr.encode(e).length>Lr?{}:{data:e,dataHash:n}}function Fr(t){let e=t??{},n=C(e.period_start_at),r=C(e.period_ends_at);if(n===0||r===0)return;let i=x(e.slug),a=x(e.seed),o=qe(e.period_local_date),s=x(e.boundary),u=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:Tr.test(s)?s:"",resetTime:Er.test(u)?u:"",seed:Ir.test(a)?a:"",...Mr(e)}}function me(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 ct(t){let e=t??{};return Array.isArray(e.challenges)?e.challenges.map(Fr).filter(n=>n!==void 0):[]}var W=class{#e;constructor(e){this.#e=e;}async list(e={}){let{periodsBack:n}=e;me(n);let r=await qn(this.#e,{...n===void 0?{}:{periods_back:n},...e.signal===void 0?{}:{signal:e.signal}});return ct(r)}};var $r="gem-web-bridge";var jr=65536,pt=8,ye=5e3,gt=1024;var fe=Object.create(null);var mt=Object.create(null);function Br(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 Nr(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 Ur(t){return /^[a-z]{2,8}(-[a-z0-9]{1,8})*$/i.test(t)}function Dr(t){return /^[a-z_]+$/.test(t)}function Vr(t){return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t)||/^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$/.test(t)&&!t.includes("--")}function Me(t,e,n){if(e>pt)return `nesting deeper than ${pt}`;if(++n.nodes>ye)return `more than ${ye} values`;if(n.bytes>n.cap)return `over the ${n.cap} 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>gt)return `an array of ${t.length} entries, over the ${gt} limit`;n.bytes+=2;for(let s of t){let u=Me(s,e+1,n);if(u)return u}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>ye)return `more than ${ye} values`;if(n.bytes+=s.length*3+4,n.bytes>n.cap)return `over the ${n.cap} byte limit`;let u=Me(o[s],e+1,n);if(u)return u}return null}function Wr(t,e=jr){let n={nodes:0,bytes:0,seen:new Set,cap:e},r=Me(t,0,n);return r?`message contains ${r}`:n.bytes>e?`message is over the ${e} byte limit`:null}var Hr={origin:[Br,"not a well-formed origin"],url:[Nr,"not a safe absolute http(s) URL"],bcp47:[Ur,"not a well-formed BCP 47 tag"],code:[Dr,"not a code of lower-case letters and underscores"],gameRef:[Vr,"not a game id or web address"]};function yt(t,e,n){for(let r of e){let i=n===""?r[0]:`${n}.${r[0]}`,a=t[r[0]];if(a==null){if(r[1]<"a")continue;return `${i}: required`}let o=Fe(a,r,i);if(o)return o}return null}function Fe(t,e,n){let r=e[1].toLowerCase();switch(r){case "u":return typeof t=="boolean"?null:Fe(t,typeof t=="string"?[e[0],"s",e[2]]:[e[0],"n",e[3],e[4]],n);case "s":{if(typeof t!="string")return `${n}: expected string`;if(t.length>e[2])return `${n}: exceeds ${e[2]} characters`;if(e[3]){let[i,a]=Hr[e[3]];if(!i(t))return `${n}: ${a}`}return null}case "n":case "i":return typeof t!="number"||!(r=="i"?Number.isInteger:Number.isFinite)(t)?`${n}: expected ${r=="i"?"integer":"number"}`:t<e[2]||t>e[3]?`${n}: out of range ${e[2]}..${e[3]}`:null;case "b":return typeof t=="boolean"?null:`${n}: expected boolean`;case "e":{let i=e[2];return i.includes(t)?null:`${n}: not one of ${i.join("|")}`}case "o":return typeof t!="object"||t===null||Array.isArray(t)?`${n}: expected object`:yt(t,e[2],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[2])return `${n}: exceeds ${e[2]} items`;let i=e[3],a=`${n}[]`;for(let o of t){if(o==null){if(i[1]<"a")continue;return `${a}: required`}let s=Fe(o,i,a);if(s)return s}return null}default:return `${n}: unknown kind ${String(r)}`}}var ft=Object.create(null);function d(t,e,n,r,i){return fe[t]=n,r&&(mt[t]=r),ft[t]=a=>{let o=Wr(a,i);if(o)return o;if(typeof a!="object"||a===null||Array.isArray(a))return "message: expected object";let s=a;return s.gem!==$r?"gem: wrong protocol marker":s.type!==t?`type: expected ${t}`:yt(s,e,"")}}var g=["requestId","s",64],I=["outcome","e",["ok","declined","unavailable"]],G=["reason","S",64,"code"];d("gem.handshake",[["versions","o",[["min","i",1,1e3],["max","i",1,1e3]]],["capabilities","A",64,["","s",64]],["embedder","s",2048,"origin"],["unbidden","B"]],30);d("gem.handshake.accept",[["v","i",1,1e3],["capabilities","A",64,["","s",64]]],5);d("gem.token",[["token","s",4096],["requestId","S",64],["generation","i",0,2147483647],["apiBaseUrl","S",512,"url"],["playerId","s",64],["gameId","s",64],["channel","e",["dev","test","release"]],["gameVersion","S",64],["expiresAt","i",0,4102444800],["chainEndsAt","i",0,4102444800],["allowDevTools","B"]],30);d("gem.token.denied",[g,["retryable","b"],["retryAfterMs","I",0,36e5],["reason","e",["chain_exhausted","unavailable"]],["correlationId","s",64]],30);d("gem.player",[["untrusted","o",[["displayName","s",64],["displayTag","S",80],["displayHandle","s",80]]],["playerId","S",64],["discriminator","S",8],["avatarIconUrl","S",2048,"url"],["avatarIconId","S",64],["avatar3dId","S",64],["avatar3dModelUrl","S",2048,"url"],["avatar3dIconUrl","S",2048,"url"],["avatars3d","A",8,["","o",[["family","s",32],["id","s",64],["modelUrl","s",256,"url"],["iconUrl","s",256,"url"]]]],["badges","A",2,["","o",[["itemId","s",64],["iconUrl","s",2048,"url"]]]],["displayTag","s",8],["avatarUrl","S",2048,"url"],["boost","O",[["multipliers","a",8,["","o",[["currencyId","s",64],["currencySlug","s",32],["multiplierBp","i",1e4,1e6]]]],["expiresInDays","I",1,7]]]],12);d("gem.pause",[["paused","b"]],120);d("gem.prefs",[["reducedMotion","b"],["muted","b"],["showFrameStats","B"],["music","B"],["sounds","B"],["locale","s",35,"bcp47"],["recommended","O",[["volume","i",0,100],["batterySaver","b"],["keyboardLayout","e",["wasd","arrows"]],["gamepadConfirm","e",["south","east"]],["vibration","b"],["lookSensitivity","I",20,400],["gamepadLookSensitivity","I",20,400],["invertLookY","B"],["touchMovement","S",16,"code"],["graphicsQuality","S",16,"code"],["graphicsQualityAuto","B"],["colorHelp","B"]]]],60);d("gem.cohorts",[["cohorts","a",8,["","o",[["experimentId","s",36],["variantKey","s",32]]]]],12,"cohorts");d("gem.earnAllowanceChanged",[],30,"earnAllowance");d("gem.viewport",[["insets","o",[["top","i",0,4096],["right","i",0,4096],["bottom","i",0,4096],["left","i",0,4096]]],["reserved","A",4,["","o",[["x","i",0,16384],["y","i",0,16384],["width","i",0,16384],["height","i",0,16384],["control","O",[["x","i",0,16384],["y","i",0,16384],["width","i",0,16384],["height","i",0,16384]]]]]]],60,"viewport");d("gem.deviceSettings",[["settings","J"]],12,"deviceSettings");d("gem.willTerminate",[["reason","e",["grant_expiring","session_ended","navigating","kill_switch"]],["graceMs","i",0,6e4]],10);d("gem.roomEvent",[["event","e",["updated","match_started","match_ready","match_failed","version_stale"]],["roomId","s",64],["matchId","S",64],["version","I",0,2147483647],["reason","S",64],["platform","E",["universal","mobile"]]],120,"rooms");d("gem.socketState",[["connected","b"],["reason","E",["connecting","dropped","watchdog","terminal"]]],12,"socketState");d("gem.seatedEvent",[["roomId","s",64]],60,"partySeating");d("gem.autoStartFailedEvent",[["roomId","s",64],["code","s",64]],30,"autoStartFailure");d("gem.ticketEvent",[["event","e",["queued","matched","expired","cancelled","failed"]],["ticketId","s",64],["partySize","I",1,64],["queuedAt","I",0,4102444800],["expiresAt","I",0,4102444800],["reason","S",64],["roomId","S",64]],60,"ticketEvents");d("gem.signalEvent",[["event","e",["hello","offer","answer","ice","peerJoined","peerLeft","migration","matchEnded","error"]],["matchId","s",64],["data","j"]],1800,"p2p");d("gem.dedicatedEvent",[["event","e",["answer","error","matchEnded"]],["matchId","s",64],["sdp","S",10240],["sessionId","S",64],["code","S",64],["message","S",256],["reason","S",64]],120,"dedicated");d("gem.partyResult",[g,["partyId","S",64]],30,"parties");d("gem.clusterTarget",[["clusterTargetId","s",64],["clusterTargetIds","A",3,["","s",64]]],12,"clusterTarget");d("gem.devtools",[["action","e",["open","close","toggle"]]],30,"devtools");d("gem.screenshot",[["maxWidth","i",1,7680],["maxHeight","i",1,4320]],6,"screenshot");d("gem.screenshot.denied",[["reason","e",["not_wired","no_source","unsupported","unreadable","tainted","too_large","busy","declined","failed"]],["retryable","b"]],12,"screenshot");d("gem.requestContext",[],12,"feedbackContext");d("gem.gameContext",[["context","j"]],12,"feedbackContext");d("gem.signal",[["signal","e",["join","offer","answer","ice","migrationAck","hostUnreachable"]],["matchId","s",64],["data","j"]],1200,"p2p");d("gem.dedicatedOffer",[["matchId","s",64],["sdp","s",10240],["intent","e",["initial","ice_restart","full_reconnect"]]],60,"dedicated");d("gem.partyRequest",[g],12,"parties");d("gem.ready",[],5);d("gem.engaged",[],5,"engagement");d("gem.progress",[["loaded","i",0,1099511627776],["total","i",0,1099511627776]],600);d("gem.requestToken",[g,["reason","e",["initial","expiring","rejected"]]],12);d("gem.requestLocalServer",[g,["gameRoomId","s",64]],6,"localHost");d("gem.localServer",[g,["serverId","S",128]],30,"localHost");d("gem.localServer.denied",[g,["retryable","b"],["reason","e",["refused","unavailable"]]],30,"localHost");d("gem.exit",[["reason","S",64]],5);d("gem.openExternal",[["url","s",2048,"url"]],6);d("gem.requestFullscreen",[["enabled","b"]],30);d("gem.audioState",[["muted","b"]],120,"audioState");d("gem.rewardCue",[["currencySlug","s",32],["expected","I",1,1e9],["origin","O",[["x","i",0,16384],["y","i",0,16384]]]],60,"rewardCue");d("gem.walletDisplay",[["visible","b"],["currencies","A",8,["","s",64]],["score","B"]],60,"walletDisplay");d("gem.controlsDeclare",[["uses","o",[["lookSensitivity","S",16,"code"],["gamepadLookSensitivity","S",16,"code"],["invertLookY","S",16,"code"],["touchMovement","S",16,"code"]]]],60,"controls");d("gem.menu",[["settings","b"],["items","A",4,["","o",[["id","s",32],["label","s",40]]]]],60,"gameMenu");d("gem.menuSelect",[["entry","e",["settings","item"]],["id","S",32]],60,"gameMenu");d("gem.gemCorner",[["corner","e",["top-left","top-right","bottom-left","bottom-right"]]],12,"gemCorner");d("gem.settingsDeclare",[["settings","a",8,["","o",[["id","s",40],["label","s",40],["kind","e",["toggle","slider","choice"]],["value","u",40,-1e6,1e6],["quick","B"],["icon","S",16,"code"],["min","N",-1e6,1e6],["max","N",-1e6,1e6],["step","N",0,1e6],["options","A",4,["","o",[["id","s",40],["label","s",40]]]]]]]],120,"gameSettings");d("gem.settingChange",[["id","s",40],["value","u",40,-1e6,1e6]],120,"gameSettings");d("gem.requestShare",[["params","a",16,["","o",[["key","s",64],["value","s",512]]]]],6,"share");d("gem.requestAvatarPicker",[["tab","E",["2d","3d"]]],6,"avatarPicker");d("gem.vibrate",[["pattern","a",99,["","i",0,1e4]]],600,"vibration");d("gem.frameStats",[["fps","i",0,1e3],["frameTimeP95Ms","i",0,1e5],["counts","E",["pageFrames","gameDraws"]]],120,"frameStats");d("gem.portraitBorders",[["name","S",40]],60,"portraitBorders");d("gem.error",[["code","e",["version_mismatch","handshake_timeout","handshake_duplicate","invalid_message","rate_limited","token_unavailable","unsupported","unsupported_capability","internal"]],["message","S",256]],60);d("gem.requestPurchase",[g,["purchaseKind","e",["item","recipe"]],["targetId","s",64],["currencySlug","s",32],["quantity","I",1,10],["catalogId","S",64]],12,"purchases");d("gem.requestAvatar3dPurchase",[g,["itemId","s",64],["currencySlug","s",32]],12,"avatar3dPurchases");d("gem.purchaseResult",[g,I,G,["purchaseId","S",64]],30,"purchases");d("gem.deviceSettings.put",[g,["settings","j"]],30,"deviceSettings");d("gem.deviceSettings.result",[g,["outcome","e",["stored","too_large","unavailable"]]],30,"deviceSettings");d("gem.requestAd",[g,["placement","s",32],["format","e",["interstitial","rewarded"]]],6,"ads");d("gem.adResult",[g,["outcome","e",["shown","no_ad","unavailable"]]],12,"ads");d("gem.signalMoment",[g,["kind","e",["level_end","run_end","match_end","menu_return","other_break"]],["placement","S",32]],6,"moments");d("gem.momentResult",[g,["shown","b"]],12,"moments");d("gem.requestSignIn",[g],6,"signIn");d("gem.signInResult",[g,["outcome","e",["signed_in","declined","unavailable"]]],12,"signIn");d("gem.requestFriendChallenge",[g,["playerId","s",64],["template","s",64],["params","J"]],12,"friendChallenges");d("gem.friendChallengeResult",[g,["outcome","e",["accepted","cancelled","refused","unavailable","rate_limited","invalid"]],["code","S",64],["param","S",64],["channel","S",16],["configVersion","I",0,9007199254740991],["retryAfterMs","I",0,864e5],["detail","S",300]],30,"friendChallenges");d("gem.requestAppLinks",[g],12,"appLinks");d("gem.appLinksResult",[g,I,G,["arcade","O",[["store","e",["app_store","google_play"]]]],["game","O",[["store","e",["app_store","google_play"]]]]],30,"appLinks");d("gem.requestOpenApp",[g,["target","e",["arcade","game"]]],6,"appLinks");d("gem.openAppResult",[g,I,G],30,"appLinks");d("gem.requestOpenGame",[g,["ref","s",40,"gameRef"]],6,"openGame");d("gem.openGameResult",[g,I,G],30,"openGame");d("gem.requestSimilarGames",[g,["limit","I",1,24]],12,"openGame");d("gem.similarGamesResult",[g,I,G,["games","a",24,["","o",[["gameId","s",36,"gameRef"],["slug","S",40,"gameRef"],["iconUrl","s",1024,"url"],["capsuleLandscapeUrl","s",1024,"url"],["capsulePortraitUrl","s",1024,"url"],["previewVideoUrl","S",1024,"url"],["previewPosterUrl","S",1024,"url"],["untrusted","o",[["name","s",64],["tagline","s",64],["shortDescription","s",320],["tags","a",10,["","s",32]]]]]]]],30,"openGame",524288);d("gem.requestStoreOffers",[g],12,"store");d("gem.storeOffersResult",[g,I,G,["offers","a",32,["","o",[["skuId","s",64],["kind","e",["gem_pack","boost","pass","bundle"]],["name","s",80],["description","s",400],["imageUrl","S",1024,"url"],["priceDisplay","s",32],["grant","O",[["currency","s",32],["amount","i",1,1e9]]]]]]],30,"store",262144);d("gem.requestStorePurchase",[g,["skuId","s",64]],12,"store");d("gem.storePurchaseResult",[g,I,G],30,"store");d("gem.storePurchaseSettled",[["skuId","s",64]],30,"store");Object.freeze(ft);fe.__malformed=60;Object.freeze(fe);Object.freeze(mt);var M={now:()=>Date.now(),setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)};function ht(t){let e=t.toLowerCase();return e==="localhost"||e.endsWith(".localhost")||e==="[::1]"||e==="::1"?true:/^127(\.\d{1,3}){3}$/.test(e)}var H=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 je(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 _t="inventory",F=t=>typeof t=="number"?t:0,J=t=>typeof t=="string"?t:"";function $e(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 bt(t){let e=t??{};return {itemDefinitionId:J(e.item_definition_id),instanceId:J(e.instance_id),quantity:F(e.quantity),acquiredAt:F(e.acquired_at),...e.properties===void 0?{}:{properties:e.properties},...e.custom_data===void 0?{}:{customData:e.custom_data}}}function Jr(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0;return {currencies:$e(e.currencies,r=>{let i=r??{},a=Array.isArray(i.buckets)?i.buckets.map(o=>{let s=o??{};return {bucket:J(s.bucket),balance:F(s.balance)}}):void 0;return {currencyId:J(i.currency_id),total:F(i.total),...a===void 0?{}:{buckets:a}}}),items:$e(e.items,bt),progressions:$e(e.progressions,r=>{let i=r??{};return {progressionDefinitionId:J(i.progression_definition_id),currentValue:F(i.current_value),completionCount:F(i.completion_count),isCompleted:i.is_completed===true,...je(i)}}),...n===void 0?{}:{etag:n}}}var K=class{constructor(e,n,r){this.api=e;this.entity=n;this.cache=r;}api;entity;cache;snapshot(e={}){let n=e.buckets?`${_t}#buckets`:_t;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 fn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return Array.isArray(i)?i.map(bt):[]}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 yn(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 Jr(n)}};var Kr={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,already_owned: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(Kr));var T=class extends RangeError{constructor(n,r){super(r);this.code=n;this.name="PurchaseRefusal";}code;retryable=false};var h=t=>typeof t=="string"?t:"",zr=t=>typeof t=="string"?t:h(t&&typeof t=="object"?t.type:void 0),S=t=>typeof t=="number"?t:0;function Yr(t){let e=t??{};return {prerequisiteType:h(e.prerequisite_type),referenceId:h(e.reference_id),required:S(e.required),current:S(e.current)}}function z(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0;return {orderId:h(e.order_id),status:h(e.status),...n===void 0?{}:{etag:n}}}function he(){return crypto.randomUUID()}var Xr="recipe-usage",Rt=100;function _e(t){let e=t??{};switch(e.type){case "currency":return {kind:"currency",currencyId:h(e.currency_id),bucket:h(e.bucket),delta:S(e.delta),balanceAfter:S(e.balance_after)};case "item":return {kind:"item",itemDefinitionId:h(e.item_definition_id),instanceId:h(e.instance_id),delta:S(e.delta),quantityAfter:S(e.quantity_after)};case "progression":return {kind:"progression",progressionDefinitionId:h(e.progression_definition_id),delta:S(e.delta),valueAfter:S(e.value_after),completed:e.completed===true};default:return {kind:"other",type:h(e.type)}}}function Qr(t){let e=t??{},n=typeof e.rarity_tier=="string"?e.rarity_tier:void 0;return {entryId:h(e.entry_id),...n===void 0?{}:{rarityTier:n},rollNumber:S(e.roll_number),wasReplacement:e.was_replacement===true,grants:Array.isArray(e.grants)?e.grants.map(_e):[]}}function Zr(t){let e=t??{},n=typeof e.etag=="string"?e.etag:void 0,r=Array.isArray(e.loot_results)?e.loot_results.map(Qr):void 0;return {orderId:h(e.order_id),status:h(e.status),...n===void 0?{}:{etag:n},granted:Array.isArray(e.granted)?e.granted.map(_e):[],consumed:Array.isArray(e.consumed)?e.consumed.map(_e):[],autoClaimedRewards:Array.isArray(e.auto_claimed_rewards)?e.auto_claimed_rewards.map(_e):[],...r===void 0||r.length===0?{}:{lootResults:r}}}function ei(t){let e=t??{},n=e.price??{};return {payment:"platform_currency",orderId:h(e.target_order_id)||h(e.source_order_id),status:h(e.status),purchaseId:h(e.purchase_id),sourceOrderId:h(e.source_order_id),price:{currencyId:h(n.platform_currency_id),amount:S(n.price)}}}function ni(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:h(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 wt(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 Y=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(()=>sn(this.api,this.entity.type,this.entity.id,{operations:e.map(wt),source:n.source??"play",nonce:he()},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}));return z(r)}async createMany(e,n={}){return this.write(()=>on(this.api,this.entity.type,this.entity.id,{orders:e.map(r=>({operations:r.map(wt),nonce:he()})),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 Rn(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,u=Array.isArray(a.lock_reasons)?a.lock_reasons.map(Yr):[];return {canExecute:a.can_execute===true,locked:a.locked===true||u.length>0,lockReasons:u,reasons:Array.isArray(a.reasons)?a.reasons.map(c=>zr(c)):[],...o===void 0?{}:{usesRemaining:o},...s===void 0?{}:{cooldownExpiresAt:s}}}async recipeUsageAll(){return this.cache.read(Xr,[],async()=>{let n=await wn(this.api,this.entity.type,this.entity.id,{limit:Rt})??{},r=Array.isArray(n.usages)?n.usages:[];return {usages:r.map(ni),truncated:r.length>=Rt}})}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,R=await this.write(()=>cn(this.api,this.entity.type,this.entity.id,{catalog_id:p.catalogId,recipe_id:p.targetId,game_id:this.api.gameId(),nonce:he()},{...n.ifMatch===void 0?{}:{ifMatch:n.ifMatch},...n.signal===void 0?{}:{signal:n.signal}}));return {payment:"configured",...Zr(R)}}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([On(this.api,n.signal===void 0?{}:{signal:n.signal}),ue(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(R=>R.slug);throw new T("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 T("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 u=s.platform_prices.find(p=>p.platform_currency_id===o.currency_id);if(u===void 0){let p=y=>i.currencies.find(P=>P.currency_id===y)?.slug??y,R=s.platform_prices.map(y=>`${p(y.platform_currency_id)} ${y.price}`);throw new T("no_price_in_currency",`purchase target ${JSON.stringify(e.targetId)} has no ${o.slug} price. It is priced in: ${R.length===0?"nothing":R.join(", ")}`)}let c=e.kind==="item"?e.quantity??1:1;if(!Number.isInteger(c)||c<1||c>10)throw new T("quantity_invalid","item purchase quantity must be an integer from 1 through 10");let m=await this.write(()=>Ln(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:u.price*c},expected_config_version:r.config_version,nonce:he(),confirmation:"none"},n.signal===void 0?{}:{signal:n.signal}));return ei(m)}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(()=>nn(this.api,this.entity.type,this.entity.id,e,{amount:n,game_id:this.api.gameId()},r===void 0?{}:{signal:r}));return z(i)}async maxProgression(e,n,r){let i=await this.write(()=>Vn(this.api,this.entity.type,this.entity.id,e,{value:n,game_id:this.api.gameId()},r===void 0?{}:{signal:r}));return z(i)}async claimProgression(e,n){let r=await this.write(()=>rn(this.api,this.entity.type,this.entity.id,e,{game_id:this.api.gameId()},n===void 0?{}:{signal:n}));return z(r)}async resetProgression(e,n){let r=await this.write(()=>Yn(this.api,this.entity.type,this.entity.id,e,{game_id:this.api.gameId()},n===void 0?{}:{signal:n}));return z(r)}async write(e){return this.cache.invalidate(),e()}};var Be=t=>typeof t=="string"?t:"",ti=t=>typeof t=="number"?t:0;function vt(t){let e=t??{};return {orderId:Be(e.order_id),status:Be(e.status),source:Be(e.source),createdAt:ti(e.created_at)}}var X=class{constructor(e,n){this.api=e;this.entity=n;}api;entity;async list(e={}){let r=await $n(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(vt):[],...i===void 0?{}:{nextCursor:i}}}async get(e,n){let r=await _n(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return vt(r)}};var xt=t=>typeof t=="number"?t:0,ri=t=>typeof t=="string"?t:"";function ii(t){let e=t??{};return {progressionDefinitionId:ri(e.progression_definition_id),currentValue:xt(e.current_value),completionCount:xt(e.completion_count),isCompleted:e.is_completed===true,...je(e)}}var Q=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 bn(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});return ii(a)}catch{return i??null}}};var be=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 u=s??{};this.slots.set(o,u);let c=this.generation,m=r().then(p=>(a&&this.generation===c&&(u.value=p,u.filledAt=this.clock.now()),p)).finally(()=>{u.inFlight===m&&(u.inFlight=void 0,u.filledAt===void 0&&this.slots.get(o)===u&&this.slots.delete(o));});return u.inFlight=m,m}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 ai(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 Ne(t){try{let e=ai(await t.text());return e?`Storage said: ${e}`:""}catch{return ""}}var b=class extends Error{constructor(n,r){super(r);this.reason=n;this.name="GemSaveError";}reason},oi=3e4,St="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",si=/^[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(!si.test(t)||t.startsWith("_"))throw new TypeError(`${JSON.stringify(t)} is not a usable save key: ${e}.`);return t}function kt(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 Ue(t,e){return t.aborted&&e?.aborted!==true}var li=new Set(["x-ms-blob-type"]),di=/^[ -~]+$/;function ui(t,e){if(t==null)return {};if(typeof t!="object"||Array.isArray(t))throw new b("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(!li.has(a))throw new b("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"||!di.test(i))throw new b("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 b("save_malformed",`the grant for save ${JSON.stringify(e)} named ${JSON.stringify(a)} twice.`);n[a]=i;}return n}function De(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 Ve(t){return t?.reason==="not_found"}var Z=class{constructor(e,n,r={}){this.api=e;this.entity=n;this.options=r;}api;entity;options;async put(e,n,r={}){let i;try{i=JSON.stringify(n);}catch(a){throw new b("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 b("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=kt(r.signal,a);try{let s=await zn(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 b("save_malformed",`the grant for save ${JSON.stringify(e)} named nowhere to put the bytes.`);let u=ui(s.upload_headers,e),c,m=this.options.fetch??globalThis.fetch.bind(globalThis);try{c=await m(s.upload_url,{method:"PUT",headers:{"content-type":i,...u},body:n,credentials:"omit",signal:o.signal});}catch(p){throw Ue(o.signal,r.signal)?this.timeout("upload",a):new b("upload_failed",`${St} for PUT. Underlying error: ${p}`)}if(!c.ok){let p=await Ne(c);throw new b("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 De(await pn(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 b("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=kt(n.signal,r);try{let a;try{let u=await Ie(this.api,this.entity.type,this.entity.id,k(e),{signal:i.signal});if(!u.modified)return null;a=u.body;}catch(u){if(Ve(u))return null;throw u}if(typeof a.download_url!="string")throw new b("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(u){throw Ue(i.signal,n.signal)?this.timeout("download",r):new b("download_failed",`${St} for GET. Underlying error: ${u}`)}if(!s.ok){let u=await Ne(s);throw new b("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. ":"")+u)}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 Ie(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?De(r.body):null}catch(r){if(Ve(r))return null;throw r}}async list(e={}){let n=await jn(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(De),...typeof r=="string"&&r.length>0?{nextCursor:r}:{}}}async delete(e,n){try{await dn(this.api,this.entity.type,this.entity.id,k(e),{...n===void 0?{}:{signal:n}});}catch(r){if(!Ve(r))throw r}}budget(e){return e??this.options.timeoutMs??oi}timeout(e,n){return new b("save_timeout",`the save ${e} did not finish within ${n}ms`)}rethrow(e,n,r,i,a){return e instanceof b?e:Ue(r,n)?this.timeout(i,a):e}};function ci(t){try{return Le(t)}catch{return t}}function We(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"?ci(n.value):"",...r===void 0?{}:{etag:r},updatedAt:typeof n.updated_at=="number"?n.updated_at:0}}var ee=class{constructor(e,n){this.api=e;this.entity=n;}api;entity;async list(e){let r=(await Fn(this.api,this.entity.type,this.entity.id,e===void 0?{}:{signal:e}))?.settings;return Array.isArray(r)?r.map(i=>We(i)):[]}async get(e,n={}){try{let r=await mn(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?We(r.body,r.etag):null}catch(r){if(At(r))return null;throw r}}async put(e,n,r={}){let i=await Wn(this.api,this.entity.type,this.entity.id,e,{value:ge(n)},{...r.signal===void 0?{}:{signal:r.signal},...r.ifMatch===void 0?{}:{ifMatch:r.ifMatch}});return We(i)}async delete(e,n){try{await ln(this.api,this.entity.type,this.entity.id,e,n===void 0?{}:{signal:n});}catch(r){if(!At(r))throw r}}};function At(t){return t?.reason==="not_found"}function Re(t,e,n={}){let r=new be(M,n.identity);n.onInventoryChanged&&r.onInvalidate(n.onInventoryChanged);let i=new K(t,e,r);return {settings:new ee(t,e),inventory:i,saves:new Z(t,e,n.saves??{}),currencies:new H(i,n.resolveCurrencyId),mutations:new Y(t,e,r),orders:new X(t,e),progressions:new Q(t,e,i)}}var E=t=>typeof t=="string"?t:"",$=t=>typeof t=="number"?t:0;function we(t,e){let n=e??{},r=E(n.character_id);if(r==="")throw new Error("[gem] a character response carried no character_id");return {...t(r),id:r,playerId:E(n.player_id),gameId:E(n.game_id),channel:E(n.channel)||"release",name:E(n.name),slotIndex:$(n.slot_index),isActive:n.is_active!==false,createdAt:E(n.created_at),updatedAt:E(n.updated_at)}}var ne=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=Re(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 Mn(this.api,e===void 0?{}:{signal:e}))?.characters;return Array.isArray(r)?r.map(i=>we(this.scope,i)):[]}async get(e,n){let r=await gn(this.api,e,n===void 0?{}:{signal:n});return we(this.scope,r)}async create(e){let n=await an(this.api,{name:e.name},e.signal===void 0?{}:{signal:e.signal});return we(this.scope,n)}async update(e,n,r){let i=await Kn(this.api,e,{name:n},r===void 0?{}:{signal:r});return we(this.scope,i)}async delete(e,n){await Xn(this.api,e,n===void 0?{}:{signal:n});}async slots(e){let r=await In(this.api,e===void 0?{}:{signal:e})??{};return {totalSlots:$(r?.total_slots),availableSlots:$(r?.available_slots),activeCharacterCount:$(r?.active_character_count),defaultMaxSlots:$(r?.default_max_slots),purchasedExtraSlots:$(r?.purchased_extra_slots),canPurchaseMore:r?.can_purchase_more===true}}};var Ct="[gem: use gem.text.toPlain()]",Pt=new Set,Ot;function pi(t){try{if(Pt.has(t))return;let e=globalThis.location;if(Ot??=!!e?.port&&ht(e.hostname??""),!Ot)return;Pt.add(t),console.warn(`[gem] ${t} is PlayerText, turned into a string: players see ${Ct}. Render text.toPlain(value) (text is in @indiegems/gem-web-sdk/sdk).
|
|
2
|
+
${new Error().stack}`);}catch{}}var v=class{#e;#t;constructor(e,n="player text"){this.#e=e,this.#t=n,Object.freeze(this);}toString(){return pi(this.#t),Ct}toJSON(){return this.toString()}get[Symbol.toStringTag](){return "PlayerText"}static unwrap(e){return e.#e}};function j(t,e){return new v(t,e)}var gi={toPlain(t){return v.unwrap(t)},compare(t,e,n){let r=t instanceof v?v.unwrap(t):t,i=e instanceof v?v.unwrap(e):e;if(typeof Intl>"u"||typeof Intl.Collator!="function")return r<i?-1:r>i?1:0;let a;try{a=new Intl.Collator(n);}catch{a=new Intl.Collator;}return a.compare(r,i)},equals(t,e){let n=t instanceof v?v.unwrap(t):t,r=e instanceof v?v.unwrap(e):e;return n.normalize("NFC")===r.normalize("NFC")}};var B=t=>typeof t=="string"?t:"";function ve(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:B(e.transfer_id),status:B(e.status),sourceEntityId:B(e.source_entity_id),targetEntityId:B(e.target_entity_id),...n===void 0?{}:{message:j(n,"transfer.message")},createdAt:B(e.created_at),expiresAt:B(e.expires_at),...r===void 0?{}:{resolvedAt:r}}}function mi(){return crypto.randomUUID()}var te=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 En(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:mi()},e.signal===void 0?{}:{signal:e.signal});return ve(n)}async list(e={}){let r=await Un(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(ve):[],...i===void 0?{}:{nextCursor:i}}}async get(e,n){let r=await Gn(this.api,e,n===void 0?{}:{signal:n});return ve(r)}async accept(e,n){return this.resolve(()=>en(this.api,e,n===void 0?{}:{signal:n}))}async reject(e,n){return this.resolve(()=>Jn(this.api,e,n===void 0?{}:{signal:n}))}async cancel(e,n){return this.resolve(()=>tn(this.api,e,n===void 0?{}:{signal:n}))}async resolve(e){return this.inventory.invalidate(),ve(await e())}};function A(t){return typeof t=="string"&&t!==""?t:void 0}var It=new Set(["localhost","127.0.0.1","[::1]"]);function L(t){return yi(t)}function yi(t){let e=A(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:"&&It.has(n.hostname)))return e}var fi=/^[\da-f]{8}(-[\da-f]{4}){3}-[\da-f]{12}$/i,hi=/^[a-z][a-z0-9_]{0,31}$/;function _i(t){if(!Array.isArray(t))return;let e=[],n=new Set;for(let r of t.slice(0,8)){let i=r??{},a=A(i.family),o=A(i.avatar_3d_id),s=L(i.model_url),u=L(i.icon_url);a===void 0||!hi.test(a)||n.has(a)||o===void 0||!fi.test(o)||s===void 0||u===void 0||(n.add(a),e.push({family:a,id:o,modelUrl:s,iconUrl:u}));}return e}function bi(t){if(!Array.isArray(t))return [];let e=[];for(let n of t){let r=n??{},i=A(r.item_id),a=L(r.icon_url);i!==void 0&&a!==void 0&&e.push({itemId:i,iconUrl:a});}return e}function O(t){let e=t??{},n=A(e.player_id),r=A(e.display_name),i=A(e.discriminator),a=A(e.display_tag),o=A(e.avatar_icon_id),s=L(e.avatar_icon_url),u=A(e.avatar_3d_id),c=L(e.avatar_3d_model_url),m=L(e.avatar_3d_icon_url),p=_i(e.avatars_3d);return {...n===void 0?{}:{playerId:n},...r===void 0?{}:{displayName:j(r,"displayName")},...i===void 0?{}:{discriminator:i},...a===void 0?{}:{displayTag:j(a,"displayTag")},...o===void 0?{}:{avatarIconId:o},...s===void 0?{}:{avatarIconUrl:s},...u===void 0?{}:{avatar3dId:u},...c===void 0?{}:{avatar3dModelUrl:c},...m===void 0?{}:{avatar3dIconUrl:m},...p===void 0?{}:{avatars3d:p},badges:bi(e.badges)}}var Ri=new Set(["https://downloads.gemarcade.com","https://cdn.gemarcade.com"]);function wi(t){if(t===void 0)return;let e=L(t);if(e===void 0)return;let n=new URL(e);return It.has(n.hostname)||Ri.has(n.origin)?e:void 0}var Gt=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;var Je=class extends f{constructor(e,n={}){super(e.reason,e.status,e.detail,e.retryAfterSeconds,e.code),this.name="FriendChallengeError";for(let[r,i]of Object.entries(n))i!==void 0&&Object.assign(this,{[r]:i});}},xe=t=>typeof t=="string"?t:void 0;function Tt(t){let e=t??{};return {...O(e),playerId:xe(e.player_id)??""}}function Et(t){let e=t.has_more===true?xe(t.next_cursor):void 0;return e===void 0?{}:{nextCursor:e}}function vi(t){let e=t??{};return {friends:Array.isArray(e.data)?e.data.map(Tt):[],...Et(e)}}var He=t=>typeof t=="number"&&Number.isFinite(t)?t:void 0;function xi(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 Lt(t){let e=t??{},n=He(e.opened_at),r=He(e.answered_at);return {id:xe(e.item_id)??"",from:Tt(e.sender),template:xe(e.template)??"",params:xi(e.params),createdAt:He(e.created_at)??0,...n===void 0?{}:{openedAt:n},...r===void 0?{}:{answeredAt:r}}}function Si(t){let e=t??{};return {challenges:Array.isArray(e.data)?e.data.map(Lt):[],...Et(e)}}function ki(t){let e=t;return e?.reason==="not_found"&&e.code==="inbox_item_not_found"}var re=class{#e;#t;#a;constructor(e,n={}){this.#e=e,this.#t=n.challenge,this.#a=n.launchedChallengeId;}async list(e={}){let n=await Nn(this.#e,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}});return vi(n)}challenge(e){return this.#t===void 0?Promise.resolve({outcome:"unavailable"}):this.#t(e)}async inbox(e={}){let n=await Bn(this.#e,{...e.limit===void 0?{}:{limit:e.limit},...e.cursor===void 0?{}:{cursor:e.cursor},...e.signal===void 0?{}:{signal:e.signal}});return Si(n)}async launchedChallenge(e={}){let n=this.#a;if(n===void 0||!Gt.test(n))return null;try{return Lt(await Sn(this.#e,n,{...e.signal===void 0?{}:{signal:e.signal}}))}catch(r){if(ki(r))return null;throw r}}async markAnswered(e){if(typeof e!="string"||!Gt.test(e))throw new f("invalid",400,"id must be a FriendChallenge.id, as gem.friends.launchedChallenge() or inbox() returned it",void 0,"bad_request");await Dn(this.#e,e);}};var qt=100,$t=/^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}Z)?$/;function Ke(t){let{periodsBack:e,period:n,playerId:r}=t;if(me(e),e!==void 0&&n!==void 0)throw new TypeError("pass periodsBack or period, not both");if(n!==void 0&&(typeof n!="string"||!$t.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 jt(t){let e=typeof t.period_id=="string"?t.period_id:"";if(!$t.test(e))return;let n=qe(t.period_local_date),r=C(t.period_start_at),i=C(t.period_ends_at),a=r>0&&i>0;return {id:e,...n===void 0?{}:{localDate:n},...a?{startAt:r,endsAt:i}:{},opensAt:C(t.opens_at),closesAt:C(t.closes_at),final:t.final===true}}var ie=t=>typeof t=="string"?t:"",N=t=>typeof t=="number"?t:0,ae=t=>typeof t=="string"?t:void 0,Ai=t=>typeof t=="number"?t:void 0,Bt={player:"players",character:"characters"};function Pi(t,e){let n=t??{},r=ae(n.entity_id),i=typeof n.entity_type=="string"&&Object.hasOwn(Bt,n.entity_type)?n.entity_type:void 0,a=Nt(n.stats),o=n.properties!==null&&typeof n.properties=="object"?n.properties:void 0,s=e?n.is_viewer===true:void 0;return {...O(n),rank:N(n.rank),occurredAt:N(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 Mt(t,e){let n=t??{},r=ae(n.bucket_1),i=ae(n.bucket_2),a=Ai(n.update_frequency_seconds),o=jt(n);return {leaderboardType:ie(n.leaderboard_type),runType:ie(n.run_type),...r===void 0?{}:{bucket1:r},...i===void 0?{}:{bucket2:i},entries:Array.isArray(n.entries)?n.entries.map(s=>Pi(s,e)):[],generatedAt:N(n.generated_at),...a===void 0?{}:{updateFrequencySeconds:a},...o===void 0?{}:{period:o}}}function Ft(t){if(t===null||typeof t!="object"||Array.isArray(t))return;let e=t;if(!Number.isFinite(e.rank))return;let n=Nt(e.stats),r=e.properties!==null&&typeof e.properties=="object"?e.properties:void 0;return {rank:e.rank,occurredAt:N(e.occurred_at),...n===void 0?{}:{stats:n},...r===void 0?{}:{properties:r}}}function Nt(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 Oi(t,e,n){let r=t??{},i=ae(r.bucket_1),a=ae(r.bucket_2),o=jt(r);return {leaderboardType:ie(r.leaderboard_type),runType:ie(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(Ft).filter(s=>s!==void 0):[],personalBest:Ft(r.personal_best)??null,totalRuns:N(r.total_runs),totalRunsExact:r.total_runs_exact!==false,generatedAt:N(r.generated_at),...o===void 0?{}:{period:o}}}var oe=class{#e;constructor(e){this.#e=e;}async get(e,n={}){let r=Ke(n),i=await kn(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 Mt(i,false)}async friends(e,n={}){let r=Ke(n),i=await vn(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 Mt(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:u}=i;if(!Number.isInteger(u)||u<1||u>qt)throw new TypeError(`limit must be an integer between 1 and ${qt}, got ${String(u)}`)}let a=Ke(i),o=await hn(this.#e,e,Bt[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"&&ie((o??{}).entity_id)||r;return Oi(o,n,s)}};var Se=t=>typeof t=="string"?t:void 0;function Ci(t){let e=t??{},n=Se(e.currency_id);if(n===void 0||n==="")return;let r=typeof e.balance=="number"&&Number.isFinite(e.balance)?e.balance:0;return {slug:Se(e.slug)??"",currencyId:n,balance:r,access:e.access==="spend"?"spend":"read"}}var ke=class{#e;constructor(e){this.#e=e;}async get(e={}){let r=(await ue(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}},ze=t=>typeof t=="number"&&Number.isFinite(t)&&t>=0?Math.floor(t):0;function Ii(t){let e=t??{},n=Se(e.currency_id);if(n===void 0||n==="")return;let r=ze(e.limit),i=Math.min(ze(e.earned),r),a=Math.min(ze(e.remaining),r-i),o=e.period_days,s=typeof o=="number"&&Number.isInteger(o)&&o>=1?o:1,u=e.resets_at,c=typeof u=="number"&&Number.isFinite(u)&&u>0?Math.round(u*1e3):void 0;return {currencySlug:Se(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 Ae=class{#e;#t;#a;constructor(e,n,r){this.#e=e,this.#t=n,this.#a=r;}async get(e={}){let r=(await An(this.#e,e))?.currencies;if(!Array.isArray(r))return [];let i=[];for(let a of r){let o=Ii(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)??(()=>{})}},se=class{currencies;earnAllowance;constructor(e,n,r){this.currencies=new ke(e),this.earnAllowance=new Ae(e,n,r);}};var Ye=t=>typeof t=="string"?t:"",Ut=t=>typeof t=="number"?t:0;function Gi(t){let e=t??{};return {key:Ye(e.key),visibility:Ye(e.visibility),value:e.value,updatedAt:Ut(e.updated_at)}}function Ti(t){let e=t??{};return {...O(e),playerId:Ye(e.player_id),showcase:Array.isArray(e.showcase)?e.showcase.map(Gi):[],generatedAt:Ut(e.generated_at)}}function Ei(t){return t?.reason==="not_found"}var le=class{#e;constructor(e){this.#e=e;}async of(e,n={}){try{return Ti(await Pn(this.#e,e,{...n.signal===void 0?{}:{signal:n.signal}}))}catch(r){if(Ei(r))return null;throw r}}};var Pe=t=>typeof t=="string"?t:"",Xe=t=>typeof t=="number"?t:0;function Dt(t){let e=t??{};return {playerId:Pe(e.player_id),key:Pe(e.key),value:e.value,updatedAt:Xe(e.updated_at)}}function Li(t){let e=t??{};return {...O(e),playerId:Pe(e.player_id),value:e.value,isViewer:e.is_viewer===true,updatedAt:Xe(e.updated_at)}}function qi(t){return t?.reason==="not_found"}var de=class{constructor(e,n){this.api=e;this.selfPlayerId=n;}api;selfPlayerId;async friends(e,n={}){let i=await xn(this.api,k(e),{...n.signal===void 0?{}:{signal:n.signal}})??{};return {key:Pe(i.key),entries:Array.isArray(i.entries)?i.entries.map(Li):[],generatedAt:Xe(i.generated_at)}}async of(e,n,r={}){try{return Dt(await Cn(this.api,e,k(n),{...r.signal===void 0?{}:{signal:r.signal}}))}catch(i){if(qi(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 Dt(await Hn(this.api,i,e,{value:n},{...r.signal===void 0?{}:{signal:r.signal}}))}async clear(e,n={}){let r=await this.selfPlayerId();await un(this.api,r,k(e),{...n.signal===void 0?{}:{signal:n.signal}});}};var Mi="https://function.gem.invalid",Vt={token:"function",expiresAt:Number.POSITIVE_INFINITY,chainEndsAt:Number.POSITIVE_INFINITY},Fi="createGem() from @indiegems/gem-web-sdk/function only runs inside a serverless function; in a browser import @indiegems/gem-web-sdk/sdk",Oe="gem.me is unavailable: this function was invoked by a game server, not a player",$i="gem.functions is unavailable inside a serverless function",ji="gem.gameConfig is unavailable inside a serverless function",Bi="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 Ni(t){let e=new Set(q);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 _(Bi)}return t.request(r)}}}function Wt(t,e,n){Object.defineProperty(t,e,{get(){throw new Error(n)},enumerable:false});}function Ui(t){let e=globalThis.__gemFunctionHost;if(e===void 0)throw new Error(Fi);let n=e.context(),r=new pe({clock:M,request:()=>Promise.resolve(Vt)});r.accept(Vt);let i=Ni(dt({baseUrl:Mi,tokenSource:r,defaultQuery:{game_id:n.gameId,channel:n.channel}})),a=new V({transport:i,clock:M,maxRetries:0}),o={client:a,gameId:()=>n.gameId},s=n.caller.type==="player"?n.caller.playerId:null,u=s===null?null:{playerId:s,gameId:n.gameId,channel:n.channel},c=s===null?null:{type:"players",id:s},m=c===null?null:Re(o,c),p=c===null||m===null?null:new te(o,c,m.inventory),R=Ce=>console.info(Ce),y=new U({client:()=>a,clock:M,gameId:()=>n.gameId,playerId:()=>s,environment:{sdk_version:Ze()},log:R}),P={context:n,identity:u,awaitIdentity:()=>u===null?Promise.reject(new Error(Oe)):Promise.resolve(u),awaitBridge:()=>Promise.resolve("connected"),client:a,get me(){if(m===null)throw new Error(Oe);return m},characters:new ne(o),get transfers(){if(p===null)throw new Error(Oe);return p},analytics:y,leaderboards:new oe(o),challenges:new W(o),showcase:new de(o,()=>s===null?Promise.reject(new Error(Oe)):Promise.resolve(s)),friends:new re(o),platform:new se(o,void 0,R),profiles:new le(o)};return Wt(P,"functions",$i),Wt(P,"gameConfig",ji),P}var Di=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]]),Qe=class extends f{constructor(e,n){super(e.reason,e.status,e.detail,e.retryAfterSeconds,e.code),this.name="GemFunctionError",Object.assign(this,n);}get retryable(){return (this.code===void 0?void 0:Di.get(this.code))??super.retryable}};
|
|
3
|
+
export{U as AnalyticsApi,w as AuthError,q as CONDITIONAL_HEADERS,W as ChallengesApi,ne as CharactersApi,H as CurrenciesApi,Je as FriendChallengeError,re as FriendsApi,f as GemApiError,V as GemClient,Qe as GemFunctionError,b as GemSaveError,K as InventoryApi,oe as LeaderboardsApi,ut as MAX_PERIODS_BACK,Y as MutationsApi,X as OrdersApi,se as PlatformApi,ke as PlatformCurrenciesApi,Ae as PlatformEarnAllowanceApi,v as PlayerText,le as ProfilesApi,Q as ProgressionsApi,Z as SavesApi,ee as SettingsApi,de as ShowcaseApi,te as TransfersApi,_ as TransportRefusal,j as asPlayerText,Ui as createGem,O as mapIdentity,wi as platformIconUrl,gi as text,ge as toBase64};//# sourceMappingURL=gem-web-sdk.function.js.map
|
|
4
4
|
//# sourceMappingURL=gem-web-sdk.function.js.map
|