@speckle/objectloader 2.23.10 → 2.23.12
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/dist/objectloader.cjs +1 -1
- package/dist/objectloader.esm.js +1 -1
- package/package.json +3 -5
- package/rollup.config.js +2 -1
- package/src/index.js +19 -11
- package/types/index.d.ts +1 -1
package/dist/objectloader.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";require("core-js/modules/es.symbol.description.js"),require("core-js/modules/es.array.flat.js"),require("core-js/modules/es.array.flat-map.js"),require("core-js/modules/es.array.includes.js"),require("core-js/modules/es.array.reduce.js"),require("core-js/modules/es.array.reduce-right.js"),require("core-js/modules/es.array.sort.js"),require("core-js/modules/es.array.unscopables.flat.js"),require("core-js/modules/es.array.unscopables.flat-map.js"),require("core-js/modules/es.math.hypot.js"),require("core-js/modules/es.object.from-entries.js"),require("core-js/modules/es.promise.js"),require("core-js/modules/es.promise.finally.js"),require("core-js/modules/es.regexp.constructor.js"),require("core-js/modules/es.regexp.exec.js"),require("core-js/modules/es.regexp.flags.js"),require("core-js/modules/es.string.replace.js"),require("core-js/modules/es.typed-array.float32-array.js"),require("core-js/modules/es.typed-array.float64-array.js"),require("core-js/modules/es.typed-array.int8-array.js"),require("core-js/modules/es.typed-array.int16-array.js"),require("core-js/modules/es.typed-array.int32-array.js"),require("core-js/modules/es.typed-array.uint8-array.js"),require("core-js/modules/es.typed-array.uint8-clamped-array.js"),require("core-js/modules/es.typed-array.uint16-array.js"),require("core-js/modules/es.typed-array.uint32-array.js"),require("core-js/modules/es.typed-array.from.js"),require("core-js/modules/es.typed-array.of.js"),require("core-js/modules/es.typed-array.set.js"),require("core-js/modules/es.typed-array.sort.js"),require("core-js/modules/esnext.aggregate-error.js"),require("core-js/modules/esnext.array.last-index.js"),require("core-js/modules/esnext.array.last-item.js"),require("core-js/modules/esnext.composite-key.js"),require("core-js/modules/esnext.composite-symbol.js"),require("core-js/modules/esnext.global-this.js"),require("core-js/modules/esnext.map.delete-all.js"),require("core-js/modules/esnext.map.every.js"),require("core-js/modules/esnext.map.filter.js"),require("core-js/modules/esnext.map.find.js"),require("core-js/modules/esnext.map.find-key.js"),require("core-js/modules/esnext.map.from.js"),require("core-js/modules/esnext.map.group-by.js"),require("core-js/modules/esnext.map.includes.js"),require("core-js/modules/esnext.map.key-by.js"),require("core-js/modules/esnext.map.key-of.js"),require("core-js/modules/esnext.map.map-keys.js"),require("core-js/modules/esnext.map.map-values.js"),require("core-js/modules/esnext.map.merge.js"),require("core-js/modules/esnext.map.of.js"),require("core-js/modules/esnext.map.reduce.js"),require("core-js/modules/esnext.map.some.js"),require("core-js/modules/esnext.map.update.js"),require("core-js/modules/esnext.math.clamp.js"),require("core-js/modules/esnext.math.deg-per-rad.js"),require("core-js/modules/esnext.math.degrees.js"),require("core-js/modules/esnext.math.fscale.js"),require("core-js/modules/esnext.math.iaddh.js"),require("core-js/modules/esnext.math.imulh.js"),require("core-js/modules/esnext.math.isubh.js"),require("core-js/modules/esnext.math.rad-per-deg.js"),require("core-js/modules/esnext.math.radians.js"),require("core-js/modules/esnext.math.scale.js"),require("core-js/modules/esnext.math.seeded-prng.js"),require("core-js/modules/esnext.math.signbit.js"),require("core-js/modules/esnext.math.umulh.js"),require("core-js/modules/esnext.number.from-string.js"),require("core-js/modules/esnext.observable.js"),require("core-js/modules/esnext.promise.all-settled.js"),require("core-js/modules/esnext.promise.any.js"),require("core-js/modules/esnext.promise.try.js"),require("core-js/modules/esnext.reflect.define-metadata.js"),require("core-js/modules/esnext.reflect.delete-metadata.js"),require("core-js/modules/esnext.reflect.get-metadata.js"),require("core-js/modules/esnext.reflect.get-metadata-keys.js"),require("core-js/modules/esnext.reflect.get-own-metadata.js"),require("core-js/modules/esnext.reflect.get-own-metadata-keys.js"),require("core-js/modules/esnext.reflect.has-metadata.js"),require("core-js/modules/esnext.reflect.has-own-metadata.js"),require("core-js/modules/esnext.reflect.metadata.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.from.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.of.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js"),require("core-js/modules/esnext.string.at.js"),require("core-js/modules/esnext.string.code-points.js"),require("core-js/modules/esnext.string.match-all.js"),require("core-js/modules/esnext.string.replace-all.js"),require("core-js/modules/esnext.symbol.dispose.js"),require("core-js/modules/esnext.symbol.observable.js"),require("core-js/modules/esnext.symbol.pattern-match.js"),require("core-js/modules/esnext.weak-map.delete-all.js"),require("core-js/modules/esnext.weak-map.from.js"),require("core-js/modules/esnext.weak-map.of.js"),require("core-js/modules/esnext.weak-set.add-all.js"),require("core-js/modules/esnext.weak-set.delete-all.js"),require("core-js/modules/esnext.weak-set.from.js"),require("core-js/modules/esnext.weak-set.of.js"),require("core-js/modules/web.dom-collections.iterator.js"),require("core-js/modules/web.immediate.js"),require("core-js/modules/web.queue-microtask.js"),require("core-js/modules/web.url.js"),require("core-js/modules/web.url.to-json.js"),require("core-js/modules/web.url-search-params.js");var e=require("#lodash");function s(e,s,t){return s in e?Object.defineProperty(e,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[s]=t,e}class t extends Error{constructor(e,s){e||(e=new.target.defaultMessage),super(e,s)}}s(t,"defaultMessage","Unexpected error occurred");class r extends t{}s(r,"defaultMessage","Object loader configured incorrectly!");class o extends t{}s(o,"defaultMessage","Object loader encountered a runtime problem!");class i{constructor(e){var s;let{serverUrl:t,streamId:i,token:a,objectId:n,options:c={enableCaching:!0,fullyTraverseArrays:!1,excludeProps:[],fetch:null,customLogger:void 0,customWarner:void 0}}=e;if(this.logger=c.customLogger||console.log,this.warner=c.customWarner||console.warn,this.INTERVAL_MS=20,this.TIMEOUT_MS=18e4,this.serverUrl=t||(null===globalThis||void 0===globalThis||null===(s=globalThis.location)||void 0===s?void 0:s.origin),!this.serverUrl)throw new r("Invalid serverUrl specified!");if(this.streamId=i,this.objectId=n,!this.streamId)throw new r("Invalid streamId specified!");if(!this.objectId)throw new r("Invalid objectId specified!");this.logger("Object loader constructor called!"),this.token=a,this.headers={Accept:"text/plain"},this.token&&(this.headers.Authorization="Bearer ".concat(this.token)),this.requestUrlRootObj="".concat(this.serverUrl,"/objects/").concat(this.streamId,"/").concat(this.objectId,"/single"),this.requestUrlChildren="".concat(this.serverUrl,"/api/getobjects/").concat(this.streamId),this.promises=[],this.intervals={},this.buffer=[],this.isLoading=!1,this.totalChildrenCount=0,this.traversedReferencesCount=0,this.options=c,this.options.numConnections=this.options.numConnections||4,this.cacheDB=null,this.lastAsyncPause=Date.now(),this.existingAsyncPause=null,this.preferredFetch=c.fetch,this.fetch=function(){const e=this.preferredFetch||fetch;if(!e)throw new o("Couldn't find fetch implementation! If running in a node environment, make sure you pass it in through the constructor!");return e(...arguments)}}static createFromObjects(e){const s=e[0];return new class extends i{constructor(){super({serverUrl:"dummy",streamId:"dummy",undefined:void 0,objectId:s.id}),this.objectId=s.id}async getRootObject(){return s}async getTotalObjectCount(){return Object.keys((null==s?void 0:s.__closure)||{}).length}async*getObjectIterator(){const s=Date.now();let t=0;for await(const{id:s,obj:r}of this.getRawObjectIterator(e))this.buffer[s]=r,t+=1,yield r;this.logger("Loaded ".concat(t," objects in: ").concat((Date.now()-s)/1e3))}async*getRawObjectIterator(e){yield{id:e[0].id,obj:e[0]};if(e[0].__closure)for(const s of e)yield{id:s.id,obj:s}}}}static createFromJSON(e){const s=performance.now(),t=JSON.parse(e);return console.warn("JSON Parse Time -> ",performance.now()-s),this.createFromObjects(t)}async asyncPause(){Date.now()-this.lastAsyncPause>=100&&(this.lastAsyncPause=Date.now(),this.existingAsyncPause=new Promise((e=>setTimeout(e,0))),await this.existingAsyncPause,this.existingAsyncPause=null,Date.now()-this.lastAsyncPause>500&&this.logger("Loader Event loop lag: ",Date.now()-this.lastAsyncPause))}dispose(){this.buffer=[],this.promises=[],Object.values(this.intervals).forEach((e=>clearInterval(e.interval)))}async getTotalObjectCount(){const e=await this.getRawRootObject(),s=JSON.parse(e);return Object.keys((null==s?void 0:s.__closure)||{}).length}async getRootObject(){const e=await this.getRawRootObject();return JSON.parse(e)}async getAndConstructObject(e){await this.downloadObjectsInBuffer(e);const s=await this.getObject(this.objectId);return this.traverseAndConstruct(s,e)}async downloadObjectsInBuffer(e){let s=!0,t=0;for await(const r of this.getObjectIterator())s&&(this.totalChildrenCount=r.totalChildrenCount,s=!1,this.isLoading=!0),t++,e&&e({stage:"download",current:t,total:this.totalChildrenCount});this.isLoading=!1}async traverseAndConstruct(e,s){if(e){if("object"!=typeof e)return e;if(Array.isArray(e)&&0!==e.length){var t,r;const o=[];for(const t of e){if(!t)continue;if("object"!=typeof t&&!this.options.fullyTraverseArrays)return e;const r=t.referencedId?await this.getObject(t.referencedId):t;t.referencedId&&s&&s({stage:"construction",current:++this.traversedReferencesCount>this.totalChildrenCount?this.totalChildrenCount:this.traversedReferencesCount,total:this.totalChildrenCount}),o.push(await this.traverseAndConstruct(r,s))}return null!==(t=o[0])&&void 0!==t&&null!==(r=t.speckle_type)&&void 0!==r&&r.toLowerCase().includes("datachunk")?o.reduce(((e,s)=>e.concat(s.data)),[]):o}for(const s of this.options.excludeProps)delete e[s];for(const t in e)"object"==typeof e[t]&&null!==e[t]&&(e[t].referencedId&&(e[t]=await this.getObject(e[t].referencedId),s&&s({stage:"construction",current:++this.traversedReferencesCount>this.totalChildrenCount?this.totalChildrenCount:this.traversedReferencesCount,total:this.totalChildrenCount})),e[t]=await this.traverseAndConstruct(e[t],s));return e}}async getObject(e){if(this.buffer[e])return this.buffer[e];return new Promise(((s,t)=>{if(this.promises.push({id:e,resolve:s,reject:t}),this.intervals[e])this.intervals[e].elapsed=0;else{const s=setInterval(this.tryResolvePromise.bind(this),this.INTERVAL_MS,e);this.intervals[e]={interval:s,elapsed:0}}}))}tryResolvePromise(e){if(this.intervals[e].elapsed+=this.INTERVAL_MS,this.buffer[e]){for(const s of this.promises.filter((s=>s.id===e)))s.resolve(this.buffer[e]);return clearInterval(this.intervals[e].interval),void delete this.intervals[e]}this.intervals[e].elapsed>this.TIMEOUT_MS&&(this.warner("Timeout resolving ".concat(e,". HIC SVNT DRACONES.")),clearInterval(this.intervals[e].interval),this.promises.filter((s=>s.id===e)).forEach((e=>e.reject())),this.promises=this.promises.filter((e=>e.id!=e.id)))}async*getObjectIterator(){const e=Date.now();let s=0;for await(const e of this.getRawObjectIterator()){const{id:t,obj:r}=this.processLine(e);this.buffer[t]=r,s+=1,yield r}this.logger("Loaded ".concat(s," objects in: ").concat((Date.now()-e)/1e3))}processLine(e){const s=e.split("\t"),[t,r]=s;let o;try{o=JSON.parse(r)}catch(e){throw new Error("Error parsing object ".concat(t,": ").concat(e.message))}return{id:t,obj:o}}supportsCache(){return!(!this.options.enableCaching||!globalThis.indexedDB)}async setupCacheDb(){if(!this.supportsCache()||null!==this.cacheDB)return;await function(){if(navigator.userAgentData||!/Safari\//.test(navigator.userAgent)||/Chrom(e|ium)\//.test(navigator.userAgent)||!indexedDB.databases)return Promise.resolve();let e;return new Promise((s=>{const t=()=>indexedDB.databases().finally(s);e=setInterval(t,100),t()})).finally((()=>clearInterval(e)))}();const e=indexedDB.open("speckle-object-cache",1);e.onupgradeneeded=()=>e.result.createObjectStore("objects"),this.cacheDB=await this.promisifyIdbRequest(e)}async*getRawObjectIterator(){await this.setupCacheDb();const s=await this.getRawRootObject();yield"".concat(this.objectId,"\t").concat(s);const t=JSON.parse(s);if(!t.__closure)return;let r=Object.keys(t.__closure).filter((e=>!e.includes("blob"))).sort(((e,s)=>t.__closure[e]-t.__closure[s]));if(0===r.length)return;let o=[];if(r.length>50){const s=[[],[],[],[]];let i=0;for(;i<.05*r.length;i++)s[0].push(r[i]);for(;i<.2*r.length;i++)s[1].push(r[i]);for(;i<.6*r.length;i++)s[2].push(r[i]);for(;i<r.length;i++)s[3].push(r[i]);this.logger("Cache check for: ",s);const a=[];let n=this.cacheGetObjects(s[0]);for(let r=0;r<4;r++){const o=await n;r<3&&(n=this.cacheGetObjects(s[r+1]));const i=Object.keys(o).sort(((e,s)=>t.__closure[e]-t.__closure[s]));for(const e of i)yield"".concat(e,"\t").concat(o[e]);const c=s[r].filter((e=>!(e in o))),u=500,l=e.chunk(c,u);for(let e=0;e<l.length;e++)a.push.apply(a,l[e])}if(0===a.length)return;if(a.length<=50)o.push(a);else{for(o=[[],[],[],[]],i=0;i<.05*a.length;i++)o[0].push(a[i]);for(;i<.2*a.length;i++)o[1].push(a[i]);for(;i<.6*a.length;i++)o[2].push(a[i]);for(;i<a.length;i++)o[3].push(a[i])}}else{const e=await this.cacheGetObjects(r),s=Object.keys(e).sort(((e,s)=>t.__closure[e]-t.__closure[s]));for(const t of s)yield"".concat(t,"\t").concat(e[t]);if(r=r.filter((s=>!(s in e))),0===r.length)return;o.push(r)}const i=[],a=[],n=[],c=[],u=[];for(let e=0;e<o.length;e++)i.push(new TextDecoder),a.push(null),n.push(null),c.push(""),u.push(!1),this.fetch(this.requestUrlChildren,{method:"POST",headers:{...this.headers,"Content-Type":"application/json"},body:JSON.stringify({objects:JSON.stringify(o[e])})}).then((s=>{s.body.getReader&&(s.body.iterator=async function*(){const e=this.getReader();for(;;){const s=await e.read();if(s.done)return s.value;yield s.value}});const t=s.body.iterator();a[e]=t;const r=t.next().then((s=>(s.reqId=e,s)));n[e]=r}));for(;;){const e=n.filter((e=>!!e));if(0===e.length){if(u.every((e=>e)))break;await new Promise((e=>{setTimeout(e,10)}));continue}const s=await Promise.any(e);let{value:t,done:r,reqId:o}=s;if(u[o]=r,r)c[o].length>0&&(yield c[o],c[o]=""),n[o]=null;else{const e=a[o].next().then((e=>(e.reqId=o,e)));n[o]=e}if(!t)continue;t=i[o].decode(t);const l=(c[o]+t).split(/\r\n|\n|\r/),d=l.pop();c[o]=d;for(const e of l)yield e;this.cacheStoreObjects(l)}}async getRawRootObject(){const e=await this.cacheGetObjects([this.objectId]);if(e[this.objectId])return e[this.objectId];const s=await this.fetch(this.requestUrlRootObj,{headers:this.headers}),t=await s.text();if([401,403].includes(s.status))throw new o("You do not have access to the root object!");return this.cacheStoreObjects(["".concat(this.objectId,"\t").concat(t)]),t}promisifyIdbRequest(e){return new Promise(((s,t)=>{e.oncomplete=e.onsuccess=()=>s(e.result),e.onabort=e.onerror=()=>t(e.error)}))}async cacheGetObjects(s){if(!this.supportsCache())return{};null===this.cacheDB&&await this.setupCacheDb();const t={};for(let r=0;r<s.length;r+=500){const o=s.slice(r,r+500),i=this.cacheDB.transaction("objects","readonly").objectStore("objects"),a=o.map((e=>this.promisifyIdbRequest(i.get(e)).then((s=>({id:e,data:s}))))),n=await Promise.all(a);for(const s of n)!s.data||e.isString(s.data)&&s.data.startsWith("<html")||(t[s.id]=s.data)}return t}async cacheStoreObjects(s){if(!this.supportsCache())return{};null===this.cacheDB&&await this.setupCacheDb();try{const t=this.cacheDB.transaction("objects","readwrite").objectStore("objects");for(const r of s){const[s,o]=r.split("\t");o&&e.isString(o)&&!o.startsWith("<html")&&t.put(o,s)}return this.promisifyIdbRequest(t.transaction)}catch(e){this.logger.error(e)}return Promise.resolve()}}module.exports=i;
|
|
1
|
+
"use strict";require("core-js/modules/es.symbol.description.js"),require("core-js/modules/es.array.flat.js"),require("core-js/modules/es.array.flat-map.js"),require("core-js/modules/es.array.includes.js"),require("core-js/modules/es.array.reduce.js"),require("core-js/modules/es.array.reduce-right.js"),require("core-js/modules/es.array.sort.js"),require("core-js/modules/es.array.unscopables.flat.js"),require("core-js/modules/es.array.unscopables.flat-map.js"),require("core-js/modules/es.math.hypot.js"),require("core-js/modules/es.object.from-entries.js"),require("core-js/modules/es.promise.js"),require("core-js/modules/es.promise.finally.js"),require("core-js/modules/es.regexp.constructor.js"),require("core-js/modules/es.regexp.exec.js"),require("core-js/modules/es.regexp.flags.js"),require("core-js/modules/es.string.replace.js"),require("core-js/modules/es.typed-array.float32-array.js"),require("core-js/modules/es.typed-array.float64-array.js"),require("core-js/modules/es.typed-array.int8-array.js"),require("core-js/modules/es.typed-array.int16-array.js"),require("core-js/modules/es.typed-array.int32-array.js"),require("core-js/modules/es.typed-array.uint8-array.js"),require("core-js/modules/es.typed-array.uint8-clamped-array.js"),require("core-js/modules/es.typed-array.uint16-array.js"),require("core-js/modules/es.typed-array.uint32-array.js"),require("core-js/modules/es.typed-array.from.js"),require("core-js/modules/es.typed-array.of.js"),require("core-js/modules/es.typed-array.set.js"),require("core-js/modules/es.typed-array.sort.js"),require("core-js/modules/esnext.aggregate-error.js"),require("core-js/modules/esnext.array.last-index.js"),require("core-js/modules/esnext.array.last-item.js"),require("core-js/modules/esnext.composite-key.js"),require("core-js/modules/esnext.composite-symbol.js"),require("core-js/modules/esnext.global-this.js"),require("core-js/modules/esnext.map.delete-all.js"),require("core-js/modules/esnext.map.every.js"),require("core-js/modules/esnext.map.filter.js"),require("core-js/modules/esnext.map.find.js"),require("core-js/modules/esnext.map.find-key.js"),require("core-js/modules/esnext.map.from.js"),require("core-js/modules/esnext.map.group-by.js"),require("core-js/modules/esnext.map.includes.js"),require("core-js/modules/esnext.map.key-by.js"),require("core-js/modules/esnext.map.key-of.js"),require("core-js/modules/esnext.map.map-keys.js"),require("core-js/modules/esnext.map.map-values.js"),require("core-js/modules/esnext.map.merge.js"),require("core-js/modules/esnext.map.of.js"),require("core-js/modules/esnext.map.reduce.js"),require("core-js/modules/esnext.map.some.js"),require("core-js/modules/esnext.map.update.js"),require("core-js/modules/esnext.math.clamp.js"),require("core-js/modules/esnext.math.deg-per-rad.js"),require("core-js/modules/esnext.math.degrees.js"),require("core-js/modules/esnext.math.fscale.js"),require("core-js/modules/esnext.math.iaddh.js"),require("core-js/modules/esnext.math.imulh.js"),require("core-js/modules/esnext.math.isubh.js"),require("core-js/modules/esnext.math.rad-per-deg.js"),require("core-js/modules/esnext.math.radians.js"),require("core-js/modules/esnext.math.scale.js"),require("core-js/modules/esnext.math.seeded-prng.js"),require("core-js/modules/esnext.math.signbit.js"),require("core-js/modules/esnext.math.umulh.js"),require("core-js/modules/esnext.number.from-string.js"),require("core-js/modules/esnext.observable.js"),require("core-js/modules/esnext.promise.all-settled.js"),require("core-js/modules/esnext.promise.any.js"),require("core-js/modules/esnext.promise.try.js"),require("core-js/modules/esnext.reflect.define-metadata.js"),require("core-js/modules/esnext.reflect.delete-metadata.js"),require("core-js/modules/esnext.reflect.get-metadata.js"),require("core-js/modules/esnext.reflect.get-metadata-keys.js"),require("core-js/modules/esnext.reflect.get-own-metadata.js"),require("core-js/modules/esnext.reflect.get-own-metadata-keys.js"),require("core-js/modules/esnext.reflect.has-metadata.js"),require("core-js/modules/esnext.reflect.has-own-metadata.js"),require("core-js/modules/esnext.reflect.metadata.js"),require("core-js/modules/esnext.set.add-all.js"),require("core-js/modules/esnext.set.delete-all.js"),require("core-js/modules/esnext.set.difference.js"),require("core-js/modules/esnext.set.every.js"),require("core-js/modules/esnext.set.filter.js"),require("core-js/modules/esnext.set.find.js"),require("core-js/modules/esnext.set.from.js"),require("core-js/modules/esnext.set.intersection.js"),require("core-js/modules/esnext.set.is-disjoint-from.js"),require("core-js/modules/esnext.set.is-subset-of.js"),require("core-js/modules/esnext.set.is-superset-of.js"),require("core-js/modules/esnext.set.join.js"),require("core-js/modules/esnext.set.map.js"),require("core-js/modules/esnext.set.of.js"),require("core-js/modules/esnext.set.reduce.js"),require("core-js/modules/esnext.set.some.js"),require("core-js/modules/esnext.set.symmetric-difference.js"),require("core-js/modules/esnext.set.union.js"),require("core-js/modules/esnext.string.at.js"),require("core-js/modules/esnext.string.code-points.js"),require("core-js/modules/esnext.string.match-all.js"),require("core-js/modules/esnext.string.replace-all.js"),require("core-js/modules/esnext.symbol.dispose.js"),require("core-js/modules/esnext.symbol.observable.js"),require("core-js/modules/esnext.symbol.pattern-match.js"),require("core-js/modules/esnext.weak-map.delete-all.js"),require("core-js/modules/esnext.weak-map.from.js"),require("core-js/modules/esnext.weak-map.of.js"),require("core-js/modules/esnext.weak-set.add-all.js"),require("core-js/modules/esnext.weak-set.delete-all.js"),require("core-js/modules/esnext.weak-set.from.js"),require("core-js/modules/esnext.weak-set.of.js"),require("core-js/modules/web.dom-collections.iterator.js"),require("core-js/modules/web.immediate.js"),require("core-js/modules/web.queue-microtask.js"),require("core-js/modules/web.url.js"),require("core-js/modules/web.url.to-json.js"),require("core-js/modules/web.url-search-params.js");var e=require("#lodash");function s(e,s,t){return s in e?Object.defineProperty(e,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[s]=t,e}class t extends Error{constructor(e,s){e||(e=new.target.defaultMessage),super(e,s)}}s(t,"defaultMessage","Unexpected error occurred");class r extends t{}s(r,"defaultMessage","Object loader configured incorrectly!");class o extends t{}s(o,"defaultMessage","Object loader encountered a runtime problem!");class i{constructor(e){var s;let{serverUrl:t,streamId:i,token:a,objectId:n,options:c={enableCaching:!0,fullyTraverseArrays:!1,excludeProps:[],fetch:null,customLogger:void 0,customWarner:void 0}}=e;if(this.logger=c.customLogger||console.log,this.warner=c.customWarner||console.warn,this.INTERVAL_MS=20,this.TIMEOUT_MS=18e4,this.serverUrl=t||(null===globalThis||void 0===globalThis||null===(s=globalThis.location)||void 0===s?void 0:s.origin),!this.serverUrl)throw new r("Invalid serverUrl specified!");if(this.streamId=i,this.objectId=n,!this.streamId)throw new r("Invalid streamId specified!");if(!this.objectId)throw new r("Invalid objectId specified!");this.logger("Object loader constructor called!"),this.token=a,this.headers={Accept:"text/plain"},this.token&&(this.headers.Authorization="Bearer ".concat(this.token)),this.requestUrlRootObj="".concat(this.serverUrl,"/objects/").concat(this.streamId,"/").concat(this.objectId,"/single"),this.requestUrlChildren="".concat(this.serverUrl,"/api/getobjects/").concat(this.streamId),this.promises=[],this.intervals={},this.buffer=[],this.isLoading=!1,this.totalChildrenCount=0,this.traversedReferencesCount=0,this.options=c,this.options.numConnections=this.options.numConnections||4,this.cacheDB=null,this.lastAsyncPause=Date.now(),this.existingAsyncPause=null,this.preferredFetch=c.fetch,this.fetch=function(){const e=this.preferredFetch||fetch;if(!e)throw new o("Couldn't find fetch implementation! If running in a node environment, make sure you pass it in through the constructor!");return e(...arguments)}}static createFromObjects(e){const s=e[0];return new class extends i{constructor(){super({serverUrl:"dummy",streamId:"dummy",undefined:void 0,objectId:s.id}),this.objectId=s.id}async getRootObject(){return s}async getTotalObjectCount(){return Object.keys((null==s?void 0:s.__closure)||{}).length}async*getObjectIterator(){const s=Date.now();let t=0;for await(const{id:s,obj:r}of this.getRawObjectIterator(e))this.buffer[s]=r,t+=1,yield r;this.logger("Loaded ".concat(t," objects in: ").concat((Date.now()-s)/1e3))}async*getRawObjectIterator(e){yield{id:e[0].id,obj:e[0]};if(e[0].__closure)for(const s of e)yield{id:s.id,obj:s}}}}static createFromJSON(e){const s=performance.now(),t=JSON.parse(e);return console.warn("JSON Parse Time -> ",performance.now()-s),this.createFromObjects(t)}async asyncPause(){Date.now()-this.lastAsyncPause>=100&&(this.lastAsyncPause=Date.now(),this.existingAsyncPause=new Promise((e=>setTimeout(e,0))),await this.existingAsyncPause,this.existingAsyncPause=null,Date.now()-this.lastAsyncPause>500&&this.logger("Loader Event loop lag: ",Date.now()-this.lastAsyncPause))}dispose(){this.buffer=[],this.promises=[],Object.values(this.intervals).forEach((e=>clearInterval(e.interval)))}async getTotalObjectCount(){const e=await this.getRootObject();return Object.keys((null==e?void 0:e.__closure)||{}).length}async getRootObject(){const e=await this.getRawRootObject();let s;try{s=JSON.parse(e)}catch(s){throw new Error('Error parsing root object. "'.concat(s.message,"\". Root object: '").concat(e,"'"))}return s}async getAndConstructObject(e){await this.downloadObjectsInBuffer(e);const s=await this.getObject(this.objectId);return this.traverseAndConstruct(s,e)}async downloadObjectsInBuffer(e){let s=!0,t=0;for await(const r of this.getObjectIterator())s&&(this.totalChildrenCount=r.totalChildrenCount,s=!1,this.isLoading=!0),t++,e&&e({stage:"download",current:t,total:this.totalChildrenCount});this.isLoading=!1}async traverseAndConstruct(e,s){if(e){if("object"!=typeof e)return e;if(Array.isArray(e)&&0!==e.length){var t,r;const o=[];for(const t of e){if(!t)continue;if("object"!=typeof t&&!this.options.fullyTraverseArrays)return e;const r=t.referencedId?await this.getObject(t.referencedId):t;t.referencedId&&s&&s({stage:"construction",current:++this.traversedReferencesCount>this.totalChildrenCount?this.totalChildrenCount:this.traversedReferencesCount,total:this.totalChildrenCount}),o.push(await this.traverseAndConstruct(r,s))}return null!==(t=o[0])&&void 0!==t&&null!==(r=t.speckle_type)&&void 0!==r&&r.toLowerCase().includes("datachunk")?o.reduce(((e,s)=>e.concat(s.data)),[]):o}for(const s of this.options.excludeProps)delete e[s];for(const t in e)"object"==typeof e[t]&&null!==e[t]&&(e[t].referencedId&&(e[t]=await this.getObject(e[t].referencedId),s&&s({stage:"construction",current:++this.traversedReferencesCount>this.totalChildrenCount?this.totalChildrenCount:this.traversedReferencesCount,total:this.totalChildrenCount})),e[t]=await this.traverseAndConstruct(e[t],s));return e}}async getObject(e){if(this.buffer[e])return this.buffer[e];return new Promise(((s,t)=>{if(this.promises.push({id:e,resolve:s,reject:t}),this.intervals[e])this.intervals[e].elapsed=0;else{const s=setInterval(this.tryResolvePromise.bind(this),this.INTERVAL_MS,e);this.intervals[e]={interval:s,elapsed:0}}}))}tryResolvePromise(e){if(this.intervals[e].elapsed+=this.INTERVAL_MS,this.buffer[e]){for(const s of this.promises.filter((s=>s.id===e)))s.resolve(this.buffer[e]);return clearInterval(this.intervals[e].interval),void delete this.intervals[e]}this.intervals[e].elapsed>this.TIMEOUT_MS&&(this.warner("Timeout resolving ".concat(e,". HIC SVNT DRACONES.")),clearInterval(this.intervals[e].interval),this.promises.filter((s=>s.id===e)).forEach((e=>e.reject())),this.promises=this.promises.filter((e=>e.id!=e.id)))}async*getObjectIterator(){const e=Date.now();let s=0;for await(const e of this.getRawObjectIterator()){const{id:t,obj:r}=this.processLine(e);this.buffer[t]=r,s+=1,yield r}this.logger("Loaded ".concat(s," objects in: ").concat((Date.now()-e)/1e3))}processLine(e){const s=e.split("\t"),[t,r]=s;let o;try{o=JSON.parse(r)}catch(e){throw new Error("Error parsing object ".concat(t,": ").concat(e.message))}return{id:t,obj:o}}supportsCache(){return!(!this.options.enableCaching||!globalThis.indexedDB)}async setupCacheDb(){if(!this.supportsCache()||null!==this.cacheDB)return;await function(){if(navigator.userAgentData||!/Safari\//.test(navigator.userAgent)||/Chrom(e|ium)\//.test(navigator.userAgent)||!indexedDB.databases)return Promise.resolve();let e;return new Promise((s=>{const t=()=>indexedDB.databases().finally(s);e=setInterval(t,100),t()})).finally((()=>clearInterval(e)))}();const e=indexedDB.open("speckle-object-cache",1);e.onupgradeneeded=()=>e.result.createObjectStore("objects"),this.cacheDB=await this.promisifyIdbRequest(e)}async*getRawObjectIterator(){await this.setupCacheDb();const s=await this.getRawRootObject();yield"".concat(this.objectId,"\t").concat(s);const t=JSON.parse(s);if(!t.__closure)return;let r=Object.keys(t.__closure).filter((e=>!e.includes("blob"))).sort(((e,s)=>t.__closure[e]-t.__closure[s]));if(0===r.length)return;let o=[];if(r.length>50){const s=[[],[],[],[]];let i=0;for(;i<.05*r.length;i++)s[0].push(r[i]);for(;i<.2*r.length;i++)s[1].push(r[i]);for(;i<.6*r.length;i++)s[2].push(r[i]);for(;i<r.length;i++)s[3].push(r[i]);this.logger("Cache check for: ",s);const a=[];let n=this.cacheGetObjects(s[0]);for(let r=0;r<4;r++){const o=await n;r<3&&(n=this.cacheGetObjects(s[r+1]));const i=Object.keys(o).sort(((e,s)=>t.__closure[e]-t.__closure[s]));for(const e of i)yield"".concat(e,"\t").concat(o[e]);const c=s[r].filter((e=>!(e in o))),u=500,l=e.chunk(c,u);for(let e=0;e<l.length;e++)a.push.apply(a,l[e])}if(0===a.length)return;if(a.length<=50)o.push(a);else{for(o=[[],[],[],[]],i=0;i<.05*a.length;i++)o[0].push(a[i]);for(;i<.2*a.length;i++)o[1].push(a[i]);for(;i<.6*a.length;i++)o[2].push(a[i]);for(;i<a.length;i++)o[3].push(a[i])}}else{const e=await this.cacheGetObjects(r),s=Object.keys(e).sort(((e,s)=>t.__closure[e]-t.__closure[s]));for(const t of s)yield"".concat(t,"\t").concat(e[t]);if(r=r.filter((s=>!(s in e))),0===r.length)return;o.push(r)}const i=[],a=[],n=[],c=[],u=[];for(let e=0;e<o.length;e++)i.push(new TextDecoder),a.push(null),n.push(null),c.push(""),u.push(!1),this.fetch(this.requestUrlChildren,{method:"POST",headers:{...this.headers,"Content-Type":"application/json"},body:JSON.stringify({objects:JSON.stringify(o[e])})}).then((s=>{s.body.getReader&&(s.body.iterator=async function*(){const e=this.getReader();for(;;){const s=await e.read();if(s.done)return s.value;yield s.value}});const t=s.body.iterator();a[e]=t;const r=t.next().then((s=>(s.reqId=e,s)));n[e]=r}));for(;;){const e=n.filter((e=>!!e));if(0===e.length){if(u.every((e=>e)))break;await new Promise((e=>{setTimeout(e,10)}));continue}const s=await Promise.any(e);let{value:t,done:r,reqId:o}=s;if(u[o]=r,r)c[o].length>0&&(yield c[o],c[o]=""),n[o]=null;else{const e=a[o].next().then((e=>(e.reqId=o,e)));n[o]=e}if(!t)continue;t=i[o].decode(t);const l=(c[o]+t).split(/\r\n|\n|\r/),d=l.pop();c[o]=d;for(const e of l)yield e;this.cacheStoreObjects(l)}}async getRawRootObject(){const e=await this.cacheGetObjects([this.objectId]);if(e[this.objectId])return e[this.objectId];const s=await this.fetch(this.requestUrlRootObj,{headers:this.headers});if(!s.ok){if([401,403].includes(s.status))throw new o("You do not have access to the root object!");throw new o("Failed to fetch root object: ".concat(s.status," ").concat(s.statusText,")"))}const t=await s.text();return this.cacheStoreObjects(["".concat(this.objectId,"\t").concat(t)]),t}promisifyIdbRequest(e){return new Promise(((s,t)=>{e.oncomplete=e.onsuccess=()=>s(e.result),e.onabort=e.onerror=()=>t(e.error)}))}async cacheGetObjects(s){if(!this.supportsCache())return{};null===this.cacheDB&&await this.setupCacheDb();const t={};for(let r=0;r<s.length;r+=500){const o=s.slice(r,r+500),i=this.cacheDB.transaction("objects","readonly").objectStore("objects"),a=o.map((e=>this.promisifyIdbRequest(i.get(e)).then((s=>({id:e,data:s}))))),n=await Promise.all(a);for(const s of n)!s.data||e.isString(s.data)&&s.data.startsWith("<html")||(t[s.id]=s.data)}return t}async cacheStoreObjects(s){if(!this.supportsCache())return{};null===this.cacheDB&&await this.setupCacheDb();try{const t=this.cacheDB.transaction("objects","readwrite").objectStore("objects");for(const r of s){const[s,o]=r.split("\t");o&&e.isString(o)&&!o.startsWith("<html")&&t.put(o,s)}return this.promisifyIdbRequest(t.transaction)}catch(e){this.logger.error(e)}return Promise.resolve()}}module.exports=i;
|
package/dist/objectloader.esm.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"core-js/modules/es.symbol.description.js";import"core-js/modules/es.array.flat.js";import"core-js/modules/es.array.flat-map.js";import"core-js/modules/es.array.includes.js";import"core-js/modules/es.array.reduce.js";import"core-js/modules/es.array.reduce-right.js";import"core-js/modules/es.array.sort.js";import"core-js/modules/es.array.unscopables.flat.js";import"core-js/modules/es.array.unscopables.flat-map.js";import"core-js/modules/es.math.hypot.js";import"core-js/modules/es.object.from-entries.js";import"core-js/modules/es.promise.js";import"core-js/modules/es.promise.finally.js";import"core-js/modules/es.regexp.constructor.js";import"core-js/modules/es.regexp.exec.js";import"core-js/modules/es.regexp.flags.js";import"core-js/modules/es.string.replace.js";import"core-js/modules/es.typed-array.float32-array.js";import"core-js/modules/es.typed-array.float64-array.js";import"core-js/modules/es.typed-array.int8-array.js";import"core-js/modules/es.typed-array.int16-array.js";import"core-js/modules/es.typed-array.int32-array.js";import"core-js/modules/es.typed-array.uint8-array.js";import"core-js/modules/es.typed-array.uint8-clamped-array.js";import"core-js/modules/es.typed-array.uint16-array.js";import"core-js/modules/es.typed-array.uint32-array.js";import"core-js/modules/es.typed-array.from.js";import"core-js/modules/es.typed-array.of.js";import"core-js/modules/es.typed-array.set.js";import"core-js/modules/es.typed-array.sort.js";import"core-js/modules/esnext.aggregate-error.js";import"core-js/modules/esnext.array.last-index.js";import"core-js/modules/esnext.array.last-item.js";import"core-js/modules/esnext.composite-key.js";import"core-js/modules/esnext.composite-symbol.js";import"core-js/modules/esnext.global-this.js";import"core-js/modules/esnext.map.delete-all.js";import"core-js/modules/esnext.map.every.js";import"core-js/modules/esnext.map.filter.js";import"core-js/modules/esnext.map.find.js";import"core-js/modules/esnext.map.find-key.js";import"core-js/modules/esnext.map.from.js";import"core-js/modules/esnext.map.group-by.js";import"core-js/modules/esnext.map.includes.js";import"core-js/modules/esnext.map.key-by.js";import"core-js/modules/esnext.map.key-of.js";import"core-js/modules/esnext.map.map-keys.js";import"core-js/modules/esnext.map.map-values.js";import"core-js/modules/esnext.map.merge.js";import"core-js/modules/esnext.map.of.js";import"core-js/modules/esnext.map.reduce.js";import"core-js/modules/esnext.map.some.js";import"core-js/modules/esnext.map.update.js";import"core-js/modules/esnext.math.clamp.js";import"core-js/modules/esnext.math.deg-per-rad.js";import"core-js/modules/esnext.math.degrees.js";import"core-js/modules/esnext.math.fscale.js";import"core-js/modules/esnext.math.iaddh.js";import"core-js/modules/esnext.math.imulh.js";import"core-js/modules/esnext.math.isubh.js";import"core-js/modules/esnext.math.rad-per-deg.js";import"core-js/modules/esnext.math.radians.js";import"core-js/modules/esnext.math.scale.js";import"core-js/modules/esnext.math.seeded-prng.js";import"core-js/modules/esnext.math.signbit.js";import"core-js/modules/esnext.math.umulh.js";import"core-js/modules/esnext.number.from-string.js";import"core-js/modules/esnext.observable.js";import"core-js/modules/esnext.promise.all-settled.js";import"core-js/modules/esnext.promise.any.js";import"core-js/modules/esnext.promise.try.js";import"core-js/modules/esnext.reflect.define-metadata.js";import"core-js/modules/esnext.reflect.delete-metadata.js";import"core-js/modules/esnext.reflect.get-metadata.js";import"core-js/modules/esnext.reflect.get-metadata-keys.js";import"core-js/modules/esnext.reflect.get-own-metadata.js";import"core-js/modules/esnext.reflect.get-own-metadata-keys.js";import"core-js/modules/esnext.reflect.has-metadata.js";import"core-js/modules/esnext.reflect.has-own-metadata.js";import"core-js/modules/esnext.reflect.metadata.js";import"core-js/modules/esnext.set.add-all.js";import"core-js/modules/esnext.set.delete-all.js";import"core-js/modules/esnext.set.difference.js";import"core-js/modules/esnext.set.every.js";import"core-js/modules/esnext.set.filter.js";import"core-js/modules/esnext.set.find.js";import"core-js/modules/esnext.set.from.js";import"core-js/modules/esnext.set.intersection.js";import"core-js/modules/esnext.set.is-disjoint-from.js";import"core-js/modules/esnext.set.is-subset-of.js";import"core-js/modules/esnext.set.is-superset-of.js";import"core-js/modules/esnext.set.join.js";import"core-js/modules/esnext.set.map.js";import"core-js/modules/esnext.set.of.js";import"core-js/modules/esnext.set.reduce.js";import"core-js/modules/esnext.set.some.js";import"core-js/modules/esnext.set.symmetric-difference.js";import"core-js/modules/esnext.set.union.js";import"core-js/modules/esnext.string.at.js";import"core-js/modules/esnext.string.code-points.js";import"core-js/modules/esnext.string.match-all.js";import"core-js/modules/esnext.string.replace-all.js";import"core-js/modules/esnext.symbol.dispose.js";import"core-js/modules/esnext.symbol.observable.js";import"core-js/modules/esnext.symbol.pattern-match.js";import"core-js/modules/esnext.weak-map.delete-all.js";import"core-js/modules/esnext.weak-map.from.js";import"core-js/modules/esnext.weak-map.of.js";import"core-js/modules/esnext.weak-set.add-all.js";import"core-js/modules/esnext.weak-set.delete-all.js";import"core-js/modules/esnext.weak-set.from.js";import"core-js/modules/esnext.weak-set.of.js";import"core-js/modules/web.dom-collections.iterator.js";import"core-js/modules/web.immediate.js";import"core-js/modules/web.queue-microtask.js";import"core-js/modules/web.url.js";import"core-js/modules/web.url.to-json.js";import"core-js/modules/web.url-search-params.js";import{chunk as e,isString as t}from"#lodash";function s(e,t,s){return t in e?Object.defineProperty(e,t,{value:s,enumerable:!0,configurable:!0,writable:!0}):e[t]=s,e}class o extends Error{constructor(e,t){e||(e=new.target.defaultMessage),super(e,t)}}s(o,"defaultMessage","Unexpected error occurred");class r extends o{}s(r,"defaultMessage","Object loader configured incorrectly!");class i extends o{}s(i,"defaultMessage","Object loader encountered a runtime problem!");class a{constructor(e){var t;let{serverUrl:s,streamId:o,token:a,objectId:n,options:c={enableCaching:!0,fullyTraverseArrays:!1,excludeProps:[],fetch:null,customLogger:void 0,customWarner:void 0}}=e;if(this.logger=c.customLogger||console.log,this.warner=c.customWarner||console.warn,this.INTERVAL_MS=20,this.TIMEOUT_MS=18e4,this.serverUrl=s||(null===globalThis||void 0===globalThis||null===(t=globalThis.location)||void 0===t?void 0:t.origin),!this.serverUrl)throw new r("Invalid serverUrl specified!");if(this.streamId=o,this.objectId=n,!this.streamId)throw new r("Invalid streamId specified!");if(!this.objectId)throw new r("Invalid objectId specified!");this.logger("Object loader constructor called!"),this.token=a,this.headers={Accept:"text/plain"},this.token&&(this.headers.Authorization="Bearer ".concat(this.token)),this.requestUrlRootObj="".concat(this.serverUrl,"/objects/").concat(this.streamId,"/").concat(this.objectId,"/single"),this.requestUrlChildren="".concat(this.serverUrl,"/api/getobjects/").concat(this.streamId),this.promises=[],this.intervals={},this.buffer=[],this.isLoading=!1,this.totalChildrenCount=0,this.traversedReferencesCount=0,this.options=c,this.options.numConnections=this.options.numConnections||4,this.cacheDB=null,this.lastAsyncPause=Date.now(),this.existingAsyncPause=null,this.preferredFetch=c.fetch,this.fetch=function(){const e=this.preferredFetch||fetch;if(!e)throw new i("Couldn't find fetch implementation! If running in a node environment, make sure you pass it in through the constructor!");return e(...arguments)}}static createFromObjects(e){const t=e[0];return new class extends a{constructor(){super({serverUrl:"dummy",streamId:"dummy",undefined:void 0,objectId:t.id}),this.objectId=t.id}async getRootObject(){return t}async getTotalObjectCount(){return Object.keys((null==t?void 0:t.__closure)||{}).length}async*getObjectIterator(){const t=Date.now();let s=0;for await(const{id:t,obj:o}of this.getRawObjectIterator(e))this.buffer[t]=o,s+=1,yield o;this.logger("Loaded ".concat(s," objects in: ").concat((Date.now()-t)/1e3))}async*getRawObjectIterator(e){yield{id:e[0].id,obj:e[0]};if(e[0].__closure)for(const t of e)yield{id:t.id,obj:t}}}}static createFromJSON(e){const t=performance.now(),s=JSON.parse(e);return console.warn("JSON Parse Time -> ",performance.now()-t),this.createFromObjects(s)}async asyncPause(){Date.now()-this.lastAsyncPause>=100&&(this.lastAsyncPause=Date.now(),this.existingAsyncPause=new Promise((e=>setTimeout(e,0))),await this.existingAsyncPause,this.existingAsyncPause=null,Date.now()-this.lastAsyncPause>500&&this.logger("Loader Event loop lag: ",Date.now()-this.lastAsyncPause))}dispose(){this.buffer=[],this.promises=[],Object.values(this.intervals).forEach((e=>clearInterval(e.interval)))}async getTotalObjectCount(){const e=await this.getRawRootObject(),t=JSON.parse(e);return Object.keys((null==t?void 0:t.__closure)||{}).length}async getRootObject(){const e=await this.getRawRootObject();return JSON.parse(e)}async getAndConstructObject(e){await this.downloadObjectsInBuffer(e);const t=await this.getObject(this.objectId);return this.traverseAndConstruct(t,e)}async downloadObjectsInBuffer(e){let t=!0,s=0;for await(const o of this.getObjectIterator())t&&(this.totalChildrenCount=o.totalChildrenCount,t=!1,this.isLoading=!0),s++,e&&e({stage:"download",current:s,total:this.totalChildrenCount});this.isLoading=!1}async traverseAndConstruct(e,t){if(e){if("object"!=typeof e)return e;if(Array.isArray(e)&&0!==e.length){var s,o;const r=[];for(const s of e){if(!s)continue;if("object"!=typeof s&&!this.options.fullyTraverseArrays)return e;const o=s.referencedId?await this.getObject(s.referencedId):s;s.referencedId&&t&&t({stage:"construction",current:++this.traversedReferencesCount>this.totalChildrenCount?this.totalChildrenCount:this.traversedReferencesCount,total:this.totalChildrenCount}),r.push(await this.traverseAndConstruct(o,t))}return null!==(s=r[0])&&void 0!==s&&null!==(o=s.speckle_type)&&void 0!==o&&o.toLowerCase().includes("datachunk")?r.reduce(((e,t)=>e.concat(t.data)),[]):r}for(const t of this.options.excludeProps)delete e[t];for(const s in e)"object"==typeof e[s]&&null!==e[s]&&(e[s].referencedId&&(e[s]=await this.getObject(e[s].referencedId),t&&t({stage:"construction",current:++this.traversedReferencesCount>this.totalChildrenCount?this.totalChildrenCount:this.traversedReferencesCount,total:this.totalChildrenCount})),e[s]=await this.traverseAndConstruct(e[s],t));return e}}async getObject(e){if(this.buffer[e])return this.buffer[e];return new Promise(((t,s)=>{if(this.promises.push({id:e,resolve:t,reject:s}),this.intervals[e])this.intervals[e].elapsed=0;else{const t=setInterval(this.tryResolvePromise.bind(this),this.INTERVAL_MS,e);this.intervals[e]={interval:t,elapsed:0}}}))}tryResolvePromise(e){if(this.intervals[e].elapsed+=this.INTERVAL_MS,this.buffer[e]){for(const t of this.promises.filter((t=>t.id===e)))t.resolve(this.buffer[e]);return clearInterval(this.intervals[e].interval),void delete this.intervals[e]}this.intervals[e].elapsed>this.TIMEOUT_MS&&(this.warner("Timeout resolving ".concat(e,". HIC SVNT DRACONES.")),clearInterval(this.intervals[e].interval),this.promises.filter((t=>t.id===e)).forEach((e=>e.reject())),this.promises=this.promises.filter((e=>e.id!=e.id)))}async*getObjectIterator(){const e=Date.now();let t=0;for await(const e of this.getRawObjectIterator()){const{id:s,obj:o}=this.processLine(e);this.buffer[s]=o,t+=1,yield o}this.logger("Loaded ".concat(t," objects in: ").concat((Date.now()-e)/1e3))}processLine(e){const t=e.split("\t"),[s,o]=t;let r;try{r=JSON.parse(o)}catch(e){throw new Error("Error parsing object ".concat(s,": ").concat(e.message))}return{id:s,obj:r}}supportsCache(){return!(!this.options.enableCaching||!globalThis.indexedDB)}async setupCacheDb(){if(!this.supportsCache()||null!==this.cacheDB)return;await function(){if(navigator.userAgentData||!/Safari\//.test(navigator.userAgent)||/Chrom(e|ium)\//.test(navigator.userAgent)||!indexedDB.databases)return Promise.resolve();let e;return new Promise((t=>{const s=()=>indexedDB.databases().finally(t);e=setInterval(s,100),s()})).finally((()=>clearInterval(e)))}();const e=indexedDB.open("speckle-object-cache",1);e.onupgradeneeded=()=>e.result.createObjectStore("objects"),this.cacheDB=await this.promisifyIdbRequest(e)}async*getRawObjectIterator(){await this.setupCacheDb();const t=await this.getRawRootObject();yield"".concat(this.objectId,"\t").concat(t);const s=JSON.parse(t);if(!s.__closure)return;let o=Object.keys(s.__closure).filter((e=>!e.includes("blob"))).sort(((e,t)=>s.__closure[e]-s.__closure[t]));if(0===o.length)return;let r=[];if(o.length>50){const t=[[],[],[],[]];let i=0;for(;i<.05*o.length;i++)t[0].push(o[i]);for(;i<.2*o.length;i++)t[1].push(o[i]);for(;i<.6*o.length;i++)t[2].push(o[i]);for(;i<o.length;i++)t[3].push(o[i]);this.logger("Cache check for: ",t);const a=[];let n=this.cacheGetObjects(t[0]);for(let o=0;o<4;o++){const r=await n;o<3&&(n=this.cacheGetObjects(t[o+1]));const i=Object.keys(r).sort(((e,t)=>s.__closure[e]-s.__closure[t]));for(const e of i)yield"".concat(e,"\t").concat(r[e]);const c=t[o].filter((e=>!(e in r))),l=e(c,500);for(let e=0;e<l.length;e++)a.push.apply(a,l[e])}if(0===a.length)return;if(a.length<=50)r.push(a);else{for(r=[[],[],[],[]],i=0;i<.05*a.length;i++)r[0].push(a[i]);for(;i<.2*a.length;i++)r[1].push(a[i]);for(;i<.6*a.length;i++)r[2].push(a[i]);for(;i<a.length;i++)r[3].push(a[i])}}else{const e=await this.cacheGetObjects(o),t=Object.keys(e).sort(((e,t)=>s.__closure[e]-s.__closure[t]));for(const s of t)yield"".concat(s,"\t").concat(e[s]);if(o=o.filter((t=>!(t in e))),0===o.length)return;r.push(o)}const i=[],a=[],n=[],c=[],l=[];for(let e=0;e<r.length;e++)i.push(new TextDecoder),a.push(null),n.push(null),c.push(""),l.push(!1),this.fetch(this.requestUrlChildren,{method:"POST",headers:{...this.headers,"Content-Type":"application/json"},body:JSON.stringify({objects:JSON.stringify(r[e])})}).then((t=>{t.body.getReader&&(t.body.iterator=async function*(){const e=this.getReader();for(;;){const t=await e.read();if(t.done)return t.value;yield t.value}});const s=t.body.iterator();a[e]=s;const o=s.next().then((t=>(t.reqId=e,t)));n[e]=o}));for(;;){const e=n.filter((e=>!!e));if(0===e.length){if(l.every((e=>e)))break;await new Promise((e=>{setTimeout(e,10)}));continue}const t=await Promise.any(e);let{value:s,done:o,reqId:r}=t;if(l[r]=o,o)c[r].length>0&&(yield c[r],c[r]=""),n[r]=null;else{const e=a[r].next().then((e=>(e.reqId=r,e)));n[r]=e}if(!s)continue;s=i[r].decode(s);const m=(c[r]+s).split(/\r\n|\n|\r/),d=m.pop();c[r]=d;for(const e of m)yield e;this.cacheStoreObjects(m)}}async getRawRootObject(){const e=await this.cacheGetObjects([this.objectId]);if(e[this.objectId])return e[this.objectId];const t=await this.fetch(this.requestUrlRootObj,{headers:this.headers}),s=await t.text();if([401,403].includes(t.status))throw new i("You do not have access to the root object!");return this.cacheStoreObjects(["".concat(this.objectId,"\t").concat(s)]),s}promisifyIdbRequest(e){return new Promise(((t,s)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>s(e.error)}))}async cacheGetObjects(e){if(!this.supportsCache())return{};null===this.cacheDB&&await this.setupCacheDb();const s={};for(let o=0;o<e.length;o+=500){const r=e.slice(o,o+500),i=this.cacheDB.transaction("objects","readonly").objectStore("objects"),a=r.map((e=>this.promisifyIdbRequest(i.get(e)).then((t=>({id:e,data:t}))))),n=await Promise.all(a);for(const e of n)!e.data||t(e.data)&&e.data.startsWith("<html")||(s[e.id]=e.data)}return s}async cacheStoreObjects(e){if(!this.supportsCache())return{};null===this.cacheDB&&await this.setupCacheDb();try{const s=this.cacheDB.transaction("objects","readwrite").objectStore("objects");for(const o of e){const[e,r]=o.split("\t");r&&t(r)&&!r.startsWith("<html")&&s.put(r,e)}return this.promisifyIdbRequest(s.transaction)}catch(e){this.logger.error(e)}return Promise.resolve()}}export{a as default};
|
|
1
|
+
import"core-js/modules/es.symbol.description.js";import"core-js/modules/es.array.flat.js";import"core-js/modules/es.array.flat-map.js";import"core-js/modules/es.array.includes.js";import"core-js/modules/es.array.reduce.js";import"core-js/modules/es.array.reduce-right.js";import"core-js/modules/es.array.sort.js";import"core-js/modules/es.array.unscopables.flat.js";import"core-js/modules/es.array.unscopables.flat-map.js";import"core-js/modules/es.math.hypot.js";import"core-js/modules/es.object.from-entries.js";import"core-js/modules/es.promise.js";import"core-js/modules/es.promise.finally.js";import"core-js/modules/es.regexp.constructor.js";import"core-js/modules/es.regexp.exec.js";import"core-js/modules/es.regexp.flags.js";import"core-js/modules/es.string.replace.js";import"core-js/modules/es.typed-array.float32-array.js";import"core-js/modules/es.typed-array.float64-array.js";import"core-js/modules/es.typed-array.int8-array.js";import"core-js/modules/es.typed-array.int16-array.js";import"core-js/modules/es.typed-array.int32-array.js";import"core-js/modules/es.typed-array.uint8-array.js";import"core-js/modules/es.typed-array.uint8-clamped-array.js";import"core-js/modules/es.typed-array.uint16-array.js";import"core-js/modules/es.typed-array.uint32-array.js";import"core-js/modules/es.typed-array.from.js";import"core-js/modules/es.typed-array.of.js";import"core-js/modules/es.typed-array.set.js";import"core-js/modules/es.typed-array.sort.js";import"core-js/modules/esnext.aggregate-error.js";import"core-js/modules/esnext.array.last-index.js";import"core-js/modules/esnext.array.last-item.js";import"core-js/modules/esnext.composite-key.js";import"core-js/modules/esnext.composite-symbol.js";import"core-js/modules/esnext.global-this.js";import"core-js/modules/esnext.map.delete-all.js";import"core-js/modules/esnext.map.every.js";import"core-js/modules/esnext.map.filter.js";import"core-js/modules/esnext.map.find.js";import"core-js/modules/esnext.map.find-key.js";import"core-js/modules/esnext.map.from.js";import"core-js/modules/esnext.map.group-by.js";import"core-js/modules/esnext.map.includes.js";import"core-js/modules/esnext.map.key-by.js";import"core-js/modules/esnext.map.key-of.js";import"core-js/modules/esnext.map.map-keys.js";import"core-js/modules/esnext.map.map-values.js";import"core-js/modules/esnext.map.merge.js";import"core-js/modules/esnext.map.of.js";import"core-js/modules/esnext.map.reduce.js";import"core-js/modules/esnext.map.some.js";import"core-js/modules/esnext.map.update.js";import"core-js/modules/esnext.math.clamp.js";import"core-js/modules/esnext.math.deg-per-rad.js";import"core-js/modules/esnext.math.degrees.js";import"core-js/modules/esnext.math.fscale.js";import"core-js/modules/esnext.math.iaddh.js";import"core-js/modules/esnext.math.imulh.js";import"core-js/modules/esnext.math.isubh.js";import"core-js/modules/esnext.math.rad-per-deg.js";import"core-js/modules/esnext.math.radians.js";import"core-js/modules/esnext.math.scale.js";import"core-js/modules/esnext.math.seeded-prng.js";import"core-js/modules/esnext.math.signbit.js";import"core-js/modules/esnext.math.umulh.js";import"core-js/modules/esnext.number.from-string.js";import"core-js/modules/esnext.observable.js";import"core-js/modules/esnext.promise.all-settled.js";import"core-js/modules/esnext.promise.any.js";import"core-js/modules/esnext.promise.try.js";import"core-js/modules/esnext.reflect.define-metadata.js";import"core-js/modules/esnext.reflect.delete-metadata.js";import"core-js/modules/esnext.reflect.get-metadata.js";import"core-js/modules/esnext.reflect.get-metadata-keys.js";import"core-js/modules/esnext.reflect.get-own-metadata.js";import"core-js/modules/esnext.reflect.get-own-metadata-keys.js";import"core-js/modules/esnext.reflect.has-metadata.js";import"core-js/modules/esnext.reflect.has-own-metadata.js";import"core-js/modules/esnext.reflect.metadata.js";import"core-js/modules/esnext.set.add-all.js";import"core-js/modules/esnext.set.delete-all.js";import"core-js/modules/esnext.set.difference.js";import"core-js/modules/esnext.set.every.js";import"core-js/modules/esnext.set.filter.js";import"core-js/modules/esnext.set.find.js";import"core-js/modules/esnext.set.from.js";import"core-js/modules/esnext.set.intersection.js";import"core-js/modules/esnext.set.is-disjoint-from.js";import"core-js/modules/esnext.set.is-subset-of.js";import"core-js/modules/esnext.set.is-superset-of.js";import"core-js/modules/esnext.set.join.js";import"core-js/modules/esnext.set.map.js";import"core-js/modules/esnext.set.of.js";import"core-js/modules/esnext.set.reduce.js";import"core-js/modules/esnext.set.some.js";import"core-js/modules/esnext.set.symmetric-difference.js";import"core-js/modules/esnext.set.union.js";import"core-js/modules/esnext.string.at.js";import"core-js/modules/esnext.string.code-points.js";import"core-js/modules/esnext.string.match-all.js";import"core-js/modules/esnext.string.replace-all.js";import"core-js/modules/esnext.symbol.dispose.js";import"core-js/modules/esnext.symbol.observable.js";import"core-js/modules/esnext.symbol.pattern-match.js";import"core-js/modules/esnext.weak-map.delete-all.js";import"core-js/modules/esnext.weak-map.from.js";import"core-js/modules/esnext.weak-map.of.js";import"core-js/modules/esnext.weak-set.add-all.js";import"core-js/modules/esnext.weak-set.delete-all.js";import"core-js/modules/esnext.weak-set.from.js";import"core-js/modules/esnext.weak-set.of.js";import"core-js/modules/web.dom-collections.iterator.js";import"core-js/modules/web.immediate.js";import"core-js/modules/web.queue-microtask.js";import"core-js/modules/web.url.js";import"core-js/modules/web.url.to-json.js";import"core-js/modules/web.url-search-params.js";import{chunk as e,isString as t}from"#lodash";function s(e,t,s){return t in e?Object.defineProperty(e,t,{value:s,enumerable:!0,configurable:!0,writable:!0}):e[t]=s,e}class o extends Error{constructor(e,t){e||(e=new.target.defaultMessage),super(e,t)}}s(o,"defaultMessage","Unexpected error occurred");class r extends o{}s(r,"defaultMessage","Object loader configured incorrectly!");class i extends o{}s(i,"defaultMessage","Object loader encountered a runtime problem!");class a{constructor(e){var t;let{serverUrl:s,streamId:o,token:a,objectId:n,options:c={enableCaching:!0,fullyTraverseArrays:!1,excludeProps:[],fetch:null,customLogger:void 0,customWarner:void 0}}=e;if(this.logger=c.customLogger||console.log,this.warner=c.customWarner||console.warn,this.INTERVAL_MS=20,this.TIMEOUT_MS=18e4,this.serverUrl=s||(null===globalThis||void 0===globalThis||null===(t=globalThis.location)||void 0===t?void 0:t.origin),!this.serverUrl)throw new r("Invalid serverUrl specified!");if(this.streamId=o,this.objectId=n,!this.streamId)throw new r("Invalid streamId specified!");if(!this.objectId)throw new r("Invalid objectId specified!");this.logger("Object loader constructor called!"),this.token=a,this.headers={Accept:"text/plain"},this.token&&(this.headers.Authorization="Bearer ".concat(this.token)),this.requestUrlRootObj="".concat(this.serverUrl,"/objects/").concat(this.streamId,"/").concat(this.objectId,"/single"),this.requestUrlChildren="".concat(this.serverUrl,"/api/getobjects/").concat(this.streamId),this.promises=[],this.intervals={},this.buffer=[],this.isLoading=!1,this.totalChildrenCount=0,this.traversedReferencesCount=0,this.options=c,this.options.numConnections=this.options.numConnections||4,this.cacheDB=null,this.lastAsyncPause=Date.now(),this.existingAsyncPause=null,this.preferredFetch=c.fetch,this.fetch=function(){const e=this.preferredFetch||fetch;if(!e)throw new i("Couldn't find fetch implementation! If running in a node environment, make sure you pass it in through the constructor!");return e(...arguments)}}static createFromObjects(e){const t=e[0];return new class extends a{constructor(){super({serverUrl:"dummy",streamId:"dummy",undefined:void 0,objectId:t.id}),this.objectId=t.id}async getRootObject(){return t}async getTotalObjectCount(){return Object.keys((null==t?void 0:t.__closure)||{}).length}async*getObjectIterator(){const t=Date.now();let s=0;for await(const{id:t,obj:o}of this.getRawObjectIterator(e))this.buffer[t]=o,s+=1,yield o;this.logger("Loaded ".concat(s," objects in: ").concat((Date.now()-t)/1e3))}async*getRawObjectIterator(e){yield{id:e[0].id,obj:e[0]};if(e[0].__closure)for(const t of e)yield{id:t.id,obj:t}}}}static createFromJSON(e){const t=performance.now(),s=JSON.parse(e);return console.warn("JSON Parse Time -> ",performance.now()-t),this.createFromObjects(s)}async asyncPause(){Date.now()-this.lastAsyncPause>=100&&(this.lastAsyncPause=Date.now(),this.existingAsyncPause=new Promise((e=>setTimeout(e,0))),await this.existingAsyncPause,this.existingAsyncPause=null,Date.now()-this.lastAsyncPause>500&&this.logger("Loader Event loop lag: ",Date.now()-this.lastAsyncPause))}dispose(){this.buffer=[],this.promises=[],Object.values(this.intervals).forEach((e=>clearInterval(e.interval)))}async getTotalObjectCount(){const e=await this.getRootObject();return Object.keys((null==e?void 0:e.__closure)||{}).length}async getRootObject(){const e=await this.getRawRootObject();let t;try{t=JSON.parse(e)}catch(t){throw new Error('Error parsing root object. "'.concat(t.message,"\". Root object: '").concat(e,"'"))}return t}async getAndConstructObject(e){await this.downloadObjectsInBuffer(e);const t=await this.getObject(this.objectId);return this.traverseAndConstruct(t,e)}async downloadObjectsInBuffer(e){let t=!0,s=0;for await(const o of this.getObjectIterator())t&&(this.totalChildrenCount=o.totalChildrenCount,t=!1,this.isLoading=!0),s++,e&&e({stage:"download",current:s,total:this.totalChildrenCount});this.isLoading=!1}async traverseAndConstruct(e,t){if(e){if("object"!=typeof e)return e;if(Array.isArray(e)&&0!==e.length){var s,o;const r=[];for(const s of e){if(!s)continue;if("object"!=typeof s&&!this.options.fullyTraverseArrays)return e;const o=s.referencedId?await this.getObject(s.referencedId):s;s.referencedId&&t&&t({stage:"construction",current:++this.traversedReferencesCount>this.totalChildrenCount?this.totalChildrenCount:this.traversedReferencesCount,total:this.totalChildrenCount}),r.push(await this.traverseAndConstruct(o,t))}return null!==(s=r[0])&&void 0!==s&&null!==(o=s.speckle_type)&&void 0!==o&&o.toLowerCase().includes("datachunk")?r.reduce(((e,t)=>e.concat(t.data)),[]):r}for(const t of this.options.excludeProps)delete e[t];for(const s in e)"object"==typeof e[s]&&null!==e[s]&&(e[s].referencedId&&(e[s]=await this.getObject(e[s].referencedId),t&&t({stage:"construction",current:++this.traversedReferencesCount>this.totalChildrenCount?this.totalChildrenCount:this.traversedReferencesCount,total:this.totalChildrenCount})),e[s]=await this.traverseAndConstruct(e[s],t));return e}}async getObject(e){if(this.buffer[e])return this.buffer[e];return new Promise(((t,s)=>{if(this.promises.push({id:e,resolve:t,reject:s}),this.intervals[e])this.intervals[e].elapsed=0;else{const t=setInterval(this.tryResolvePromise.bind(this),this.INTERVAL_MS,e);this.intervals[e]={interval:t,elapsed:0}}}))}tryResolvePromise(e){if(this.intervals[e].elapsed+=this.INTERVAL_MS,this.buffer[e]){for(const t of this.promises.filter((t=>t.id===e)))t.resolve(this.buffer[e]);return clearInterval(this.intervals[e].interval),void delete this.intervals[e]}this.intervals[e].elapsed>this.TIMEOUT_MS&&(this.warner("Timeout resolving ".concat(e,". HIC SVNT DRACONES.")),clearInterval(this.intervals[e].interval),this.promises.filter((t=>t.id===e)).forEach((e=>e.reject())),this.promises=this.promises.filter((e=>e.id!=e.id)))}async*getObjectIterator(){const e=Date.now();let t=0;for await(const e of this.getRawObjectIterator()){const{id:s,obj:o}=this.processLine(e);this.buffer[s]=o,t+=1,yield o}this.logger("Loaded ".concat(t," objects in: ").concat((Date.now()-e)/1e3))}processLine(e){const t=e.split("\t"),[s,o]=t;let r;try{r=JSON.parse(o)}catch(e){throw new Error("Error parsing object ".concat(s,": ").concat(e.message))}return{id:s,obj:r}}supportsCache(){return!(!this.options.enableCaching||!globalThis.indexedDB)}async setupCacheDb(){if(!this.supportsCache()||null!==this.cacheDB)return;await function(){if(navigator.userAgentData||!/Safari\//.test(navigator.userAgent)||/Chrom(e|ium)\//.test(navigator.userAgent)||!indexedDB.databases)return Promise.resolve();let e;return new Promise((t=>{const s=()=>indexedDB.databases().finally(t);e=setInterval(s,100),s()})).finally((()=>clearInterval(e)))}();const e=indexedDB.open("speckle-object-cache",1);e.onupgradeneeded=()=>e.result.createObjectStore("objects"),this.cacheDB=await this.promisifyIdbRequest(e)}async*getRawObjectIterator(){await this.setupCacheDb();const t=await this.getRawRootObject();yield"".concat(this.objectId,"\t").concat(t);const s=JSON.parse(t);if(!s.__closure)return;let o=Object.keys(s.__closure).filter((e=>!e.includes("blob"))).sort(((e,t)=>s.__closure[e]-s.__closure[t]));if(0===o.length)return;let r=[];if(o.length>50){const t=[[],[],[],[]];let i=0;for(;i<.05*o.length;i++)t[0].push(o[i]);for(;i<.2*o.length;i++)t[1].push(o[i]);for(;i<.6*o.length;i++)t[2].push(o[i]);for(;i<o.length;i++)t[3].push(o[i]);this.logger("Cache check for: ",t);const a=[];let n=this.cacheGetObjects(t[0]);for(let o=0;o<4;o++){const r=await n;o<3&&(n=this.cacheGetObjects(t[o+1]));const i=Object.keys(r).sort(((e,t)=>s.__closure[e]-s.__closure[t]));for(const e of i)yield"".concat(e,"\t").concat(r[e]);const c=t[o].filter((e=>!(e in r))),l=e(c,500);for(let e=0;e<l.length;e++)a.push.apply(a,l[e])}if(0===a.length)return;if(a.length<=50)r.push(a);else{for(r=[[],[],[],[]],i=0;i<.05*a.length;i++)r[0].push(a[i]);for(;i<.2*a.length;i++)r[1].push(a[i]);for(;i<.6*a.length;i++)r[2].push(a[i]);for(;i<a.length;i++)r[3].push(a[i])}}else{const e=await this.cacheGetObjects(o),t=Object.keys(e).sort(((e,t)=>s.__closure[e]-s.__closure[t]));for(const s of t)yield"".concat(s,"\t").concat(e[s]);if(o=o.filter((t=>!(t in e))),0===o.length)return;r.push(o)}const i=[],a=[],n=[],c=[],l=[];for(let e=0;e<r.length;e++)i.push(new TextDecoder),a.push(null),n.push(null),c.push(""),l.push(!1),this.fetch(this.requestUrlChildren,{method:"POST",headers:{...this.headers,"Content-Type":"application/json"},body:JSON.stringify({objects:JSON.stringify(r[e])})}).then((t=>{t.body.getReader&&(t.body.iterator=async function*(){const e=this.getReader();for(;;){const t=await e.read();if(t.done)return t.value;yield t.value}});const s=t.body.iterator();a[e]=s;const o=s.next().then((t=>(t.reqId=e,t)));n[e]=o}));for(;;){const e=n.filter((e=>!!e));if(0===e.length){if(l.every((e=>e)))break;await new Promise((e=>{setTimeout(e,10)}));continue}const t=await Promise.any(e);let{value:s,done:o,reqId:r}=t;if(l[r]=o,o)c[r].length>0&&(yield c[r],c[r]=""),n[r]=null;else{const e=a[r].next().then((e=>(e.reqId=r,e)));n[r]=e}if(!s)continue;s=i[r].decode(s);const m=(c[r]+s).split(/\r\n|\n|\r/),d=m.pop();c[r]=d;for(const e of m)yield e;this.cacheStoreObjects(m)}}async getRawRootObject(){const e=await this.cacheGetObjects([this.objectId]);if(e[this.objectId])return e[this.objectId];const t=await this.fetch(this.requestUrlRootObj,{headers:this.headers});if(!t.ok){if([401,403].includes(t.status))throw new i("You do not have access to the root object!");throw new i("Failed to fetch root object: ".concat(t.status," ").concat(t.statusText,")"))}const s=await t.text();return this.cacheStoreObjects(["".concat(this.objectId,"\t").concat(s)]),s}promisifyIdbRequest(e){return new Promise(((t,s)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>s(e.error)}))}async cacheGetObjects(e){if(!this.supportsCache())return{};null===this.cacheDB&&await this.setupCacheDb();const s={};for(let o=0;o<e.length;o+=500){const r=e.slice(o,o+500),i=this.cacheDB.transaction("objects","readonly").objectStore("objects"),a=r.map((e=>this.promisifyIdbRequest(i.get(e)).then((t=>({id:e,data:t}))))),n=await Promise.all(a);for(const e of n)!e.data||t(e.data)&&e.data.startsWith("<html")||(s[e.id]=e.data)}return s}async cacheStoreObjects(e){if(!this.supportsCache())return{};null===this.cacheDB&&await this.setupCacheDb();try{const s=this.cacheDB.transaction("objects","readwrite").objectStore("objects");for(const o of e){const[e,r]=o.split("\t");r&&t(r)&&!r.startsWith("<html")&&s.put(r,e)}return this.promisifyIdbRequest(s.transaction)}catch(e){this.logger.error(e)}return Promise.resolve()}}export{a as default};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@speckle/objectloader",
|
|
3
|
-
"version": "2.23.
|
|
3
|
+
"version": "2.23.12",
|
|
4
4
|
"description": "Simple API helper to stream in objects from the Speckle Server.",
|
|
5
5
|
"main": "dist/objectloader.cjs",
|
|
6
6
|
"module": "dist/objectloader.esm.js",
|
|
@@ -22,9 +22,7 @@
|
|
|
22
22
|
"imports": {
|
|
23
23
|
"#lodash": {
|
|
24
24
|
"require": "lodash",
|
|
25
|
-
"import": "lodash-es"
|
|
26
|
-
"node": "lodash",
|
|
27
|
-
"default": "lodash-es"
|
|
25
|
+
"import": "lodash-es"
|
|
28
26
|
}
|
|
29
27
|
},
|
|
30
28
|
"homepage": "https://speckle.systems",
|
|
@@ -53,7 +51,7 @@
|
|
|
53
51
|
"license": "Apache-2.0",
|
|
54
52
|
"dependencies": {
|
|
55
53
|
"@babel/core": "^7.17.9",
|
|
56
|
-
"@speckle/shared": "^2.23.
|
|
54
|
+
"@speckle/shared": "^2.23.12",
|
|
57
55
|
"core-js": "^3.21.1",
|
|
58
56
|
"lodash": "^4.17.21",
|
|
59
57
|
"lodash-es": "^4.17.21",
|
package/rollup.config.js
CHANGED
|
@@ -9,6 +9,7 @@ const isProd = process.env.NODE_ENV === 'production'
|
|
|
9
9
|
const isExample = !!process.env.EXAMPLE_BUILD
|
|
10
10
|
|
|
11
11
|
const sourcemap = isProd ? false : 'inline'
|
|
12
|
+
const skipMinification = process.env.SKIP_LIBRARY_MINIFICATION === 'true'
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Build config
|
|
@@ -51,7 +52,7 @@ function buildConfig(isWebBuild = false) {
|
|
|
51
52
|
clean({ targets: 'dist/*' })
|
|
52
53
|
]),
|
|
53
54
|
babel({ babelHelpers: 'bundled' }),
|
|
54
|
-
...(isProd ? [terser()] : [])
|
|
55
|
+
...(isProd && !skipMinification ? [terser()] : [])
|
|
55
56
|
],
|
|
56
57
|
external: isWebBuild
|
|
57
58
|
? undefined
|
package/src/index.js
CHANGED
|
@@ -197,20 +197,23 @@ class ObjectLoader {
|
|
|
197
197
|
}
|
|
198
198
|
|
|
199
199
|
async getTotalObjectCount() {
|
|
200
|
-
|
|
201
|
-
const rootObjJson = await this.getRawRootObject()
|
|
202
|
-
/** Ideally we shouldn't to a `parse` here since it's going to pointlessly allocate
|
|
203
|
-
* But doing string gymnastics in order to get closure length is going to be the same
|
|
204
|
-
* if not even more memory constly
|
|
205
|
-
*/
|
|
206
|
-
const rootObj = JSON.parse(rootObjJson)
|
|
200
|
+
const rootObj = await this.getRootObject()
|
|
207
201
|
const totalChildrenCount = Object.keys(rootObj?.__closure || {}).length
|
|
208
202
|
return totalChildrenCount
|
|
209
203
|
}
|
|
210
204
|
|
|
211
205
|
async getRootObject() {
|
|
206
|
+
/** This is fine, because it gets cached */
|
|
212
207
|
const rootObjJson = await this.getRawRootObject()
|
|
213
|
-
|
|
208
|
+
let rootObj
|
|
209
|
+
try {
|
|
210
|
+
rootObj = JSON.parse(rootObjJson)
|
|
211
|
+
} catch (e) {
|
|
212
|
+
throw new Error(
|
|
213
|
+
`Error parsing root object. "${e.message}". Root object: '${rootObjJson}'`
|
|
214
|
+
)
|
|
215
|
+
}
|
|
216
|
+
return rootObj
|
|
214
217
|
}
|
|
215
218
|
|
|
216
219
|
/**
|
|
@@ -609,10 +612,15 @@ class ObjectLoader {
|
|
|
609
612
|
const cachedRootObject = await this.cacheGetObjects([this.objectId])
|
|
610
613
|
if (cachedRootObject[this.objectId]) return cachedRootObject[this.objectId]
|
|
611
614
|
const response = await this.fetch(this.requestUrlRootObj, { headers: this.headers })
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
+
if (!response.ok) {
|
|
616
|
+
if ([401, 403].includes(response.status)) {
|
|
617
|
+
throw new ObjectLoaderRuntimeError('You do not have access to the root object!')
|
|
618
|
+
}
|
|
619
|
+
throw new ObjectLoaderRuntimeError(
|
|
620
|
+
`Failed to fetch root object: ${response.status} ${response.statusText})`
|
|
621
|
+
)
|
|
615
622
|
}
|
|
623
|
+
const responseText = await response.text()
|
|
616
624
|
|
|
617
625
|
this.cacheStoreObjects([`${this.objectId}\t${responseText}`])
|
|
618
626
|
return responseText
|
package/types/index.d.ts
CHANGED
|
@@ -49,7 +49,7 @@ class ObjectLoader {
|
|
|
49
49
|
onProgress: (e: { stage: ProgressStage; current: number; total: number }) => void
|
|
50
50
|
): SpeckleObject | SpeckleObject[]
|
|
51
51
|
|
|
52
|
-
async *getObjectIterator():
|
|
52
|
+
async *getObjectIterator(): AsyncGenerator<SpeckleObject, SpeckleObject>
|
|
53
53
|
async getObject(id: string): Promise<Record<string, unknown>>
|
|
54
54
|
dispose(): void
|
|
55
55
|
}
|