@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 19.6 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.32/esri/copyright.txt for details.
*/
import{id as e}from"../kernel.js";import t from"../request.js";import r from"../core/Error.js";import a from"../core/Logger.js";import{isAbortError as n}from"../core/promiseUtils.js";import o from"../geometry/Geometry.js";import s from"../geometry/SpatialReference.js";import{submitJob as i}from"./geoprocessor/submitJob.js";import d from"./knowledgeGraph/GraphQueryResult.js";import l from"./knowledgeGraph/GraphQueryResultHeader.js";import c from"./knowledgeGraph/GraphQueryStreamingResult.js";import p from"./knowledgeGraph/KnowledgeGraph.js";import u from"./knowledgeGraph/ServiceDefinition.js";import{encodeClientDataAtKeysRequest as h}from"./knowledgeGraph/wasmInterface/clientDataToWasmEncodedFactories.js";import{getWasmInterface as w}from"./knowledgeGraph/wasmInterface/knowledgeWasmAccess.js";import{setInputQuantizationParametersOnEncoder as f,setOutputQuantizationParametersOnEncoder as g,setProvenanceBehaviorOnEncoder as y,bindParamArrayToWasm as m,geometryToWasm as _,bindParamObjectToWasm as k}from"./knowledgeGraph/wasmInterface/queryToWasmEncodedFactories.js";import{inputQuantizationParametersToWasmFormat as v,namedObjectToWasm as b}from"./knowledgeGraph/wasmInterface/updateToWasmEncodedFactories.js";import{wasmClientDataFetchResponseToClientData as S,wasmClientDataAllKeysResponseToClientDataKeys as G}from"./knowledgeGraph/wasmInterface/wasmToClientDataFactories.js";import{wasmToDataModel as x}from"./knowledgeGraph/wasmInterface/wasmToDataModelFactories.js";import{wasmToGraphQueryResponseHeader as T,decodedWasmObjToQueryResponseObj as A}from"./knowledgeGraph/wasmInterface/wasmToQueryResponseObjFactories.js";import{decoderToApplyEditsResponse as D}from"./knowledgeGraph/wasmInterface/wasmToUpdateResponseFactories.js";import{checkWasmError as R}from"./knowledgeGraph/wasmInterface/wasmUtils.js";const E=new Map,C=()=>new Map(E.entries()),M={fetchKnowledgeGraph:async e=>{const t=new p({url:e}),r=[];return r.push(U(t)),r.push(H(t)),await Promise.all(r),t},refreshDataModel:async e=>{e.dataModel=await ie(e)},refreshServiceDefinition:async e=>{const r=(await t(e.url,{query:{f:"json"}})).data;return r.capabilities=r?.capabilities?.split(","),r.supportedQueryFormats=r?.supportedQueryFormats?.split(","),e.serviceDefinition=new u(r),e.serviceDefinition},executeFindPathsAsynchronous:async(e,t)=>{const a=e.inKnowledgeGraphUrl.split("/rest/services");if(a.length<2)throw new r("knowledge-graph:invalid-tool-url","The URL for the KG Service was not correctly formatted. It should contain /reset/services/");const n=a[0];return await O(`${n}/rest/services/System/KnowledgeGraphServerToolsAsync/GPServer/ServerFilteredFindPaths`,{in_knowledge_graph_url:e.inKnowledgeGraphUrl,config_type:"STRING",config_string:e.config.toJSON(),result_type:"STRING"},{},t)},executeFindPaths:async(e,t)=>{const a=e.inKnowledgeGraphUrl.split("/rest/services");if(a.length<2)throw new r("knowledge-graph:invalid-tool-url","The URL for the KG Service was not correctly formatted. It should contain /reset/services/");const n=a[0],o=await J(`${n}/rest/services/System/KnowledgeGraphServerTools/GPServer/ServerFilteredFindPaths/execute`,{method:"post",query:{f:"pjson",in_knowledge_graph_url:e.inKnowledgeGraphUrl,config_type:"STRING",config_string:JSON.stringify(e.config),result_type:"STRING"},...t});if(o.data.results.length<1)throw new r("knowledge-graph:no-results","No results were returned from the FindPaths tool - no results returned",o);let s;for(const r of o.data.results)if("out_results_string"===r.paramName){s=r.value;break}if(!s)throw new r("knowledge-graph:no-results","No results were returned from the FindPaths tool - no results were returned on the expected paramater out_results_string",o);return s},fetchAsynchronousFindPathsResultData:async(e,t)=>(await e.fetchResultData("out_results_string",null,t)).value,executeQueryStreaming:async(e,t,a)=>{const n="include",o=`${e.url}/graph/query`;await V(e);const s=await te(o,a);if(!e.serviceDefinition?.supportsProvenance&&t.provenanceBehavior===n)throw new r("knowledge-graph:provenance-not-supported","The Knowledge Graph Service definition indicated that provenance is not supported");s.data.body=await Z(t,e);const i=await $(s.data.url,s.data);if(e.dataModel){const t=await se(i,e.dataModel);return new c({resultRowsStream:t.readableStream,resultHeader:t.resultHeader})}throw new r("knowledge-graph:undefined-data-model","The KnowledgeGraph supplied did not have a data model")},executeApplyEdits:async(e,t,a)=>{if(e.serviceDefinition?.dataEditingNotSupported)throw new r("knowledge-graph:data-editing-not-supported","The Knowledge Graph Service definition indicated that data editing is not supported");const n=`${e.url}/graph/applyEdits`;await V(e);const o=await te(n,a);o.data.body=await X(t,e);return re(await $(o.data.url,o.data))},executeQuery:async(e,a,n)=>{const o=`${e.url}/graph/query`,s=await t(o,{responseType:"array-buffer",query:{f:"pbf",openCypherQuery:a.openCypherQuery,...n?.query},signal:n?.signal,timeout:n?.timeout}),i=s.getHeader?.("content-type"),l=s.data;if(i?.includes("application/x-protobuf")){const t=new((await w()).GraphQueryDecoder);if(t.deleteLater(),e.dataModel){const r=oe({wasmQueryDecoder:t,newArrayBufferToParse:l,dataModel:e.dataModel});return new d({resultRows:r.resultRows,resultHeader:r.resultHeader})}throw new r("knowledge-graph:undefined-data-model","The KnowledgeGraph supplied did not have a data model")}throw new r("knowledge-graph:unexpected-server-response","server returned an unexpected response",{responseType:i,data:s.data})},executeSearch:async(e,a,n)=>{const o=a.typeCategoryFilter,s=`${e.url}/graph/search`,i=await t(s,{responseType:"array-buffer",query:{f:"pbf",searchQuery:`"${a.searchQuery}"`,typeCategoryFilter:o,...n?.query},signal:n?.signal,timeout:n?.timeout}),l=i.getHeader?.("content-type"),c=i.data;if(l?.includes("application/x-protobuf")){const t=new((await w()).GraphQueryDecoder);if(t.deleteLater(),e.dataModel){const r=oe({wasmQueryDecoder:t,newArrayBufferToParse:c,dataModel:e.dataModel});return new d({resultRows:r.resultRows,resultHeader:r.resultHeader})}throw new r("knowledge-graph:undefined-data-model","The KnowledgeGraph supplied did not have a data model")}throw new r("knowledge-graph:unexpected-server-response","server returned an unexpected response",{responseType:l,data:i.data})},executeSearchStreaming:async(e,t,a)=>{const n=`${e.url}/graph/search`;await V(e);const o=await te(n,a);o.data.body=await ee(t);const s=await $(o.data.url,o.data);if(e.dataModel){const t=await se(s,e.dataModel);return new c({resultRowsStream:t.readableStream,resultHeader:t.resultHeader})}throw new r("knowledge-graph:undefined-data-model","The KnowledgeGraph supplied did not have a data model")},fetchClientDataAtKeys:async(e,t,a={ignoreCache:!1})=>{if(!t.length)return new Map;let n=E.get(e.url||"");n||(n=new Map,E.set(e.url||"",n));const o=new Map(n.entries()),s=`${e.url}/clientData/fetch`;t=Array.from(new Set(t));const i=await w(),d=h(t,n,i,a.ignoreCache),l=await te(s,a.requestOptions);l.data.body=d;const c=await $(l.data.url,l.data),p=c.headers.get("content-type");if(p?.includes("application/x-protobuf")){const e=new i.ClientDataFetchResponseDecoder;e.deleteLater();const t=await c.arrayBuffer();return e.decode(new Uint8Array(t)),e.has_error()&&R(e.error,"knowledge-graph:fetchClientDataAtKeys-decoding-error","An error occurred while decoding the client data keys response"),S(e,n,o,a.ignoreCache)}throw new r("knowledge-graph:unexpected-server-response","server returned an unexpected response when fetching client data",{responseType:p,data:c})},fetchAllClientDataKeys:async(e,a)=>{const n=`${e.url}/clientData`,o=await t(n,{responseType:"array-buffer",query:{f:"pbf"},signal:a?.signal,timeout:a?.timeout}),s=o.getHeader?.("content-type"),i=o.data;if(s?.includes("application/x-protobuf")){const e=new((await w()).ClientDataKeysResponseDecoder);return e.deleteLater(),e.decode(new Uint8Array(i)),e.has_error()&&R(e.error,"knowledge-graph:fetchAllClientDataKeys-decoding-error","An error occurred while decoding the client data keys response"),G(e)}throw new r("knowledge-graph:unexpected-server-response","server returned an unexpected response",{responseType:s,data:o.data})},clearClientDataCache:()=>E.clear(),_fetchWrapper:async(e,t)=>fetch(e,t),_submitJobWrapper:async(e,t,r,a)=>i(e,t,r,a),_esriRequestWrapper:async(e,r)=>t(e,r)};async function P(e,t,r){return M.executeApplyEdits(e,t,r)}async function q(e,t,r){return M.executeQuery(e,t,r)}async function F(e,t,r){return M.executeQueryStreaming(e,t,r)}async function Q(e,t,r){return M.executeSearch(e,t,r)}async function j(e,t,r){return M.executeSearchStreaming(e,t,r)}function K(e,t){return M.fetchAllClientDataKeys(e,t)}function W(e,t,r){return M.fetchClientDataAtKeys(e,t,r)}async function I(e){return M.fetchKnowledgeGraph(e)}async function U(e){return M.refreshDataModel(e)}async function H(e){return M.refreshServiceDefinition(e)}async function L(e,t){return M.executeFindPathsAsynchronous(e,t)}async function N(e,t){return M.executeFindPaths(e,t)}async function z(e,t){return M.fetchAsynchronousFindPathsResultData(e,t)}function B(){return M.clearClientDataCache()}async function $(e,t){return M._fetchWrapper(e,t)}async function O(e,t,r,a){return M._submitJobWrapper(e,t,r,a)}async function J(e,t){return M._esriRequestWrapper(e,t)}async function V(t){const r=e?.findCredential(t.url);r||(t.dataModel?await ie(t):await U(t))}function Y(e,t,r,a){null==t?r.set_param_key_value(e,""):"object"!=typeof t||t instanceof Date?r.set_param_key_value(e,t):t instanceof o?r.set_param_key_value(e,_(t,a)):Array.isArray(t)?r.set_param_key_value(e,m(t,a)):r.set_param_key_value(e,k(t,a))}async function X(e,t){if(t.dataModel||await U(t),!t.dataModel)throw new r("knowledge-graph:data-model-undefined","Encoding could not proceed because a data model was not provided and it could not be determined from the service");const a=await w(),n=!!e.options?.cascadeDelete,o=new a.GraphApplyEditsEncoder(a.SpatialReferenceUtil.WGS84(),e.options?.inputQuantizationParameters?v(e.options?.inputQuantizationParameters):a.InputQuantizationUtil.WGS84_lossless());o.deleteLater(),o.cascade_delete=n;try{let t;e.entityAdds?.forEach((e=>{t=o.add_entity(b(e,a)),R(t,"knowledge-graph:applyEdits-encoding-failed","Attempting to encode the applyEdits - an entity failed to be added to the encoder")})),e.relationshipAdds?.forEach((e=>{if(!e.originId||!e.destinationId)throw new r("knowledge-graph:relationship-origin-destination-missing","When adding a new relationship, you must provide both an origin and destination id on the appropriate class property");t=o.add_relationship(b(e,a)),R(t,"knowledge-graph:applyEdits-encoding-failed","Attempting to encode the applyEdits - a relationship failed to be added to the encoder")})),e.entityUpdates?.forEach((e=>{if(!e.id)throw new r("knowledge-graph:entity-id-missing","When updating an entity or relationship, you must specify the id on the class level property");t=o.update_entity(b(e,a)),R(t,"knowledge-graph:applyEdits-encoding-failed","Attempting to encode the applyEdits - an entity failed to be added to the encoder")})),e.relationshipUpdates?.forEach((e=>{if(!e.id)throw new r("knowledge-graph:relationship-id-missing","When updating an entity or relationship, you must specify the id on the class level property");t=o.update_relationship(b(e,a)),R(t,"knowledge-graph:applyEdits-encoding-failed","Attempting to encode the applyEdits - a relationship failed to be added to the encoder")})),e.entityDeletes?.forEach((e=>{if(!e.typeName)throw new r("knowledge-graph:no-type-name","You must indicate the entity/relationship named object type to apply edits - delete");const t=o.make_delete_helper(e.typeName,!0);t.deleteLater(),e.ids?.forEach((e=>{t.delete_by_id(e)}))})),e.relationshipDeletes?.forEach((e=>{if(!e.typeName)throw new r("knowledge-graph:no-type-name","You must indicate the entity/relationship named object type to apply edits - delete");const t=o.make_delete_helper(e.typeName,!1);e.ids?.forEach((e=>{t.delete_by_id(e)}))})),o.encode()}catch(i){throw new r("knowledge-graph:applyEdits-encoding-failed","Attempting to encode the applyEdits failed",{error:i})}const s=o.get_encoding_result();return R(s.error,"knowledge-graph:applyEdits-encoding-failed","Attempting to encode the applyEdits failed"),structuredClone(s.get_byte_buffer())}async function Z(e,t){const a=await w(),n=new a.GraphQueryRequestEncoder;if(n.deleteLater(),e.outputSpatialReference?n.output_spatial_reference={wkid:e.outputSpatialReference.wkid,latestWkid:e.outputSpatialReference.latestWkid,vcsWkid:e.outputSpatialReference.vcsWkid,latestVcsWkid:e.outputSpatialReference.latestVcsWkid,wkt:e.outputSpatialReference.wkt??""}:n.output_spatial_reference=a.SpatialReferenceUtil.WGS84(),n.open_cypher_query=e.openCypherQuery,e.bindParameters)for(const[r,i]of Object.entries(e.bindParameters))Y(r,i,n,a);if(e.bindGeometryQuantizationParameters)f(e.bindGeometryQuantizationParameters,n);else{if(t.dataModel||await U(t),4326!==t.dataModel?.spatialReference?.wkid)throw new r("knowledge-graph:SR-quantization-mismatch","If the DataModel indicates a coordinate system other than WGS84, inputQuantizationParameters must be provided to the query encoder");n.input_quantization_parameters=a.InputQuantizationUtil.WGS84_lossless()}e.outputQuantizationParameters&&g(e.outputQuantizationParameters,n,a),e.provenanceBehavior&&y(e.provenanceBehavior,n);try{n.encode()}catch(s){throw new r("knowledge-graph:query-encoding-failed","Attempting to encode the query failed",{error:s})}const o=n.get_encoding_result();if(0!==o.error.error_code)throw new r("knowledge-graph:query-encoding-failed","Attempting to encode the query failed",{errorCode:o.error.error_code,errorMessage:o.error.error_message});return structuredClone(o.get_byte_buffer())}async function ee(e){const t=await w(),a=new t.GraphSearchRequestEncoder;if(a.deleteLater(),a.search_query=e.searchQuery,a.type_category_filter=t.esriNamedTypeCategory[e.typeCategoryFilter],!0===e.returnSearchContext&&(a.return_search_context=e.returnSearchContext),null!=e.start&&e.start>0&&(a.start_index=e.start),null!=e.num&&(a.max_num_results=e.num),null!=e.idsFilter&&Array.isArray(e.idsFilter)&&e.idsFilter.length>0)try{a.set_ids_filter(m(e.idsFilter,t))}catch(o){throw new r("knowledge-graph:ids-format-error","Attempting to set ids filter failed. This is usually caused by an incorrectly formatted UUID string",{error:o})}e.namedTypesFilter?.forEach((e=>{a.add_named_type_filter(e)}));try{a.encode()}catch(o){throw new r("knowledge-graph:search-encoding-failed","Attempting to encode the search failed",{error:o})}const n=a.get_encoding_result();if(0!==n.error.error_code)throw new r("knowledge-graph:search-encoding-failed","Attempting to get encoding result from the query failed",{errorCode:n.error.error_code,errorMessage:n.error.error_message});return structuredClone(n.get_byte_buffer())}async function te(e,r){return t(e,{responseType:"native-request-init",method:"post",query:{f:"pbf",...r?.query},body:"x",headers:{"Content-Type":"application/octet-stream"},signal:r?.signal,timeout:r?.timeout})}async function re(e){const t=e.headers.get("content-type");if(t?.includes("application/x-protobuf")){const t=await e.arrayBuffer(),r=new((await w()).GraphApplyEditsDecoder);return r.deleteLater(),r.decode(new Uint8Array(t)),D(r)}throw new r("knowledge-graph:unexpected-server-response","server returned an unexpected response",{responseType:t,data:e.text()})}let ae=50;function ne(e){ae=e}function oe({wasmQueryDecoder:e,newArrayBufferToParse:t,dataModel:a,decodedHeader:n,limitMaxProcessingTime:o=!1}){t&&e.push_buffer(new Uint8Array(t));const i=[];let d,l,c=0;const p=Date.now();let u=!0;for(;e.next_row();){d&&l||(d=n??T(e),l=d.outSpatialReference??new s({wkid:4326})),c||(c=e.get_header_keys().size());const t=new Array(c);for(let r=0;r<c;r++){const n=e.get_value(r);t[r]=A(n,a,l)}if(i.push(t),o&&Date.now()-p>ae){u=!1;break}}if(e.has_error())throw new r("knowledge-graph:stream-decoding-error","One or more result rows were not successfully decoded - inner row decoding",{errorCode:e.error.error_code,errorMessage:e.error.error_message});return{resultHeader:d,resultRows:i,parsedAllResultsFromBuffer:u}}async function se(e,t){const o=e.headers.get("content-type");if(e.headers.get("content-length")&&a.getLogger("esri.rest.knowledgeGraph.knowledgeGraphService").warnOnce("Found `Content-Length` header when expecting a streaming HTTP response! Please investigate whether all intermediate HTTP proxies and/or load balancers are configured such that they don't forcefully buffer the entire response before returning it to the client. A valid HTTP streaming response should use Chunked Transfer Encoding and not have a Content Length defined."),o?.includes("application/x-protobuf")){const o=e.body?.getReader(),s=new((await w()).GraphQueryDecoder);let i,d,c;s.deleteLater();const p=new Promise(((e,t)=>{d=e,c=t}));let u=!1,h=null;const f=new ReadableStream({pull:async function e(p){if(!o){const e=new r("knowledge-graph:stream-decoding-error","Error reading from stream - reader is undefined");throw c(e),e}const{done:w,value:f}=h?{done:!1,value:null}:await o.read().catch((e=>{throw c(e),o.releaseLock(),e}));f&&(h=f);try{if(w){let e;if(s.has_error()?e=new r("knowledge-graph:stream-decoding-error","One or more result rows were not successfully decoded - query stream done",{errorCode:s.error.error_code,errorMessage:s.error.error_message}):u||d(new l),o.releaseLock(),e)throw p.error(e),c(e),e;return void p.close()}const{resultHeader:a,resultRows:n,parsedAllResultsFromBuffer:g}=oe({wasmQueryDecoder:s,newArrayBufferToParse:f,dataModel:t,decodedHeader:i,limitMaxProcessingTime:!0});return g&&(h=null),!i&&a&&(i=a,d(a),u=!0),n.length>0?void p.enqueue(n):await e(p)}catch(g){throw a.getLogger("esri.rest.knowledgeGraph.knowledgeGraphService").error(g),c(g),o.releaseLock(),n(g)?g:new r("knowledge-graph:unexpected-server-response","Error inside streaming data return parsing",{error:g})}}});return{readableStream:f,resultHeader:await p}}throw new r("knowledge-graph:unexpected-server-response","server returned an unexpected response",{responseType:o,data:e.text()})}async function ie(e){const a=`${e.url}/dataModel/queryDataModel`,n=await t(a,{responseType:"array-buffer",query:{f:"pbf"}}),o=n.getHeader?.("content-type"),s=n.data;if(o?.includes("application/x-protobuf")){const e=(await w()).decode_data_model_from_protocol_buffer(new Uint8Array(s));if(!e)throw new r("knowledge-graph:data-model-decode-failure","The server responded to the data model query, but the response failed to be decoded. This typically occurs when the Knowledge JS API (4.26 or later) is used with an unsupported backend (11.0 or earlier)");return x(e)}throw new r("knowledge-graph:unexpected-server-response","server returned an unexpected response",{responseType:o,data:n.data})}export{J as _esriRequestWrapper,$ as _fetchWrapper,C as _getClientDataCacheCopy,ne as _setMaxQueryParsingDurationForTesting,O as _submitJobWrapper,B as clearClientDataCache,E as clientDataCache,P as executeApplyEdits,N as executeFindPaths,L as executeFindPathsAsynchronous,q as executeQuery,F as executeQueryStreaming,Q as executeSearch,j as executeSearchStreaming,K as fetchAllClientDataKeys,z as fetchAsynchronousFindPathsResultData,W as fetchClientDataAtKeys,I as fetchKnowledgeGraph,M as kgRestServices,U as refreshDataModel,H as refreshServiceDefinition};