PageSourceSearch

https://app.sailmate.com/assets/smApi-CdGhpTVI.js

js sailmate.com collected 2026-10-01 23:56:49 UTC 17,244 bytes, 3 lines download raw bytes

1var p={idToken:"cognito.idToken",accessToken:"cognito.accessToken",refreshToken:"cognito.refreshToken"},R="cognito.username",z="VITE_COGNITO_USER_POOL_CLIENT_ID",O="VITE_COGNITO_USER_POOL_ID",m=class extends Error{code;statusCode;constructor(t,e,n){super(t),this.name=e,this.code=e,this.statusCode=n}get isUserNotFound(){return this.code==="UserNotFoundException"||this.name==="UserNotFoundException"}},L=class{value;constructor(t){this.value=t}toString(){return this.value}},I=null;function x(t){const e={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1,VITE_API_URL:"https://sailmate-y76ds.ondigitalocean.app",VITE_APP_ENV:"production",VITE_CDN_URL:"https://cdn.sailmate.fi",VITE_COGNITO_REGION:"eu-west-1",VITE_COGNITO_USER_POOL_CLIENT_ID:"67tfvk2a8gg2d619s5bsomm9l0",VITE_COGNITO_USER_POOL_ID:"eu-west-1_FUKgjk8iV",VITE_GA_MEASUREMENT_ID:"G-2Y168S4X56",VITE_MOTD_VERSION:"2",VITE_REVENUECAT_PUBLIC_KEY:"strp_VkMzgXtbrkXtFaTRwfaegYmlkYk",VITE_S57_PMTILES_URL:"pmtiles://https://cdn.sailmate.fi/pmtiles/2/fin260617.pmtiles",VITE_S57_PMTILES_URL_EST:"pmtiles://https://cdn.sailmate.fi/pmtiles/2/est260617.pmtiles",VITE_SM_API_URL:"https://api.sailmate.fi",VITE_SM_EST_DISABLED:"false",VITE_SM_EST_PRICE:"12.99",VITE_SM_PREMIUM_PRICE:"24.99",VITE_SM_RC_EST_ENTITLEMENT_ID:"estonian_charts",VITE_SM_SCOUT_PRICE:"19.99",VITE_SM_STRIPE_EST_PRICE_ID:"price_1Tc50xHwD4KWd0BN2kBIJxdW",VITE_SM_STRIPE_PREMIUM_PRICE_ID:"price_1TIrPIHwD4KWd0BNM60uc1Tl",VITE_SM_STRIPE_SCOUT_PRICE_ID:"price_1Mc602HwD4KWd0BNgpFfoBZz",VITE_SPRITE_VERSION:"6",VITE_SPV_VOTING_ENABLED:"true",VITE_STRIPE_BILLING_URL:"https://billing.stripe.com/p/login/7sIeWv4GZ1JUa8o8ww"}[t];if(!e||typeof e!="string")throw new Error(`Missing required env var: ${t}`);return e}function S(){return x(z)}function q(){const t=x(O).split("_")[0];if(!t)throw new Error(`Invalid ${O} format`);return t}function G(){return`https://cognito-idp.${q()}.amazonaws.com/`}function M(t){try{return localStorage.getItem(t)}catch{return null}}function h(t,e){try{localStorage.setItem(t,e)}catch{}}function A(t){try{localStorage.removeItem(t)}catch{}}function _(t){return M(p[t])}function J(t){h(p.idToken,t.idToken),h(p.accessToken,t.accessToken),h(p.refreshToken,t.refreshToken)}function K(t){h(p.idToken,t.idToken),h(p.accessToken,t.accessToken)}function F(t){if(!t)return;const e=t.split(".");if(!(e.length<2))try{const n=JSON.parse(atob(e[1]));return n&&typeof n=="object"?n:void 0}catch{return}}function H(t){const e=F(t);return typeof e?.sub=="string"?e.sub:void 0}function W(t){const e=F(t)?.exp;return typeof e=="number"&&Number.isFinite(e)?e*1e3:void 0}function Y(t=6e4){const e=W(_("accessToken"));return e?e>Date.now()+t:!1}function X(t){if(!(t instanceof m))return!1;switch(t.code){case"NotAuthorizedException":case"UserNotFoundException":case"InvalidParameterException":case"ResourceNotFoundException":return!0;default:return!1}}async function y(t,e){const n=await fetch(G(),{method:"POST",headers:{"Content-Type":"application/x-amz-json-1.1","X-Amz-Target":`AWSCognitoIdentityProviderService.${t}`},body:JSON.stringify(e)}),s=await n.json().catch(()=>({}));if(!n.ok){const o=typeof s.__type=="string"?s.__type:"",r=o.split("#").pop()||o||"CognitoError",i=typeof s.message=="string"&&s.message||typeof s.Message=="string"&&s.Message||`${t} failed`;throw new m(i,r,n.status)}return s}function U(t){return t.trim().toLowerCase()}function V(){A(p.idToken),A(p.accessToken),A(p.refreshToken),A(R)}function v(){return M(R)}async function at(){const t=_("accessToken"),e=_("idToken");return t?{tokens:{accessToken:new L(t),idToken:e?new L(e):void 0}}:{}}function Z(){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZ",e="abcdefghijklmnopqrstuvwxyz",n="0123456789",s="!@#$%^&*",o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*",r=u=>u[Math.floor(Math.random()*u.length)];let i=[r(t),r(e),r(n),r(s)].join("");for(;i.length<20;)i+=r(o);return i}async function ut(t,e){const n=U(t);await y("SignUp",{ClientId:S(),Username:n,Password:e??Z()})}async function ct(t){const e=U(t);I=(await y("InitiateAuth",{AuthFlow:"CUSTOM_AUTH",ClientId:S(),AuthParameters:{USERNAME:e}})).Session??null,h(R,e)}async function lt(t){const e=v();
1if(!e)throw new m("Missing login user","InvalidStateException");if(!I)throw new m("Missing challenge session","InvalidStateException");const n=(await y("RespondToAuthChallenge",{ChallengeName:"CUSTOM_CHALLENGE",ClientId:S(),Session:I,ChallengeResponses:{USERNAME:e,ANSWER:t}})).AuthenticationResult;if(!n?.IdToken||!n.AccessToken||!n.RefreshToken)throw new m("Authentication incomplete","NotAuthorizedException");J({idToken:n.IdToken,accessToken:n.AccessToken,refreshToken:n.RefreshToken}),I=null}async function ft(t){if(!t?.force&&Y())return!0;const e=_("refreshToken");if(!e)return!1;try{const n=(await y("InitiateAuth",{AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:S(),AuthParameters:{REFRESH_TOKEN:e}})).AuthenticationResult;return!n?.IdToken||!n.AccessToken?!1:(K({idToken:n.IdToken,accessToken:n.AccessToken}),!0)}catch(n){return X(n)&&V(),!1}}async function pt(){const t=_("refreshToken");t&&await y("RevokeToken",{ClientId:S(),Token:t}).catch(()=>{}),V(),I=null}async function dt(){const t=_("accessToken"),e=_("idToken"),n=v();if(!t||!n)throw new m("Not signed in","NotAuthorizedException");return{username:n,userId:H(e),signInDetails:{loginId:n}}}async function _t(){const t=_("accessToken");if(!t)throw new m("Not signed in","NotAuthorizedException");const e=await y("GetUser",{AccessToken:t}),n={};for(const s of e.UserAttributes??[])!s?.Name||typeof s.Value!="string"||(n[s.Name]=s.Value);if(!v()){const s=U(n.email||e.Username||"");s&&h(R,s)}return n}var w="https://api.sailmate.fi",f=class extends Error{status;constructor(t,e){super(t),this.name="SmApiError",this.status=e}};function j(){return w}async function a(t,e,n){const s=new URL(t,j()),o=await fetch(s.toString(),{...n,headers:{Authorization:`Bearer ${e}`,...n?.headers??{}}});if(!o.ok){const r=await o.text().catch(()=>"");throw console.error("SM API request failed",{path:t,status:o.status,statusText:o.statusText,body:r}),new f(`SM API request failed: ${o.status}`,o.status)}if(o.status!==204)return await o.json()}function Q(t){if(!t||typeof t!="object")return null;const e=t,n=e.type??e.Type??e.rating_type??e.ratingType??e.kind;if(n==null||n==="")return null;const s=String(n).trim(),o=e.score??e.Score,r=typeof o=="number"&&Number.isFinite(o)?o:Number(o);if(!Number.isFinite(r))return null;const i=e.comment??e.Comment;return{type:s,score:r,comment:i==null||i===""?null:String(i)}}function $(t){if(!Array.isArray(t))return[];const e=[];for(const n of t){const s=Q(n);s&&e.push(s)}return e}function D(t){if(!t||typeof t!="object")return{point_of_interest_id:"",all_ratings:[],user_ratings:[]};const e=t;return{point_of_interest_id:typeof e.point_of_interest_id=="string"?e.point_of_interest_id:e.pointOfInterestId!=null?String(e.pointOfInterestId):"",all_ratings:$(e.all_ratings),user_ratings:$(e.user_ratings)}}async function mt(t,e){return D(await a(`/point_of_interests/${encodeURIComponent(e)}/ratings`,t,{method:"GET"}))}async function ht(t,e,n){return D(await a(`/point_of_interests/${encodeURIComponent(e)}/ratings`,t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)}))}async function Tt(t){const e=new URL("/profile",w),n=await fetch(e.toString(),{headers:{Authorization:`Bearer ${t}`}});if(!n.ok){const s=await n.text().catch(()=>"");throw console.error("Profile request failed",{status:n.status,statusText:n.statusText,body:s}),new f(`Profile request failed: ${n.status}`,n.status)}return await n.json()}function tt(t=16){const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n=new Uint32Array(t);return crypto.getRandomValues(n),Array.from(n,s=>e[s%62]).join("")}async function gt(t){const e=t.password??tt(16),n=new URL("/users.json",w),s=await fetch(n.toString(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({user:{email:t.email,password:e,password_confirmation:e,first_name:t.first_name,last_name:t.last_name}})});if(!s.ok){const o=await s.text().catch(()=>"");throw console.error("Signup request failed",{status:s.status,statusText:s.statusText,body:o}),new f(`Signup request failed: ${s.status}`,s.status)}return await s.json()}async function yt(t,e){const n=new URL("/link_user",w),s=await fetch(n.toString(),{method:"POST",headers:{Authorization:`Bearer ${t}`,"x-api-key":e,"Content-Type":"application/json"},body:JSON.stringify({})});if(!s.ok){const o=await s.text().catch(()=>"");throw console.error("Link request failed",{status:s.status,statusText:s.statusText,body:o}),new f(`Link request failed: ${s.status}`,s.status)}}async function wt(t,e){await a(`/users/${e}`,t,{method:"DELETE"})}async function Et(t,e="ports"){const n=new URL("/v3/point_of_interests",w);n.searchParams.set("filter",e);const s={};t&&(s.Authorization=`Bearer ${t}`);const o=await fetch(n.toString(),{headers:s});if(!o.ok){const i=await o.text().catch(()=>"");throw console.error("Point of interests request failed",{status:o.status,statusText:o.statusText,body:i}),new Error(`Point of interests request failed: ${o.status}`)}const r=await o.json();return Array.isArray(r)?r:[]}async function It(){try{const t=new URL("/navigational_warnings",w),e=await fetch(t.toString());if(!e.ok)throw new Error(`Navigational warnings request failed: HTTP ${e.status}`);const n=await e.json();return!n||!Array.isArray(n.features)?{type:"FeatureCollection",features:[]}:{type:"FeatureCollection",features:n.features}}catch(t){return console.error("Failed to fetch navigational warnings",t),{type:"FeatureCollection",features:[]}}}async function St(t,e){return(await a(`/users/${e}/routes`,t)).map(n=>{const s=n.id,o=Number(s);return{...n,id:s==null?void 0:Number.isFinite(o)?o:void 0}})}async function bt(t,e,n){const s=await a(`/users/${e}/routes/${n}`,t),o=s.id,r=Number(o);return{...s,id:o==null?void 0:Number.isFinite(r)?r:void 0}}async function At(t,e,n){const s=await a(`/users/${e}/routes`,t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)}),o=s.id,r=Number(o);return{...s,id:o==null?void 0:Number.isFinite(r)?r:void 0}}async function Rt(t,e,n,s){const o=await a(`/users/${e}/routes/${n}`,t,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}
1),r=o.id,i=Number(r);return{...o,id:r==null?void 0:Number.isFinite(i)?i:void 0}}async function Nt(t,e,n){await a(`/users/${e}/routes/${n}`,t,{method:"DELETE"})}function N(t){if(!t||typeof t!="object")throw new f("Invalid point of interest response",500);const e=t;if(e.point_of_interest&&typeof e.point_of_interest=="object")return N(e.point_of_interest);const n=Number(e.lat),s=Number(e.lon);if(!Number.isFinite(n)||!Number.isFinite(s))throw new f("Invalid point of interest coordinates",500);const o=e.images,r=Array.isArray(o)?o.map(i=>{if(!i||typeof i!="object")return null;const u=i,b=Number(u.id),T=Number(u.position),g=u.variants;if(!Number.isFinite(b)||!Number.isFinite(T)||!g||typeof g!="object")return null;const l=g,c=typeof l.thumbnail=="string"?l.thumbnail:"",E=typeof l.public=="string"?l.public:typeof l.publicUrl=="string"?l.publicUrl:"";return!c&&!E?null:{id:b,position:T,variants:{thumbnail:c,public:E}}}).filter(i=>i!==null):void 0;return{id:e.id,name:typeof e.name=="string"?e.name:"",lat:n,lon:s,poi_type:typeof e.poi_type=="string"?e.poi_type:void 0,is_scout_port:typeof e.is_scout_port=="boolean"?e.is_scout_port:void 0,is_official:typeof e.is_official=="boolean"?e.is_official:void 0,is_spv:typeof e.is_spv=="boolean"?e.is_spv:void 0,description:typeof e.description=="string"?e.description:e.description===null?null:void 0,category:typeof e.category=="string"?e.category:e.category===null?null:void 0,images:r,created_at:typeof e.created_at=="string"?e.created_at:void 0,updated_at:typeof e.updated_at=="string"?e.updated_at:void 0}}function B(t){return{name:t.name,lat:t.lat,lon:t.lon,poi_type:t.poi_type??"PRIVATE",is_scout_port:t.is_scout_port??!1,is_official:t.is_official??!1,is_spv:t.is_spv??!1,description:t.description??null,category:t.category??"FAVORITE"}}async function Ut(t,e){const n=await a(`/v3/users/${e}/point_of_interests`,t);return Array.isArray(n)?n.map(s=>N(s)):[]}async function vt(t,e,n){return N(await a(`/v3/users/${e}/point_of_interests`,t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(B(n))}))}async function kt(t,e,n,s){return N(await a(`/v3/users/${e}/point_of_interests/${n}`,t,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({...B(s),id:n})}))}async function Pt(t,e,n){await a(`/v3/users/${e}/point_of_interests/${n}`,t,{method:"DELETE"})}async function et(t,e,n){const s=await a(`/v3/users/${e}/point_of_interests/${n}/images/upload_url`,t,{method:"POST"});if(!s?.upload_url||!s?.image_id)throw new f("Invalid image upload URL response",500);return s}function nt(t){if(!t||typeof t!="object")throw new f("Invalid image response",500);const e=t,n=Number(e.id),s=Number(e.position??0),o=e.variants;if(!Number.isFinite(n)||!o||typeof o!="object")throw new f("Invalid image response",500);const r=o;return{id:n,position:Number.isFinite(s)?s:0,variants:{thumbnail:typeof r.thumbnail=="string"?r.thumbnail:"",public:typeof r.public=="string"?r.public:typeof r.publicUrl=="string"?r.publicUrl:""}}}async function st(t,e,n,s){return nt(await a(`/v3/users/${e}/point_of_interests/${n}/images`,t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cloudflare_image_id:s})}))}async function Ct(t,e,n,s){await a(`/v3/users/${e}/point_of_interests/${n}/images/${s}`,t,{method:"DELETE"})}async function Ot(t,e,n,s){const{upload_url:o,image_id:r}=await et(t,e,n),i=new FormData;i.append("file",s,s.name||"photo.jpg");const u=await fetch(o,{method:"POST",body:i});if(!u.ok&&u.status!==409)throw new f(`Cloudflare image upload failed: ${u.status}`,u.status);return st(t,e,n,r)}function ot(t){const e=(t.waypoints??[]).slice().sort((n,s)=>n.order_id-s.order_id).map(n=>[n.longitude,n.latitude]).filter(([n,s])=>Number.isFinite(n)&&Number.isFinite(s)&&Math.abs(s)<=90&&Math.abs(n)<=180);return e.length<2?null:{type:"Feature",geometry:{type:"LineString",coordinates:e},properties:{id:t.id,name:t.name,length:t.length,created_at:t.created_at,updated_at:t.updated_at,waypoint_count:t.waypoints?.length??0}}}function rt(t){if(typeof t=="object"&&t!==null&&"type"in t&&t.type==="FeatureCollection"&&"features"in t&&Array.isArray(t.features))return{type:"FeatureCollection",features:t.features.flatMap(n=>{const s=n?.geometry;return s?s.type==="LineString"&&Array.isArray(s.coordinates)&&s.coordinates.length>=2?[n]:s.type==="MultiLineString"&&Array.isArray(s.coordinates)?s.coordinates.filter(o=>Array.isArray(o)&&o.length>=2).map(o=>({type:"Feature",geometry:{type:"LineString",coordinates:o},properties:n.properties??{}})):[]:[]})};let e=t;if(typeof t=="object"&&t!==null&&!Array.isArray(t)){const n=t;Array.isArray(n.routes)?e=n.routes:Array.isArray(n.data)?e=n.data:Array.isArray(n.items)&&(e=n.items)}return Array.isArray(e)?{type:"FeatureCollection",features:e.map(n=>ot(n)).filter(n=>!!n)}:(console.warn("Scout routes response is not an array",t),{type:"FeatureCollection",features:[]})}async function Lt(t){const e=new URL("/routes",j());e.searchParams.set("scout_routes","true");const n=await fetch(e.toString(),{headers:{Authorization:`Bearer ${t}`}});if(!n.ok){const s=await n.text().catch(()=>"");throw console.error("Scout routes request failed",{status:n.status,statusText:n.statusText,body:s}),new f(`Scout routes request failed: ${n.status}`,n.status)}return rt(await n.json())}async function $t(t,e){return a(`/users/${e}/subscriptions`,t)}var it="https://app-tiles-api-1074576217688.europe-north1.run.app";function d(t){if(typeof t=="number")return Number.isFinite(t)?t:null;if(typeof t=="string"){const e=Number(t);return Number.isFinite(e)?e:null}return null}async function xt({mcc:t="244",mnc:e,tech:n,zoom:s,northwest:o,southeast:r,signal:i}){const u=Math.max(0,Math.round(s)),b=`${it}/api/appTiles/getTiles/${encodeURIComponent(t)}/${encodeURIComponent(e)}/${encodeURIComponent(String(o.lat))}/${encodeURIComponent(String(o.lng))}/${encodeURIComponent(String(r.lat))}/${encodeURIComponent(String(r.lng))}/${encodeURIComponent(String(u))}/${encodeURIComponent(n)}`,T=await fetch(b,{method:"GET",signal:i});if(!T.ok)throw new Error(`Tile API request failed: ${T.status}`);const g=await T.json();return Array.isArray(g)?g.map(l=>{if(!l||typeof l!="object")return null;const c=l,E=d(c.northwest_latitude),k=d(c.northwest_longitude),P=d(c.southeast_latitude),C=d(c.southeast_longitude);return E===null||k===null||P===null||C===null?null:{tile_id:c.tile_id,id:c.id,northwest_latitude:E,northwest_longitude:k,southeast_latitude:P,southeast_longitude:C,download:d(c.download),upload:d(c.upload),latency:d(c.latency),rsrp:d(c.rsrp)}}).filter(l=>l!==null):[]}export{ft as A,Ot as C,dt as D,_t as E,pt as M,ut as N,ct as O,Rt as S,at as T,St as _,wt as a,ht as b,Nt as c,mt as d,Et as f,bt as g,Ut as h,At as i,lt as j,U as k,It as l,Lt as m,gt as n,Ct as o,Tt as p,vt as r,Pt as s,f as t,xt as u,$t as v,m as w,kt as x,yt as y};
2
3//# sourceMappingURL=smApi-CdGhpTVI.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.