UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

3 lines (2 loc) 5.17 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */ import{toSymbolId as t}from"../arcade/arcadeEnvironment.js";import e from"../arcade/Dictionary.js";import{ArcadeExecutionError as s}from"../arcade/executionError.js";import{B as r,j as n,N as o}from"./languageUtils.js";import a from"../core/Error.js";import i from"../core/Logger.js";import{getOrCreateMapValue as c}from"../core/MapUtils.js";import l from"../portal/Portal.js";import{translate as u}from"../rest/translate.js";import h from"../rest/support/TranslateContent.js";import m from"../rest/support/TranslateParameters.js";import f from"../rest/support/TranslateResult.js";import{isString as p,isArray as _}from"../support/guards.js";class d{constructor(t,e){this.portal=t,this._debugLog=e}async translate(t){this.portal.loaded||await this.portal.load();const e=this.portal.helperServices?.aiUtilityServices;if(null==e)return{success:!1};const s=e.url+e.translateUtility;try{t.requestSource??="arcade";return{success:!0,results:(await u(s,t,{authMode:"no-prompt"})).map(t=>t.toJSON())}}catch(r){return null!=this._debugLog&&(r instanceof Error||r instanceof a)&&this._debugLog(`TranslateText error: ${r.message}`),i.getLogger("esri.arcade.functions.aiServices").error(r),{success:!1}}}}class g{constructor(t,e,s){this._parameters=t,this._maxTotalContentSize=e,this._maxContentsLength=s,this._requests=[],this._normalizedContents=new Map,this._contentsTotalSize=0}tryAdd(t){const e=new Set(t.filter(t=>!this._normalizedContents.has(t.text)).map(t=>t.text));if(this._requests.length+e.size>this._maxContentsLength)return null;let s=0;for(const n of e)s+=n.length;if((s+this._contentsTotalSize)*(this._parameters.to.length??1)>this._maxTotalContentSize)return null;const r=this._requests.length;for(const{key:n,text:o}of t)c(this._normalizedContents,o,()=>[]).push({batchIdx:r,key:n});return this._requests.push(t),this._contentsTotalSize+=s,r}async send(t){const e=[],s=[];let r=0;for(const[i,c]of this._normalizedContents)e.push(new h({key:String(r++),text:i})),s.push(c);const n=new m(this._parameters);n.contents=e;const o=await t.translate(n);if(!o.success)return Array.from(this._requests,()=>o);const a=Array.from(this._requests,()=>({success:!0,results:[]}));for(const i of o.results){const t=Number(i.key);for(const e of s[t])a[e.batchIdx].results.push({...i,key:e.key})}return a}}function y(t){const e=[...new Set(t.to)].sort(),s=t.from??null,r=t.portalUrl,n=t.translator,o=t.apiKey??null;return JSON.stringify([e,s,r,n,o])}async function w(t,e,s){try{return(await t.yieldFor(s))[e]}catch{return{success:!1}}}class x{constructor(t,e,{maxTotalContentSize:s=5e4,maxContentsLength:r=1e3}={}){this._executor=t,this._service=e,this._openBatches=new Map,this._maxTotalContentSize=s,this._maxContentsLength=r}create(t){return{translate:async e=>{const s=y(e),{contents:r,to:n,from:o,translator:a,portalUrl:i,apiKey:c}=e;if(null==n)return{success:!1};if(null==r||r.every(t=>0===t.text.length))return{success:!1};const l=this._openBatches.get(s);if(null!=l){const e=l.data.tryAdd(r);if(null!=e)return await w(t,e,l);l.send()}const u=new g({to:n,from:o,translator:a,portalUrl:i,apiKey:c},this._maxTotalContentSize,this._maxContentsLength),h=u.tryAdd(r);if(null!=h){const e=this._executor.openBatch(u,{open:t=>{this._openBatches.set(s,t)},execute:t=>t.send(this._service),close:t=>{this._openBatches.get(s)===t&&this._openBatches.delete(s)}});return await w(t,h,e)}return await this._service.translate(e)}}}}function S(a){"async"===a.mode&&(a.functions[t("TranslateText")]=function(t,i){return a.standardFunctionAsync(t,i,async(t,a,i)=>{if(r(i,2,3,t,a),!p(i[0])&&!_(i[0])&&!n(i[0]))throw new s(t,"InvalidParameter",a);const c=o(i[0]);if(!p(i[1])&&!_(i[1])&&!n(i[1]))throw new s(t,"InvalidParameter",a);const u=o(i[1]);let g=null;if(i.length>=3){if(!p(i[2]))throw new s(t,"InvalidParameter",a);g=i[2]}const w=c.map((t,e)=>new h({key:String(e),text:t})),x=t.services?.portal??l.getDefault(),S=new m({to:u,contents:w,from:g,portalUrl:x.restUrl.replace(/\/sharing\/rest$/,"")}),T=new Map;let v=null;if(null!=t.lrucache){const e=t.lrucache;v??=y(S),S.contents=S.contents?.filter(t=>{const s=e.getCachedTranslation(v,t.text);return null==s||(T.set(t.key,{...s,key:t.key,text:t.text}),!1)})}if(S.contents?.length){const r=t.services?.translation??new d(x,t.console),n=await r.translate(S);if(!n.success)return new e({__proto__:null,success:!1});for(const e of n.results){const r=S.contents?.find(t=>t.key===e.key)?.text;if(null==r)throw new s(null,"NeverReach",null);T.set(e.key,e),null!=t.lrucache&&(v??=y(S),t.lrucache.setCachedTranslation(v,r,{detectedLanguage:e.detectedLanguage,translation:e.translation}))}}const C=Array.from(w,r=>{const n=f.fromJSON(T.get(r.key));if(null==n)throw new s(null,"NeverReach",null);return n.text=r.text,e.convertJsonToArcade(n.toJSON(),t.timeZone??"system",!0)});return new e({__proto__:null,success:!0,results:C})})})}const T=Object.freeze(Object.defineProperty({__proto__:null,BatchTranslationServiceFactory:x,PortalTranslationService:d,getTranslateParametersKey:y,registerFunctions:S},Symbol.toStringTag,{value:"Module"}));export{T as A,x as B,d as P,y as g,S as r};