UNPKG

@arcgis/core

Version:

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

3 lines (2 loc) • 7.75 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */ import e from"../../../../request.js";import"../../../../core/has.js";import s from"../../../../core/Logger.js";import{throwIfAborted as t,after as r,throwIfAbortError as o}from"../../../../core/promiseUtils.js";import{Milliseconds as n}from"../../../../core/time.js";import{join as a,parseData as i}from"../../../../core/urlUtils.js";import{generateBracedUUID as c}from"../../../../core/uuid.js";import{projectAsync as u}from"../../../../geometry/projectionUtils.js";import l from"../../../../geometry/SpatialReference.js";import{externalIsOnService as p,externalSourceToMultiPart as m,assetFormatId as f,ServiceAsset as g,ServiceAssetPart as d}from"../../../../geometry/support/meshUtils/External.js";import{UnsupportedError as y,NoSupportedSourceError as h,NoGlbSupportError as w,Convert3DFailedError as P,UnsupportedFormatUploadedError as j,BadResponseError as b,UploadFailedError as T,NotBase64Error as v,UnableToPrepareOptionsError as x}from"./uploadAssetErrors.js";import{uploadProgressWeights as A}from"./uploadProgressWeights.js";import{uploadItem as S}from"./uploads.js";import{getPrjFormatId as F,getWorldFileFormatId as U,getGlbFormatId as R,getMimeTypeFormatId as D,getFormatIdMimeType as N}from"../../../support/infoFor3D.js";import{getMeshTransformForMetersToSpatialReference as E}from"../../../support/meshSpatialReferenceScaleUtils.js";import{extractMeshFeatureTransform as C,extractMeshFeatureOrigin as O}from"../../../../rest/support/meshFeatureAttributes.js";import{makeProgressManager as k,estimatedConversionTime as I,simulateProgress as B}from"../../../../support/progressUtils.js";async function q(e,s,t){const r=e.length;if(!r)return t?.onProgress?.(1),[];const o=k(r,t?.onProgress,"uploadAssets");return Promise.all(e.map((e,r)=>L(e,s,{...t,onProgress:o.makeOnProgress(r)})))}async function L(e,{layer:s,ongoingUploads:t},r){const o=t.get(e);if(o)return o;if(!ae(s))throw new y;if(H(e,s))return r?.onProgress?.(1),{mesh:e};const n=$(e,s,r);t.set(e,n);try{return await n}finally{t.delete(e)}}function H(e,s){const{parsedUrl:t}=s;return null!=t&&e.metadata.externalSources.some(e=>p(e,t))}async function $(e,s,r){const{metadata:o}=e,{displaySource:n}=o,a=K(n?.source,s,{checkForConversionRequired:!0}),i=null!=a?J(e,a,s,r):o.externalSources.length>0?z(e,s,r):G(e,s,r),{external:c,info:u}=await i;return t(r),e.addExternalSources([c]),u}async function J(e,s,t,r){return{external:{source:{type:"service",assets:await V(s,t,r)},original:!0,unitConversionDisabled:!0},info:{mesh:e}}}async function z(e,s,t){const r=ie(s),{externalSources:o}=e.metadata,n=W(o,s);if(!n)throw new h;const a=k(A.uploadConvertibleSource,t?.onProgress,"uploadConvertibleSource"),i={type:"service",assets:await V(n,s,{onProgress:a.makeOnProgress("uploadEditSource")})};e.addExternalSources([{source:i,original:!0}]);const c=n.reduce((e,{asset:s})=>s instanceof File?e+s.size:e,0),l=a.simulate("serviceAssetsToGlb",I(c));try{const{source:o,transform:n,origin:a}=await te(i,s,r);if(e.transform=n,a&&t?.useAssetOrigin){const s=await u(a,e.spatialReference,t);e.vertexSpace.origin=[s.x,s.y,s.z??0]}return{external:{source:o,unitConversionDisabled:!0},info:{mesh:e,georeferenceInfo:a?{origin:a}:void 0}}}finally{l.remove()}}async function G(e,s,t){const r=k(A.uploadLocalMesh,t?.onProgress,"uploadLocalMesh"),o=M(e,s,{...t,onProgress:r.makeOnProgress("meshToAssetBlob")});return{external:{source:{type:"service",assets:await X([o],s,{...t,onProgress:r.makeOnProgress("uploadAssetBlobs")})},extent:e.extent.clone(),original:!0},info:{mesh:e}}}async function M(e,s,r){const o=ie(s),n=await e.load(r),a=await n.toBinaryGLTF({origin:n.origin,signal:r?.signal,ignoreLocalTransform:!0,unitConversionDisabled:!0});return t(r),{blob:new Blob([a],{type:"model/gltf-binary"}),assetName:`${c()}.glb`,assetType:o}}function W(e,s){for(const t of e){const e=K(t.source,s);if(e)return e}return null}function K(e,{infoFor3D:s},t={}){if(!e)return null;const r=m(e);if(!r)return null;const{supportedFormats:o,editFormats:n}=s,a=new Array,i=F(s),c=U(s);let u=!1;for(const l of r){const e=Q(l,o);if(!e)return null;const{assetType:s}=e;if(t.checkForConversionRequired&&(s===i||s===c))return null;n.includes(s)&&(u=!0),a.push(e)}return u?a:null}function Q(e,s){const t=f(e,s);return t?{asset:e,assetType:t}:null}async function V(e,s,t){return X(e.map(e=>Y(e,t)),s,t)}async function X(e,s,r){const o=k(A.uploadAssetBlobs,r?.onProgress,"uploadAssetBlobs"),n=await _(e,s,{...r,onProgress:o.makeOnProgress("prepareAssetItems")});t(r);const a=n.map(({item:e})=>e),{uploadResults:i}=await ee(a,s,{...r,onProgress:o.makeOnProgress("uploadAssetItems")});return t(r),e.map((e,t)=>se(n[t],i[t],s))}async function Y(e,s){const{asset:r,assetType:o}=e;if(r instanceof File)return{blob:r,assetName:r.name,assetType:o};const n=await r.toBlob(s);return t(s),{blob:n,assetName:r.assetName,assetType:o}}async function Z(e,s,r){const{blob:n,assetType:a,assetName:c}=e;let u=null;try{const e=await S({data:n,name:c},s.url,r);t(r),u={assetType:a,assetUploadId:e.itemID}}catch(l){o(l),ce().warnOnce(`Service ${s.url} does not support the REST Uploads API.`)}if(!u){const e=await i(n);if(t(r),!e.isBase64)throw new v;u={assetType:a,assetData:e.data}}if(!u)throw new x;return{item:u,assetName:c}}function _(e,s,r){const o=k(e.length,r?.onProgress,"prepareAssetItems");return Promise.all(e.map(async(e,n)=>{const a=Z(await e,s,{...r,onProgress:o.makeOnProgress(n)});return t(r),a}))}async function ee(s,r,o){const n=B(o?.onProgress);try{const n=await e(a(r.parsedUrl.path,"uploadAssets"),{timeout:0,query:{f:"json",assets:JSON.stringify(s)},method:"post",responseType:"json"});if(t(o),n.data.uploadResults.length!==s.length)throw new b(s.length,n.data.uploadResults.length);return n.data}finally{n.remove()}}function se(e,s,t){const{success:r}=s;if(!r){const{error:t}=s;throw new T(e.assetName,t)}const{assetHash:o}=s,{assetName:n,item:{assetType:a}}=e,{infoFor3D:{supportedFormats:i}}=t,c=N(a,i);if(!c)throw new j(a);return new g(n,c,[new d(`${t.parsedUrl.path}/assets/${o}`,o)])}async function te({assets:e},s,t){const r=e.map(({assetName:e,parts:s})=>({assetName:e,assetHash:s[0].partHash}));let o;try{const e=a(s.parsedUrl.path,"convert3D"),n=s.capabilities?.operations.supportsAsyncConvert3D;o=(await(n?ne:oe)(e,{query:{f:"json",assets:JSON.stringify(r),transportType:"esriTransportTypeUrl",targetFormat:t,async:n},responseType:"json",timeout:0})).data}catch(n){throw new P}return re(s,o)}function re(e,s){const t={source:{type:"service",assets:s.assets.map(s=>{const t=D(s.contentType,e.infoFor3D.supportedFormats);if(!t)throw new j(t);return new g(s.assetName,s.contentType,[new d(s.assetURL,s.assetHash)])})},origin:void 0,transform:void 0};if(s.transform){if(t.transform=C(s.transform),s.spatialReference){const e=l.fromJSON(s.spatialReference);t.origin=O(s.transform,e)}}else t.transform=E(e.spatialReference);return t}function oe(s,t){return e(s,t)}async function ne(s,t){const o=(await e(s,t)).data.statusUrl;for(;;){const s=(await e(o,{query:{f:"json"},responseType:"json"})).data;switch(s.status){case"Completed":return e(s.resultUrl,{query:{f:"json"},responseType:"json"});case"CompletedWithErrors":throw new Error(s.status);case"Failed ImportChanges":case"InProgress":case"Pending":case"ExportAttachments":case"ExportChanges":case"ExportingData":case"ExportingSnapshot":case"ImportAttachments":case"ProvisioningReplica":case"UnRegisteringReplica":break;default:throw new Error}await r(ue)}}function ae(e){return!!e.infoFor3D&&!!e.url}function ie({infoFor3D:e}){const s=R(e);if(!s)throw new w;return s}function ce(){return s.getLogger("esri.layers.graphics.sources.support.uploadAssets")}const ue=n(1e3);export{q as uploadAssets};