@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.
@@ -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;
@@ -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.10",
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.10",
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
- /** This is fine, because it gets cached */
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
- return JSON.parse(rootObjJson)
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
- const responseText = await response.text()
613
- if ([401, 403].includes(response.status)) {
614
- throw new ObjectLoaderRuntimeError('You do not have access to the root object!')
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(): Generator<SpeckleObject, SpeckleObject>
52
+ async *getObjectIterator(): AsyncGenerator<SpeckleObject, SpeckleObject>
53
53
  async getObject(id: string): Promise<Record<string, unknown>>
54
54
  dispose(): void
55
55
  }