dome-embedded-app-sdk 0.2.4-experimental.3 → 0.2.4-experimental.4
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/dome-sdk.d.ts +2 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/dome-sdk.d.ts
CHANGED
|
@@ -297,14 +297,15 @@ export declare class CardSdk extends DomeEmbeddedAppSdk {
|
|
|
297
297
|
* Sends a deep link request to the parent directly from the card.
|
|
298
298
|
*/
|
|
299
299
|
openDeepLink(href: string): void;
|
|
300
|
-
private getRequestTokenFromUrl;
|
|
301
300
|
private deriveSecretSeed;
|
|
301
|
+
private getSeedToken;
|
|
302
302
|
private requestAf1DataFromParent;
|
|
303
303
|
private fetchAf1Data;
|
|
304
304
|
private initializeCardSdk;
|
|
305
305
|
private sendInit;
|
|
306
306
|
private getWebappDetails;
|
|
307
307
|
private sendMessageWithAck;
|
|
308
|
+
private resolvePendingAckByType;
|
|
308
309
|
protected handleMessage: (type: ClientMessageType, data: any) => void;
|
|
309
310
|
private cardsFsRead;
|
|
310
311
|
private cardsFsReadById;
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.domeSdk=t():e.domeSdk=t()}(this,(()=>(()=>{"use strict";var e={d:(t,a)=>{for(var s in a)e.o(a,s)&&!e.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:a[s]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{CardSdk:()=>h,CryptoA01:()=>s,ViewerSdk:()=>d});const a=JSON.parse('{"rE":"0.2.4-experimental.3"}');class s{constructor(){if(this.subtleCrypto=window.crypto?.subtle,!this.subtleCrypto)throw new Error("SubtleCrypto API is not available in this environment.")}async decrypt(e,t,a){try{if(!e)throw new Error("Invalid token");const s=this.base64UrlDecode(e);if(128!==s[0])throw new Error("Invalid version");s.slice(1,9);const r=s.slice(9,25),n=s.slice(25,-32),i=s.slice(-32),o=await this.deriveKey(t,a),{hmacKey:c,aesKey:d}=await this.splitKey(o),l=s.slice(0,-32);if(!new Uint8Array(await this.subtleCrypto.sign("HMAC",c,l)).every(((e,t)=>e===i[t])))throw new Error("Invalid HMAC. Token has been tampered with!");const u=await this.subtleCrypto.decrypt({name:"AES-CBC",iv:r},d,n);return(new TextDecoder).decode(u)}catch(e){throw console.log("Error in decrypt:",e),e}}async deriveKey(e,t,a=1e4){const s=new TextEncoder,r=await this.subtleCrypto.importKey("raw",s.encode(e),"PBKDF2",!1,["deriveKey"]);return this.subtleCrypto.deriveKey({name:"PBKDF2",hash:"SHA-256",salt:s.encode(t),iterations:a},r,{name:"AES-CBC",length:256},!0,["encrypt","decrypt"])}async splitKey(e){const t=new Uint8Array(await this.subtleCrypto.exportKey("raw",e));return{hmacKey:await this.subtleCrypto.importKey("raw",t.slice(0,16),{name:"HMAC",hash:"SHA-256"},!1,["sign","verify"]),aesKey:await this.subtleCrypto.importKey("raw",t.slice(16),{name:"AES-CBC"},!1,["encrypt","decrypt"])}}base64UrlDecode(e){const t=e.replace(/-/g,"+").replace(/_/g,"/"),a=atob(t);return new Uint8Array([...a].map((e=>e.charCodeAt(0))))}}var r,n,i;!function(e){e.CONNECTION_SUCCESS="CONNECTION_SUCCESS",e.INIT="INIT",e.REQUEST_SAVE="REQUEST_SAVE",e.REQUEST_CLOSE="REQUEST_CLOSE",e.REQUEST_INITIAL_DATA="REQUEST_INITIAL_DATA",e.SET_DIRTY="SET_DIRTY",e.SEND_CLOSE="SEND_CLOSE",e.SEND_EXCEPTION="SEND_EXCEPTION"}(r||(r={})),function(e){e.INIT_MESSAGE_CHANNEL="INIT_MESSAGE_CHANNEL"}(n||(n={})),function(e){e.CONNECT="CONNECT",e.REQUEST_CLOSE="REQUEST_CLOSE",e.REQUEST_SAVE="REQUEST_SAVE",e.SAVE_ERROR="SAVE_ERROR",e.SAVE_SUCCESS="SAVE_SUCCESS",e.DATA_CHANGE="DATA_CHANGE",e.FILE_DATA="FILE_DATA",e.WRITE_FILE_ACK="WRITE_FILE_ACK",e.READ_FILE_ACK="READ_FILE_ACK",e.DELETE_FILE_ACK="DELETE_FILE_ACK",e.LIST_FILES_ACK="LIST_FILES_ACK",e.INIT_ACK="INIT_ACK",e.AF1_DATA_TOKEN_ACK="AF1_DATA_TOKEN_ACK",e.ERROR="ERROR",e.REFRESH="REFRESH"}(i||(i={}));new Set("undefined"==typeof window?[]:[window.location.origin,"https://dome.so","https://spaces.intouchapp.com/","http://localhost:4200","http://localhost:4201","null"]);const o=new Set(["dome","intouchapp"]);class c{constructor(){this.targetOrigin="*",this.isAppReady=!1,this.port2=null,this.runtimeHost="unknown",this.parentHostDetails=null,this.parentCapabilities=null,this.handleDeepLinkClick=e=>{if("webapp"!==this.runtimeHost)return;if(!(e.target instanceof Element))return;const t=e.target.closest("a[href]");if(!t)return;const a=t.getAttribute("href")??"";this.emitDeepLink(a)&&e.preventDefault()},console.info(`Initializing Dome Embedded App SDK v${a.rE}`),this.detectHost(),this.setupDeepLinkInterception()}detectHost(){void 0!==window.AndroidBridge?this.runtimeHost="android":void 0!==window.webkit?this.runtimeHost="ios":this.runtimeHost="webapp",console.debug(`Detected host: ${this.runtimeHost}`)}setupDeepLinkInterception(){"webapp"===this.runtimeHost&&"undefined"!=typeof document&&document.addEventListener("click",this.handleDeepLinkClick,!0)}emitDeepLink(e){if("string"!=typeof e||""===e.trim())return console.warn("emitDeepLink called without a valid href"),!1;const t=e.split(":")[0]?.toLowerCase();return!(!t||!o.has(t))&&(this.sendMessage(l.OPEN_DEEPLINK,{url:e}),!0)}updateParentContext(e,t){if(!e&&!t)return;const a={...this.parentHostDetails??{type:this.runtimeHost},...e??{}};a.type||(a.type=this.runtimeHost);const s=t??this.parentCapabilities??a.capabilities;t&&(this.parentCapabilities=t),s?a.capabilities=s:delete a.capabilities,this.parentHostDetails=a,this.parentCapabilities=s??null,s?console.info("Host capabilities detected",{host_type:a.type,capabilities:s}):console.info("Host capabilities not found",{hostType:a.type})}getHost(){return this.parentHostDetails??{type:this.runtimeHost}}sendMessage(e,t){const a={type:e,data:t??null};switch(this.runtimeHost){case"android":window.AndroidBridge?.sendMessage(JSON.stringify(a));break;case"ios":window?.webkit?.messageHandlers?window.webkit?.messageHandlers.appHandler.postMessage(JSON.stringify(a)):console.error("webkit.messageHandlers not found");break;case"webapp":this.port2?this.port2.postMessage(a):console.error("Web connection is not established.");break;default:console.error("Unsupported host, cannot send message.")}console.debug(`Sent message to ${this.runtimeHost}:`,a)}sendAppInit(){this.isAppReady||(this.isAppReady=!0,this.sendMessage(r.INIT,{sdk:{ver:a.rE}}))}safeInvoke(e,t,a){const s=t[e];"function"==typeof s?s(a):console.warn(`Handler for '${String(e)}' is not defined.`)}setupParentConnection(){return new Promise(((e,t)=>{switch(this.runtimeHost){case"android":window.receiveFromAndroid=e=>{console.debug("Message received from Android:",e),this.handleMessage(e.type,e.data)},e();break;case"ios":window.receiveFromIOS=e=>{console.debug("Message received from iOS:",e),this.handleMessage(e.type,e.data)},e();break;case"webapp":if(this.port2)return console.warn("Connection already established. Skipping reinitialization."),void e();const s=t=>{const{type:a}=t.data||{};a===i.CONNECT&&t.ports&&t.ports.length>0&&(this.port2=t.ports[0],this.port2.onmessage=e=>this.handlePortMessage(e),window.removeEventListener("message",s),this.notifyConnectionSuccess(),e())};window.addEventListener("message",s),window.parent?window.parent.postMessage({type:n.INIT_MESSAGE_CHANNEL,data:{sdk:{ver:a.rE}}},this.targetOrigin):console.error("Parent window not available to initialize message channel.");break;default:console.error("Unknown host."),t("Unknown host")}}))}notifyConnectionSuccess(){this.sendMessage(r.CONNECTION_SUCCESS)}handlePortMessage(e){const{type:t,data:a}=e.data||{};t&&this.handleMessage(t,a)}handleMessage(e,t){throw new Error("Subclasses must implement handleMessage.")}}class d extends c{constructor(){super(),this.handler=null,this.pendingRequests=new Map,this.pendingInitAck=null}static init(e){return console.debug("init called",e&&"with handler"),d.initialized?(console.warn("ViewerSdk is already initialized. Skipping initialization."),d.instance):(d.instance||(d.instance=new d,d.instance.setupParentConnection().then((()=>{try{d.instance.initializeViewerSdk()}catch(e){console.error("Error in initializeViewerSdk:",e)}})).catch((e=>{console.error("init: Error setting up parent connection!",e),console.trace("called from:")}))),e&&d.instance.setHandler(e),d.initialized=!0,d.instance)}setHandler(e){this.handler=e,this.pendingInitAck&&(console.debug("Processing pending INIT_ACK message after handler is set."),this.safeInvoke("onInitialData",this.handler,this.pendingInitAck),this.pendingInitAck=null)}canRead(e){return!!e?.includes("r")}canWrite(e){return!!e?.includes("w")||!!e?.includes("*")}initializeViewerSdk(){console.debug("initializing viewer sdk"),this.sendAppInit()}requestInitialData(){this.sendMessage(r.REQUEST_INITIAL_DATA)}requestSave(e,t){const a=function(){if("undefined"!=typeof window&&window.crypto&&window.crypto.randomUUID)return window.crypto.randomUUID();if("undefined"!=typeof crypto&&crypto.randomUUID)return crypto.randomUUID();throw new Error("UUID generation is not supported in this environment")}();return this.sendMessage(r.REQUEST_SAVE,{doc:e,isDataDirty:t,requestId:a}),new Promise(((e,t)=>{this.pendingRequests.set(a,e),this.pendingRequests.set(a+"_reject",t),setTimeout((()=>{this.pendingRequests.has(a)&&(this.pendingRequests.delete(a),this.pendingRequests.delete(a+"_reject"))}),3e4)}))}handleOnSave(e){const{requestId:t,status:a,message:s}=e,r=this.pendingRequests.get(t),n=this.pendingRequests.get(t+"_reject");r&&("error"===a?n?.({status:a,message:s}):r({status:a,message:s}),this.pendingRequests.delete(t),this.pendingRequests.delete(t+"_reject"))}setDirty(e){this.sendMessage(r.SET_DIRTY,e)}sendClose(e,t){this.sendMessage(r.SEND_CLOSE,{doc:e,isDataDirty:t})}sendException(e){this.sendMessage(r.SEND_EXCEPTION,e)}handleMessage(e,t){if(console.debug("handleMessage called for:",e,"with data:",t),e===i.INIT_ACK&&this.updateParentContext(t?.host,t?.capabilities),this.handler)switch(e){case i.INIT_ACK:this.safeInvoke("onInitialData",this.handler,t);break;case i.DATA_CHANGE:this.safeInvoke("onDataChange",this.handler,t);break;case i.REQUEST_CLOSE:this.safeInvoke("onCloseRequest",this.handler);break;case i.REQUEST_SAVE:this.safeInvoke("onSaveRequest",this.handler);break;case i.SAVE_SUCCESS:case i.SAVE_ERROR:this.handleOnSave(t);break;default:console.warn(`No handler found for message type: ${e}`)}else e===i.INIT_ACK?(console.warn("Handler not set. Storing INIT_ACK message for later processing."),this.pendingInitAck=t):console.error("Message handler not found for type:",e)}}var l;d.initialized=!1,function(e){e.APP_READY="APP_READY",e.INIT="INIT",e.READ_FILE="READ_FILE",e.WRITE_FILE="WRITE_FILE",e.DELETE_FILE="DELETE_FILE",e.LIST_FILES="LIST_FILES",e.FILE_DIRTY="FILE_DIRTY",e.OPEN_DEEPLINK="OPEN_DEEPLINK",e.AF1_DATA_TOKEN="AF1_DATA_TOKEN"}(l||(l={}));class u{constructor(e,t){this.cardIuid=e,this.containerIuid=t,this.openPromise=null}isSupported(){return"undefined"!=typeof indexedDB}async openDb(){return this.isSupported()?(this.openPromise||(this.openPromise=new Promise((e=>{this.openWithVersion(u.DB_VERSION,e)}))),this.openPromise):null}openWithVersion(e,t){let a="ensure";const s=indexedDB.open(this.cardIuid,e);s.onupgradeneeded=e=>{a=0===(e.oldVersion||0)?"create":"ensure",this.configureStores(s.result)},s.onsuccess=()=>{const e=s.result;if(!this.hasRequiredStores(e)){const a=e.version+1;return e.close(),void this.openWithVersion(a,t)}this.updateStoresMetadata(e,"ensure"===a).catch((()=>{})).finally((()=>t(e)))},s.onerror=()=>t(null)}configureStores(e){e.objectStoreNames.contains(u.DATA_STORE)||e.createObjectStore(u.DATA_STORE),e.objectStoreNames.contains(u.NAME_LOOKUP_STORE)||e.createObjectStore(u.NAME_LOOKUP_STORE),e.objectStoreNames.contains(u.INFO_STORE)||e.createObjectStore(u.INFO_STORE)}hasRequiredStores(e){const t=e.objectStoreNames;return t.contains(u.DATA_STORE)&&t.contains(u.NAME_LOOKUP_STORE)&&t.contains(u.INFO_STORE)}static nowMicros(){return Math.trunc(1e3*Date.now())}updateStoresMetadata(e,t){return Promise.all([this.ensureStoreVersion(e,u.DATA_STORE),this.ensureStoreVersion(e,u.NAME_LOOKUP_STORE),this.updateCardInfo(e,t)]).then((()=>{}))}ensureStoreVersion(e,t){return e.objectStoreNames.contains(t)?new Promise((a=>{try{const s=e.transaction(t,"readwrite"),r=s.objectStore(t),n=()=>a();s.oncomplete=n,s.onerror=n,s.onabort=n,r.put("1.0.0",u.STORE_VERSION_KEY)}catch{a()}})):Promise.resolve()}async updateCardInfo(e,t){if(!e.objectStoreNames.contains(u.INFO_STORE))return;const a=await this.readInfoValue(e,"container_iuid"),s=t?await this.readInfoValue(e,"ts_c"):void 0,r=this.containerIuid??a??null,n=t&&s?s:u.nowMicros();await Promise.all([this.writeInfoValue(e,"container_iuid",r),this.writeInfoValue(e,"ts_c",n)]).catch((()=>{}))}readInfoValue(e,t){return new Promise((a=>{try{const s=e.transaction(u.INFO_STORE,"readonly"),r=s.objectStore(u.INFO_STORE).get(t);r.onsuccess=()=>a(r.result),r.onerror=()=>a(void 0)}catch{a(void 0)}}))}writeInfoValue(e,t,a){return new Promise((s=>{try{const r=e.transaction(u.INFO_STORE,"readwrite"),n=r.objectStore(u.INFO_STORE),i=()=>s();r.oncomplete=i,r.onerror=i,r.onabort=i,n.put(a,t)}catch{s()}}))}keyFor(e){return e}static normalizeName(e){if("string"!=typeof e)return null;const t=e.trim();return t||null}async put(e,t){const a=await this.openDb();a&&await new Promise((s=>{const r=a.transaction(u.DATA_STORE,"readwrite");r.objectStore(u.DATA_STORE).put(t,e).onsuccess=()=>s(),r.oncomplete=()=>s(),r.onerror=()=>s(),r.onabort=()=>s()}))}async get(e){const t=await this.openDb();if(t)return new Promise((a=>{const s=t.transaction(u.DATA_STORE,"readonly").objectStore(u.DATA_STORE).get(e);s.onsuccess=()=>a(s.result),s.onerror=()=>a(void 0)}))}async delete(e){const t=await this.openDb();t&&await new Promise((a=>{const s=t.transaction(u.DATA_STORE,"readwrite");s.objectStore(u.DATA_STORE).delete(e).onsuccess=()=>a(),s.oncomplete=()=>a(),s.onerror=()=>a(),s.onabort=()=>a()}))}static async hashName(e){const t="undefined"!=typeof globalThis?globalThis.crypto:void 0;if(!t?.subtle?.digest)throw new Error("CardFS name hashing requires SubtleCrypto support");const a=u.encodeText(e),s=await t.subtle.digest("SHA-256",a);return u.bufferToBase64(s)}static encodeText(e){if("undefined"!=typeof TextEncoder)return(new TextEncoder).encode(e).buffer;const t=new Uint8Array(e.length);for(let a=0;a<e.length;a++)t[a]=e.charCodeAt(a);return t.buffer}static bufferToBase64(e){let t="";const a=new Uint8Array(e);for(let e=0;e<a.length;e++)t+=String.fromCharCode(a[e]);return btoa(t)}async getIuidForName(e){const t=u.normalizeName(e);if(!t)return;const a=await this.openDb();if(!a)return;const s=await u.hashName(t);return new Promise((e=>{const t=a.transaction(u.NAME_LOOKUP_STORE,"readonly").objectStore(u.NAME_LOOKUP_STORE).get(s);t.onsuccess=()=>e(t.result),t.onerror=()=>e(void 0)}))}async upsertNameLookup(e,t){const a=u.normalizeName(e);if(!a)return;const s=await this.openDb();if(!s)return;const r=await u.hashName(a);await new Promise((e=>{const a=s.transaction(u.NAME_LOOKUP_STORE,"readwrite"),n=a.objectStore(u.NAME_LOOKUP_STORE);n.put(t,r);n.openCursor().onsuccess=e=>{const a=e.target.result;a&&(a.key!==r&&a.value===t&&a.delete(),a.continue())},a.oncomplete=()=>e(),a.onerror=()=>e(),a.onabort=()=>e()}))}async deleteNameLookupByName(e){const t=u.normalizeName(e);if(!t)return;const a=await this.openDb();if(!a)return;const s=await u.hashName(t);await new Promise((e=>{const t=a.transaction(u.NAME_LOOKUP_STORE,"readwrite");t.objectStore(u.NAME_LOOKUP_STORE).delete(s),t.oncomplete=()=>e(),t.onerror=()=>e(),t.onabort=()=>e()}))}async deleteNameLookupByIuid(e){if(!e)return;const t=await this.openDb();t&&await new Promise((a=>{const s=t.transaction(u.NAME_LOOKUP_STORE,"readwrite");s.objectStore(u.NAME_LOOKUP_STORE).openCursor().onsuccess=t=>{const a=t.target.result;a&&(a.value===e&&a.delete(),a.continue())},s.oncomplete=()=>a(),s.onerror=()=>a(),s.onabort=()=>a()}))}static estimateSize(e){if(null==e)return 0;if("undefined"!=typeof Blob&&e instanceof Blob)return e.size;if(e instanceof ArrayBuffer)return e.byteLength;if(ArrayBuffer.isView(e))return e.byteLength;if("string"==typeof e)return new Blob([e]).size;try{return new Blob([JSON.stringify(e)]).size}catch{return 0}}async cacheDocument(e,t){if(!e?.iuid)return;await this.put(this.keyFor(`${e.iuid}_object`),e);const a=u.normalizeName(e.name);if(a&&await this.upsertNameLookup(a,e.iuid),void 0===t)return void await this.delete(this.keyFor(`${e.iuid}_data`));u.estimateSize(t)<=u.MAX_DATA_BYTES?await this.put(this.keyFor(`${e.iuid}_data`),t):await this.delete(this.keyFor(`${e.iuid}_data`))}async getByName(e){const t=u.normalizeName(e);if(!t)return null;const a=await this.getIuidForName(t);if(!a)return null;const s=await this.get(this.keyFor(`${a}_object`));if(!s)return null;return{iuid:a,object:s,data:await this.get(this.keyFor(`${a}_data`))}}async getByIuid(e){if(!e)return null;const t=await this.get(this.keyFor(`${e}_object`));if(!t)return null;return{iuid:e,object:t,data:await this.get(this.keyFor(`${e}_data`))}}async deleteByName(e){const t=await this.getByName(e);await this.deleteNameLookupByName(e),t&&(await this.delete(this.keyFor(`${t.iuid}_object`)),await this.delete(this.keyFor(`${t.iuid}_data`)))}async deleteByIuid(e,t){t&&await this.deleteNameLookupByName(t),await this.deleteNameLookupByIuid(e),await this.delete(this.keyFor(`${e}_object`)),await this.delete(this.keyFor(`${e}_data`))}async getAllCachedObjects(){const e=await this.openDb();return e?new Promise((t=>{const a=[],s=e.transaction(u.DATA_STORE,"readonly").objectStore(u.DATA_STORE).openCursor();s.onsuccess=e=>{const s=e.target.result;if(!s)return void t(a);const r=s.key;"string"==typeof r&&r.endsWith("_object")&&a.push(s.value),s.continue()},s.onerror=()=>t(a)})):[]}}u.DB_VERSION=2,u.DATA_STORE="cardfs",u.NAME_LOOKUP_STORE="cardfs_name_iuid_lookup",u.INFO_STORE="info",u.STORE_VERSION_KEY="ver",u.MAX_DATA_BYTES=5242880;class h extends c{buildCardFsMessagePayload(e,t){return{...e.name?{name:e.name}:{},...e.iuid?{iuid:e.iuid}:{},...t??{}}}assertValidReadHandler(e){if(!e||"function"!=typeof e.next)throw new Error("cardFS.read requires a handler with a next() function");return e}invokeReadHandlerNext(e,t){try{e.next(t)}catch(e){console.error("cardFS.read handler next() threw",e)}}invokeReadHandlerError(e,t){if(e.error)try{e.error(t)}catch(e){console.error("cardFS.read handler error() threw",e)}}sanitizeReadData(e,t){if(null==e)return{value:e,stripped:!1};try{if(u.estimateSize(e)>u.MAX_DATA_BYTES){const e=t?` for ${t}`:"";return console.warn(`cardFS.read payload data exceeded ${u.MAX_DATA_BYTES} bytes${e}; omitting data`),{value:void 0,stripped:!0}}}catch(e){console.warn("cardFS.read payload size estimation failed",e)}return{value:e,stripped:!1}}getCardIuid(){return this.dataStore?.iuid||null}ensureCardFsCache(){if(!this.shouldUseCardFsFallback())return null;if(!this.cardFsCache){const e=this.getCardIuid();e&&(this.cardFsCache=new u(e,this.containerIuid))}return this.cardFsCache}supportsParentCardFs(){return!!this.parentCapabilities?.card_fs}shouldUseCardFsFallback(){return!this.supportsParentCardFs()}constructor(){super(),this.handler=null,this.accessToken="",this.devMode=!1,this.fsReadRequests=new Map,this.fsWriteRequests=new Map,this.cardFsCache=null,this.pendingAcks=new Map,this.handleMessage=(e,t)=>{if(e===i.INIT_ACK&&this.updateParentContext(t?.host,t?.capabilities),!this.handler)throw new Error("Message handler not found!");const a=t?.messageId;if(a&&this.pendingAcks.has(a)){const{resolve:e,timeout:s}=this.pendingAcks.get(a);return clearTimeout(s),this.pendingAcks.delete(a),void e(t)}switch(e){case i.INIT_ACK:console.debug("CardSdk: INIT_ACK received"),this.dataStore.kw1=t.key_wa1,this.dataStore.iuid=t.iuid,t?.dev_mode&&(this.devMode=t.dev_mode),t.iuid?this.shouldUseCardFsFallback()?this.cardFsCache=new u(t.iuid,this.containerIuid):this.cardFsCache=null:this.shouldUseCardFsFallback()||(this.cardFsCache=null);try{this.cryptoA01.decrypt(this.dataStore.denc,t.key_wa1+this.dataStore.kw2,t.iuid).then((e=>{console.debug("CardSdk: INIT_ACK: decrypted data ",e);const a=JSON.parse(e),s=a?.container?.iuid;s&&(this.containerIuid=s,this.shouldUseCardFsFallback()&&this.dataStore?.iuid&&(this.cardFsCache=new u(this.dataStore.iuid,this.containerIuid)));const r="string"==typeof a?.api_token?a.api_token.trim():"";r?(this.accessToken=r,console.debug("CardSdk: Stored API token from INIT_ACK payload")):console.warn("CardSdk: INIT_ACK payload missing api_token; fallback APIs may fail without auth"),this.handler&&this.safeInvoke("onInit",this.handler,{...a,ui:t.ui}),delete this.dataStore.denc})).catch((e=>{throw console.error("Final decrypt error",e),e}))}catch(e){console.error("Decryption failed!",e),this.sendEventError("dec2_failed",e.message)}break;case i.FILE_DATA:{const e=t?.messageId;if(e&&this.fsReadRequests.has(e)){const{messageId:a,...s}=t||{};return void this.handleFsReadDataMessage(e,s)}console.warn("CardSdk: FILE_DATA received but no matching fsRead request",t?.messageId??t?.name);break}case i.DATA_CHANGE:this.safeInvoke("onFileChange",this.handler,t);case i.SAVE_SUCCESS:{const e=t?.messageId;if(e&&this.fsWriteRequests.has(e))return void this.handleFsWriteSuccess(e,t);console.warn("CardSdk: SAVE_SUCCESS received but no matching fsWrite request",t?.messageId??t?.name);break}case i.SAVE_ERROR:{const e=t?.messageId;if(e&&this.fsWriteRequests.has(e))return void this.handleFsWriteError(e,t);console.warn("CardSdk: SAVE_ERROR received but no matching fsWrite request",t?.messageId??t?.name);break}case i.ERROR:{const e=t?.messageId;if(e){const a=t?.message||"Unknown error";if(this.fsReadRequests.has(e))return void this.failFsReadRequest(e,new Error(a));if(this.fsWriteRequests.has(e))return void this.failFsWriteRequest(e,new Error(a))}this.safeInvoke("onError",this.handler,t);break}case i.REFRESH:this.safeInvoke("onRefreshRequest",this.handler,t);break;default:console.warn(`No handler found for message type: ${e}`)}},this.cryptoA01=new s,this.cardFS={read:(e,t,a=!0)=>{this.cardsFsRead(e,t,a)},readById:(e,t,a=!0)=>{this.cardsFsReadById(e,t,a)},write:(e,t,a)=>this.cardsFsWrite(e,t,a),writeById:(e,t,a)=>this.cardsFsWriteById(e,t,a),delete:(e,t)=>this.cardsFsDelete(e,t),deleteById:(e,t)=>this.cardsFsDeleteById(e,t),list:e=>this.cardsFsList(e)},console.debug("CardSdk::constructor: done")}static async init(e,t,a){try{return console.debug("CardSdk::init"),h.instance?h.instance:(h.instance=new h,h.instance.setupParentConnection().then((()=>{h.instance.initializeCardSdk(e)})).catch((e=>{console.error(e)})),t&&h.instance.setHandler(t),h.instance)}catch(e){throw console.error("CardSdk: Unrecoverable error in init",e),e}}setHandler(e){this.handler=e}openDeepLink(e){this.emitDeepLink(e)||console.warn("openDeepLink ignored; provide a dome:// or intouchapp:// href")}getRequestTokenFromUrl(e){const t=e.pathname.split("/wa/");if(t.length<2||!t[1])throw new Error("Invalid URL: missing /wa/ segment");const a=t[1].split("/")[0];if(!a)throw new Error("Invalid URL: missing request token");return decodeURIComponent(a)}deriveSecretSeed(e){const t=e.split("").reverse().join("").substring(4,25);if(!t)throw new Error("Cannot decrypt (1)");return t}async requestAf1DataFromParent(e){const t=await this.sendMessageWithAck(l.AF1_DATA_TOKEN,{sdk:{ver:a.rE}},i.AF1_DATA_TOKEN_ACK),{messageId:s,...r}=t||{},{cie:n,ck:o,dev_token:c}=r;if(!n||!o||!c)throw new Error("Invalid AF1 data token payload");const d=await this.fetchAf1Data(n,o,c,e),u=d?.data.data_af1;if(!u)throw new Error("AF1 data fetch returned empty payload");return window.IT_DATA_AF1=u,u}async fetchAf1Data(e,t,a,s){if(!(e&&t&&a&&s))throw new Error("Invalid AF1 data fetch parameters");const r=new URL(`https://dome.so/api/v1/cards/e/${encodeURIComponent(e)}/data_af1/`);r.searchParams.set("dt",a),r.searchParams.set("rt",s),r.searchParams.set("ck",t);const n=await fetch(r.toString(),{method:"GET"});if(!n.ok){const e=await n.text().catch((()=>n.statusText));throw new Error(`AF1 data fetch failed: ${n.status} ${e}`)}return n.json()}async initializeCardSdk(e){let t="CardSdk::initializeCardSdk:";try{if(console.debug(t,"enter"),!e)throw new Error("Invalid secret");const a=window.location.href;console.debug(t,"url:",a);const s=new URL(a),r=this.getRequestTokenFromUrl(s),n=this.deriveSecretSeed(r);console.debug(t,"ss:",n);let i=window.IT_DATA_AF1;if(i||(console.debug(t,"IT_DATA_AF1 missing. Requesting token via parent"),i=await this.requestAf1DataFromParent(r)),!i)throw console.error(t,"No data"),new Error("No data");const o=await this.cryptoA01.decrypt(i,e,n);try{const e=JSON.parse(o);if(console.debug("CardSdk: dataFromServer:",e),!e.ite)throw new Error("Invalid data");this.dataStore={denc:e.d,kw2:e.kw2},h.instance.sendInit(e.ite)}catch(e){throw console.error("Initial Decryption failed (2):",e),e}}catch(e){console.error(t,"Init failed:",e),this.sendEventError("init_failed",e.message)}}async sendInit(e){const t={token:e,sdk:{ver:a.rE}},s=this.getWebappDetails();s&&(t.wa=s),this.sendMessage(l.INIT,t)}getWebappDetails(){if("undefined"==typeof window)return null;let e={};const t=window.IT_VERSION,a=window.IT_ENV;return t&&(e.ver=String(t)),a&&(e.env=String(a)),Object.keys(e).length?e:null}sendMessageWithAck(e,t,a,s=15e3,r){const n=crypto.randomUUID();if(r)try{r(n)}catch(e){return Promise.reject(e)}return new Promise(((r,i)=>{const o=setTimeout((()=>{this.pendingAcks.delete(n),i(new Error(`${a} not received in time`))}),s);this.pendingAcks.set(n,{resolve:r,reject:i,timeout:o}),this.sendMessage(e,{...t,messageId:n})}))}cardsFsRead(e,t,a=!0){const s={name:e},r=this.assertValidReadHandler(t);this.cardsFsReadInternal(s,r,a,"read")}cardsFsReadById(e,t,a=!0){const s={iuid:e},r=this.assertValidReadHandler(t);this.cardsFsReadInternal(s,r,a,"readById")}cardsFsReadInternal(e,t,a,s){if(this.shouldUseCardFsFallback())return console.debug(`cardFS.${s} using fallback implementation for`,e),void this.cardsFsReadFallback(e,void 0,t,a).catch((e=>{const a=e instanceof Error?e:new Error(String(e));this.invokeReadHandlerError(t,a)}));console.debug(`cardFS.${s} delegating to parent for`,e);let r=null;const n=e.name?`"${e.name}"`:e.iuid?`iuid ${e.iuid}`:"document";this.sendMessageWithAck(l.READ_FILE,this.buildCardFsMessagePayload(e,{allow_stale:a}),i.READ_FILE_ACK,h.CARD_FS_ACK_TIMEOUT_MS,(e=>{r=e;const i={name:n,handler:t,allowStale:a};i.noResponseTimeout=setTimeout((()=>{this.failFsReadRequest(e,new Error(`cardFS.${s} timed out for ${n}`))}),h.FS_RESPONSE_TIMEOUT_MS),this.fsReadRequests.set(e,i)})).catch((e=>{const a=e instanceof Error?e:new Error(String(e));r?this.failFsReadRequest(r,a):this.invokeReadHandlerError(t,a)}))}cardsFsWrite(e,t,a){const s={name:e};return this.cardsFsWriteInternal(s,t,a,"write")}cardsFsWriteById(e,t,a){const s={iuid:e};return this.cardsFsWriteInternal(s,t,a,"writeById")}cardsFsWriteInternal(e,t,a,s){return this.shouldUseCardFsFallback()?(console.debug(`cardFS.${s} using fallback implementation for`,e),this.cardsFsWriteFallback(e,t).then((e=>{try{a?.(e)}catch(e){console.error(`cardFS.${s} fallback callback threw`,e)}return e}))):(console.debug(`cardFS.${s} delegating to parent for`,e),new Promise(((r,n)=>{let o=null;const c=e.name?`"${e.name}"`:e.iuid?`iuid ${e.iuid}`:"document";this.sendMessageWithAck(l.WRITE_FILE,this.buildCardFsMessagePayload(e,{data:t}),i.WRITE_FILE_ACK,h.CARD_FS_ACK_TIMEOUT_MS,(e=>{o=e;const t={name:c,onResult:a,resolve:r,reject:n,timeout:setTimeout((()=>{this.failFsWriteRequest(e,new Error(`cardFS.${s} timed out for ${c}`))}),h.FS_RESPONSE_TIMEOUT_MS)};this.fsWriteRequests.set(e,t)})).catch((e=>{const t=e instanceof Error?e:new Error(String(e));o?this.failFsWriteRequest(o,t):n(t)}))})))}cardsFsDelete(e,t){const a={name:e};return this.cardsFsDeleteInternal(a,t,"delete")}cardsFsDeleteById(e,t){const a={iuid:e};return this.cardsFsDeleteInternal(a,t,"deleteById")}cardsFsDeleteInternal(e,t,a){return this.shouldUseCardFsFallback()?(console.debug(`cardFS.${a} using fallback implementation for`,e),this.cardsFsDeleteFallback(e).then((e=>{try{t?.(e)}catch(e){console.error(`cardFS.${a} fallback callback threw`,e)}return e}))):(console.debug(`cardFS.${a} delegating to parent for`,e),new Promise(((a,s)=>{this.sendMessageWithAck(l.DELETE_FILE,this.buildCardFsMessagePayload(e),i.DELETE_FILE_ACK,h.CARD_FS_ACK_TIMEOUT_MS).then((e=>{const{messageId:s,...r}=e||{};t?.(r),a(r)})).catch((e=>{s(e instanceof Error?e:new Error(String(e)))}))})))}cardsFsList(e){return this.shouldUseCardFsFallback()?(console.debug("cardFS.list using fallback implementation"),this.cardsFsListFallback().then((t=>{try{e?.(t)}catch(e){console.error("cardFS.list fallback callback threw",e)}return t}))):(console.debug("cardFS.list delegating to parent"),new Promise(((t,a)=>{this.sendMessageWithAck(l.LIST_FILES,{},i.LIST_FILES_ACK,h.CARD_FS_ACK_TIMEOUT_MS).then((a=>{const{messageId:s,...r}=a||{};e?.(r),t(r)})).catch((e=>{a(e instanceof Error?e:new Error(String(e)))}))})))}handleFsReadDataMessage(e,t){const a=this.fsReadRequests.get(e);if(!a)return;a.noResponseTimeout&&(clearTimeout(a.noResponseTimeout),a.noResponseTimeout=void 0);const s=this.sanitizeReadData(t?.data,a.name),r=Boolean(t?.from_cache??t?.is_stale),n={name:t?.name,iuid:t?.iuid??null,object:t?.object,data:s.value,is_stale:Boolean(t?.is_stale??t?.from_cache),is_complete:"boolean"==typeof t?.is_complete?t.is_complete:!a.allowStale||!r};this.invokeReadHandlerNext(a.handler,n),a.cleanupTimeout&&clearTimeout(a.cleanupTimeout),a.cleanupTimeout=setTimeout((()=>{this.clearFsReadRequest(e)}),h.FS_READ_RETENTION_MS)}clearFsReadRequest(e){const t=this.fsReadRequests.get(e);if(t)return t.noResponseTimeout&&clearTimeout(t.noResponseTimeout),t.cleanupTimeout&&clearTimeout(t.cleanupTimeout),this.fsReadRequests.delete(e),t}failFsReadRequest(e,t){const a=this.clearFsReadRequest(e);a&&this.invokeReadHandlerError(a.handler,t)}clearFsWriteRequest(e){const t=this.fsWriteRequests.get(e);if(t)return clearTimeout(t.timeout),this.fsWriteRequests.delete(e),t}failFsWriteRequest(e,t){const a=this.clearFsWriteRequest(e);a&&a.reject(t)}handleFsWriteSuccess(e,t){const a=this.clearFsWriteRequest(e);if(!a)return;const{messageId:s,...r}=t||{};if("function"==typeof a.onResult)try{a.onResult(r)}catch(e){console.error("cardFS.write callback threw",e)}else console.warn("onResult method invalid:",a.onResult);a.resolve(r)}handleFsWriteError(e,t){const a=this.clearFsWriteRequest(e);if(!a)return;const s=t instanceof Error?t:new Error(t?.message||"Unknown write error");a.reject(s)}async cardsFsReadFallback(e,t,a,s=!0){if(!this.shouldUseCardFsFallback())throw new Error("cardFS.read fallback is disabled because parent supports card_fs");const r=this.getCardIuid();if(!r)throw new Error("cardFS.read fallback failed: card not initialized");const n=this.ensureCardFsCache();let i=null;const o=e.name?`"${e.name}"`:e.iuid?`iuid ${e.iuid}`:"document",c=(s,r,n,o,c,d)=>{if(!s)return null;const l=c??e.name??s?.name??e.iuid??"document",u=d??s?.iuid??e.iuid??null,{value:h}=this.sanitizeReadData(r,l),f={name:l,iuid:u,object:s,data:h,is_stale:n,is_complete:o};return t&&this.fsReadRequests.has(t)?this.handleFsReadDataMessage(t,f):this.invokeReadHandlerNext(a,f),i||(i=f),f};let d=null;if(n)try{if(s){let t=null;e.iuid&&(t=await n.getByIuid(e.iuid)),!t&&e.name&&(t=await n.getByName(e.name)),t?.object&&(d=c(t.object,t.data,!0,!1,t.object?.name??e.name,t.iuid))}}catch(e){console.warn("cardFS.read cache lookup failed",e)}try{const t=await this.fetchDocumentPayload(r,e);t?(await(n?.cacheDocument(t.object,t.data)),c(t.object,t.data,!1,!0,t.object?.name,t.object?.iuid)):s&&d&&c(d.object,d.data,!0,!0,d.name,d.iuid??void 0)}catch(e){if(!i){throw e instanceof Error?e:new Error(String(e))}console.warn("cardFS.read fresh fetch failed",e),s&&d&&c(d.object,d.data,!0,!0,d.name,d.iuid??void 0)}if(!i)throw new Error(`cardFS.read fallback could not locate ${o}`)}async cardsFsWriteFallback(e,t,a){if(!this.shouldUseCardFsFallback())throw new Error("cardFS.write fallback is disabled because parent supports card_fs");const s=this.getCardIuid();if(!s)throw new Error("cardFS.write fallback failed: card not initialized");console.debug("cardFS.write fallback invoked for target",e),await this.upsertDocumentViaApi(s,e,t);const r=await this.fetchDocumentPayload(s,e);await(this.ensureCardFsCache()?.cacheDocument(r.object,r.data));const n={name:r.object?.name??e.name??null,iuid:r.object?.iuid??e.iuid??null,object:r.object,data:r.data};return a&&this.fsWriteRequests.has(a)&&this.handleFsWriteSuccess(a,n),n}async cardsFsDeleteFallback(e){if(!this.shouldUseCardFsFallback())throw new Error("cardFS.delete fallback is disabled because parent supports card_fs");const t=this.getCardIuid();if(!t)throw new Error("cardFS.delete fallback failed: card not initialized");console.debug("cardFS.delete fallback invoked for target",e);const a=this.ensureCardFsCache(),s=await this.fetchDocumentMetadataByTarget(t,e).catch((()=>null)),r=s?.iuid??e.iuid??null,n=s?.name??e.name??null;if(!r)return e.name&&await(a?.deleteByName(e.name)),{name:n,iuid:null,deleted:!1};const i=await fetch(`/api/v1/documents/${r}/`,{method:"DELETE",headers:this.authHeader()});if(!i.ok&&404!==i.status){const e=await i.text().catch((()=>"delete failed"));throw new Error(`cardFS.delete fallback failed: ${e}`)}await(a?.deleteByIuid(r,n??void 0));return{name:n??r,iuid:r,deleted:404!==i.status}}async cardsFsListFallback(){if(!this.shouldUseCardFsFallback())throw new Error("cardFS.list fallback is disabled because parent supports card_fs");const e=this.getCardIuid();if(!e)throw new Error("cardFS.list fallback failed: card not initialized");const t=this.ensureCardFsCache();try{const a=await this.fetchAllDocuments(e);if(t)for(const e of a)await t.cacheDocument(e,void 0);return{documents:a,from_cache:!1}}catch(e){const a=await(t?.getAllCachedObjects());if(a&&a.length>0)return{documents:a,from_cache:!0};throw e}}authHeader(){return this.accessToken?{Authorization:`Bearer ${this.accessToken}`}:{}}jsonHeaders(){return{...this.authHeader(),"Content-Type":"application/json"}}async fetchDocumentMetadataByTarget(e,t){return t.iuid?this.fetchDocumentMetadataByIuid(t.iuid):t.name?this.fetchDocumentMetadataByName(e,t.name):null}async fetchDocumentMetadataByIuid(e){const t=await fetch(`/api/v1/documents/${e}/`,{method:"GET",headers:this.authHeader()});if(404===t.status)return null;if(!t.ok){const e=await t.text().catch((()=>"metadata lookup failed"));throw new Error(`cardFS metadata fetch failed: ${e}`)}return t.json().catch((()=>null))}normalizeDocumentsResponse(e){return Array.isArray(e?.results)?e.results:Array.isArray(e)?e:e?[e]:[]}extractHttpErrorMessage(e,t){if(!e)return t;if("string"==typeof e)return e;if(e instanceof Error&&e.message)return e.message;const a=e?.error??e;return a instanceof Blob?t:"string"==typeof a?a:a?.detail?a.detail:a?.message?a.message:"string"==typeof a?.statusText&&a.statusText.trim()?a.statusText:t}async fetchDocumentMetadataByName(e,t){if(!t)return null;const a=await fetch(`/api/v1/documents/with_card/${e}/?name=${encodeURIComponent(t)}`,{method:"GET",headers:this.authHeader()});if(!a.ok){if(404===a.status)return null;const e=await a.text().catch((()=>"metadata lookup failed"));throw new Error(`cardFS metadata fetch failed: ${e}`)}const s=await a.json().catch((()=>null)),r=this.normalizeDocumentsResponse(s);return r.find((e=>e?.name===t))??r[0]??null}async fetchAllDocuments(e){const t=await fetch(`/api/v1/documents/with_card/${e}/`,{method:"GET",headers:this.authHeader()});if(!t.ok){const e=await t.text().catch((()=>"list failed"));throw new Error(`cardFS.list failed: ${e}`)}const a=await t.json().catch((()=>null));return this.normalizeDocumentsResponse(a)}async fetchDocumentPayload(e,t){const a="string"==typeof t?{name:t}:t,s=await this.fetchDocumentMetadataByTarget(e,a);if(!s){const e=a.name?`"${a.name}"`:a.iuid?`iuid ${a.iuid}`:"document";throw new Error(`cardFS document not found: ${e}`)}return{object:s,data:await this.fetchDocumentData(s)}}async fetchDocumentData(e){if(void 0!==e?.data)return e.data;const t=e?.orig?.url||e?.url?.original||e?.url;if(!t||"string"!=typeof t)return null;const a=await fetch(t);if(!a.ok){const e=await a.text().catch((()=>"download failed"));throw new Error(`cardFS data fetch failed: ${e}`)}const s=a.headers.get("Content-Type")||"";return s.includes("application/json")?a.json():s.startsWith("text/")?a.text():a.arrayBuffer()}async buildFileFormData(e,t){let a;const s=e=>{if(e instanceof ArrayBuffer)return new Blob([e.slice(0)],{type:"application/octet-stream"});if("undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer){const t=new Uint8Array(e),a=new Uint8Array(t.length);return a.set(t),new Blob([a.buffer],{type:"application/octet-stream"})}if(ArrayBuffer.isView(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),a=new Uint8Array(t.length);return a.set(t),new Blob([a.buffer],{type:"application/octet-stream"})}const t=new Uint8Array(e),a=new Uint8Array(t.length);return a.set(t),new Blob([a.buffer],{type:"application/octet-stream"})};if(t instanceof File)a=t;else if("undefined"!=typeof Blob&&t instanceof Blob)a=new File([t],e,{type:t.type||"application/octet-stream"});else if("undefined"!=typeof SharedArrayBuffer&&t instanceof SharedArrayBuffer){const r=s(t);a=new File([r],e,{type:r.type})}else if(t instanceof ArrayBuffer){const r=s(t);a=new File([r],e,{type:r.type})}else if(ArrayBuffer.isView(t)){const r=s(t);a=new File([r],e,{type:r.type})}else if("string"==typeof t){const s=new Blob([t],{type:"text/plain"});a=new File([s],e,{type:s.type})}else{const s=JSON.stringify(t??{}),r=new Blob([s],{type:"application/json"});a=new File([r],e,{type:r.type})}const r=new FormData;return r.append("file",a),r}async upsertDocumentViaApi(e,t,a){const s=await this.buildFileFormData(t.name??t.iuid??"document",a);if(t.iuid){const e=await fetch(`/api/v1/documents/${t.iuid}/`,{method:"PUT",headers:this.authHeader(),body:s});if(!e.ok){const t=await e.text().catch((()=>"update failed"));throw new Error(`cardFS.write update failed: ${t}`)}return}const r=t.name?await this.fetchDocumentMetadataByName(e,t.name).catch((()=>null)):null;if(r?.iuid){const e=await fetch(`/api/v1/documents/${r.iuid}/`,{method:"PUT",headers:this.authHeader(),body:s});if(!e.ok){const t=await e.text().catch((()=>"update failed"));throw new Error(`cardFS.write update failed: ${t}`)}return}const n=await fetch("/api/v1/documents/",{method:"POST",headers:this.authHeader(),body:s});if(!n.ok){const e=await n.text().catch((()=>"upload failed"));throw new Error(`cardFS.write upload failed: ${e}`)}const i=await n.json().catch((()=>null)),o=Array.isArray(i?.results)?i.results[0]:i,c=o?.iuid;if(!c)throw new Error("cardFS.write upload failed: missing document iuid");const d=await fetch(`/api/v1/documents/with_card/${e}/`,{method:"POST",headers:this.jsonHeaders(),body:JSON.stringify({documents:[c]})});if(!d.ok){const e=await d.text().catch((()=>"attach failed"));throw new Error(`cardFS.write attach failed: ${e}`)}}async getDocumentAttachedToCard(e,t="default"){const a=new URL(`/api/v1/documents/attached_to/${e}/`);a.searchParams.set("name",t);const s=await fetch(a.toString(),{method:"GET",headers:{Authorization:`Bearer ${this.accessToken||""}`,"Content-Type":"application/json"}});if(!s.ok){const e=await s.text();throw new Error(`Fetch failed: ${e}`)}return s.json()}async postDocumentAttachedToCard(e,t){const a=await fetch(`/api/v1/documents/attached_to/${e}/`,{method:"POST",headers:{Authorization:`Bearer ${this.accessToken||""}`,"Content-Type":"application/json"},body:JSON.stringify(t)});if(!a.ok){const e=await a.text();throw new Error(`Post failed: ${e}`)}return a.json()}async getCardDocument(e,t){const a=await fetch(`/api/v1/documents/with_card/${e}/?name=${t}`,{method:"GET",headers:{Authorization:`Bearer ${this.accessToken||""}`,"Content-Type":"application/json"}});return await a.json()}formatErrorMessage(e){if("string"==typeof e&&e.trim())return e;if(e instanceof Error)return e.message||e.toString();if(e&&"object"==typeof e){if("string"==typeof e.message)return e.message;try{return JSON.stringify(e)}catch{return Object.prototype.toString.call(e)}}return null!=e?String(e):"Unknown error"}sendEventError(e,t,a=void 0){const s={message:this.formatErrorMessage(t),error_code:e,data:a??null};this.handler&&this.safeInvoke("onError",this.handler,s)}setFileDirty(e){this.sendMessage(l.FILE_DIRTY,e)}getUsername(e){const t=e?.name;return t&&Object.values(t).some((e=>e))?function(e){const{prefix:t="",given:a="",middle:s="",family:r="",suffix:n=""}=e||{};return[t,a,s,r,n].filter((e=>e)).join(" ").trim()}(t):""}}return h.FS_RESPONSE_TIMEOUT_MS=3e4,h.FS_READ_RETENTION_MS=5e3,h.CARD_FS_ACK_TIMEOUT_MS=5e3,t})()));
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.domeSdk=t():e.domeSdk=t()}(this,(()=>(()=>{"use strict";var e={d:(t,a)=>{for(var s in a)e.o(a,s)&&!e.o(t,s)&&Object.defineProperty(t,s,{enumerable:!0,get:a[s]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{CardSdk:()=>h,CryptoA01:()=>s,ViewerSdk:()=>d});const a=JSON.parse('{"rE":"0.2.4-experimental.4"}');class s{constructor(){if(this.subtleCrypto=window.crypto?.subtle,!this.subtleCrypto)throw new Error("SubtleCrypto API is not available in this environment.")}async decrypt(e,t,a){try{if(!e)throw new Error("Invalid token");const s=this.base64UrlDecode(e);if(128!==s[0])throw new Error("Invalid version");s.slice(1,9);const r=s.slice(9,25),n=s.slice(25,-32),i=s.slice(-32),o=await this.deriveKey(t,a),{hmacKey:c,aesKey:d}=await this.splitKey(o),l=s.slice(0,-32);if(!new Uint8Array(await this.subtleCrypto.sign("HMAC",c,l)).every(((e,t)=>e===i[t])))throw new Error("Invalid HMAC. Token has been tampered with!");const u=await this.subtleCrypto.decrypt({name:"AES-CBC",iv:r},d,n);return(new TextDecoder).decode(u)}catch(e){throw console.log("Error in decrypt:",e),e}}async deriveKey(e,t,a=1e4){const s=new TextEncoder,r=await this.subtleCrypto.importKey("raw",s.encode(e),"PBKDF2",!1,["deriveKey"]);return this.subtleCrypto.deriveKey({name:"PBKDF2",hash:"SHA-256",salt:s.encode(t),iterations:a},r,{name:"AES-CBC",length:256},!0,["encrypt","decrypt"])}async splitKey(e){const t=new Uint8Array(await this.subtleCrypto.exportKey("raw",e));return{hmacKey:await this.subtleCrypto.importKey("raw",t.slice(0,16),{name:"HMAC",hash:"SHA-256"},!1,["sign","verify"]),aesKey:await this.subtleCrypto.importKey("raw",t.slice(16),{name:"AES-CBC"},!1,["encrypt","decrypt"])}}base64UrlDecode(e){const t=e.replace(/-/g,"+").replace(/_/g,"/"),a=atob(t);return new Uint8Array([...a].map((e=>e.charCodeAt(0))))}}var r,n,i;!function(e){e.CONNECTION_SUCCESS="CONNECTION_SUCCESS",e.INIT="INIT",e.REQUEST_SAVE="REQUEST_SAVE",e.REQUEST_CLOSE="REQUEST_CLOSE",e.REQUEST_INITIAL_DATA="REQUEST_INITIAL_DATA",e.SET_DIRTY="SET_DIRTY",e.SEND_CLOSE="SEND_CLOSE",e.SEND_EXCEPTION="SEND_EXCEPTION"}(r||(r={})),function(e){e.INIT_MESSAGE_CHANNEL="INIT_MESSAGE_CHANNEL"}(n||(n={})),function(e){e.CONNECT="CONNECT",e.REQUEST_CLOSE="REQUEST_CLOSE",e.REQUEST_SAVE="REQUEST_SAVE",e.SAVE_ERROR="SAVE_ERROR",e.SAVE_SUCCESS="SAVE_SUCCESS",e.DATA_CHANGE="DATA_CHANGE",e.FILE_DATA="FILE_DATA",e.WRITE_FILE_ACK="WRITE_FILE_ACK",e.READ_FILE_ACK="READ_FILE_ACK",e.DELETE_FILE_ACK="DELETE_FILE_ACK",e.LIST_FILES_ACK="LIST_FILES_ACK",e.INIT_ACK="INIT_ACK",e.AF1_DATA_TOKEN_ACK="AF1_DATA_TOKEN_ACK",e.ERROR="ERROR",e.REFRESH="REFRESH"}(i||(i={}));new Set("undefined"==typeof window?[]:[window.location.origin,"https://dome.so","https://spaces.intouchapp.com/","http://localhost:4200","http://localhost:4201","null"]);const o=new Set(["dome","intouchapp"]);class c{constructor(){this.targetOrigin="*",this.isAppReady=!1,this.port2=null,this.runtimeHost="unknown",this.parentHostDetails=null,this.parentCapabilities=null,this.handleDeepLinkClick=e=>{if("webapp"!==this.runtimeHost)return;if(!(e.target instanceof Element))return;const t=e.target.closest("a[href]");if(!t)return;const a=t.getAttribute("href")??"";this.emitDeepLink(a)&&e.preventDefault()},console.info(`Initializing Dome Embedded App SDK v${a.rE}`),this.detectHost(),this.setupDeepLinkInterception()}detectHost(){void 0!==window.AndroidBridge?this.runtimeHost="android":void 0!==window.webkit?this.runtimeHost="ios":this.runtimeHost="webapp",console.debug(`Detected host: ${this.runtimeHost}`)}setupDeepLinkInterception(){"webapp"===this.runtimeHost&&"undefined"!=typeof document&&document.addEventListener("click",this.handleDeepLinkClick,!0)}emitDeepLink(e){if("string"!=typeof e||""===e.trim())return console.warn("emitDeepLink called without a valid href"),!1;const t=e.split(":")[0]?.toLowerCase();return!(!t||!o.has(t))&&(this.sendMessage(l.OPEN_DEEPLINK,{url:e}),!0)}updateParentContext(e,t){if(!e&&!t)return;const a={...this.parentHostDetails??{type:this.runtimeHost},...e??{}};a.type||(a.type=this.runtimeHost);const s=t??this.parentCapabilities??a.capabilities;t&&(this.parentCapabilities=t),s?a.capabilities=s:delete a.capabilities,this.parentHostDetails=a,this.parentCapabilities=s??null,s?console.info("Host capabilities detected",{host_type:a.type,capabilities:s}):console.info("Host capabilities not found",{hostType:a.type})}getHost(){return this.parentHostDetails??{type:this.runtimeHost}}sendMessage(e,t){const a={type:e,data:t??null};switch(this.runtimeHost){case"android":window.AndroidBridge?.sendMessage(JSON.stringify(a));break;case"ios":window?.webkit?.messageHandlers?window.webkit?.messageHandlers.appHandler.postMessage(JSON.stringify(a)):console.error("webkit.messageHandlers not found");break;case"webapp":this.port2?this.port2.postMessage(a):console.error("Web connection is not established.");break;default:console.error("Unsupported host, cannot send message.")}console.debug(`Sent message to ${this.runtimeHost}:`,a)}sendAppInit(){this.isAppReady||(this.isAppReady=!0,this.sendMessage(r.INIT,{sdk:{ver:a.rE}}))}safeInvoke(e,t,a){const s=t[e];"function"==typeof s?s(a):console.warn(`Handler for '${String(e)}' is not defined.`)}setupParentConnection(){return new Promise(((e,t)=>{switch(this.runtimeHost){case"android":window.receiveFromAndroid=e=>{console.debug("Message received from Android:",e),this.handleMessage(e.type,e.data)},e();break;case"ios":window.receiveFromIOS=e=>{console.debug("Message received from iOS:",e),this.handleMessage(e.type,e.data)},e();break;case"webapp":if(this.port2)return console.warn("Connection already established. Skipping reinitialization."),void e();const s=t=>{const{type:a}=t.data||{};a===i.CONNECT&&t.ports&&t.ports.length>0&&(this.port2=t.ports[0],this.port2.onmessage=e=>this.handlePortMessage(e),window.removeEventListener("message",s),this.notifyConnectionSuccess(),e())};window.addEventListener("message",s),window.parent?window.parent.postMessage({type:n.INIT_MESSAGE_CHANNEL,data:{sdk:{ver:a.rE}}},this.targetOrigin):console.error("Parent window not available to initialize message channel.");break;default:console.error("Unknown host."),t("Unknown host")}}))}notifyConnectionSuccess(){this.sendMessage(r.CONNECTION_SUCCESS)}handlePortMessage(e){const{type:t,data:a}=e.data||{};t&&this.handleMessage(t,a)}handleMessage(e,t){throw new Error("Subclasses must implement handleMessage.")}}class d extends c{constructor(){super(),this.handler=null,this.pendingRequests=new Map,this.pendingInitAck=null}static init(e){return console.debug("init called",e&&"with handler"),d.initialized?(console.warn("ViewerSdk is already initialized. Skipping initialization."),d.instance):(d.instance||(d.instance=new d,d.instance.setupParentConnection().then((()=>{try{d.instance.initializeViewerSdk()}catch(e){console.error("Error in initializeViewerSdk:",e)}})).catch((e=>{console.error("init: Error setting up parent connection!",e),console.trace("called from:")}))),e&&d.instance.setHandler(e),d.initialized=!0,d.instance)}setHandler(e){this.handler=e,this.pendingInitAck&&(console.debug("Processing pending INIT_ACK message after handler is set."),this.safeInvoke("onInitialData",this.handler,this.pendingInitAck),this.pendingInitAck=null)}canRead(e){return!!e?.includes("r")}canWrite(e){return!!e?.includes("w")||!!e?.includes("*")}initializeViewerSdk(){console.debug("initializing viewer sdk"),this.sendAppInit()}requestInitialData(){this.sendMessage(r.REQUEST_INITIAL_DATA)}requestSave(e,t){const a=function(){if("undefined"!=typeof window&&window.crypto&&window.crypto.randomUUID)return window.crypto.randomUUID();if("undefined"!=typeof crypto&&crypto.randomUUID)return crypto.randomUUID();throw new Error("UUID generation is not supported in this environment")}();return this.sendMessage(r.REQUEST_SAVE,{doc:e,isDataDirty:t,requestId:a}),new Promise(((e,t)=>{this.pendingRequests.set(a,e),this.pendingRequests.set(a+"_reject",t),setTimeout((()=>{this.pendingRequests.has(a)&&(this.pendingRequests.delete(a),this.pendingRequests.delete(a+"_reject"))}),3e4)}))}handleOnSave(e){const{requestId:t,status:a,message:s}=e,r=this.pendingRequests.get(t),n=this.pendingRequests.get(t+"_reject");r&&("error"===a?n?.({status:a,message:s}):r({status:a,message:s}),this.pendingRequests.delete(t),this.pendingRequests.delete(t+"_reject"))}setDirty(e){this.sendMessage(r.SET_DIRTY,e)}sendClose(e,t){this.sendMessage(r.SEND_CLOSE,{doc:e,isDataDirty:t})}sendException(e){this.sendMessage(r.SEND_EXCEPTION,e)}handleMessage(e,t){if(console.debug("handleMessage called for:",e,"with data:",t),e===i.INIT_ACK&&this.updateParentContext(t?.host,t?.capabilities),this.handler)switch(e){case i.INIT_ACK:this.safeInvoke("onInitialData",this.handler,t);break;case i.DATA_CHANGE:this.safeInvoke("onDataChange",this.handler,t);break;case i.REQUEST_CLOSE:this.safeInvoke("onCloseRequest",this.handler);break;case i.REQUEST_SAVE:this.safeInvoke("onSaveRequest",this.handler);break;case i.SAVE_SUCCESS:case i.SAVE_ERROR:this.handleOnSave(t);break;default:console.warn(`No handler found for message type: ${e}`)}else e===i.INIT_ACK?(console.warn("Handler not set. Storing INIT_ACK message for later processing."),this.pendingInitAck=t):console.error("Message handler not found for type:",e)}}var l;d.initialized=!1,function(e){e.APP_READY="APP_READY",e.INIT="INIT",e.READ_FILE="READ_FILE",e.WRITE_FILE="WRITE_FILE",e.DELETE_FILE="DELETE_FILE",e.LIST_FILES="LIST_FILES",e.FILE_DIRTY="FILE_DIRTY",e.OPEN_DEEPLINK="OPEN_DEEPLINK",e.AF1_DATA_TOKEN="AF1_DATA_TOKEN"}(l||(l={}));class u{constructor(e,t){this.cardIuid=e,this.containerIuid=t,this.openPromise=null}isSupported(){return"undefined"!=typeof indexedDB}async openDb(){return this.isSupported()?(this.openPromise||(this.openPromise=new Promise((e=>{this.openWithVersion(u.DB_VERSION,e)}))),this.openPromise):null}openWithVersion(e,t){let a="ensure";const s=indexedDB.open(this.cardIuid,e);s.onupgradeneeded=e=>{a=0===(e.oldVersion||0)?"create":"ensure",this.configureStores(s.result)},s.onsuccess=()=>{const e=s.result;if(!this.hasRequiredStores(e)){const a=e.version+1;return e.close(),void this.openWithVersion(a,t)}this.updateStoresMetadata(e,"ensure"===a).catch((()=>{})).finally((()=>t(e)))},s.onerror=()=>t(null)}configureStores(e){e.objectStoreNames.contains(u.DATA_STORE)||e.createObjectStore(u.DATA_STORE),e.objectStoreNames.contains(u.NAME_LOOKUP_STORE)||e.createObjectStore(u.NAME_LOOKUP_STORE),e.objectStoreNames.contains(u.INFO_STORE)||e.createObjectStore(u.INFO_STORE)}hasRequiredStores(e){const t=e.objectStoreNames;return t.contains(u.DATA_STORE)&&t.contains(u.NAME_LOOKUP_STORE)&&t.contains(u.INFO_STORE)}static nowMicros(){return Math.trunc(1e3*Date.now())}updateStoresMetadata(e,t){return Promise.all([this.ensureStoreVersion(e,u.DATA_STORE),this.ensureStoreVersion(e,u.NAME_LOOKUP_STORE),this.updateCardInfo(e,t)]).then((()=>{}))}ensureStoreVersion(e,t){return e.objectStoreNames.contains(t)?new Promise((a=>{try{const s=e.transaction(t,"readwrite"),r=s.objectStore(t),n=()=>a();s.oncomplete=n,s.onerror=n,s.onabort=n,r.put("1.0.0",u.STORE_VERSION_KEY)}catch{a()}})):Promise.resolve()}async updateCardInfo(e,t){if(!e.objectStoreNames.contains(u.INFO_STORE))return;const a=await this.readInfoValue(e,"container_iuid"),s=t?await this.readInfoValue(e,"ts_c"):void 0,r=this.containerIuid??a??null,n=t&&s?s:u.nowMicros();await Promise.all([this.writeInfoValue(e,"container_iuid",r),this.writeInfoValue(e,"ts_c",n)]).catch((()=>{}))}readInfoValue(e,t){return new Promise((a=>{try{const s=e.transaction(u.INFO_STORE,"readonly"),r=s.objectStore(u.INFO_STORE).get(t);r.onsuccess=()=>a(r.result),r.onerror=()=>a(void 0)}catch{a(void 0)}}))}writeInfoValue(e,t,a){return new Promise((s=>{try{const r=e.transaction(u.INFO_STORE,"readwrite"),n=r.objectStore(u.INFO_STORE),i=()=>s();r.oncomplete=i,r.onerror=i,r.onabort=i,n.put(a,t)}catch{s()}}))}keyFor(e){return e}static normalizeName(e){if("string"!=typeof e)return null;const t=e.trim();return t||null}async put(e,t){const a=await this.openDb();a&&await new Promise((s=>{const r=a.transaction(u.DATA_STORE,"readwrite");r.objectStore(u.DATA_STORE).put(t,e).onsuccess=()=>s(),r.oncomplete=()=>s(),r.onerror=()=>s(),r.onabort=()=>s()}))}async get(e){const t=await this.openDb();if(t)return new Promise((a=>{const s=t.transaction(u.DATA_STORE,"readonly").objectStore(u.DATA_STORE).get(e);s.onsuccess=()=>a(s.result),s.onerror=()=>a(void 0)}))}async delete(e){const t=await this.openDb();t&&await new Promise((a=>{const s=t.transaction(u.DATA_STORE,"readwrite");s.objectStore(u.DATA_STORE).delete(e).onsuccess=()=>a(),s.oncomplete=()=>a(),s.onerror=()=>a(),s.onabort=()=>a()}))}static async hashName(e){const t="undefined"!=typeof globalThis?globalThis.crypto:void 0;if(!t?.subtle?.digest)throw new Error("CardFS name hashing requires SubtleCrypto support");const a=u.encodeText(e),s=await t.subtle.digest("SHA-256",a);return u.bufferToBase64(s)}static encodeText(e){if("undefined"!=typeof TextEncoder)return(new TextEncoder).encode(e).buffer;const t=new Uint8Array(e.length);for(let a=0;a<e.length;a++)t[a]=e.charCodeAt(a);return t.buffer}static bufferToBase64(e){let t="";const a=new Uint8Array(e);for(let e=0;e<a.length;e++)t+=String.fromCharCode(a[e]);return btoa(t)}async getIuidForName(e){const t=u.normalizeName(e);if(!t)return;const a=await this.openDb();if(!a)return;const s=await u.hashName(t);return new Promise((e=>{const t=a.transaction(u.NAME_LOOKUP_STORE,"readonly").objectStore(u.NAME_LOOKUP_STORE).get(s);t.onsuccess=()=>e(t.result),t.onerror=()=>e(void 0)}))}async upsertNameLookup(e,t){const a=u.normalizeName(e);if(!a)return;const s=await this.openDb();if(!s)return;const r=await u.hashName(a);await new Promise((e=>{const a=s.transaction(u.NAME_LOOKUP_STORE,"readwrite"),n=a.objectStore(u.NAME_LOOKUP_STORE);n.put(t,r);n.openCursor().onsuccess=e=>{const a=e.target.result;a&&(a.key!==r&&a.value===t&&a.delete(),a.continue())},a.oncomplete=()=>e(),a.onerror=()=>e(),a.onabort=()=>e()}))}async deleteNameLookupByName(e){const t=u.normalizeName(e);if(!t)return;const a=await this.openDb();if(!a)return;const s=await u.hashName(t);await new Promise((e=>{const t=a.transaction(u.NAME_LOOKUP_STORE,"readwrite");t.objectStore(u.NAME_LOOKUP_STORE).delete(s),t.oncomplete=()=>e(),t.onerror=()=>e(),t.onabort=()=>e()}))}async deleteNameLookupByIuid(e){if(!e)return;const t=await this.openDb();t&&await new Promise((a=>{const s=t.transaction(u.NAME_LOOKUP_STORE,"readwrite");s.objectStore(u.NAME_LOOKUP_STORE).openCursor().onsuccess=t=>{const a=t.target.result;a&&(a.value===e&&a.delete(),a.continue())},s.oncomplete=()=>a(),s.onerror=()=>a(),s.onabort=()=>a()}))}static estimateSize(e){if(null==e)return 0;if("undefined"!=typeof Blob&&e instanceof Blob)return e.size;if(e instanceof ArrayBuffer)return e.byteLength;if(ArrayBuffer.isView(e))return e.byteLength;if("string"==typeof e)return new Blob([e]).size;try{return new Blob([JSON.stringify(e)]).size}catch{return 0}}async cacheDocument(e,t){if(!e?.iuid)return;await this.put(this.keyFor(`${e.iuid}_object`),e);const a=u.normalizeName(e.name);if(a&&await this.upsertNameLookup(a,e.iuid),void 0===t)return void await this.delete(this.keyFor(`${e.iuid}_data`));u.estimateSize(t)<=u.MAX_DATA_BYTES?await this.put(this.keyFor(`${e.iuid}_data`),t):await this.delete(this.keyFor(`${e.iuid}_data`))}async getByName(e){const t=u.normalizeName(e);if(!t)return null;const a=await this.getIuidForName(t);if(!a)return null;const s=await this.get(this.keyFor(`${a}_object`));if(!s)return null;return{iuid:a,object:s,data:await this.get(this.keyFor(`${a}_data`))}}async getByIuid(e){if(!e)return null;const t=await this.get(this.keyFor(`${e}_object`));if(!t)return null;return{iuid:e,object:t,data:await this.get(this.keyFor(`${e}_data`))}}async deleteByName(e){const t=await this.getByName(e);await this.deleteNameLookupByName(e),t&&(await this.delete(this.keyFor(`${t.iuid}_object`)),await this.delete(this.keyFor(`${t.iuid}_data`)))}async deleteByIuid(e,t){t&&await this.deleteNameLookupByName(t),await this.deleteNameLookupByIuid(e),await this.delete(this.keyFor(`${e}_object`)),await this.delete(this.keyFor(`${e}_data`))}async getAllCachedObjects(){const e=await this.openDb();return e?new Promise((t=>{const a=[],s=e.transaction(u.DATA_STORE,"readonly").objectStore(u.DATA_STORE).openCursor();s.onsuccess=e=>{const s=e.target.result;if(!s)return void t(a);const r=s.key;"string"==typeof r&&r.endsWith("_object")&&a.push(s.value),s.continue()},s.onerror=()=>t(a)})):[]}}u.DB_VERSION=2,u.DATA_STORE="cardfs",u.NAME_LOOKUP_STORE="cardfs_name_iuid_lookup",u.INFO_STORE="info",u.STORE_VERSION_KEY="ver",u.MAX_DATA_BYTES=5242880;class h extends c{buildCardFsMessagePayload(e,t){return{...e.name?{name:e.name}:{},...e.iuid?{iuid:e.iuid}:{},...t??{}}}assertValidReadHandler(e){if(!e||"function"!=typeof e.next)throw new Error("cardFS.read requires a handler with a next() function");return e}invokeReadHandlerNext(e,t){try{e.next(t)}catch(e){console.error("cardFS.read handler next() threw",e)}}invokeReadHandlerError(e,t){if(e.error)try{e.error(t)}catch(e){console.error("cardFS.read handler error() threw",e)}}sanitizeReadData(e,t){if(null==e)return{value:e,stripped:!1};try{if(u.estimateSize(e)>u.MAX_DATA_BYTES){const e=t?` for ${t}`:"";return console.warn(`cardFS.read payload data exceeded ${u.MAX_DATA_BYTES} bytes${e}; omitting data`),{value:void 0,stripped:!0}}}catch(e){console.warn("cardFS.read payload size estimation failed",e)}return{value:e,stripped:!1}}getCardIuid(){return this.dataStore?.iuid||null}ensureCardFsCache(){if(!this.shouldUseCardFsFallback())return null;if(!this.cardFsCache){const e=this.getCardIuid();e&&(this.cardFsCache=new u(e,this.containerIuid))}return this.cardFsCache}supportsParentCardFs(){return!!this.parentCapabilities?.card_fs}shouldUseCardFsFallback(){return!this.supportsParentCardFs()}constructor(){super(),this.handler=null,this.accessToken="",this.devMode=!1,this.fsReadRequests=new Map,this.fsWriteRequests=new Map,this.cardFsCache=null,this.pendingAcks=new Map,this.handleMessage=(e,t)=>{e===i.INIT_ACK&&this.updateParentContext(t?.host,t?.capabilities);const a=t?.messageId;if(a&&this.pendingAcks.has(a)){const{resolve:e,timeout:s}=this.pendingAcks.get(a);return clearTimeout(s),this.pendingAcks.delete(a),void e(t)}if(a||!this.resolvePendingAckByType(e,t)){if(!this.handler)throw new Error("Message handler not found!");switch(e){case i.INIT_ACK:console.debug("CardSdk: INIT_ACK received"),this.dataStore.kw1=t.key_wa1,this.dataStore.iuid=t.iuid,"boolean"==typeof t?.dev_mode&&(this.devMode=t.dev_mode,this.dataStore.dev_mode=t.dev_mode),t.iuid?this.shouldUseCardFsFallback()?this.cardFsCache=new u(t.iuid,this.containerIuid):this.cardFsCache=null:this.shouldUseCardFsFallback()||(this.cardFsCache=null);try{this.cryptoA01.decrypt(this.dataStore.denc,t.key_wa1+this.dataStore.kw2,t.iuid).then((e=>{console.debug("CardSdk: INIT_ACK: decrypted data ",e);const a=JSON.parse(e),s=a?.container?.iuid;s&&(this.containerIuid=s,this.shouldUseCardFsFallback()&&this.dataStore?.iuid&&(this.cardFsCache=new u(this.dataStore.iuid,this.containerIuid)));const r="string"==typeof a?.api_token?a.api_token.trim():"";r?(this.accessToken=r,console.debug("CardSdk: Stored API token from INIT_ACK payload")):console.warn("CardSdk: INIT_ACK payload missing api_token; fallback APIs may fail without auth"),this.handler&&this.safeInvoke("onInit",this.handler,{...a,ui:t.ui}),delete this.dataStore.denc})).catch((e=>{throw console.error("Final decrypt error",e),e}))}catch(e){console.error("Decryption failed!",e),this.sendEventError("dec2_failed",e.message)}break;case i.FILE_DATA:{const e=t?.messageId;if(e&&this.fsReadRequests.has(e)){const{messageId:a,...s}=t||{};return void this.handleFsReadDataMessage(e,s)}console.warn("CardSdk: FILE_DATA received but no matching fsRead request",t?.messageId??t?.name);break}case i.DATA_CHANGE:this.safeInvoke("onFileChange",this.handler,t);case i.SAVE_SUCCESS:{const e=t?.messageId;if(e&&this.fsWriteRequests.has(e))return void this.handleFsWriteSuccess(e,t);console.warn("CardSdk: SAVE_SUCCESS received but no matching fsWrite request",t?.messageId??t?.name);break}case i.SAVE_ERROR:{const e=t?.messageId;if(e&&this.fsWriteRequests.has(e))return void this.handleFsWriteError(e,t);console.warn("CardSdk: SAVE_ERROR received but no matching fsWrite request",t?.messageId??t?.name);break}case i.ERROR:{const e=t?.messageId;if(e){const a=t?.message||"Unknown error";if(this.fsReadRequests.has(e))return void this.failFsReadRequest(e,new Error(a));if(this.fsWriteRequests.has(e))return void this.failFsWriteRequest(e,new Error(a))}this.safeInvoke("onError",this.handler,t);break}case i.REFRESH:this.safeInvoke("onRefreshRequest",this.handler,t);break;case i.AF1_DATA_TOKEN_ACK:break;default:console.warn(`No handler found for message type: ${e}`)}}},this.cryptoA01=new s,this.cardFS={read:(e,t,a=!0)=>{this.cardsFsRead(e,t,a)},readById:(e,t,a=!0)=>{this.cardsFsReadById(e,t,a)},write:(e,t,a)=>this.cardsFsWrite(e,t,a),writeById:(e,t,a)=>this.cardsFsWriteById(e,t,a),delete:(e,t)=>this.cardsFsDelete(e,t),deleteById:(e,t)=>this.cardsFsDeleteById(e,t),list:e=>this.cardsFsList(e)},console.debug("CardSdk::constructor: done")}static async init(e,t,a){try{return console.debug("CardSdk::init"),h.instance?h.instance:(h.instance=new h,h.instance.setupParentConnection().then((()=>{h.instance.initializeCardSdk(e)})).catch((e=>{console.error(e)})),t&&h.instance.setHandler(t),h.instance)}catch(e){throw console.error("CardSdk: Unrecoverable error in init",e),e}}setHandler(e){this.handler=e}openDeepLink(e){this.emitDeepLink(e)||console.warn("openDeepLink ignored; provide a dome:// or intouchapp:// href")}deriveSecretSeed(e){const t=e.split("").reverse().join("").substring(4,25);if(!t)throw new Error("Cannot decrypt (1)");return t}getSeedToken(e){try{const t=e.pathname.split("/wa/").filter(Boolean);if(t.length<2)return null;return(t[1]?.split("/")[0]??null)||null}catch(e){return console.warn("CardSdk: Failed to extract legacy seed token",e),null}}async requestAf1DataFromParent(e){const t=await this.sendMessageWithAck(l.AF1_DATA_TOKEN,{sdk:{ver:a.rE}},i.AF1_DATA_TOKEN_ACK),{messageId:s,...r}=t||{},{cie:n,ck:o,dev_token:c}=r;if(!n||!o||!c)throw new Error("Invalid AF1 data token payload");const d=await this.fetchAf1Data(n,o,c,e),u=d?.data_af1??d?.data?.data_af1;if(!u)throw new Error("AF1 data fetch returned empty payload");return window.IT_DATA_AF1=u,d?.ver&&(window.IT_VERSION=d.ver),d?.env&&(window.IT_ENV=d.env),{dataAf1:u,cie:n}}async fetchAf1Data(e,t,a,s){if(!(e&&t&&a&&s))throw new Error("Invalid AF1 data fetch parameters");const r=new URL(`https://dome.so/api/v1/cards/e/${encodeURIComponent(e)}/data_af1/`);r.searchParams.set("dt",a),r.searchParams.set("rt",s),r.searchParams.set("ck",t);const n=await fetch(r.toString(),{method:"GET"});if(!n.ok){const e=await n.text().catch((()=>n.statusText));throw new Error(`AF1 data fetch failed: ${n.status} ${e}`)}return n.json()}async initializeCardSdk(e){let t="CardSdk::initializeCardSdk:";try{if(console.debug(t,"enter"),!e)throw new Error("Invalid secret");const a=window.location.href;console.debug(t,"url:",a);const s=new URL(a),r=s.searchParams.get("rt");if(!r)throw new Error("Missing request token");let n=this.getSeedToken(s),i=window.IT_DATA_AF1;if(!i){console.debug(t,"IT_DATA_AF1 missing. Requesting token via parent");const{dataAf1:e,cie:a}=await this.requestAf1DataFromParent(r);i=e,n=a||n}if(!i)throw console.error(t,"No data"),new Error("No data");if(!n)throw new Error("Cannot decrypt (missing seed)");const o=this.deriveSecretSeed(n);console.debug(t,"ss:",o);const c=await this.cryptoA01.decrypt(i,e,o);try{const e=JSON.parse(c);if(console.debug("CardSdk: dataFromServer:",e),!e.ite)throw new Error("Invalid data");this.dataStore={denc:e.d,kw2:e.kw2},h.instance.sendInit(e.ite)}catch(e){throw console.error("Initial Decryption failed (2):",e),e}}catch(e){console.error(t,"Init failed:",e),this.sendEventError("init_failed",e.message)}}async sendInit(e){const t={token:e,sdk:{ver:a.rE}},s=this.getWebappDetails();s&&(t.wa=s),this.sendMessage(l.INIT,t)}getWebappDetails(){if("undefined"==typeof window)return null;let e={};const t=window.IT_VERSION,a=window.IT_ENV;return t&&(e.ver=String(t)),a&&(e.env=String(a)),Object.keys(e).length?e:null}sendMessageWithAck(e,t,a,s=15e3,r){const n=crypto.randomUUID();if(r)try{r(n)}catch(e){return Promise.reject(e)}return new Promise(((r,i)=>{const o=setTimeout((()=>{this.pendingAcks.delete(n),i(new Error(`${a} not received in time`))}),s);this.pendingAcks.set(n,{resolve:r,reject:i,timeout:o,ackType:a}),this.sendMessage(e,{...t,messageId:n})}))}resolvePendingAckByType(e,t){for(const[a,s]of this.pendingAcks.entries())if(s.ackType===e)return clearTimeout(s.timeout),this.pendingAcks.delete(a),s.resolve(t),!0;return!1}cardsFsRead(e,t,a=!0){const s={name:e},r=this.assertValidReadHandler(t);this.cardsFsReadInternal(s,r,a,"read")}cardsFsReadById(e,t,a=!0){const s={iuid:e},r=this.assertValidReadHandler(t);this.cardsFsReadInternal(s,r,a,"readById")}cardsFsReadInternal(e,t,a,s){if(this.shouldUseCardFsFallback())return console.debug(`cardFS.${s} using fallback implementation for`,e),void this.cardsFsReadFallback(e,void 0,t,a).catch((e=>{const a=e instanceof Error?e:new Error(String(e));this.invokeReadHandlerError(t,a)}));console.debug(`cardFS.${s} delegating to parent for`,e);let r=null;const n=e.name?`"${e.name}"`:e.iuid?`iuid ${e.iuid}`:"document";this.sendMessageWithAck(l.READ_FILE,this.buildCardFsMessagePayload(e,{allow_stale:a}),i.READ_FILE_ACK,h.CARD_FS_ACK_TIMEOUT_MS,(e=>{r=e;const i={name:n,handler:t,allowStale:a};i.noResponseTimeout=setTimeout((()=>{this.failFsReadRequest(e,new Error(`cardFS.${s} timed out for ${n}`))}),h.FS_RESPONSE_TIMEOUT_MS),this.fsReadRequests.set(e,i)})).catch((e=>{const a=e instanceof Error?e:new Error(String(e));r?this.failFsReadRequest(r,a):this.invokeReadHandlerError(t,a)}))}cardsFsWrite(e,t,a){const s={name:e};return this.cardsFsWriteInternal(s,t,a,"write")}cardsFsWriteById(e,t,a){const s={iuid:e};return this.cardsFsWriteInternal(s,t,a,"writeById")}cardsFsWriteInternal(e,t,a,s){return this.shouldUseCardFsFallback()?(console.debug(`cardFS.${s} using fallback implementation for`,e),this.cardsFsWriteFallback(e,t).then((e=>{try{a?.(e)}catch(e){console.error(`cardFS.${s} fallback callback threw`,e)}return e}))):(console.debug(`cardFS.${s} delegating to parent for`,e),new Promise(((r,n)=>{let o=null;const c=e.name?`"${e.name}"`:e.iuid?`iuid ${e.iuid}`:"document";this.sendMessageWithAck(l.WRITE_FILE,this.buildCardFsMessagePayload(e,{data:t}),i.WRITE_FILE_ACK,h.CARD_FS_ACK_TIMEOUT_MS,(e=>{o=e;const t={name:c,onResult:a,resolve:r,reject:n,timeout:setTimeout((()=>{this.failFsWriteRequest(e,new Error(`cardFS.${s} timed out for ${c}`))}),h.FS_RESPONSE_TIMEOUT_MS)};this.fsWriteRequests.set(e,t)})).catch((e=>{const t=e instanceof Error?e:new Error(String(e));o?this.failFsWriteRequest(o,t):n(t)}))})))}cardsFsDelete(e,t){const a={name:e};return this.cardsFsDeleteInternal(a,t,"delete")}cardsFsDeleteById(e,t){const a={iuid:e};return this.cardsFsDeleteInternal(a,t,"deleteById")}cardsFsDeleteInternal(e,t,a){return this.shouldUseCardFsFallback()?(console.debug(`cardFS.${a} using fallback implementation for`,e),this.cardsFsDeleteFallback(e).then((e=>{try{t?.(e)}catch(e){console.error(`cardFS.${a} fallback callback threw`,e)}return e}))):(console.debug(`cardFS.${a} delegating to parent for`,e),new Promise(((a,s)=>{this.sendMessageWithAck(l.DELETE_FILE,this.buildCardFsMessagePayload(e),i.DELETE_FILE_ACK,h.CARD_FS_ACK_TIMEOUT_MS).then((e=>{const{messageId:s,...r}=e||{};t?.(r),a(r)})).catch((e=>{s(e instanceof Error?e:new Error(String(e)))}))})))}cardsFsList(e){return this.shouldUseCardFsFallback()?(console.debug("cardFS.list using fallback implementation"),this.cardsFsListFallback().then((t=>{try{e?.(t)}catch(e){console.error("cardFS.list fallback callback threw",e)}return t}))):(console.debug("cardFS.list delegating to parent"),new Promise(((t,a)=>{this.sendMessageWithAck(l.LIST_FILES,{},i.LIST_FILES_ACK,h.CARD_FS_ACK_TIMEOUT_MS).then((a=>{const{messageId:s,...r}=a||{};e?.(r),t(r)})).catch((e=>{a(e instanceof Error?e:new Error(String(e)))}))})))}handleFsReadDataMessage(e,t){const a=this.fsReadRequests.get(e);if(!a)return;a.noResponseTimeout&&(clearTimeout(a.noResponseTimeout),a.noResponseTimeout=void 0);const s=this.sanitizeReadData(t?.data,a.name),r=Boolean(t?.from_cache??t?.is_stale),n={name:t?.name,iuid:t?.iuid??null,object:t?.object,data:s.value,is_stale:Boolean(t?.is_stale??t?.from_cache),is_complete:"boolean"==typeof t?.is_complete?t.is_complete:!a.allowStale||!r};this.invokeReadHandlerNext(a.handler,n),a.cleanupTimeout&&clearTimeout(a.cleanupTimeout),a.cleanupTimeout=setTimeout((()=>{this.clearFsReadRequest(e)}),h.FS_READ_RETENTION_MS)}clearFsReadRequest(e){const t=this.fsReadRequests.get(e);if(t)return t.noResponseTimeout&&clearTimeout(t.noResponseTimeout),t.cleanupTimeout&&clearTimeout(t.cleanupTimeout),this.fsReadRequests.delete(e),t}failFsReadRequest(e,t){const a=this.clearFsReadRequest(e);a&&this.invokeReadHandlerError(a.handler,t)}clearFsWriteRequest(e){const t=this.fsWriteRequests.get(e);if(t)return clearTimeout(t.timeout),this.fsWriteRequests.delete(e),t}failFsWriteRequest(e,t){const a=this.clearFsWriteRequest(e);a&&a.reject(t)}handleFsWriteSuccess(e,t){const a=this.clearFsWriteRequest(e);if(!a)return;const{messageId:s,...r}=t||{};if("function"==typeof a.onResult)try{a.onResult(r)}catch(e){console.error("cardFS.write callback threw",e)}else console.warn("onResult method invalid:",a.onResult);a.resolve(r)}handleFsWriteError(e,t){const a=this.clearFsWriteRequest(e);if(!a)return;const s=t instanceof Error?t:new Error(t?.message||"Unknown write error");a.reject(s)}async cardsFsReadFallback(e,t,a,s=!0){if(!this.shouldUseCardFsFallback())throw new Error("cardFS.read fallback is disabled because parent supports card_fs");const r=this.getCardIuid();if(!r)throw new Error("cardFS.read fallback failed: card not initialized");const n=this.ensureCardFsCache();let i=null;const o=e.name?`"${e.name}"`:e.iuid?`iuid ${e.iuid}`:"document",c=(s,r,n,o,c,d)=>{if(!s)return null;const l=c??e.name??s?.name??e.iuid??"document",u=d??s?.iuid??e.iuid??null,{value:h}=this.sanitizeReadData(r,l),f={name:l,iuid:u,object:s,data:h,is_stale:n,is_complete:o};return t&&this.fsReadRequests.has(t)?this.handleFsReadDataMessage(t,f):this.invokeReadHandlerNext(a,f),i||(i=f),f};let d=null;if(n)try{if(s){let t=null;e.iuid&&(t=await n.getByIuid(e.iuid)),!t&&e.name&&(t=await n.getByName(e.name)),t?.object&&(d=c(t.object,t.data,!0,!1,t.object?.name??e.name,t.iuid))}}catch(e){console.warn("cardFS.read cache lookup failed",e)}try{const t=await this.fetchDocumentPayload(r,e);t?(await(n?.cacheDocument(t.object,t.data)),c(t.object,t.data,!1,!0,t.object?.name,t.object?.iuid)):s&&d&&c(d.object,d.data,!0,!0,d.name,d.iuid??void 0)}catch(e){if(!i){throw e instanceof Error?e:new Error(String(e))}console.warn("cardFS.read fresh fetch failed",e),s&&d&&c(d.object,d.data,!0,!0,d.name,d.iuid??void 0)}if(!i)throw new Error(`cardFS.read fallback could not locate ${o}`)}async cardsFsWriteFallback(e,t,a){if(!this.shouldUseCardFsFallback())throw new Error("cardFS.write fallback is disabled because parent supports card_fs");const s=this.getCardIuid();if(!s)throw new Error("cardFS.write fallback failed: card not initialized");console.debug("cardFS.write fallback invoked for target",e),await this.upsertDocumentViaApi(s,e,t);const r=await this.fetchDocumentPayload(s,e);await(this.ensureCardFsCache()?.cacheDocument(r.object,r.data));const n={name:r.object?.name??e.name??null,iuid:r.object?.iuid??e.iuid??null,object:r.object,data:r.data};return a&&this.fsWriteRequests.has(a)&&this.handleFsWriteSuccess(a,n),n}async cardsFsDeleteFallback(e){if(!this.shouldUseCardFsFallback())throw new Error("cardFS.delete fallback is disabled because parent supports card_fs");const t=this.getCardIuid();if(!t)throw new Error("cardFS.delete fallback failed: card not initialized");console.debug("cardFS.delete fallback invoked for target",e);const a=this.ensureCardFsCache(),s=await this.fetchDocumentMetadataByTarget(t,e).catch((()=>null)),r=s?.iuid??e.iuid??null,n=s?.name??e.name??null;if(!r)return e.name&&await(a?.deleteByName(e.name)),{name:n,iuid:null,deleted:!1};const i=await fetch(`/api/v1/documents/${r}/`,{method:"DELETE",headers:this.authHeader()});if(!i.ok&&404!==i.status){const e=await i.text().catch((()=>"delete failed"));throw new Error(`cardFS.delete fallback failed: ${e}`)}await(a?.deleteByIuid(r,n??void 0));return{name:n??r,iuid:r,deleted:404!==i.status}}async cardsFsListFallback(){if(!this.shouldUseCardFsFallback())throw new Error("cardFS.list fallback is disabled because parent supports card_fs");const e=this.getCardIuid();if(!e)throw new Error("cardFS.list fallback failed: card not initialized");const t=this.ensureCardFsCache();try{const a=await this.fetchAllDocuments(e);if(t)for(const e of a)await t.cacheDocument(e,void 0);return{documents:a,from_cache:!1}}catch(e){const a=await(t?.getAllCachedObjects());if(a&&a.length>0)return{documents:a,from_cache:!0};throw e}}authHeader(){return this.accessToken?{Authorization:`Bearer ${this.accessToken}`}:{}}jsonHeaders(){return{...this.authHeader(),"Content-Type":"application/json"}}async fetchDocumentMetadataByTarget(e,t){return t.iuid?this.fetchDocumentMetadataByIuid(t.iuid):t.name?this.fetchDocumentMetadataByName(e,t.name):null}async fetchDocumentMetadataByIuid(e){const t=await fetch(`/api/v1/documents/${e}/`,{method:"GET",headers:this.authHeader()});if(404===t.status)return null;if(!t.ok){const e=await t.text().catch((()=>"metadata lookup failed"));throw new Error(`cardFS metadata fetch failed: ${e}`)}return t.json().catch((()=>null))}normalizeDocumentsResponse(e){return Array.isArray(e?.results)?e.results:Array.isArray(e)?e:e?[e]:[]}extractHttpErrorMessage(e,t){if(!e)return t;if("string"==typeof e)return e;if(e instanceof Error&&e.message)return e.message;const a=e?.error??e;return a instanceof Blob?t:"string"==typeof a?a:a?.detail?a.detail:a?.message?a.message:"string"==typeof a?.statusText&&a.statusText.trim()?a.statusText:t}async fetchDocumentMetadataByName(e,t){if(!t)return null;const a=await fetch(`/api/v1/documents/with_card/${e}/?name=${encodeURIComponent(t)}`,{method:"GET",headers:this.authHeader()});if(!a.ok){if(404===a.status)return null;const e=await a.text().catch((()=>"metadata lookup failed"));throw new Error(`cardFS metadata fetch failed: ${e}`)}const s=await a.json().catch((()=>null)),r=this.normalizeDocumentsResponse(s);return r.find((e=>e?.name===t))??r[0]??null}async fetchAllDocuments(e){const t=await fetch(`/api/v1/documents/with_card/${e}/`,{method:"GET",headers:this.authHeader()});if(!t.ok){const e=await t.text().catch((()=>"list failed"));throw new Error(`cardFS.list failed: ${e}`)}const a=await t.json().catch((()=>null));return this.normalizeDocumentsResponse(a)}async fetchDocumentPayload(e,t){const a="string"==typeof t?{name:t}:t,s=await this.fetchDocumentMetadataByTarget(e,a);if(!s){const e=a.name?`"${a.name}"`:a.iuid?`iuid ${a.iuid}`:"document";throw new Error(`cardFS document not found: ${e}`)}return{object:s,data:await this.fetchDocumentData(s)}}async fetchDocumentData(e){if(void 0!==e?.data)return e.data;const t=e?.orig?.url||e?.url?.original||e?.url;if(!t||"string"!=typeof t)return null;const a=await fetch(t);if(!a.ok){const e=await a.text().catch((()=>"download failed"));throw new Error(`cardFS data fetch failed: ${e}`)}const s=a.headers.get("Content-Type")||"";return s.includes("application/json")?a.json():s.startsWith("text/")?a.text():a.arrayBuffer()}async buildFileFormData(e,t){let a;const s=e=>{if(e instanceof ArrayBuffer)return new Blob([e.slice(0)],{type:"application/octet-stream"});if("undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer){const t=new Uint8Array(e),a=new Uint8Array(t.length);return a.set(t),new Blob([a.buffer],{type:"application/octet-stream"})}if(ArrayBuffer.isView(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),a=new Uint8Array(t.length);return a.set(t),new Blob([a.buffer],{type:"application/octet-stream"})}const t=new Uint8Array(e),a=new Uint8Array(t.length);return a.set(t),new Blob([a.buffer],{type:"application/octet-stream"})};if(t instanceof File)a=t;else if("undefined"!=typeof Blob&&t instanceof Blob)a=new File([t],e,{type:t.type||"application/octet-stream"});else if("undefined"!=typeof SharedArrayBuffer&&t instanceof SharedArrayBuffer){const r=s(t);a=new File([r],e,{type:r.type})}else if(t instanceof ArrayBuffer){const r=s(t);a=new File([r],e,{type:r.type})}else if(ArrayBuffer.isView(t)){const r=s(t);a=new File([r],e,{type:r.type})}else if("string"==typeof t){const s=new Blob([t],{type:"text/plain"});a=new File([s],e,{type:s.type})}else{const s=JSON.stringify(t??{}),r=new Blob([s],{type:"application/json"});a=new File([r],e,{type:r.type})}const r=new FormData;return r.append("file",a),r}async upsertDocumentViaApi(e,t,a){const s=await this.buildFileFormData(t.name??t.iuid??"document",a);if(t.iuid){const e=await fetch(`/api/v1/documents/${t.iuid}/`,{method:"PUT",headers:this.authHeader(),body:s});if(!e.ok){const t=await e.text().catch((()=>"update failed"));throw new Error(`cardFS.write update failed: ${t}`)}return}const r=t.name?await this.fetchDocumentMetadataByName(e,t.name).catch((()=>null)):null;if(r?.iuid){const e=await fetch(`/api/v1/documents/${r.iuid}/`,{method:"PUT",headers:this.authHeader(),body:s});if(!e.ok){const t=await e.text().catch((()=>"update failed"));throw new Error(`cardFS.write update failed: ${t}`)}return}const n=await fetch("/api/v1/documents/",{method:"POST",headers:this.authHeader(),body:s});if(!n.ok){const e=await n.text().catch((()=>"upload failed"));throw new Error(`cardFS.write upload failed: ${e}`)}const i=await n.json().catch((()=>null)),o=Array.isArray(i?.results)?i.results[0]:i,c=o?.iuid;if(!c)throw new Error("cardFS.write upload failed: missing document iuid");const d=await fetch(`/api/v1/documents/with_card/${e}/`,{method:"POST",headers:this.jsonHeaders(),body:JSON.stringify({documents:[c]})});if(!d.ok){const e=await d.text().catch((()=>"attach failed"));throw new Error(`cardFS.write attach failed: ${e}`)}}async getDocumentAttachedToCard(e,t="default"){const a=new URL(`/api/v1/documents/attached_to/${e}/`);a.searchParams.set("name",t);const s=await fetch(a.toString(),{method:"GET",headers:{Authorization:`Bearer ${this.accessToken||""}`,"Content-Type":"application/json"}});if(!s.ok){const e=await s.text();throw new Error(`Fetch failed: ${e}`)}return s.json()}async postDocumentAttachedToCard(e,t){const a=await fetch(`/api/v1/documents/attached_to/${e}/`,{method:"POST",headers:{Authorization:`Bearer ${this.accessToken||""}`,"Content-Type":"application/json"},body:JSON.stringify(t)});if(!a.ok){const e=await a.text();throw new Error(`Post failed: ${e}`)}return a.json()}async getCardDocument(e,t){const a=await fetch(`/api/v1/documents/with_card/${e}/?name=${t}`,{method:"GET",headers:{Authorization:`Bearer ${this.accessToken||""}`,"Content-Type":"application/json"}});return await a.json()}formatErrorMessage(e){if("string"==typeof e&&e.trim())return e;if(e instanceof Error)return e.message||e.toString();if(e&&"object"==typeof e){if("string"==typeof e.message)return e.message;try{return JSON.stringify(e)}catch{return Object.prototype.toString.call(e)}}return null!=e?String(e):"Unknown error"}sendEventError(e,t,a=void 0){const s={message:this.formatErrorMessage(t),error_code:e,data:a??null};this.handler&&this.safeInvoke("onError",this.handler,s)}setFileDirty(e){this.sendMessage(l.FILE_DIRTY,e)}getUsername(e){const t=e?.name;return t&&Object.values(t).some((e=>e))?function(e){const{prefix:t="",given:a="",middle:s="",family:r="",suffix:n=""}=e||{};return[t,a,s,r,n].filter((e=>e)).join(" ").trim()}(t):""}}return h.FS_RESPONSE_TIMEOUT_MS=3e4,h.FS_READ_RETENTION_MS=5e3,h.CARD_FS_ACK_TIMEOUT_MS=5e3,t})()));
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://domeSdk/webpack/universalModuleDefinition","webpack://domeSdk/webpack/bootstrap","webpack://domeSdk/webpack/runtime/define property getters","webpack://domeSdk/webpack/runtime/hasOwnProperty shorthand","webpack://domeSdk/webpack/runtime/make namespace object","webpack://domeSdk/./src/crypto.ts","webpack://domeSdk/./src/dome-sdk.ts","webpack://domeSdk/./src/utils.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"domeSdk\"] = factory();\n\telse\n\t\troot[\"domeSdk\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// Provide enc / dec using Algorithm01\nexport class CryptoA01 {\n constructor() {\n // Initialize subtleCrypto once\n this.subtleCrypto = window.crypto?.subtle;\n if (!this.subtleCrypto) {\n throw new Error('SubtleCrypto API is not available in this environment.');\n }\n }\n /**\n * Perform decryption using AES based V1 algorithm.\n *\n * string: the encrypted string (base64 encoded)\n * password: the password used for encryption\n * salt: the base64 encoded salt used\n */\n async decrypt(token, password, salt) {\n try {\n if (!token) {\n throw new Error(\"Invalid token\");\n }\n const tokenBytes = this.base64UrlDecode(token);\n // Extract token components\n const version = tokenBytes[0];\n if (version !== 0x80) {\n // console.log(\"Incorrect Version: \", version);\n throw new Error('Invalid version');\n }\n const timestamp = tokenBytes.slice(1, 9);\n const iv = tokenBytes.slice(9, 25);\n const ciphertext = tokenBytes.slice(25, -32);\n const hmacFromToken = tokenBytes.slice(-32);\n // Derive the key and split it into HMAC and AES keys\n const fullKey = await this.deriveKey(password, salt);\n const { hmacKey, aesKey } = await this.splitKey(fullKey);\n // Compute HMAC over version + timestamp + IV + ciphertext\n const hmacInput = tokenBytes.slice(0, -32);\n const computedHmac = new Uint8Array(await this.subtleCrypto.sign('HMAC', hmacKey, hmacInput));\n // Validate HMAC\n if (!computedHmac.every((byte, i) => byte === hmacFromToken[i])) {\n throw new Error('Invalid HMAC. Token has been tampered with!');\n }\n // Decrypt the ciphertext\n const decrypted = await this.subtleCrypto.decrypt({\n name: 'AES-CBC',\n iv: iv,\n }, aesKey, ciphertext);\n // Convert decrypted data to UTF-8 string\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n }\n catch (err) {\n console.log(\"Error in decrypt:\", err);\n throw err;\n }\n }\n async deriveKey(password, salt, iterations = 10000) {\n const encoder = new TextEncoder();\n const keyMaterial = await this.subtleCrypto.importKey(\"raw\", encoder.encode(password), \"PBKDF2\", false, [\"deriveKey\"]);\n return this.subtleCrypto.deriveKey({\n name: \"PBKDF2\",\n hash: \"SHA-256\",\n salt: encoder.encode(salt),\n iterations: iterations,\n }, keyMaterial, { name: \"AES-CBC\", length: 256 }, true, // Allow export of the derived key (req for splitting)\n [\"encrypt\", \"decrypt\"]);\n }\n // Split the full key into HMAC and AES keys\n async splitKey(fullKey) {\n const rawKey = new Uint8Array(await this.subtleCrypto.exportKey('raw', fullKey));\n // Split the key into HMAC (first 16 bytes) and AES (last 16 bytes)\n const hmacKey = await this.subtleCrypto.importKey('raw', rawKey.slice(0, 16), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign', 'verify']);\n const aesKey = await this.subtleCrypto.importKey('raw', rawKey.slice(16), { name: 'AES-CBC' }, false, ['encrypt', 'decrypt']);\n return { hmacKey, aesKey };\n }\n // Decode Base64 URL-safe strings\n base64UrlDecode(base64) {\n // assumes URL safe encoding that has + in place of - and _ in place of /\n const base64String = base64.replace(/-/g, '+').replace(/_/g, '/');\n const decodedString = atob(base64String);\n return new Uint8Array([...decodedString].map(c => c.charCodeAt(0)));\n }\n}\n","import pkg from \"../package.json\";\nimport { generateUUID, getNameString } from './utils';\nimport { CryptoA01 } from './crypto';\n// Enum defining message types sent from the viewer to the parent application\nexport var ViewerMessageType;\n(function (ViewerMessageType) {\n ViewerMessageType[\"CONNECTION_SUCCESS\"] = \"CONNECTION_SUCCESS\";\n ViewerMessageType[\"INIT\"] = \"INIT\";\n ViewerMessageType[\"REQUEST_SAVE\"] = \"REQUEST_SAVE\";\n ViewerMessageType[\"REQUEST_CLOSE\"] = \"REQUEST_CLOSE\";\n ViewerMessageType[\"REQUEST_INITIAL_DATA\"] = \"REQUEST_INITIAL_DATA\";\n ViewerMessageType[\"SET_DIRTY\"] = \"SET_DIRTY\";\n ViewerMessageType[\"SEND_CLOSE\"] = \"SEND_CLOSE\";\n ViewerMessageType[\"SEND_EXCEPTION\"] = \"SEND_EXCEPTION\";\n})(ViewerMessageType || (ViewerMessageType = {}));\nvar CommonSdkMessageType;\n(function (CommonSdkMessageType) {\n CommonSdkMessageType[\"INIT_MESSAGE_CHANNEL\"] = \"INIT_MESSAGE_CHANNEL\";\n})(CommonSdkMessageType || (CommonSdkMessageType = {}));\n// Enum defining message types sent from the parent application to the embedded app\nvar ClientMessageType;\n(function (ClientMessageType) {\n ClientMessageType[\"CONNECT\"] = \"CONNECT\";\n ClientMessageType[\"REQUEST_CLOSE\"] = \"REQUEST_CLOSE\";\n ClientMessageType[\"REQUEST_SAVE\"] = \"REQUEST_SAVE\";\n ClientMessageType[\"SAVE_ERROR\"] = \"SAVE_ERROR\";\n ClientMessageType[\"SAVE_SUCCESS\"] = \"SAVE_SUCCESS\";\n ClientMessageType[\"DATA_CHANGE\"] = \"DATA_CHANGE\";\n ClientMessageType[\"FILE_DATA\"] = \"FILE_DATA\";\n ClientMessageType[\"WRITE_FILE_ACK\"] = \"WRITE_FILE_ACK\";\n ClientMessageType[\"READ_FILE_ACK\"] = \"READ_FILE_ACK\";\n ClientMessageType[\"DELETE_FILE_ACK\"] = \"DELETE_FILE_ACK\";\n ClientMessageType[\"LIST_FILES_ACK\"] = \"LIST_FILES_ACK\";\n ClientMessageType[\"INIT_ACK\"] = \"INIT_ACK\";\n ClientMessageType[\"AF1_DATA_TOKEN_ACK\"] = \"AF1_DATA_TOKEN_ACK\";\n ClientMessageType[\"ERROR\"] = \"ERROR\";\n ClientMessageType[\"REFRESH\"] = \"REFRESH\";\n})(ClientMessageType || (ClientMessageType = {}));\n;\nconst ALLOWED_ORIGINS = new Set(getAllowedOrigins());\nconst ALLOWED_DEEP_LINK_PROTOCOLS = new Set([\"dome\", \"intouchapp\"]);\nconst CARD_FS_VERSION = '1.0.0';\nfunction getAllowedOrigins() {\n if (typeof window === 'undefined')\n return [];\n return [\n window.location.origin,\n 'https://dome.so',\n 'https://spaces.intouchapp.com/',\n 'http://localhost:4200',\n 'http://localhost:4201',\n 'null',\n ];\n}\n/**\n * DomeEmbeddedAppSdk:\n * Base SDK class providing methods to send messages to the parent application.\n */\nclass DomeEmbeddedAppSdk {\n constructor() {\n this.targetOrigin = \"*\";\n this.isAppReady = false;\n this.port2 = null;\n this.runtimeHost = \"unknown\"; // Transport/runtime host\n this.parentHostDetails = null;\n this.parentCapabilities = null;\n this.handleDeepLinkClick = (event) => {\n if (this.runtimeHost !== \"webapp\")\n return;\n if (!(event.target instanceof Element))\n return;\n const anchor = event.target.closest(\"a[href]\");\n if (!anchor)\n return;\n const href = anchor.getAttribute(\"href\") ?? \"\";\n if (this.emitDeepLink(href)) {\n event.preventDefault();\n }\n };\n console.info(`Initializing Dome Embedded App SDK v${pkg.version}`);\n this.detectHost();\n this.setupDeepLinkInterception();\n }\n /**\n * Detects the host (iOS, Android, or Web) and saves it.\n */\n detectHost() {\n if (typeof window.AndroidBridge !== \"undefined\") {\n this.runtimeHost = \"android\";\n }\n else if (typeof window.webkit !== \"undefined\") {\n this.runtimeHost = \"ios\";\n }\n else {\n this.runtimeHost = \"webapp\";\n }\n console.debug(`Detected host: ${this.runtimeHost}`);\n }\n /**\n * Listens for deep link anchor clicks on web to forward them to the parent app.\n */\n setupDeepLinkInterception() {\n if (this.runtimeHost !== \"webapp\")\n return;\n if (typeof document === \"undefined\")\n return;\n document.addEventListener(\"click\", this.handleDeepLinkClick, true);\n }\n /**\n * Sends an OPEN_DEEPLINK message when the href uses an allowed protocol.\n * @returns true if the message was dispatched, false otherwise.\n */\n emitDeepLink(href) {\n if (typeof href !== \"string\" || href.trim() === \"\") {\n console.warn(\"emitDeepLink called without a valid href\");\n return false;\n }\n const protocol = href.split(\":\")[0]?.toLowerCase();\n if (!protocol || !ALLOWED_DEEP_LINK_PROTOCOLS.has(protocol)) {\n return false;\n }\n this.sendMessage(CardMessageType.OPEN_DEEPLINK, { url: href });\n return true;\n }\n updateParentContext(host, capabilities) {\n if (!host && !capabilities) {\n return;\n }\n const base = this.parentHostDetails ?? { type: this.runtimeHost };\n const merged = {\n ...base,\n ...(host ?? {}),\n };\n if (!merged.type) {\n merged.type = this.runtimeHost;\n }\n const nextCapabilities = capabilities ?? this.parentCapabilities ?? merged.capabilities;\n if (capabilities) {\n this.parentCapabilities = capabilities;\n }\n if (nextCapabilities) {\n merged.capabilities = nextCapabilities;\n }\n else {\n delete merged.capabilities;\n }\n this.parentHostDetails = merged;\n this.parentCapabilities = nextCapabilities ?? null;\n if (nextCapabilities) {\n console.info(\"Host capabilities detected\", {\n host_type: merged.type,\n capabilities: nextCapabilities\n });\n }\n else {\n console.info(\"Host capabilities not found\", {\n hostType: merged.type,\n });\n }\n }\n getHost() {\n return this.parentHostDetails ?? { type: this.runtimeHost };\n }\n /**\n * Method to send messages to the parent application.\n * Ensures the parent window exists and sends a structured message with type and data.\n * @param type - The type of message being sent\n * @param data - (Optional) payload data for the message\n */\n sendMessage(type, data) {\n const message = { type, data: data ?? null };\n switch (this.runtimeHost) {\n case \"android\":\n window.AndroidBridge?.sendMessage(JSON.stringify(message));\n break;\n case \"ios\":\n if (window?.webkit?.messageHandlers) {\n window.webkit?.messageHandlers.appHandler.postMessage(JSON.stringify(message));\n }\n else {\n console.error(\"webkit.messageHandlers not found\");\n }\n break;\n case \"webapp\":\n if (this.port2) {\n this.port2.postMessage(message);\n }\n else {\n console.error(\"Web connection is not established.\");\n }\n break;\n default:\n console.error(\"Unsupported host, cannot send message.\");\n break;\n }\n console.debug(`Sent message to ${this.runtimeHost}:`, message);\n }\n /**\n * Notifies the parent application that the app is ready, if it hasn’t already.\n */\n sendAppInit() {\n if (!this.isAppReady) {\n this.isAppReady = true;\n this.sendMessage(ViewerMessageType.INIT, { sdk: { ver: pkg.version } });\n }\n }\n /**\n * Safely invokes a function from the handler object if it exists.\n * and logs a warning if the handler is not provided for the given message type.\n *\n * @param eventName - Name of the event method to be invoked from the handler.\n * @param handlerObj - The handler object that contains the message handling methods.\n * @param data - (Optional) The data to be passed to the handler function if invoked.\n */\n safeInvoke(eventName, handlerObj, data) {\n const handler = handlerObj[eventName];\n if (typeof handler === 'function') {\n handler(data);\n }\n else {\n console.warn(`Handler for '${String(eventName)}' is not defined.`);\n }\n }\n // Sets up connection with iframe parent using message channel\n // Call this once only in the lifetime. Should be called\n // _before_ iFrame's onLoad is called (otherwise messaging will\n // not be setup)\n setupParentConnection() {\n return new Promise((resolve, reject) => {\n switch (this.runtimeHost) {\n case \"android\":\n window.receiveFromAndroid = (message) => {\n console.debug(\"Message received from Android:\", message);\n this.handleMessage(message.type, message.data);\n };\n resolve();\n break;\n case \"ios\":\n window.receiveFromIOS = (message) => {\n console.debug(\"Message received from iOS:\", message);\n this.handleMessage(message.type, message.data);\n };\n resolve();\n break;\n case \"webapp\":\n if (this.port2) {\n console.warn(\"Connection already established. Skipping reinitialization.\");\n resolve();\n return;\n }\n const handleMessage = (event) => {\n const { type } = event.data || {};\n if (type !== ClientMessageType.CONNECT)\n return;\n if (event.ports && event.ports.length > 0) {\n this.port2 = event.ports[0];\n this.port2.onmessage = (e) => this.handlePortMessage(e);\n window.removeEventListener(\"message\", handleMessage); // Cleanup\n this.notifyConnectionSuccess();\n resolve();\n }\n };\n // Listen for browser-based `message` events\n window.addEventListener(\"message\", handleMessage);\n // Notify parent to initialize a message channel\n if (window.parent) {\n window.parent.postMessage({ type: CommonSdkMessageType.INIT_MESSAGE_CHANNEL, data: { sdk: { ver: pkg.version } } }, this.targetOrigin);\n }\n else {\n console.error(\"Parent window not available to initialize message channel.\");\n }\n break;\n default:\n console.error(\"Unknown host.\");\n reject(\"Unknown host\");\n }\n });\n }\n // Send CONNECTION_SUCCESS message to parent\n notifyConnectionSuccess() {\n this.sendMessage(ViewerMessageType.CONNECTION_SUCCESS);\n }\n // Handle messages coming over message channel port\n handlePortMessage(event) {\n const { type, data } = event.data || {};\n if (!type)\n return;\n // Delegate to subclass-specific message handler\n this.handleMessage(type, data);\n }\n // Common method for handling messages to be implemented by sub-classes\n handleMessage(type, data) {\n throw new Error(\"Subclasses must implement handleMessage.\");\n }\n}\n/**\n * ViewerSdk:\n * A subclass of DomeEmbeddedAppSdk specifically for document viewer applications.\n * It includes additional methods and properties to manage app interactions.\n */\nexport class ViewerSdk extends DomeEmbeddedAppSdk {\n constructor() {\n super();\n this.handler = null; // Handler instance for client messages\n this.pendingRequests = new Map();\n this.pendingInitAck = null;\n }\n /**\n * Static initialization method to get or create the singleton instance of ViewerSdk.\n * Allows setting the handler during initialization.\n * @param handler - (Optional) Custom handler for different message types\n * @returns The singleton ViewerSdk instance\n */\n static init(handler) {\n console.debug(\"init called\", handler && \"with handler\");\n // Prevent reinitialization if already initialized\n if (ViewerSdk.initialized) {\n console.warn(\"ViewerSdk is already initialized. Skipping initialization.\");\n return ViewerSdk.instance;\n }\n if (!ViewerSdk.instance) {\n ViewerSdk.instance = new ViewerSdk();\n // Initialize parent communication - REQUIRED!\n ViewerSdk.instance.setupParentConnection()\n .then(() => {\n try {\n // Connection established with parent\n ViewerSdk.instance.initializeViewerSdk();\n }\n catch (err) {\n console.error(\"Error in initializeViewerSdk:\", err);\n }\n })\n .catch((err) => {\n console.error(\"init: Error setting up parent connection!\", err);\n console.trace(\"called from:\");\n });\n }\n if (handler) {\n ViewerSdk.instance.setHandler(handler); // Set handler if provided during initialization\n }\n // Mark as initialized\n ViewerSdk.initialized = true;\n return ViewerSdk.instance;\n }\n /**\n * Method to set or update the handler object.\n * @param handler - Custom handler for different message types\n */\n setHandler(handler) {\n this.handler = handler;\n // If INIT_ACK message was received and stored, process it now\n if (this.pendingInitAck) {\n console.debug(\"Processing pending INIT_ACK message after handler is set.\");\n this.safeInvoke(\"onInitialData\", this.handler, this.pendingInitAck);\n this.pendingInitAck = null; // Clear the stored message\n }\n }\n /**\n * Checks if the given permissions string allows reading.\n * @param perms - The permissions string.\n * @returns - True if the permission string includes read access.\n */\n canRead(perms) {\n return !!perms?.includes('r');\n }\n /**\n * Checks if the given permissions string allows writing.\n * @param perms - The permissions string.\n * @returns - True if the permission string includes write access.\n */\n canWrite(perms) {\n return !!perms?.includes('w') || !!perms?.includes('*');\n }\n // Initializes the viewer SDK, setting up the message listener and sending an initial \"ready\" message.\n initializeViewerSdk() {\n console.debug(\"initializing viewer sdk\");\n this.sendAppInit();\n }\n /**\n * Sends a request to the parent application to retrieve initial data.\n */\n requestInitialData() {\n this.sendMessage(ViewerMessageType.REQUEST_INITIAL_DATA);\n }\n /**\n * Sends a request to the parent application to save data.\n * @param doc - payload data to be saved\n * @param isDataDirty - Boolean indicating indicating modified data\n */\n requestSave(doc, isDataDirty) {\n const requestId = generateUUID();\n // Send save request with the generated requestId\n this.sendMessage(ViewerMessageType.REQUEST_SAVE, { doc, isDataDirty, requestId });\n return new Promise((resolve, reject) => {\n this.pendingRequests.set(requestId, resolve);\n this.pendingRequests.set(requestId + '_reject', reject);\n // Timeout if the parent fails to respond in time\n setTimeout(() => {\n if (this.pendingRequests.has(requestId)) {\n this.pendingRequests.delete(requestId);\n this.pendingRequests.delete(requestId + '_reject');\n }\n }, 30000);\n });\n }\n handleOnSave(data) {\n const { requestId, status, message } = data;\n // Check if we have a pending request for this requestId\n const resolve = this.pendingRequests.get(requestId);\n const reject = this.pendingRequests.get(requestId + '_reject');\n if (resolve) {\n // If status is \"error\", reject the promise, otherwise resolve it\n if (status === \"error\") {\n reject?.({ status, message });\n }\n else {\n resolve({ status, message });\n }\n // Clean up\n this.pendingRequests.delete(requestId);\n this.pendingRequests.delete(requestId + '_reject');\n }\n }\n /**\n * Sets the viewer's \"dirty\" state, indicating modified data.\n * @param isDirty - Boolean indicating whether the viewer has modified data\n */\n setDirty(isDirty) {\n this.sendMessage(ViewerMessageType.SET_DIRTY, isDirty);\n }\n /**\n * Sends a close request to the parent, with information on whether the data is dirty.\n * @param doc - Latest document data\n * @param isDataDirty - Boolean indicating indicating modified data\n */\n sendClose(doc, isDataDirty) {\n this.sendMessage(ViewerMessageType.SEND_CLOSE, { doc, isDataDirty });\n }\n /**\n * Sends an exception to parent.\n * @param error - An error object with name and message or an error string\n */\n sendException(error) {\n this.sendMessage(ViewerMessageType.SEND_EXCEPTION, error);\n }\n // Sets up the message listener for viewer to receive messages from the parent.\n handleMessage(type, data) {\n console.debug(\"handleMessage called for:\", type, \"with data:\", data);\n if (type === ClientMessageType.INIT_ACK) {\n this.updateParentContext(data?.host, data?.capabilities);\n }\n if (!this.handler) {\n if (type === ClientMessageType.INIT_ACK) {\n console.warn(\"Handler not set. Storing INIT_ACK message for later processing.\");\n this.pendingInitAck = data; // Save INIT_ACK message\n }\n else {\n console.error(\"Message handler not found for type:\", type);\n }\n return;\n }\n switch (type) {\n case ClientMessageType.INIT_ACK:\n this.safeInvoke(\"onInitialData\", this.handler, data);\n break;\n case ClientMessageType.DATA_CHANGE:\n this.safeInvoke(\"onDataChange\", this.handler, data);\n break;\n case ClientMessageType.REQUEST_CLOSE:\n this.safeInvoke(\"onCloseRequest\", this.handler);\n break;\n case ClientMessageType.REQUEST_SAVE:\n this.safeInvoke(\"onSaveRequest\", this.handler);\n break;\n case ClientMessageType.SAVE_SUCCESS:\n this.handleOnSave(data);\n break;\n case ClientMessageType.SAVE_ERROR:\n this.handleOnSave(data);\n break;\n default:\n console.warn(`No handler found for message type: ${type}`);\n }\n }\n}\nViewerSdk.initialized = false;\n// Card SDK\n// Enum defining message types sent from the card to the parent application\nexport var CardMessageType;\n(function (CardMessageType) {\n CardMessageType[\"APP_READY\"] = \"APP_READY\";\n CardMessageType[\"INIT\"] = \"INIT\";\n CardMessageType[\"READ_FILE\"] = \"READ_FILE\";\n CardMessageType[\"WRITE_FILE\"] = \"WRITE_FILE\";\n CardMessageType[\"DELETE_FILE\"] = \"DELETE_FILE\";\n CardMessageType[\"LIST_FILES\"] = \"LIST_FILES\";\n CardMessageType[\"FILE_DIRTY\"] = \"FILE_DIRTY\";\n CardMessageType[\"OPEN_DEEPLINK\"] = \"OPEN_DEEPLINK\";\n CardMessageType[\"AF1_DATA_TOKEN\"] = \"AF1_DATA_TOKEN\";\n})(CardMessageType || (CardMessageType = {}));\n;\nclass CardFsCache {\n constructor(cardIuid, containerIuid) {\n this.cardIuid = cardIuid;\n this.containerIuid = containerIuid;\n this.openPromise = null;\n }\n isSupported() {\n return typeof indexedDB !== \"undefined\";\n }\n async openDb() {\n if (!this.isSupported())\n return null;\n if (!this.openPromise) {\n this.openPromise = new Promise((resolve) => {\n this.openWithVersion(CardFsCache.DB_VERSION, resolve);\n });\n }\n return this.openPromise;\n }\n openWithVersion(version, resolve) {\n let infoAction = \"ensure\";\n const request = indexedDB.open(this.cardIuid, version);\n request.onupgradeneeded = (event) => {\n infoAction = (event.oldVersion || 0) === 0 ? \"create\" : \"ensure\";\n this.configureStores(request.result);\n };\n request.onsuccess = () => {\n const db = request.result;\n if (!this.hasRequiredStores(db)) {\n const nextVersion = db.version + 1;\n db.close();\n this.openWithVersion(nextVersion, resolve);\n return;\n }\n this.updateStoresMetadata(db, infoAction === \"ensure\")\n .catch(() => undefined)\n .finally(() => resolve(db));\n };\n request.onerror = () => resolve(null);\n }\n configureStores(db) {\n if (!db.objectStoreNames.contains(CardFsCache.DATA_STORE)) {\n db.createObjectStore(CardFsCache.DATA_STORE);\n }\n if (!db.objectStoreNames.contains(CardFsCache.NAME_LOOKUP_STORE)) {\n db.createObjectStore(CardFsCache.NAME_LOOKUP_STORE);\n }\n if (!db.objectStoreNames.contains(CardFsCache.INFO_STORE)) {\n db.createObjectStore(CardFsCache.INFO_STORE);\n }\n }\n hasRequiredStores(db) {\n const stores = db.objectStoreNames;\n return (stores.contains(CardFsCache.DATA_STORE) &&\n stores.contains(CardFsCache.NAME_LOOKUP_STORE) &&\n stores.contains(CardFsCache.INFO_STORE));\n }\n static nowMicros() {\n return Math.trunc(Date.now() * 1000);\n }\n updateStoresMetadata(db, preserveExistingInfoTs) {\n return Promise.all([\n this.ensureStoreVersion(db, CardFsCache.DATA_STORE),\n this.ensureStoreVersion(db, CardFsCache.NAME_LOOKUP_STORE),\n this.updateCardInfo(db, preserveExistingInfoTs),\n ]).then(() => undefined);\n }\n ensureStoreVersion(db, storeName) {\n if (!db.objectStoreNames.contains(storeName)) {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n try {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n const finalize = () => resolve();\n tx.oncomplete = finalize;\n tx.onerror = finalize;\n tx.onabort = finalize;\n store.put(CARD_FS_VERSION, CardFsCache.STORE_VERSION_KEY);\n }\n catch {\n resolve();\n }\n });\n }\n async updateCardInfo(db, preserveExistingTs) {\n if (!db.objectStoreNames.contains(CardFsCache.INFO_STORE)) {\n return;\n }\n const existingContainer = await this.readInfoValue(db, \"container_iuid\");\n const existingTs = preserveExistingTs ? await this.readInfoValue(db, \"ts_c\") : undefined;\n const containerValue = this.containerIuid ?? existingContainer ?? null;\n const timestampValue = preserveExistingTs && existingTs ? existingTs : CardFsCache.nowMicros();\n await Promise.all([\n this.writeInfoValue(db, \"container_iuid\", containerValue),\n this.writeInfoValue(db, \"ts_c\", timestampValue),\n ]).catch(() => undefined);\n }\n readInfoValue(db, key) {\n return new Promise((resolve) => {\n try {\n const tx = db.transaction(CardFsCache.INFO_STORE, \"readonly\");\n const store = tx.objectStore(CardFsCache.INFO_STORE);\n const request = store.get(key);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => resolve(undefined);\n }\n catch {\n resolve(undefined);\n }\n });\n }\n writeInfoValue(db, key, value) {\n return new Promise((resolve) => {\n try {\n const tx = db.transaction(CardFsCache.INFO_STORE, \"readwrite\");\n const store = tx.objectStore(CardFsCache.INFO_STORE);\n const finalize = () => resolve();\n tx.oncomplete = finalize;\n tx.onerror = finalize;\n tx.onabort = finalize;\n store.put(value, key);\n }\n catch {\n resolve();\n }\n });\n }\n keyFor(suffix) {\n return suffix;\n }\n static normalizeName(name) {\n if (typeof name !== \"string\")\n return null;\n const trimmed = name.trim();\n return trimmed ? trimmed : null;\n }\n async put(key, value) {\n const db = await this.openDb();\n if (!db)\n return;\n await new Promise((resolve) => {\n const tx = db.transaction(CardFsCache.DATA_STORE, \"readwrite\");\n const store = tx.objectStore(CardFsCache.DATA_STORE);\n store.put(value, key).onsuccess = () => resolve();\n tx.oncomplete = () => resolve();\n tx.onerror = () => resolve();\n tx.onabort = () => resolve();\n });\n }\n async get(key) {\n const db = await this.openDb();\n if (!db)\n return undefined;\n return new Promise((resolve) => {\n const tx = db.transaction(CardFsCache.DATA_STORE, \"readonly\");\n const store = tx.objectStore(CardFsCache.DATA_STORE);\n const request = store.get(key);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => resolve(undefined);\n });\n }\n async delete(key) {\n const db = await this.openDb();\n if (!db)\n return;\n await new Promise((resolve) => {\n const tx = db.transaction(CardFsCache.DATA_STORE, \"readwrite\");\n const store = tx.objectStore(CardFsCache.DATA_STORE);\n store.delete(key).onsuccess = () => resolve();\n tx.oncomplete = () => resolve();\n tx.onerror = () => resolve();\n tx.onabort = () => resolve();\n });\n }\n static async hashName(name) {\n const cryptoRef = typeof globalThis !== 'undefined' ? globalThis.crypto : undefined;\n if (!cryptoRef?.subtle?.digest) {\n throw new Error('CardFS name hashing requires SubtleCrypto support');\n }\n const encoded = CardFsCache.encodeText(name);\n const digest = await cryptoRef.subtle.digest('SHA-256', encoded);\n return CardFsCache.bufferToBase64(digest);\n }\n static encodeText(value) {\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(value).buffer;\n }\n const result = new Uint8Array(value.length);\n for (let i = 0; i < value.length; i++) {\n result[i] = value.charCodeAt(i);\n }\n return result.buffer;\n }\n static bufferToBase64(buffer) {\n let binary = '';\n const bytes = new Uint8Array(buffer);\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n async getIuidForName(name) {\n const normalized = CardFsCache.normalizeName(name);\n if (!normalized)\n return undefined;\n const db = await this.openDb();\n if (!db)\n return undefined;\n const hashed = await CardFsCache.hashName(normalized);\n return new Promise((resolve) => {\n const tx = db.transaction(CardFsCache.NAME_LOOKUP_STORE, \"readonly\");\n const store = tx.objectStore(CardFsCache.NAME_LOOKUP_STORE);\n const request = store.get(hashed);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => resolve(undefined);\n });\n }\n async upsertNameLookup(name, iuid) {\n const normalized = CardFsCache.normalizeName(name);\n if (!normalized)\n return;\n const db = await this.openDb();\n if (!db)\n return;\n const hashed = await CardFsCache.hashName(normalized);\n await new Promise((resolve) => {\n const tx = db.transaction(CardFsCache.NAME_LOOKUP_STORE, \"readwrite\");\n const store = tx.objectStore(CardFsCache.NAME_LOOKUP_STORE);\n store.put(iuid, hashed);\n const cursorRequest = store.openCursor();\n cursorRequest.onsuccess = (event) => {\n const cursor = event.target.result;\n if (!cursor)\n return;\n if (cursor.key !== hashed && cursor.value === iuid) {\n cursor.delete();\n }\n cursor.continue();\n };\n tx.oncomplete = () => resolve();\n tx.onerror = () => resolve();\n tx.onabort = () => resolve();\n });\n }\n async deleteNameLookupByName(name) {\n const normalized = CardFsCache.normalizeName(name);\n if (!normalized)\n return;\n const db = await this.openDb();\n if (!db)\n return;\n const hashed = await CardFsCache.hashName(normalized);\n await new Promise((resolve) => {\n const tx = db.transaction(CardFsCache.NAME_LOOKUP_STORE, \"readwrite\");\n const store = tx.objectStore(CardFsCache.NAME_LOOKUP_STORE);\n store.delete(hashed);\n tx.oncomplete = () => resolve();\n tx.onerror = () => resolve();\n tx.onabort = () => resolve();\n });\n }\n async deleteNameLookupByIuid(iuid) {\n if (!iuid)\n return;\n const db = await this.openDb();\n if (!db)\n return;\n await new Promise((resolve) => {\n const tx = db.transaction(CardFsCache.NAME_LOOKUP_STORE, \"readwrite\");\n const store = tx.objectStore(CardFsCache.NAME_LOOKUP_STORE);\n const request = store.openCursor();\n request.onsuccess = (event) => {\n const cursor = event.target.result;\n if (!cursor)\n return;\n if (cursor.value === iuid) {\n cursor.delete();\n }\n cursor.continue();\n };\n tx.oncomplete = () => resolve();\n tx.onerror = () => resolve();\n tx.onabort = () => resolve();\n });\n }\n static estimateSize(data) {\n if (data == null)\n return 0;\n if (typeof Blob !== \"undefined\" && data instanceof Blob)\n return data.size;\n if (data instanceof ArrayBuffer)\n return data.byteLength;\n if (ArrayBuffer.isView(data))\n return data.byteLength;\n if (typeof data === \"string\")\n return new Blob([data]).size;\n try {\n return new Blob([JSON.stringify(data)]).size;\n }\n catch {\n return 0;\n }\n }\n async cacheDocument(doc, data) {\n if (!doc?.iuid)\n return;\n await this.put(this.keyFor(`${doc.iuid}_object`), doc);\n const normalizedName = CardFsCache.normalizeName(doc.name);\n if (normalizedName) {\n await this.upsertNameLookup(normalizedName, doc.iuid);\n }\n if (data === undefined) {\n await this.delete(this.keyFor(`${doc.iuid}_data`));\n return;\n }\n const size = CardFsCache.estimateSize(data);\n if (size <= CardFsCache.MAX_DATA_BYTES) {\n await this.put(this.keyFor(`${doc.iuid}_data`), data);\n }\n else {\n await this.delete(this.keyFor(`${doc.iuid}_data`));\n }\n }\n async getByName(name) {\n const normalizedName = CardFsCache.normalizeName(name);\n if (!normalizedName)\n return null;\n const iuid = await this.getIuidForName(normalizedName);\n if (!iuid)\n return null;\n const object = await this.get(this.keyFor(`${iuid}_object`));\n if (!object)\n return null;\n const data = await this.get(this.keyFor(`${iuid}_data`));\n return { iuid, object, data };\n }\n async getByIuid(iuid) {\n if (!iuid)\n return null;\n const object = await this.get(this.keyFor(`${iuid}_object`));\n if (!object)\n return null;\n const data = await this.get(this.keyFor(`${iuid}_data`));\n return { iuid, object, data };\n }\n async deleteByName(name) {\n const entry = await this.getByName(name);\n await this.deleteNameLookupByName(name);\n if (!entry)\n return;\n await this.delete(this.keyFor(`${entry.iuid}_object`));\n await this.delete(this.keyFor(`${entry.iuid}_data`));\n }\n async deleteByIuid(iuid, name) {\n if (name) {\n await this.deleteNameLookupByName(name);\n }\n await this.deleteNameLookupByIuid(iuid);\n await this.delete(this.keyFor(`${iuid}_object`));\n await this.delete(this.keyFor(`${iuid}_data`));\n }\n async getAllCachedObjects() {\n const db = await this.openDb();\n if (!db)\n return [];\n return new Promise((resolve) => {\n const results = [];\n const tx = db.transaction(CardFsCache.DATA_STORE, \"readonly\");\n const store = tx.objectStore(CardFsCache.DATA_STORE);\n const request = store.openCursor();\n request.onsuccess = (event) => {\n const cursor = event.target.result;\n if (!cursor) {\n resolve(results);\n return;\n }\n const key = cursor.key;\n if (typeof key === \"string\" && key.endsWith(\"_object\")) {\n results.push(cursor.value);\n }\n cursor.continue();\n };\n request.onerror = () => resolve(results);\n });\n }\n}\nCardFsCache.DB_VERSION = 2;\nCardFsCache.DATA_STORE = \"cardfs\";\nCardFsCache.NAME_LOOKUP_STORE = \"cardfs_name_iuid_lookup\";\nCardFsCache.INFO_STORE = \"info\";\nCardFsCache.STORE_VERSION_KEY = \"ver\";\nCardFsCache.MAX_DATA_BYTES = 5 * 1024 * 1024;\n/**\n * Use CardSdk to create webapp cards\n */\nexport class CardSdk extends DomeEmbeddedAppSdk {\n buildCardFsMessagePayload(target, extra) {\n return {\n ...(target.name ? { name: target.name } : {}),\n ...(target.iuid ? { iuid: target.iuid } : {}),\n ...(extra ?? {}),\n };\n }\n assertValidReadHandler(handler) {\n if (!handler || typeof handler.next !== \"function\") {\n throw new Error(\"cardFS.read requires a handler with a next() function\");\n }\n return handler;\n }\n invokeReadHandlerNext(handler, payload) {\n try {\n handler.next(payload);\n }\n catch (err) {\n console.error(\"cardFS.read handler next() threw\", err);\n }\n }\n invokeReadHandlerError(handler, error) {\n if (!handler.error)\n return;\n try {\n handler.error(error);\n }\n catch (err) {\n console.error(\"cardFS.read handler error() threw\", err);\n }\n }\n sanitizeReadData(data, contextLabel) {\n if (data == null) {\n return { value: data, stripped: false };\n }\n try {\n const size = CardFsCache.estimateSize(data);\n if (size > CardFsCache.MAX_DATA_BYTES) {\n const label = contextLabel ? ` for ${contextLabel}` : \"\";\n console.warn(`cardFS.read payload data exceeded ${CardFsCache.MAX_DATA_BYTES} bytes${label}; omitting data`);\n return { value: undefined, stripped: true };\n }\n }\n catch (err) {\n console.warn(\"cardFS.read payload size estimation failed\", err);\n }\n return { value: data, stripped: false };\n }\n getCardIuid() {\n return this.dataStore?.iuid || null;\n }\n ensureCardFsCache() {\n if (!this.shouldUseCardFsFallback()) {\n return null;\n }\n if (!this.cardFsCache) {\n const cardIuid = this.getCardIuid();\n if (cardIuid) {\n this.cardFsCache = new CardFsCache(cardIuid, this.containerIuid);\n }\n }\n return this.cardFsCache;\n }\n supportsParentCardFs() {\n return !!this.parentCapabilities?.card_fs;\n }\n shouldUseCardFsFallback() {\n return !this.supportsParentCardFs();\n }\n constructor() {\n super();\n this.handler = null; // Handler instance for client messages\n this.accessToken = '';\n this.devMode = false;\n // Track in-flight FS operations by messageId so we can settle promises on callback\n this.fsReadRequests = new Map();\n this.fsWriteRequests = new Map();\n this.cardFsCache = null;\n this.pendingAcks = new Map();\n // Sets up the message listener for cards to receive messages from the parent.\n this.handleMessage = (type, data) => {\n if (type === ClientMessageType.INIT_ACK) {\n this.updateParentContext(data?.host, data?.capabilities);\n }\n if (!this.handler) {\n throw new Error(\"Message handler not found!\");\n }\n // Check for ACK response with messageId\n const messageId = data?.messageId;\n if (messageId && this.pendingAcks.has(messageId)) {\n const { resolve, timeout } = this.pendingAcks.get(messageId);\n clearTimeout(timeout);\n this.pendingAcks.delete(messageId);\n resolve(data);\n return;\n }\n switch (type) {\n case ClientMessageType.INIT_ACK:\n // Parent sent INIT_ACK\n console.debug(\"CardSdk: INIT_ACK received\");\n this.dataStore.kw1 = data.key_wa1;\n this.dataStore.iuid = data.iuid;\n if (data?.dev_mode) {\n this.devMode = data.dev_mode;\n }\n if (data.iuid) {\n if (this.shouldUseCardFsFallback()) {\n this.cardFsCache = new CardFsCache(data.iuid, this.containerIuid);\n }\n else {\n this.cardFsCache = null;\n }\n }\n else if (!this.shouldUseCardFsFallback()) {\n this.cardFsCache = null;\n }\n try {\n this.cryptoA01.decrypt(this.dataStore.denc, data.key_wa1 + this.dataStore.kw2, data.iuid)\n .then((decData) => {\n console.debug(\"CardSdk: INIT_ACK: decrypted data \", decData);\n const decryptedData = JSON.parse(decData);\n const decryptedContainerIuid = decryptedData?.container?.iuid;\n if (decryptedContainerIuid) {\n this.containerIuid = decryptedContainerIuid;\n if (this.shouldUseCardFsFallback() && this.dataStore?.iuid) {\n this.cardFsCache = new CardFsCache(this.dataStore.iuid, this.containerIuid);\n }\n }\n const apiToken = typeof decryptedData?.api_token === \"string\" ? decryptedData.api_token.trim() : \"\";\n if (apiToken) {\n this.accessToken = apiToken;\n console.debug(\"CardSdk: Stored API token from INIT_ACK payload\");\n }\n else {\n console.warn(\"CardSdk: INIT_ACK payload missing api_token; fallback APIs may fail without auth\");\n }\n if (this.handler)\n this.safeInvoke(\"onInit\", this.handler, { ...decryptedData, ui: data.ui });\n // no need for orig enc data.. free to delete it\n delete this.dataStore.denc;\n })\n .catch((err) => {\n console.error(\"Final decrypt error\", err);\n throw err;\n });\n }\n catch (err) {\n console.error(\"Decryption failed!\", err);\n this.sendEventError('dec2_failed', err.message);\n }\n break;\n case ClientMessageType.FILE_DATA: {\n const responseId = data?.messageId;\n if (responseId && this.fsReadRequests.has(responseId)) {\n // cardFS.read payload from parent (cached or fresh)\n const { messageId: _ignored, ...payload } = data || {};\n this.handleFsReadDataMessage(responseId, payload);\n return;\n }\n console.warn(\"CardSdk: FILE_DATA received but no matching fsRead request\", data?.messageId ?? data?.name);\n break;\n }\n case ClientMessageType.DATA_CHANGE:\n this.safeInvoke(\"onFileChange\", this.handler, data);\n case ClientMessageType.SAVE_SUCCESS: {\n const responseId = data?.messageId;\n if (responseId && this.fsWriteRequests.has(responseId)) {\n // cardFS write/list/delete success routed by messageId\n this.handleFsWriteSuccess(responseId, data);\n return;\n }\n console.warn(\"CardSdk: SAVE_SUCCESS received but no matching fsWrite request\", data?.messageId ?? data?.name);\n break;\n }\n case ClientMessageType.SAVE_ERROR: {\n const responseId = data?.messageId;\n if (responseId && this.fsWriteRequests.has(responseId)) {\n // cardFS write/list/delete failure routed by messageId\n this.handleFsWriteError(responseId, data);\n return;\n }\n console.warn(\"CardSdk: SAVE_ERROR received but no matching fsWrite request\", data?.messageId ?? data?.name);\n break;\n }\n case ClientMessageType.ERROR: {\n const responseId = data?.messageId;\n if (responseId) {\n const message = data?.message || 'Unknown error';\n if (this.fsReadRequests.has(responseId)) {\n // cardFS read error surfaced by the parent\n this.failFsReadRequest(responseId, new Error(message));\n return;\n }\n if (this.fsWriteRequests.has(responseId)) {\n // cardFS write/delete/list error surfaced by the parent\n this.failFsWriteRequest(responseId, new Error(message));\n return;\n }\n }\n // Parent sent an ERROR\n this.safeInvoke(\"onError\", this.handler, data);\n break;\n }\n case ClientMessageType.REFRESH:\n // Asking for UI refresh\n this.safeInvoke(\"onRefreshRequest\", this.handler, data);\n break;\n default:\n console.warn(`No handler found for message type: ${type}`);\n }\n };\n this.cryptoA01 = new CryptoA01();\n this.cardFS = {\n read: (name, handler, allowStale = true) => {\n this.cardsFsRead(name, handler, allowStale);\n },\n readById: (iuid, handler, allowStale = true) => {\n this.cardsFsReadById(iuid, handler, allowStale);\n },\n write: (name, fileData, onResult) => this.cardsFsWrite(name, fileData, onResult),\n writeById: (iuid, fileData, onResult) => this.cardsFsWriteById(iuid, fileData, onResult),\n delete: (name, onResult) => this.cardsFsDelete(name, onResult),\n deleteById: (iuid, onResult) => this.cardsFsDeleteById(iuid, onResult),\n list: (onResult) => this.cardsFsList(onResult),\n };\n console.debug(\"CardSdk::constructor: done\");\n }\n /**\n * Static initialization method to get or create the singleton instance of CardSdk.\n * @param secret - The card developer secret key\n * @param handler - (Optional) Handler for different events emitted by the SDK\n * @returns The singleton CardSdk instance\n */\n static async init(secret, handler, options) {\n try {\n console.debug(\"CardSdk::init\");\n if (!CardSdk.instance) {\n CardSdk.instance = new CardSdk();\n // Initialize parent communication - REQUIRED!\n CardSdk.instance.setupParentConnection()\n .then(() => {\n // Connection established with parents..\n // Initialize SDK in async\n CardSdk.instance.initializeCardSdk(secret);\n })\n .catch((err) => {\n console.error(err);\n });\n }\n else {\n return CardSdk.instance;\n }\n // Setup handlers\n if (handler) {\n CardSdk.instance.setHandler(handler); // Set handler if provided during initialization\n }\n return CardSdk.instance;\n }\n catch (err) {\n console.error(\"CardSdk: Unrecoverable error in init\", err);\n throw err;\n }\n }\n /**\n * Method to set or update the handler object.\n * @param handler - Custom handler for different message types\n */\n setHandler(handler) {\n this.handler = handler;\n }\n /**\n * Sends a deep link request to the parent directly from the card.\n */\n openDeepLink(href) {\n if (!this.emitDeepLink(href)) {\n console.warn(\"openDeepLink ignored; provide a dome:// or intouchapp:// href\");\n }\n }\n getRequestTokenFromUrl(url) {\n const segments = url.pathname.split(\"/wa/\");\n if (segments.length < 2 || !segments[1]) {\n throw new Error(\"Invalid URL: missing /wa/ segment\");\n }\n const requestToken = segments[1].split(\"/\")[0];\n if (!requestToken) {\n throw new Error(\"Invalid URL: missing request token\");\n }\n return decodeURIComponent(requestToken);\n }\n deriveSecretSeed(requestToken) {\n const reversed = requestToken.split('').reverse().join('');\n const seed = reversed.substring(4, 25);\n if (!seed) {\n throw new Error('Cannot decrypt (1)');\n }\n return seed;\n }\n async requestAf1DataFromParent(requestToken) {\n const ackPayload = await this.sendMessageWithAck(CardMessageType.AF1_DATA_TOKEN, { sdk: { ver: pkg.version } }, ClientMessageType.AF1_DATA_TOKEN_ACK);\n const { messageId: _ignored, ...payload } = ackPayload || {};\n const { cie, ck, dev_token } = payload;\n if (!cie || !ck || !dev_token) {\n throw new Error(\"Invalid AF1 data token payload\");\n }\n const res = await this.fetchAf1Data(cie, ck, dev_token, requestToken);\n const dataAf1 = res?.data.data_af1;\n if (!dataAf1) {\n throw new Error(\"AF1 data fetch returned empty payload\");\n }\n window.IT_DATA_AF1 = dataAf1;\n return dataAf1;\n }\n async fetchAf1Data(cie, ck, devToken, requestToken) {\n if (!cie || !ck || !devToken || !requestToken) {\n throw new Error(\"Invalid AF1 data fetch parameters\");\n }\n const endpoint = new URL(`https://dome.so/api/v1/cards/e/${encodeURIComponent(cie)}/data_af1/`);\n endpoint.searchParams.set(\"dt\", devToken);\n endpoint.searchParams.set(\"rt\", requestToken);\n endpoint.searchParams.set(\"ck\", ck);\n const response = await fetch(endpoint.toString(), { method: \"GET\" });\n if (!response.ok) {\n const message = await response.text().catch(() => response.statusText);\n throw new Error(`AF1 data fetch failed: ${response.status} ${message}`);\n }\n return response.json();\n }\n // Function to initialize SDK after instance is created\n async initializeCardSdk(secret) {\n let TAG = \"CardSdk::initializeCardSdk:\";\n try {\n console.debug(TAG, \"enter\");\n if (!secret) {\n throw new Error(\"Invalid secret\");\n }\n const url = window.location.href;\n console.debug(TAG, \"url:\", url);\n const urlObject = new URL(url);\n const requestToken = this.getRequestTokenFromUrl(urlObject);\n const ss = this.deriveSecretSeed(requestToken);\n console.debug(TAG, \"ss:\", ss);\n let data_af1 = window.IT_DATA_AF1;\n if (!data_af1) {\n console.debug(TAG, \"IT_DATA_AF1 missing. Requesting token via parent\");\n data_af1 = await this.requestAf1DataFromParent(requestToken);\n }\n if (!data_af1) {\n console.error(TAG, \"No data\");\n throw new Error('No data');\n }\n const decData = await this.cryptoA01.decrypt(data_af1, secret, ss);\n try {\n const dataFromServer = JSON.parse(decData);\n console.debug(\"CardSdk: dataFromServer:\", dataFromServer);\n if (!dataFromServer.ite) {\n throw new Error(\"Invalid data\");\n }\n this.dataStore = {\n 'denc': dataFromServer.d,\n 'kw2': dataFromServer.kw2\n };\n CardSdk.instance.sendInit(dataFromServer.ite);\n }\n catch (err) {\n console.error(\"Initial Decryption failed (2):\", err);\n throw err;\n }\n }\n catch (err) {\n console.error(TAG, \"Init failed:\", err);\n this.sendEventError('init_failed', err.message);\n }\n }\n async sendInit(token) {\n const payload = { token, sdk: { ver: pkg.version } };\n const webappDetails = this.getWebappDetails();\n if (webappDetails) {\n payload.wa = webappDetails;\n }\n this.sendMessage(CardMessageType.INIT, payload);\n }\n getWebappDetails() {\n if (typeof window === \"undefined\") {\n return null;\n }\n let wa = {};\n const version = window.IT_VERSION;\n const env = window.IT_ENV;\n if (version) {\n wa.ver = String(version);\n }\n if (env) {\n wa.env = String(env);\n }\n return Object.keys(wa).length ? wa : null;\n }\n sendMessageWithAck(type, data, ackType, timeoutMs = 15000, onMessageId) {\n const messageId = crypto.randomUUID();\n if (onMessageId) {\n try {\n onMessageId(messageId);\n }\n catch (err) {\n return Promise.reject(err);\n }\n }\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingAcks.delete(messageId);\n reject(new Error(`${ackType} not received in time`));\n }, timeoutMs);\n this.pendingAcks.set(messageId, { resolve, reject, timeout });\n this.sendMessage(type, { ...data, messageId });\n });\n }\n // cardsSdk.cardFS.read implementation - streams updates only via handler callbacks\n cardsFsRead(name, handler, allowStale = true) {\n const target = { name };\n const resolvedHandler = this.assertValidReadHandler(handler);\n this.cardsFsReadInternal(target, resolvedHandler, allowStale, \"read\");\n }\n cardsFsReadById(iuid, handler, allowStale = true) {\n const target = { iuid };\n const resolvedHandler = this.assertValidReadHandler(handler);\n this.cardsFsReadInternal(target, resolvedHandler, allowStale, \"readById\");\n }\n cardsFsReadInternal(target, handler, allowStale, operation) {\n if (this.shouldUseCardFsFallback()) {\n console.debug(`cardFS.${operation} using fallback implementation for`, target);\n void this.cardsFsReadFallback(target, undefined, handler, allowStale).catch((err) => {\n const error = err instanceof Error ? err : new Error(String(err));\n this.invokeReadHandlerError(handler, error);\n });\n return;\n }\n console.debug(`cardFS.${operation} delegating to parent for`, target);\n let registeredMessageId = null;\n const targetLabel = target.name ? `\"${target.name}\"` : (target.iuid ? `iuid ${target.iuid}` : \"document\");\n const registerRequest = (messageId) => {\n registeredMessageId = messageId;\n // Track this read so FILE_DATA updates can stream via handler callbacks\n const request = {\n name: targetLabel,\n handler,\n allowStale,\n };\n request.noResponseTimeout = setTimeout(() => {\n this.failFsReadRequest(messageId, new Error(`cardFS.${operation} timed out for ${targetLabel}`));\n }, CardSdk.FS_RESPONSE_TIMEOUT_MS);\n this.fsReadRequests.set(messageId, request);\n };\n // Parent ACK provides a messageId that subsequent FILE_DATA responses will reuse\n this.sendMessageWithAck(CardMessageType.READ_FILE, this.buildCardFsMessagePayload(target, { allow_stale: allowStale }), ClientMessageType.READ_FILE_ACK, CardSdk.CARD_FS_ACK_TIMEOUT_MS, registerRequest).catch((err) => {\n const error = err instanceof Error ? err : new Error(String(err));\n if (registeredMessageId) {\n this.failFsReadRequest(registeredMessageId, error);\n }\n else {\n this.invokeReadHandlerError(handler, error);\n }\n });\n }\n // cardsSdk.cardFS.write - resolves when host confirms write\n cardsFsWrite(name, fileData, onResult) {\n const target = { name };\n return this.cardsFsWriteInternal(target, fileData, onResult, \"write\");\n }\n cardsFsWriteById(iuid, fileData, onResult) {\n const target = { iuid };\n return this.cardsFsWriteInternal(target, fileData, onResult, \"writeById\");\n }\n cardsFsWriteInternal(target, fileData, onResult, operation) {\n if (this.shouldUseCardFsFallback()) {\n console.debug(`cardFS.${operation} using fallback implementation for`, target);\n return this.cardsFsWriteFallback(target, fileData)\n .then((result) => {\n try {\n onResult?.(result);\n }\n catch (callbackErr) {\n console.error(`cardFS.${operation} fallback callback threw`, callbackErr);\n }\n return result;\n });\n }\n console.debug(`cardFS.${operation} delegating to parent for`, target);\n return new Promise((resolve, reject) => {\n let registeredMessageId = null;\n const targetLabel = target.name ? `\"${target.name}\"` : (target.iuid ? `iuid ${target.iuid}` : \"document\");\n const registerRequest = (messageId) => {\n registeredMessageId = messageId;\n const request = {\n name: targetLabel,\n onResult,\n resolve,\n reject,\n timeout: setTimeout(() => {\n this.failFsWriteRequest(messageId, new Error(`cardFS.${operation} timed out for ${targetLabel}`));\n }, CardSdk.FS_RESPONSE_TIMEOUT_MS),\n };\n this.fsWriteRequests.set(messageId, request);\n };\n this.sendMessageWithAck(CardMessageType.WRITE_FILE, this.buildCardFsMessagePayload(target, { data: fileData }), ClientMessageType.WRITE_FILE_ACK, CardSdk.CARD_FS_ACK_TIMEOUT_MS, registerRequest).catch((err) => {\n const error = err instanceof Error ? err : new Error(String(err));\n if (registeredMessageId) {\n this.failFsWriteRequest(registeredMessageId, error);\n }\n else {\n reject(error);\n }\n });\n });\n }\n // cardsSdk.cardFS.delete - simple request/ack flow\n cardsFsDelete(name, onResult) {\n const target = { name };\n return this.cardsFsDeleteInternal(target, onResult, \"delete\");\n }\n cardsFsDeleteById(iuid, onResult) {\n const target = { iuid };\n return this.cardsFsDeleteInternal(target, onResult, \"deleteById\");\n }\n cardsFsDeleteInternal(target, onResult, operation) {\n if (this.shouldUseCardFsFallback()) {\n console.debug(`cardFS.${operation} using fallback implementation for`, target);\n return this.cardsFsDeleteFallback(target)\n .then((result) => {\n try {\n onResult?.(result);\n }\n catch (callbackErr) {\n console.error(`cardFS.${operation} fallback callback threw`, callbackErr);\n }\n return result;\n });\n }\n console.debug(`cardFS.${operation} delegating to parent for`, target);\n return new Promise((resolve, reject) => {\n this.sendMessageWithAck(CardMessageType.DELETE_FILE, this.buildCardFsMessagePayload(target), ClientMessageType.DELETE_FILE_ACK, CardSdk.CARD_FS_ACK_TIMEOUT_MS)\n .then((data) => {\n const { messageId: _ignored, ...result } = data || {};\n onResult?.(result);\n resolve(result);\n })\n .catch((err) => {\n reject(err instanceof Error ? err : new Error(String(err)));\n });\n });\n }\n // cardsSdk.cardFS.list - returns metadata list provided by parent\n cardsFsList(onResult) {\n if (this.shouldUseCardFsFallback()) {\n console.debug(\"cardFS.list using fallback implementation\");\n return this.cardsFsListFallback()\n .then((result) => {\n try {\n onResult?.(result);\n }\n catch (callbackErr) {\n console.error(\"cardFS.list fallback callback threw\", callbackErr);\n }\n return result;\n });\n }\n console.debug(\"cardFS.list delegating to parent\");\n return new Promise((resolve, reject) => {\n this.sendMessageWithAck(CardMessageType.LIST_FILES, {}, ClientMessageType.LIST_FILES_ACK, CardSdk.CARD_FS_ACK_TIMEOUT_MS)\n .then((data) => {\n const { messageId: _ignored, ...result } = data || {};\n onResult?.(result);\n resolve(result);\n })\n .catch((err) => {\n reject(err instanceof Error ? err : new Error(String(err)));\n });\n });\n }\n // Handle FILE_DATA updates (cached + fresh) for cardFS.read\n handleFsReadDataMessage(messageId, payload) {\n const request = this.fsReadRequests.get(messageId);\n if (!request)\n return;\n if (request.noResponseTimeout) {\n clearTimeout(request.noResponseTimeout);\n request.noResponseTimeout = undefined;\n }\n // Guard against oversized payloads even if parent misbehaves\n const sanitized = this.sanitizeReadData(payload?.data, request.name);\n const fromCache = Boolean(payload?.from_cache ?? payload?.is_stale);\n const normalizedPayload = {\n name: payload?.name,\n iuid: payload?.iuid ?? null,\n object: payload?.object,\n data: sanitized.value,\n is_stale: Boolean(payload?.is_stale ?? payload?.from_cache),\n is_complete: typeof payload?.is_complete === \"boolean\"\n ? payload.is_complete\n : (!request.allowStale || !fromCache),\n };\n this.invokeReadHandlerNext(request.handler, normalizedPayload);\n if (request.cleanupTimeout) {\n clearTimeout(request.cleanupTimeout);\n }\n request.cleanupTimeout = setTimeout(() => {\n this.clearFsReadRequest(messageId);\n }, CardSdk.FS_READ_RETENTION_MS);\n }\n // Remove read request bookkeeping and clear timers\n clearFsReadRequest(messageId) {\n const request = this.fsReadRequests.get(messageId);\n if (!request)\n return undefined;\n if (request.noResponseTimeout) {\n clearTimeout(request.noResponseTimeout);\n }\n if (request.cleanupTimeout) {\n clearTimeout(request.cleanupTimeout);\n }\n this.fsReadRequests.delete(messageId);\n return request;\n }\n failFsReadRequest(messageId, error) {\n const request = this.clearFsReadRequest(messageId);\n if (request) {\n this.invokeReadHandlerError(request.handler, error);\n }\n }\n // Remove write request bookkeeping\n clearFsWriteRequest(messageId) {\n const request = this.fsWriteRequests.get(messageId);\n if (!request)\n return undefined;\n clearTimeout(request.timeout);\n this.fsWriteRequests.delete(messageId);\n return request;\n }\n failFsWriteRequest(messageId, error) {\n const request = this.clearFsWriteRequest(messageId);\n if (request) {\n request.reject(error);\n }\n }\n // Resolve write/list/delete promise with payload and invoke optional callback\n handleFsWriteSuccess(messageId, payload) {\n const request = this.clearFsWriteRequest(messageId);\n if (!request)\n return;\n const { messageId: _ignored, ...result } = payload || {};\n if (typeof request.onResult === \"function\") {\n try {\n request.onResult(result);\n }\n catch (err) {\n console.error(\"cardFS.write callback threw\", err);\n }\n }\n else {\n console.warn(\"onResult method invalid:\", request.onResult);\n }\n request.resolve(result);\n }\n handleFsWriteError(messageId, payload) {\n const request = this.clearFsWriteRequest(messageId);\n if (!request)\n return;\n const errorMessage = payload?.message || 'Unknown write error';\n const error = payload instanceof Error ? payload : new Error(errorMessage);\n request.reject(error);\n }\n async cardsFsReadFallback(target, requestId, handler, allowStale = true) {\n if (!this.shouldUseCardFsFallback()) {\n throw new Error(\"cardFS.read fallback is disabled because parent supports card_fs\");\n }\n const cardIuid = this.getCardIuid();\n if (!cardIuid) {\n throw new Error(\"cardFS.read fallback failed: card not initialized\");\n }\n const cache = this.ensureCardFsCache();\n let firstPayload = null;\n const targetLabel = target.name ? `\"${target.name}\"` : (target.iuid ? `iuid ${target.iuid}` : \"document\");\n const emit = (object, data, fromCache, isComplete, explicitName, explicitIuid) => {\n if (!object)\n return null;\n const payloadName = explicitName ?? target.name ?? object?.name ?? target.iuid ?? \"document\";\n const payloadIuid = explicitIuid ?? object?.iuid ?? target.iuid ?? null;\n const { value: safeData } = this.sanitizeReadData(data, payloadName);\n const messagePayload = {\n name: payloadName,\n iuid: payloadIuid,\n object,\n data: safeData,\n is_stale: fromCache,\n is_complete: isComplete,\n };\n if (requestId && this.fsReadRequests.has(requestId)) {\n this.handleFsReadDataMessage(requestId, messagePayload);\n }\n else {\n this.invokeReadHandlerNext(handler, messagePayload);\n }\n if (!firstPayload) {\n firstPayload = messagePayload;\n }\n return messagePayload;\n };\n let lastCachedPayload = null;\n if (cache) {\n try {\n if (allowStale) {\n let cached = null;\n if (target.iuid) {\n cached = await cache.getByIuid(target.iuid);\n }\n if (!cached && target.name) {\n cached = await cache.getByName(target.name);\n }\n if (cached?.object) {\n lastCachedPayload = emit(cached.object, cached.data, true, false, cached.object?.name ?? target.name, cached.iuid);\n }\n }\n }\n catch (err) {\n console.warn(\"cardFS.read cache lookup failed\", err);\n }\n }\n try {\n const freshPayload = await this.fetchDocumentPayload(cardIuid, target);\n if (freshPayload) {\n await cache?.cacheDocument(freshPayload.object, freshPayload.data);\n emit(freshPayload.object, freshPayload.data, false, true, freshPayload.object?.name, freshPayload.object?.iuid);\n }\n else if (allowStale && lastCachedPayload) {\n // Host served data; cached entry kept in sync\n emit(lastCachedPayload.object, lastCachedPayload.data, true, true, lastCachedPayload.name, lastCachedPayload.iuid ?? undefined);\n }\n }\n catch (err) {\n if (!firstPayload) {\n const error = err instanceof Error ? err : new Error(String(err));\n throw error;\n }\n console.warn(\"cardFS.read fresh fetch failed\", err);\n if (allowStale && lastCachedPayload) {\n // Fresh fetch failed but we have cache — mark it complete and return data\n emit(lastCachedPayload.object, lastCachedPayload.data, true, true, lastCachedPayload.name, lastCachedPayload.iuid ?? undefined);\n }\n }\n if (!firstPayload) {\n throw new Error(`cardFS.read fallback could not locate ${targetLabel}`);\n }\n }\n async cardsFsWriteFallback(target, fileData, requestId) {\n if (!this.shouldUseCardFsFallback()) {\n throw new Error(\"cardFS.write fallback is disabled because parent supports card_fs\");\n }\n const cardIuid = this.getCardIuid();\n if (!cardIuid) {\n throw new Error(\"cardFS.write fallback failed: card not initialized\");\n }\n console.debug(\"cardFS.write fallback invoked for target\", target);\n await this.upsertDocumentViaApi(cardIuid, target, fileData);\n const payload = await this.fetchDocumentPayload(cardIuid, target);\n await this.ensureCardFsCache()?.cacheDocument(payload.object, payload.data);\n const enrichedPayload = {\n name: payload.object?.name ?? target.name ?? null,\n iuid: payload.object?.iuid ?? target.iuid ?? null,\n object: payload.object,\n data: payload.data,\n };\n if (requestId && this.fsWriteRequests.has(requestId)) {\n this.handleFsWriteSuccess(requestId, enrichedPayload);\n }\n return enrichedPayload;\n }\n async cardsFsDeleteFallback(target) {\n if (!this.shouldUseCardFsFallback()) {\n throw new Error(\"cardFS.delete fallback is disabled because parent supports card_fs\");\n }\n const cardIuid = this.getCardIuid();\n if (!cardIuid) {\n throw new Error(\"cardFS.delete fallback failed: card not initialized\");\n }\n console.debug(\"cardFS.delete fallback invoked for target\", target);\n const cache = this.ensureCardFsCache();\n const doc = await this.fetchDocumentMetadataByTarget(cardIuid, target).catch(() => null);\n const deleteIuid = doc?.iuid ?? target.iuid ?? null;\n const resolvedName = doc?.name ?? target.name ?? null;\n if (!deleteIuid) {\n if (target.name) {\n await cache?.deleteByName(target.name);\n }\n return { name: resolvedName, iuid: null, deleted: false };\n }\n const response = await fetch(`/api/v1/documents/${deleteIuid}/`, {\n method: 'DELETE',\n headers: this.authHeader(),\n });\n if (!response.ok && response.status !== 404) {\n const message = await response.text().catch(() => 'delete failed');\n throw new Error(`cardFS.delete fallback failed: ${message}`);\n }\n await cache?.deleteByIuid(deleteIuid, resolvedName ?? undefined);\n const deleted = response.status !== 404;\n return {\n name: resolvedName ?? deleteIuid,\n iuid: deleteIuid,\n deleted,\n };\n }\n async cardsFsListFallback() {\n if (!this.shouldUseCardFsFallback()) {\n throw new Error(\"cardFS.list fallback is disabled because parent supports card_fs\");\n }\n const cardIuid = this.getCardIuid();\n if (!cardIuid) {\n throw new Error(\"cardFS.list fallback failed: card not initialized\");\n }\n const cache = this.ensureCardFsCache();\n try {\n const documents = await this.fetchAllDocuments(cardIuid);\n if (cache) {\n for (const doc of documents) {\n await cache.cacheDocument(doc, undefined);\n }\n }\n return { documents, from_cache: false };\n }\n catch (err) {\n const cachedDocs = await cache?.getAllCachedObjects();\n if (cachedDocs && cachedDocs.length > 0) {\n return { documents: cachedDocs, from_cache: true };\n }\n throw err;\n }\n }\n authHeader() {\n return this.accessToken ? { 'Authorization': `Bearer ${this.accessToken}` } : {};\n }\n jsonHeaders() {\n return { ...this.authHeader(), 'Content-Type': 'application/json' };\n }\n async fetchDocumentMetadataByTarget(cardIuid, target) {\n if (target.iuid) {\n return this.fetchDocumentMetadataByIuid(target.iuid);\n }\n if (target.name) {\n return this.fetchDocumentMetadataByName(cardIuid, target.name);\n }\n return null;\n }\n async fetchDocumentMetadataByIuid(iuid) {\n const response = await fetch(`/api/v1/documents/${iuid}/`, {\n method: 'GET',\n headers: this.authHeader(),\n });\n if (response.status === 404) {\n return null;\n }\n if (!response.ok) {\n const message = await response.text().catch(() => 'metadata lookup failed');\n throw new Error(`cardFS metadata fetch failed: ${message}`);\n }\n return response.json().catch(() => null);\n }\n normalizeDocumentsResponse(body) {\n if (Array.isArray(body?.results)) {\n return body.results;\n }\n if (Array.isArray(body)) {\n return body;\n }\n return body ? [body] : [];\n }\n extractHttpErrorMessage(error, fallback) {\n if (!error) {\n return fallback;\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error instanceof Error && error.message) {\n return error.message;\n }\n const payload = error?.error ?? error;\n if (payload instanceof Blob) {\n return fallback;\n }\n if (typeof payload === \"string\") {\n return payload;\n }\n if (payload?.detail) {\n return payload.detail;\n }\n if (payload?.message) {\n return payload.message;\n }\n if (typeof payload?.statusText === \"string\" && payload.statusText.trim()) {\n return payload.statusText;\n }\n return fallback;\n }\n async fetchDocumentMetadataByName(cardIuid, name) {\n if (!name)\n return null;\n const response = await fetch(`/api/v1/documents/with_card/${cardIuid}/?name=${encodeURIComponent(name)}`, {\n method: 'GET',\n headers: this.authHeader(),\n });\n if (!response.ok) {\n if (response.status === 404)\n return null;\n const message = await response.text().catch(() => 'metadata lookup failed');\n throw new Error(`cardFS metadata fetch failed: ${message}`);\n }\n const body = await response.json().catch(() => null);\n const documents = this.normalizeDocumentsResponse(body);\n return documents.find((doc) => doc?.name === name) ?? documents[0] ?? null;\n }\n async fetchAllDocuments(cardIuid) {\n const response = await fetch(`/api/v1/documents/with_card/${cardIuid}/`, {\n method: 'GET',\n headers: this.authHeader(),\n });\n if (!response.ok) {\n const message = await response.text().catch(() => 'list failed');\n throw new Error(`cardFS.list failed: ${message}`);\n }\n const body = await response.json().catch(() => null);\n return this.normalizeDocumentsResponse(body);\n }\n async fetchDocumentPayload(cardIuid, target) {\n const resolvedTarget = typeof target === \"string\" ? { name: target } : target;\n const doc = await this.fetchDocumentMetadataByTarget(cardIuid, resolvedTarget);\n if (!doc) {\n const targetLabel = resolvedTarget.name ? `\"${resolvedTarget.name}\"` : (resolvedTarget.iuid ? `iuid ${resolvedTarget.iuid}` : \"document\");\n throw new Error(`cardFS document not found: ${targetLabel}`);\n }\n const data = await this.fetchDocumentData(doc);\n return { object: doc, data };\n }\n async fetchDocumentData(doc) {\n if (doc?.data !== undefined) {\n return doc.data;\n }\n const url = doc?.orig?.url || doc?.url?.original || doc?.url;\n if (!url || typeof url !== 'string') {\n return null;\n }\n const response = await fetch(url);\n if (!response.ok) {\n const message = await response.text().catch(() => 'download failed');\n throw new Error(`cardFS data fetch failed: ${message}`);\n }\n const contentType = response.headers.get('Content-Type') || '';\n if (contentType.includes('application/json')) {\n return response.json();\n }\n if (contentType.startsWith('text/')) {\n return response.text();\n }\n return response.arrayBuffer();\n }\n async buildFileFormData(name, fileData) {\n let file;\n const toBinaryBlob = (input) => {\n if (input instanceof ArrayBuffer) {\n return new Blob([input.slice(0)], { type: 'application/octet-stream' });\n }\n if (typeof SharedArrayBuffer !== 'undefined' && input instanceof SharedArrayBuffer) {\n const viewFromShared = new Uint8Array(input);\n const copy = new Uint8Array(viewFromShared.length);\n copy.set(viewFromShared);\n return new Blob([copy.buffer], { type: 'application/octet-stream' });\n }\n if (ArrayBuffer.isView(input)) {\n const view = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n const copy = new Uint8Array(view.length);\n copy.set(view);\n return new Blob([copy.buffer], { type: 'application/octet-stream' });\n }\n const arrayBufferLike = input;\n const view = new Uint8Array(arrayBufferLike);\n const copy = new Uint8Array(view.length);\n copy.set(view);\n return new Blob([copy.buffer], { type: 'application/octet-stream' });\n };\n if (fileData instanceof File) {\n file = fileData;\n }\n else if (typeof Blob !== 'undefined' && fileData instanceof Blob) {\n file = new File([fileData], name, { type: fileData.type || 'application/octet-stream' });\n }\n else if (typeof SharedArrayBuffer !== 'undefined' && fileData instanceof SharedArrayBuffer) {\n const blob = toBinaryBlob(fileData);\n file = new File([blob], name, { type: blob.type });\n }\n else if (fileData instanceof ArrayBuffer) {\n const blob = toBinaryBlob(fileData);\n file = new File([blob], name, { type: blob.type });\n }\n else if (ArrayBuffer.isView(fileData)) {\n const blob = toBinaryBlob(fileData);\n file = new File([blob], name, { type: blob.type });\n }\n else if (typeof fileData === 'string') {\n const blob = new Blob([fileData], { type: 'text/plain' });\n file = new File([blob], name, { type: blob.type });\n }\n else {\n const jsonString = JSON.stringify(fileData ?? {});\n const blob = new Blob([jsonString], { type: 'application/json' });\n file = new File([blob], name, { type: blob.type });\n }\n const formData = new FormData();\n formData.append('file', file);\n return formData;\n }\n async upsertDocumentViaApi(cardIuid, target, fileData) {\n const formData = await this.buildFileFormData(target.name ?? target.iuid ?? 'document', fileData);\n if (target.iuid) {\n const response = await fetch(`/api/v1/documents/${target.iuid}/`, {\n method: 'PUT',\n headers: this.authHeader(),\n body: formData,\n });\n if (!response.ok) {\n const message = await response.text().catch(() => 'update failed');\n throw new Error(`cardFS.write update failed: ${message}`);\n }\n return;\n }\n const existing = target.name\n ? await this.fetchDocumentMetadataByName(cardIuid, target.name).catch(() => null)\n : null;\n if (existing?.iuid) {\n const response = await fetch(`/api/v1/documents/${existing.iuid}/`, {\n method: 'PUT',\n headers: this.authHeader(),\n body: formData,\n });\n if (!response.ok) {\n const message = await response.text().catch(() => 'update failed');\n throw new Error(`cardFS.write update failed: ${message}`);\n }\n return;\n }\n const uploadResponse = await fetch(`/api/v1/documents/`, {\n method: 'POST',\n headers: this.authHeader(),\n body: formData,\n });\n if (!uploadResponse.ok) {\n const message = await uploadResponse.text().catch(() => 'upload failed');\n throw new Error(`cardFS.write upload failed: ${message}`);\n }\n const uploadBody = await uploadResponse.json().catch(() => null);\n const uploadedDoc = Array.isArray(uploadBody?.results) ? uploadBody.results[0] : uploadBody;\n const newIuid = uploadedDoc?.iuid;\n if (!newIuid) {\n throw new Error('cardFS.write upload failed: missing document iuid');\n }\n const attachResponse = await fetch(`/api/v1/documents/with_card/${cardIuid}/`, {\n method: 'POST',\n headers: this.jsonHeaders(),\n body: JSON.stringify({ documents: [newIuid] }),\n });\n if (!attachResponse.ok) {\n const message = await attachResponse.text().catch(() => 'attach failed');\n throw new Error(`cardFS.write attach failed: ${message}`);\n }\n }\n /**\n * Get document associated with the current card\n */\n async getDocumentAttachedToCard(card_iuid, document_name = 'default') {\n const url = new URL(`/api/v1/documents/attached_to/${card_iuid}/`);\n url.searchParams.set('name', document_name);\n const response = await fetch(url.toString(), {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${this.accessToken || ''}`,\n 'Content-Type': 'application/json'\n }\n });\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Fetch failed: ${error}`);\n }\n return response.json();\n }\n /**\n * Save document attached to current card\n */\n async postDocumentAttachedToCard(card_iuid, document) {\n const response = await fetch(`/api/v1/documents/attached_to/${card_iuid}/`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.accessToken || ''}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(document)\n });\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Post failed: ${error}`);\n }\n return response.json();\n }\n async getCardDocument(card_iuid, doc_name) {\n const response = await fetch(`/api/v1/documents/with_card/${card_iuid}/?name=${doc_name}`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${this.accessToken || ''}`,\n 'Content-Type': 'application/json',\n },\n });\n const data = await response.json();\n return data;\n }\n // Send event on error (clients will get \"onError\" event)\n formatErrorMessage(input) {\n if (typeof input === \"string\" && input.trim()) {\n return input;\n }\n if (input instanceof Error) {\n return input.message || input.toString();\n }\n if (input && typeof input === \"object\") {\n if (typeof input.message === \"string\") {\n return input.message;\n }\n try {\n return JSON.stringify(input);\n }\n catch {\n return Object.prototype.toString.call(input);\n }\n }\n if (input != null) {\n return String(input);\n }\n return \"Unknown error\";\n }\n sendEventError(error_code, message, data = undefined) {\n const data_to_send = {\n message: this.formatErrorMessage(message),\n error_code,\n data: data ?? null,\n };\n if (this.handler)\n this.safeInvoke(\"onError\", this.handler, data_to_send);\n }\n setFileDirty(data) {\n this.sendMessage(CardMessageType.FILE_DIRTY, data);\n }\n // Get username string from user object received from parent\n getUsername(userObj) {\n const nameObj = userObj?.name;\n if (nameObj && Object.values(nameObj).some(value => value)) {\n return getNameString(nameObj);\n }\n return '';\n }\n}\n// How long we wait for parent responses before rejecting (ms)\nCardSdk.FS_RESPONSE_TIMEOUT_MS = 30000;\n// Keep read handlers alive briefly to allow cached+fresh events (ms)\nCardSdk.FS_READ_RETENTION_MS = 5000;\nCardSdk.CARD_FS_ACK_TIMEOUT_MS = 5000;\n","/**\n * Helper function to generate a unique requestId (UUID).\n * This uses the browser's crypto API for random UUID generation.\n */\nexport function generateUUID() {\n // If in a browser environment with crypto support (modern browsers)\n if (typeof window !== 'undefined' && window.crypto && window.crypto.randomUUID) {\n return window.crypto.randomUUID();\n }\n // Fallback for non-browser environments (e.g., Node.js)\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n // Fallback for environments without crypto support\n throw new Error('UUID generation is not supported in this environment');\n}\n/**\n * Helper function to get username from user object\n * @param nameObj the user object\n */\nexport function getNameString(nameObj) {\n const { prefix = '', given = '', middle = '', family = '', suffix = '' } = nameObj || {};\n const fullname = [prefix, given, middle, family, suffix].filter(namePart => namePart).join(' ');\n return fullname.trim();\n}\n"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","CryptoA01","constructor","subtleCrypto","window","crypto","subtle","Error","decrypt","token","password","salt","tokenBytes","base64UrlDecode","slice","iv","ciphertext","hmacFromToken","fullKey","deriveKey","hmacKey","aesKey","splitKey","hmacInput","Uint8Array","sign","every","byte","i","decrypted","name","TextDecoder","decode","err","console","log","iterations","encoder","TextEncoder","keyMaterial","importKey","encode","hash","length","rawKey","exportKey","base64","base64String","replace","decodedString","atob","map","c","charCodeAt","ViewerMessageType","CommonSdkMessageType","ClientMessageType","Set","location","origin","ALLOWED_DEEP_LINK_PROTOCOLS","DomeEmbeddedAppSdk","targetOrigin","isAppReady","port2","runtimeHost","parentHostDetails","parentCapabilities","handleDeepLinkClick","event","target","Element","anchor","closest","href","getAttribute","emitDeepLink","preventDefault","info","detectHost","setupDeepLinkInterception","AndroidBridge","webkit","debug","document","addEventListener","trim","warn","protocol","split","toLowerCase","has","sendMessage","CardMessageType","OPEN_DEEPLINK","url","updateParentContext","host","capabilities","merged","type","nextCapabilities","host_type","hostType","getHost","data","message","JSON","stringify","messageHandlers","appHandler","postMessage","error","sendAppInit","INIT","sdk","ver","safeInvoke","eventName","handlerObj","handler","String","setupParentConnection","Promise","resolve","reject","receiveFromAndroid","handleMessage","receiveFromIOS","CONNECT","ports","onmessage","e","handlePortMessage","removeEventListener","notifyConnectionSuccess","parent","INIT_MESSAGE_CHANNEL","CONNECTION_SUCCESS","ViewerSdk","super","pendingRequests","Map","pendingInitAck","init","initialized","instance","then","initializeViewerSdk","catch","trace","setHandler","canRead","perms","includes","canWrite","requestInitialData","REQUEST_INITIAL_DATA","requestSave","doc","isDataDirty","requestId","randomUUID","generateUUID","REQUEST_SAVE","set","setTimeout","delete","handleOnSave","status","setDirty","isDirty","SET_DIRTY","sendClose","SEND_CLOSE","sendException","SEND_EXCEPTION","INIT_ACK","DATA_CHANGE","REQUEST_CLOSE","SAVE_SUCCESS","SAVE_ERROR","CardFsCache","cardIuid","containerIuid","openPromise","isSupported","indexedDB","openDb","openWithVersion","DB_VERSION","version","infoAction","request","open","onupgradeneeded","oldVersion","configureStores","result","onsuccess","db","hasRequiredStores","nextVersion","close","updateStoresMetadata","finally","onerror","objectStoreNames","contains","DATA_STORE","createObjectStore","NAME_LOOKUP_STORE","INFO_STORE","stores","nowMicros","Math","trunc","Date","now","preserveExistingInfoTs","all","ensureStoreVersion","updateCardInfo","storeName","tx","transaction","store","objectStore","finalize","oncomplete","onabort","put","STORE_VERSION_KEY","preserveExistingTs","existingContainer","readInfoValue","existingTs","undefined","containerValue","timestampValue","writeInfoValue","keyFor","suffix","normalizeName","trimmed","hashName","cryptoRef","globalThis","digest","encoded","encodeText","bufferToBase64","buffer","binary","bytes","fromCharCode","btoa","getIuidForName","normalized","hashed","upsertNameLookup","iuid","openCursor","cursor","continue","deleteNameLookupByName","deleteNameLookupByIuid","estimateSize","Blob","size","ArrayBuffer","byteLength","isView","cacheDocument","normalizedName","MAX_DATA_BYTES","getByName","object","getByIuid","deleteByName","entry","deleteByIuid","getAllCachedObjects","results","endsWith","push","CardSdk","buildCardFsMessagePayload","extra","assertValidReadHandler","next","invokeReadHandlerNext","payload","invokeReadHandlerError","sanitizeReadData","contextLabel","stripped","label","getCardIuid","dataStore","ensureCardFsCache","shouldUseCardFsFallback","cardFsCache","supportsParentCardFs","card_fs","accessToken","devMode","fsReadRequests","fsWriteRequests","pendingAcks","messageId","timeout","clearTimeout","kw1","key_wa1","dev_mode","cryptoA01","denc","kw2","decData","decryptedData","parse","decryptedContainerIuid","container","apiToken","api_token","ui","sendEventError","FILE_DATA","responseId","_ignored","handleFsReadDataMessage","handleFsWriteSuccess","handleFsWriteError","ERROR","failFsReadRequest","failFsWriteRequest","REFRESH","cardFS","read","allowStale","cardsFsRead","readById","cardsFsReadById","write","fileData","onResult","cardsFsWrite","writeById","cardsFsWriteById","cardsFsDelete","deleteById","cardsFsDeleteById","list","cardsFsList","secret","options","initializeCardSdk","openDeepLink","getRequestTokenFromUrl","segments","pathname","requestToken","decodeURIComponent","deriveSecretSeed","seed","reverse","join","substring","requestAf1DataFromParent","ackPayload","sendMessageWithAck","AF1_DATA_TOKEN","AF1_DATA_TOKEN_ACK","cie","ck","dev_token","res","fetchAf1Data","dataAf1","data_af1","IT_DATA_AF1","devToken","endpoint","URL","encodeURIComponent","searchParams","response","fetch","toString","method","ok","text","statusText","json","TAG","urlObject","ss","dataFromServer","ite","d","sendInit","webappDetails","getWebappDetails","wa","IT_VERSION","env","IT_ENV","keys","ackType","timeoutMs","onMessageId","resolvedHandler","cardsFsReadInternal","operation","cardsFsReadFallback","registeredMessageId","targetLabel","READ_FILE","allow_stale","READ_FILE_ACK","CARD_FS_ACK_TIMEOUT_MS","noResponseTimeout","FS_RESPONSE_TIMEOUT_MS","cardsFsWriteInternal","cardsFsWriteFallback","callbackErr","WRITE_FILE","WRITE_FILE_ACK","cardsFsDeleteInternal","cardsFsDeleteFallback","DELETE_FILE","DELETE_FILE_ACK","cardsFsListFallback","LIST_FILES","LIST_FILES_ACK","sanitized","fromCache","Boolean","from_cache","is_stale","normalizedPayload","is_complete","cleanupTimeout","clearFsReadRequest","FS_READ_RETENTION_MS","clearFsWriteRequest","cache","firstPayload","emit","isComplete","explicitName","explicitIuid","payloadName","payloadIuid","safeData","messagePayload","lastCachedPayload","cached","freshPayload","fetchDocumentPayload","upsertDocumentViaApi","enrichedPayload","fetchDocumentMetadataByTarget","deleteIuid","resolvedName","deleted","headers","authHeader","documents","fetchAllDocuments","cachedDocs","jsonHeaders","fetchDocumentMetadataByIuid","fetchDocumentMetadataByName","normalizeDocumentsResponse","body","Array","isArray","extractHttpErrorMessage","fallback","detail","find","resolvedTarget","fetchDocumentData","orig","original","contentType","startsWith","arrayBuffer","buildFileFormData","file","toBinaryBlob","input","SharedArrayBuffer","viewFromShared","copy","view","byteOffset","File","blob","jsonString","formData","FormData","append","existing","uploadResponse","uploadBody","uploadedDoc","newIuid","attachResponse","getDocumentAttachedToCard","card_iuid","document_name","postDocumentAttachedToCard","getCardDocument","doc_name","formatErrorMessage","error_code","data_to_send","setFileDirty","FILE_DIRTY","getUsername","userObj","nameObj","values","some","prefix","given","middle","family","filter","namePart","getNameString"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://domeSdk/webpack/universalModuleDefinition","webpack://domeSdk/webpack/bootstrap","webpack://domeSdk/webpack/runtime/define property getters","webpack://domeSdk/webpack/runtime/hasOwnProperty shorthand","webpack://domeSdk/webpack/runtime/make namespace object","webpack://domeSdk/./src/crypto.ts","webpack://domeSdk/./src/dome-sdk.ts","webpack://domeSdk/./src/utils.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"domeSdk\"] = factory();\n\telse\n\t\troot[\"domeSdk\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// Provide enc / dec using Algorithm01\nexport class CryptoA01 {\n constructor() {\n // Initialize subtleCrypto once\n this.subtleCrypto = window.crypto?.subtle;\n if (!this.subtleCrypto) {\n throw new Error('SubtleCrypto API is not available in this environment.');\n }\n }\n /**\n * Perform decryption using AES based V1 algorithm.\n *\n * string: the encrypted string (base64 encoded)\n * password: the password used for encryption\n * salt: the base64 encoded salt used\n */\n async decrypt(token, password, salt) {\n try {\n if (!token) {\n throw new Error(\"Invalid token\");\n }\n const tokenBytes = this.base64UrlDecode(token);\n // Extract token components\n const version = tokenBytes[0];\n if (version !== 0x80) {\n // console.log(\"Incorrect Version: \", version);\n throw new Error('Invalid version');\n }\n const timestamp = tokenBytes.slice(1, 9);\n const iv = tokenBytes.slice(9, 25);\n const ciphertext = tokenBytes.slice(25, -32);\n const hmacFromToken = tokenBytes.slice(-32);\n // Derive the key and split it into HMAC and AES keys\n const fullKey = await this.deriveKey(password, salt);\n const { hmacKey, aesKey } = await this.splitKey(fullKey);\n // Compute HMAC over version + timestamp + IV + ciphertext\n const hmacInput = tokenBytes.slice(0, -32);\n const computedHmac = new Uint8Array(await this.subtleCrypto.sign('HMAC', hmacKey, hmacInput));\n // Validate HMAC\n if (!computedHmac.every((byte, i) => byte === hmacFromToken[i])) {\n throw new Error('Invalid HMAC. Token has been tampered with!');\n }\n // Decrypt the ciphertext\n const decrypted = await this.subtleCrypto.decrypt({\n name: 'AES-CBC',\n iv: iv,\n }, aesKey, ciphertext);\n // Convert decrypted data to UTF-8 string\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n }\n catch (err) {\n console.log(\"Error in decrypt:\", err);\n throw err;\n }\n }\n async deriveKey(password, salt, iterations = 10000) {\n const encoder = new TextEncoder();\n const keyMaterial = await this.subtleCrypto.importKey(\"raw\", encoder.encode(password), \"PBKDF2\", false, [\"deriveKey\"]);\n return this.subtleCrypto.deriveKey({\n name: \"PBKDF2\",\n hash: \"SHA-256\",\n salt: encoder.encode(salt),\n iterations: iterations,\n }, keyMaterial, { name: \"AES-CBC\", length: 256 }, true, // Allow export of the derived key (req for splitting)\n [\"encrypt\", \"decrypt\"]);\n }\n // Split the full key into HMAC and AES keys\n async splitKey(fullKey) {\n const rawKey = new Uint8Array(await this.subtleCrypto.exportKey('raw', fullKey));\n // Split the key into HMAC (first 16 bytes) and AES (last 16 bytes)\n const hmacKey = await this.subtleCrypto.importKey('raw', rawKey.slice(0, 16), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign', 'verify']);\n const aesKey = await this.subtleCrypto.importKey('raw', rawKey.slice(16), { name: 'AES-CBC' }, false, ['encrypt', 'decrypt']);\n return { hmacKey, aesKey };\n }\n // Decode Base64 URL-safe strings\n base64UrlDecode(base64) {\n // assumes URL safe encoding that has + in place of - and _ in place of /\n const base64String = base64.replace(/-/g, '+').replace(/_/g, '/');\n const decodedString = atob(base64String);\n return new Uint8Array([...decodedString].map(c => c.charCodeAt(0)));\n }\n}\n","import pkg from \"../package.json\";\nimport { generateUUID, getNameString } from './utils';\nimport { CryptoA01 } from './crypto';\n// Enum defining message types sent from the viewer to the parent application\nexport var ViewerMessageType;\n(function (ViewerMessageType) {\n ViewerMessageType[\"CONNECTION_SUCCESS\"] = \"CONNECTION_SUCCESS\";\n ViewerMessageType[\"INIT\"] = \"INIT\";\n ViewerMessageType[\"REQUEST_SAVE\"] = \"REQUEST_SAVE\";\n ViewerMessageType[\"REQUEST_CLOSE\"] = \"REQUEST_CLOSE\";\n ViewerMessageType[\"REQUEST_INITIAL_DATA\"] = \"REQUEST_INITIAL_DATA\";\n ViewerMessageType[\"SET_DIRTY\"] = \"SET_DIRTY\";\n ViewerMessageType[\"SEND_CLOSE\"] = \"SEND_CLOSE\";\n ViewerMessageType[\"SEND_EXCEPTION\"] = \"SEND_EXCEPTION\";\n})(ViewerMessageType || (ViewerMessageType = {}));\nvar CommonSdkMessageType;\n(function (CommonSdkMessageType) {\n CommonSdkMessageType[\"INIT_MESSAGE_CHANNEL\"] = \"INIT_MESSAGE_CHANNEL\";\n})(CommonSdkMessageType || (CommonSdkMessageType = {}));\n// Enum defining message types sent from the parent application to the embedded app\nvar ClientMessageType;\n(function (ClientMessageType) {\n ClientMessageType[\"CONNECT\"] = \"CONNECT\";\n ClientMessageType[\"REQUEST_CLOSE\"] = \"REQUEST_CLOSE\";\n ClientMessageType[\"REQUEST_SAVE\"] = \"REQUEST_SAVE\";\n ClientMessageType[\"SAVE_ERROR\"] = \"SAVE_ERROR\";\n ClientMessageType[\"SAVE_SUCCESS\"] = \"SAVE_SUCCESS\";\n ClientMessageType[\"DATA_CHANGE\"] = \"DATA_CHANGE\";\n ClientMessageType[\"FILE_DATA\"] = \"FILE_DATA\";\n ClientMessageType[\"WRITE_FILE_ACK\"] = \"WRITE_FILE_ACK\";\n ClientMessageType[\"READ_FILE_ACK\"] = \"READ_FILE_ACK\";\n ClientMessageType[\"DELETE_FILE_ACK\"] = \"DELETE_FILE_ACK\";\n ClientMessageType[\"LIST_FILES_ACK\"] = \"LIST_FILES_ACK\";\n ClientMessageType[\"INIT_ACK\"] = \"INIT_ACK\";\n ClientMessageType[\"AF1_DATA_TOKEN_ACK\"] = \"AF1_DATA_TOKEN_ACK\";\n ClientMessageType[\"ERROR\"] = \"ERROR\";\n ClientMessageType[\"REFRESH\"] = \"REFRESH\";\n})(ClientMessageType || (ClientMessageType = {}));\n;\nconst ALLOWED_ORIGINS = new Set(getAllowedOrigins());\nconst ALLOWED_DEEP_LINK_PROTOCOLS = new Set([\"dome\", \"intouchapp\"]);\nconst CARD_FS_VERSION = '1.0.0';\nfunction getAllowedOrigins() {\n if (typeof window === 'undefined')\n return [];\n return [\n window.location.origin,\n 'https://dome.so',\n 'https://spaces.intouchapp.com/',\n 'http://localhost:4200',\n 'http://localhost:4201',\n 'null',\n ];\n}\n/**\n * DomeEmbeddedAppSdk:\n * Base SDK class providing methods to send messages to the parent application.\n */\nclass DomeEmbeddedAppSdk {\n constructor() {\n this.targetOrigin = \"*\";\n this.isAppReady = false;\n this.port2 = null;\n this.runtimeHost = \"unknown\"; // Transport/runtime host\n this.parentHostDetails = null;\n this.parentCapabilities = null;\n this.handleDeepLinkClick = (event) => {\n if (this.runtimeHost !== \"webapp\")\n return;\n if (!(event.target instanceof Element))\n return;\n const anchor = event.target.closest(\"a[href]\");\n if (!anchor)\n return;\n const href = anchor.getAttribute(\"href\") ?? \"\";\n if (this.emitDeepLink(href)) {\n event.preventDefault();\n }\n };\n console.info(`Initializing Dome Embedded App SDK v${pkg.version}`);\n this.detectHost();\n this.setupDeepLinkInterception();\n }\n /**\n * Detects the host (iOS, Android, or Web) and saves it.\n */\n detectHost() {\n if (typeof window.AndroidBridge !== \"undefined\") {\n this.runtimeHost = \"android\";\n }\n else if (typeof window.webkit !== \"undefined\") {\n this.runtimeHost = \"ios\";\n }\n else {\n this.runtimeHost = \"webapp\";\n }\n console.debug(`Detected host: ${this.runtimeHost}`);\n }\n /**\n * Listens for deep link anchor clicks on web to forward them to the parent app.\n */\n setupDeepLinkInterception() {\n if (this.runtimeHost !== \"webapp\")\n return;\n if (typeof document === \"undefined\")\n return;\n document.addEventListener(\"click\", this.handleDeepLinkClick, true);\n }\n /**\n * Sends an OPEN_DEEPLINK message when the href uses an allowed protocol.\n * @returns true if the message was dispatched, false otherwise.\n */\n emitDeepLink(href) {\n if (typeof href !== \"string\" || href.trim() === \"\") {\n console.warn(\"emitDeepLink called without a valid href\");\n return false;\n }\n const protocol = href.split(\":\")[0]?.toLowerCase();\n if (!protocol || !ALLOWED_DEEP_LINK_PROTOCOLS.has(protocol)) {\n return false;\n }\n this.sendMessage(CardMessageType.OPEN_DEEPLINK, { url: href });\n return true;\n }\n updateParentContext(host, capabilities) {\n if (!host && !capabilities) {\n return;\n }\n const base = this.parentHostDetails ?? { type: this.runtimeHost };\n const merged = {\n ...base,\n ...(host ?? {}),\n };\n if (!merged.type) {\n merged.type = this.runtimeHost;\n }\n const nextCapabilities = capabilities ?? this.parentCapabilities ?? merged.capabilities;\n if (capabilities) {\n this.parentCapabilities = capabilities;\n }\n if (nextCapabilities) {\n merged.capabilities = nextCapabilities;\n }\n else {\n delete merged.capabilities;\n }\n this.parentHostDetails = merged;\n this.parentCapabilities = nextCapabilities ?? null;\n if (nextCapabilities) {\n console.info(\"Host capabilities detected\", {\n host_type: merged.type,\n capabilities: nextCapabilities\n });\n }\n else {\n console.info(\"Host capabilities not found\", {\n hostType: merged.type,\n });\n }\n }\n getHost() {\n return this.parentHostDetails ?? { type: this.runtimeHost };\n }\n /**\n * Method to send messages to the parent application.\n * Ensures the parent window exists and sends a structured message with type and data.\n * @param type - The type of message being sent\n * @param data - (Optional) payload data for the message\n */\n sendMessage(type, data) {\n const message = { type, data: data ?? null };\n switch (this.runtimeHost) {\n case \"android\":\n window.AndroidBridge?.sendMessage(JSON.stringify(message));\n break;\n case \"ios\":\n if (window?.webkit?.messageHandlers) {\n window.webkit?.messageHandlers.appHandler.postMessage(JSON.stringify(message));\n }\n else {\n console.error(\"webkit.messageHandlers not found\");\n }\n break;\n case \"webapp\":\n if (this.port2) {\n this.port2.postMessage(message);\n }\n else {\n console.error(\"Web connection is not established.\");\n }\n break;\n default:\n console.error(\"Unsupported host, cannot send message.\");\n break;\n }\n console.debug(`Sent message to ${this.runtimeHost}:`, message);\n }\n /**\n * Notifies the parent application that the app is ready, if it hasn’t already.\n */\n sendAppInit() {\n if (!this.isAppReady) {\n this.isAppReady = true;\n this.sendMessage(ViewerMessageType.INIT, { sdk: { ver: pkg.version } });\n }\n }\n /**\n * Safely invokes a function from the handler object if it exists.\n * and logs a warning if the handler is not provided for the given message type.\n *\n * @param eventName - Name of the event method to be invoked from the handler.\n * @param handlerObj - The handler object that contains the message handling methods.\n * @param data - (Optional) The data to be passed to the handler function if invoked.\n */\n safeInvoke(eventName, handlerObj, data) {\n const handler = handlerObj[eventName];\n if (typeof handler === 'function') {\n handler(data);\n }\n else {\n console.warn(`Handler for '${String(eventName)}' is not defined.`);\n }\n }\n // Sets up connection with iframe parent using message channel\n // Call this once only in the lifetime. Should be called\n // _before_ iFrame's onLoad is called (otherwise messaging will\n // not be setup)\n setupParentConnection() {\n return new Promise((resolve, reject) => {\n switch (this.runtimeHost) {\n case \"android\":\n window.receiveFromAndroid = (message) => {\n console.debug(\"Message received from Android:\", message);\n this.handleMessage(message.type, message.data);\n };\n resolve();\n break;\n case \"ios\":\n window.receiveFromIOS = (message) => {\n console.debug(\"Message received from iOS:\", message);\n this.handleMessage(message.type, message.data);\n };\n resolve();\n break;\n case \"webapp\":\n if (this.port2) {\n console.warn(\"Connection already established. Skipping reinitialization.\");\n resolve();\n return;\n }\n const handleMessage = (event) => {\n const { type } = event.data || {};\n if (type !== ClientMessageType.CONNECT)\n return;\n if (event.ports && event.ports.length > 0) {\n this.port2 = event.ports[0];\n this.port2.onmessage = (e) => this.handlePortMessage(e);\n window.removeEventListener(\"message\", handleMessage); // Cleanup\n this.notifyConnectionSuccess();\n resolve();\n }\n };\n // Listen for browser-based `message` events\n window.addEventListener(\"message\", handleMessage);\n // Notify parent to initialize a message channel\n if (window.parent) {\n window.parent.postMessage({ type: CommonSdkMessageType.INIT_MESSAGE_CHANNEL, data: { sdk: { ver: pkg.version } } }, this.targetOrigin);\n }\n else {\n console.error(\"Parent window not available to initialize message channel.\");\n }\n break;\n default:\n console.error(\"Unknown host.\");\n reject(\"Unknown host\");\n }\n });\n }\n // Send CONNECTION_SUCCESS message to parent\n notifyConnectionSuccess() {\n this.sendMessage(ViewerMessageType.CONNECTION_SUCCESS);\n }\n // Handle messages coming over message channel port\n handlePortMessage(event) {\n const { type, data } = event.data || {};\n if (!type)\n return;\n // Delegate to subclass-specific message handler\n this.handleMessage(type, data);\n }\n // Common method for handling messages to be implemented by sub-classes\n handleMessage(type, data) {\n throw new Error(\"Subclasses must implement handleMessage.\");\n }\n}\n/**\n * ViewerSdk:\n * A subclass of DomeEmbeddedAppSdk specifically for document viewer applications.\n * It includes additional methods and properties to manage app interactions.\n */\nexport class ViewerSdk extends DomeEmbeddedAppSdk {\n constructor() {\n super();\n this.handler = null; // Handler instance for client messages\n this.pendingRequests = new Map();\n this.pendingInitAck = null;\n }\n /**\n * Static initialization method to get or create the singleton instance of ViewerSdk.\n * Allows setting the handler during initialization.\n * @param handler - (Optional) Custom handler for different message types\n * @returns The singleton ViewerSdk instance\n */\n static init(handler) {\n console.debug(\"init called\", handler && \"with handler\");\n // Prevent reinitialization if already initialized\n if (ViewerSdk.initialized) {\n console.warn(\"ViewerSdk is already initialized. Skipping initialization.\");\n return ViewerSdk.instance;\n }\n if (!ViewerSdk.instance) {\n ViewerSdk.instance = new ViewerSdk();\n // Initialize parent communication - REQUIRED!\n ViewerSdk.instance.setupParentConnection()\n .then(() => {\n try {\n // Connection established with parent\n ViewerSdk.instance.initializeViewerSdk();\n }\n catch (err) {\n console.error(\"Error in initializeViewerSdk:\", err);\n }\n })\n .catch((err) => {\n console.error(\"init: Error setting up parent connection!\", err);\n console.trace(\"called from:\");\n });\n }\n if (handler) {\n ViewerSdk.instance.setHandler(handler); // Set handler if provided during initialization\n }\n // Mark as initialized\n ViewerSdk.initialized = true;\n return ViewerSdk.instance;\n }\n /**\n * Method to set or update the handler object.\n * @param handler - Custom handler for different message types\n */\n setHandler(handler) {\n this.handler = handler;\n // If INIT_ACK message was received and stored, process it now\n if (this.pendingInitAck) {\n console.debug(\"Processing pending INIT_ACK message after handler is set.\");\n this.safeInvoke(\"onInitialData\", this.handler, this.pendingInitAck);\n this.pendingInitAck = null; // Clear the stored message\n }\n }\n /**\n * Checks if the given permissions string allows reading.\n * @param perms - The permissions string.\n * @returns - True if the permission string includes read access.\n */\n canRead(perms) {\n return !!perms?.includes('r');\n }\n /**\n * Checks if the given permissions string allows writing.\n * @param perms - The permissions string.\n * @returns - True if the permission string includes write access.\n */\n canWrite(perms) {\n return !!perms?.includes('w') || !!perms?.includes('*');\n }\n // Initializes the viewer SDK, setting up the message listener and sending an initial \"ready\" message.\n initializeViewerSdk() {\n console.debug(\"initializing viewer sdk\");\n this.sendAppInit();\n }\n /**\n * Sends a request to the parent application to retrieve initial data.\n */\n requestInitialData() {\n this.sendMessage(ViewerMessageType.REQUEST_INITIAL_DATA);\n }\n /**\n * Sends a request to the parent application to save data.\n * @param doc - payload data to be saved\n * @param isDataDirty - Boolean indicating indicating modified data\n */\n requestSave(doc, isDataDirty) {\n const requestId = generateUUID();\n // Send save request with the generated requestId\n this.sendMessage(ViewerMessageType.REQUEST_SAVE, { doc, isDataDirty, requestId });\n return new Promise((resolve, reject) => {\n this.pendingRequests.set(requestId, resolve);\n this.pendingRequests.set(requestId + '_reject', reject);\n // Timeout if the parent fails to respond in time\n setTimeout(() => {\n if (this.pendingRequests.has(requestId)) {\n this.pendingRequests.delete(requestId);\n this.pendingRequests.delete(requestId + '_reject');\n }\n }, 30000);\n });\n }\n handleOnSave(data) {\n const { requestId, status, message } = data;\n // Check if we have a pending request for this requestId\n const resolve = this.pendingRequests.get(requestId);\n const reject = this.pendingRequests.get(requestId + '_reject');\n if (resolve) {\n // If status is \"error\", reject the promise, otherwise resolve it\n if (status === \"error\") {\n reject?.({ status, message });\n }\n else {\n resolve({ status, message });\n }\n // Clean up\n this.pendingRequests.delete(requestId);\n this.pendingRequests.delete(requestId + '_reject');\n }\n }\n /**\n * Sets the viewer's \"dirty\" state, indicating modified data.\n * @param isDirty - Boolean indicating whether the viewer has modified data\n */\n setDirty(isDirty) {\n this.sendMessage(ViewerMessageType.SET_DIRTY, isDirty);\n }\n /**\n * Sends a close request to the parent, with information on whether the data is dirty.\n * @param doc - Latest document data\n * @param isDataDirty - Boolean indicating indicating modified data\n */\n sendClose(doc, isDataDirty) {\n this.sendMessage(ViewerMessageType.SEND_CLOSE, { doc, isDataDirty });\n }\n /**\n * Sends an exception to parent.\n * @param error - An error object with name and message or an error string\n */\n sendException(error) {\n this.sendMessage(ViewerMessageType.SEND_EXCEPTION, error);\n }\n // Sets up the message listener for viewer to receive messages from the parent.\n handleMessage(type, data) {\n console.debug(\"handleMessage called for:\", type, \"with data:\", data);\n if (type === ClientMessageType.INIT_ACK) {\n this.updateParentContext(data?.host, data?.capabilities);\n }\n if (!this.handler) {\n if (type === ClientMessageType.INIT_ACK) {\n console.warn(\"Handler not set. Storing INIT_ACK message for later processing.\");\n this.pendingInitAck = data; // Save INIT_ACK message\n }\n else {\n console.error(\"Message handler not found for type:\", type);\n }\n return;\n }\n switch (type) {\n case ClientMessageType.INIT_ACK:\n this.safeInvoke(\"onInitialData\", this.handler, data);\n break;\n case ClientMessageType.DATA_CHANGE:\n this.safeInvoke(\"onDataChange\", this.handler, data);\n break;\n case ClientMessageType.REQUEST_CLOSE:\n this.safeInvoke(\"onCloseRequest\", this.handler);\n break;\n case ClientMessageType.REQUEST_SAVE:\n this.safeInvoke(\"onSaveRequest\", this.handler);\n break;\n case ClientMessageType.SAVE_SUCCESS:\n this.handleOnSave(data);\n break;\n case ClientMessageType.SAVE_ERROR:\n this.handleOnSave(data);\n break;\n default:\n console.warn(`No handler found for message type: ${type}`);\n }\n }\n}\nViewerSdk.initialized = false;\n// Card SDK\n// Enum defining message types sent from the card to the parent application\nexport var CardMessageType;\n(function (CardMessageType) {\n CardMessageType[\"APP_READY\"] = \"APP_READY\";\n CardMessageType[\"INIT\"] = \"INIT\";\n CardMessageType[\"READ_FILE\"] = \"READ_FILE\";\n CardMessageType[\"WRITE_FILE\"] = \"WRITE_FILE\";\n CardMessageType[\"DELETE_FILE\"] = \"DELETE_FILE\";\n CardMessageType[\"LIST_FILES\"] = \"LIST_FILES\";\n CardMessageType[\"FILE_DIRTY\"] = \"FILE_DIRTY\";\n CardMessageType[\"OPEN_DEEPLINK\"] = \"OPEN_DEEPLINK\";\n CardMessageType[\"AF1_DATA_TOKEN\"] = \"AF1_DATA_TOKEN\";\n})(CardMessageType || (CardMessageType = {}));\n;\nclass CardFsCache {\n constructor(cardIuid, containerIuid) {\n this.cardIuid = cardIuid;\n this.containerIuid = containerIuid;\n this.openPromise = null;\n }\n isSupported() {\n return typeof indexedDB !== \"undefined\";\n }\n async openDb() {\n if (!this.isSupported())\n return null;\n if (!this.openPromise) {\n this.openPromise = new Promise((resolve) => {\n this.openWithVersion(CardFsCache.DB_VERSION, resolve);\n });\n }\n return this.openPromise;\n }\n openWithVersion(version, resolve) {\n let infoAction = \"ensure\";\n const request = indexedDB.open(this.cardIuid, version);\n request.onupgradeneeded = (event) => {\n infoAction = (event.oldVersion || 0) === 0 ? \"create\" : \"ensure\";\n this.configureStores(request.result);\n };\n request.onsuccess = () => {\n const db = request.result;\n if (!this.hasRequiredStores(db)) {\n const nextVersion = db.version + 1;\n db.close();\n this.openWithVersion(nextVersion, resolve);\n return;\n }\n this.updateStoresMetadata(db, infoAction === \"ensure\")\n .catch(() => undefined)\n .finally(() => resolve(db));\n };\n request.onerror = () => resolve(null);\n }\n configureStores(db) {\n if (!db.objectStoreNames.contains(CardFsCache.DATA_STORE)) {\n db.createObjectStore(CardFsCache.DATA_STORE);\n }\n if (!db.objectStoreNames.contains(CardFsCache.NAME_LOOKUP_STORE)) {\n db.createObjectStore(CardFsCache.NAME_LOOKUP_STORE);\n }\n if (!db.objectStoreNames.contains(CardFsCache.INFO_STORE)) {\n db.createObjectStore(CardFsCache.INFO_STORE);\n }\n }\n hasRequiredStores(db) {\n const stores = db.objectStoreNames;\n return (stores.contains(CardFsCache.DATA_STORE) &&\n stores.contains(CardFsCache.NAME_LOOKUP_STORE) &&\n stores.contains(CardFsCache.INFO_STORE));\n }\n static nowMicros() {\n return Math.trunc(Date.now() * 1000);\n }\n updateStoresMetadata(db, preserveExistingInfoTs) {\n return Promise.all([\n this.ensureStoreVersion(db, CardFsCache.DATA_STORE),\n this.ensureStoreVersion(db, CardFsCache.NAME_LOOKUP_STORE),\n this.updateCardInfo(db, preserveExistingInfoTs),\n ]).then(() => undefined);\n }\n ensureStoreVersion(db, storeName) {\n if (!db.objectStoreNames.contains(storeName)) {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n try {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n const finalize = () => resolve();\n tx.oncomplete = finalize;\n tx.onerror = finalize;\n tx.onabort = finalize;\n store.put(CARD_FS_VERSION, CardFsCache.STORE_VERSION_KEY);\n }\n catch {\n resolve();\n }\n });\n }\n async updateCardInfo(db, preserveExistingTs) {\n if (!db.objectStoreNames.contains(CardFsCache.INFO_STORE)) {\n return;\n }\n const existingContainer = await this.readInfoValue(db, \"container_iuid\");\n const existingTs = preserveExistingTs ? await this.readInfoValue(db, \"ts_c\") : undefined;\n const containerValue = this.containerIuid ?? existingContainer ?? null;\n const timestampValue = preserveExistingTs && existingTs ? existingTs : CardFsCache.nowMicros();\n await Promise.all([\n this.writeInfoValue(db, \"container_iuid\", containerValue),\n this.writeInfoValue(db, \"ts_c\", timestampValue),\n ]).catch(() => undefined);\n }\n readInfoValue(db, key) {\n return new Promise((resolve) => {\n try {\n const tx = db.transaction(CardFsCache.INFO_STORE, \"readonly\");\n const store = tx.objectStore(CardFsCache.INFO_STORE);\n const request = store.get(key);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => resolve(undefined);\n }\n catch {\n resolve(undefined);\n }\n });\n }\n writeInfoValue(db, key, value) {\n return new Promise((resolve) => {\n try {\n const tx = db.transaction(CardFsCache.INFO_STORE, \"readwrite\");\n const store = tx.objectStore(CardFsCache.INFO_STORE);\n const finalize = () => resolve();\n tx.oncomplete = finalize;\n tx.onerror = finalize;\n tx.onabort = finalize;\n store.put(value, key);\n }\n catch {\n resolve();\n }\n });\n }\n keyFor(suffix) {\n return suffix;\n }\n static normalizeName(name) {\n if (typeof name !== \"string\")\n return null;\n const trimmed = name.trim();\n return trimmed ? trimmed : null;\n }\n async put(key, value) {\n const db = await this.openDb();\n if (!db)\n return;\n await new Promise((resolve) => {\n const tx = db.transaction(CardFsCache.DATA_STORE, \"readwrite\");\n const store = tx.objectStore(CardFsCache.DATA_STORE);\n store.put(value, key).onsuccess = () => resolve();\n tx.oncomplete = () => resolve();\n tx.onerror = () => resolve();\n tx.onabort = () => resolve();\n });\n }\n async get(key) {\n const db = await this.openDb();\n if (!db)\n return undefined;\n return new Promise((resolve) => {\n const tx = db.transaction(CardFsCache.DATA_STORE, \"readonly\");\n const store = tx.objectStore(CardFsCache.DATA_STORE);\n const request = store.get(key);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => resolve(undefined);\n });\n }\n async delete(key) {\n const db = await this.openDb();\n if (!db)\n return;\n await new Promise((resolve) => {\n const tx = db.transaction(CardFsCache.DATA_STORE, \"readwrite\");\n const store = tx.objectStore(CardFsCache.DATA_STORE);\n store.delete(key).onsuccess = () => resolve();\n tx.oncomplete = () => resolve();\n tx.onerror = () => resolve();\n tx.onabort = () => resolve();\n });\n }\n static async hashName(name) {\n const cryptoRef = typeof globalThis !== 'undefined' ? globalThis.crypto : undefined;\n if (!cryptoRef?.subtle?.digest) {\n throw new Error('CardFS name hashing requires SubtleCrypto support');\n }\n const encoded = CardFsCache.encodeText(name);\n const digest = await cryptoRef.subtle.digest('SHA-256', encoded);\n return CardFsCache.bufferToBase64(digest);\n }\n static encodeText(value) {\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(value).buffer;\n }\n const result = new Uint8Array(value.length);\n for (let i = 0; i < value.length; i++) {\n result[i] = value.charCodeAt(i);\n }\n return result.buffer;\n }\n static bufferToBase64(buffer) {\n let binary = '';\n const bytes = new Uint8Array(buffer);\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n async getIuidForName(name) {\n const normalized = CardFsCache.normalizeName(name);\n if (!normalized)\n return undefined;\n const db = await this.openDb();\n if (!db)\n return undefined;\n const hashed = await CardFsCache.hashName(normalized);\n return new Promise((resolve) => {\n const tx = db.transaction(CardFsCache.NAME_LOOKUP_STORE, \"readonly\");\n const store = tx.objectStore(CardFsCache.NAME_LOOKUP_STORE);\n const request = store.get(hashed);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => resolve(undefined);\n });\n }\n async upsertNameLookup(name, iuid) {\n const normalized = CardFsCache.normalizeName(name);\n if (!normalized)\n return;\n const db = await this.openDb();\n if (!db)\n return;\n const hashed = await CardFsCache.hashName(normalized);\n await new Promise((resolve) => {\n const tx = db.transaction(CardFsCache.NAME_LOOKUP_STORE, \"readwrite\");\n const store = tx.objectStore(CardFsCache.NAME_LOOKUP_STORE);\n store.put(iuid, hashed);\n const cursorRequest = store.openCursor();\n cursorRequest.onsuccess = (event) => {\n const cursor = event.target.result;\n if (!cursor)\n return;\n if (cursor.key !== hashed && cursor.value === iuid) {\n cursor.delete();\n }\n cursor.continue();\n };\n tx.oncomplete = () => resolve();\n tx.onerror = () => resolve();\n tx.onabort = () => resolve();\n });\n }\n async deleteNameLookupByName(name) {\n const normalized = CardFsCache.normalizeName(name);\n if (!normalized)\n return;\n const db = await this.openDb();\n if (!db)\n return;\n const hashed = await CardFsCache.hashName(normalized);\n await new Promise((resolve) => {\n const tx = db.transaction(CardFsCache.NAME_LOOKUP_STORE, \"readwrite\");\n const store = tx.objectStore(CardFsCache.NAME_LOOKUP_STORE);\n store.delete(hashed);\n tx.oncomplete = () => resolve();\n tx.onerror = () => resolve();\n tx.onabort = () => resolve();\n });\n }\n async deleteNameLookupByIuid(iuid) {\n if (!iuid)\n return;\n const db = await this.openDb();\n if (!db)\n return;\n await new Promise((resolve) => {\n const tx = db.transaction(CardFsCache.NAME_LOOKUP_STORE, \"readwrite\");\n const store = tx.objectStore(CardFsCache.NAME_LOOKUP_STORE);\n const request = store.openCursor();\n request.onsuccess = (event) => {\n const cursor = event.target.result;\n if (!cursor)\n return;\n if (cursor.value === iuid) {\n cursor.delete();\n }\n cursor.continue();\n };\n tx.oncomplete = () => resolve();\n tx.onerror = () => resolve();\n tx.onabort = () => resolve();\n });\n }\n static estimateSize(data) {\n if (data == null)\n return 0;\n if (typeof Blob !== \"undefined\" && data instanceof Blob)\n return data.size;\n if (data instanceof ArrayBuffer)\n return data.byteLength;\n if (ArrayBuffer.isView(data))\n return data.byteLength;\n if (typeof data === \"string\")\n return new Blob([data]).size;\n try {\n return new Blob([JSON.stringify(data)]).size;\n }\n catch {\n return 0;\n }\n }\n async cacheDocument(doc, data) {\n if (!doc?.iuid)\n return;\n await this.put(this.keyFor(`${doc.iuid}_object`), doc);\n const normalizedName = CardFsCache.normalizeName(doc.name);\n if (normalizedName) {\n await this.upsertNameLookup(normalizedName, doc.iuid);\n }\n if (data === undefined) {\n await this.delete(this.keyFor(`${doc.iuid}_data`));\n return;\n }\n const size = CardFsCache.estimateSize(data);\n if (size <= CardFsCache.MAX_DATA_BYTES) {\n await this.put(this.keyFor(`${doc.iuid}_data`), data);\n }\n else {\n await this.delete(this.keyFor(`${doc.iuid}_data`));\n }\n }\n async getByName(name) {\n const normalizedName = CardFsCache.normalizeName(name);\n if (!normalizedName)\n return null;\n const iuid = await this.getIuidForName(normalizedName);\n if (!iuid)\n return null;\n const object = await this.get(this.keyFor(`${iuid}_object`));\n if (!object)\n return null;\n const data = await this.get(this.keyFor(`${iuid}_data`));\n return { iuid, object, data };\n }\n async getByIuid(iuid) {\n if (!iuid)\n return null;\n const object = await this.get(this.keyFor(`${iuid}_object`));\n if (!object)\n return null;\n const data = await this.get(this.keyFor(`${iuid}_data`));\n return { iuid, object, data };\n }\n async deleteByName(name) {\n const entry = await this.getByName(name);\n await this.deleteNameLookupByName(name);\n if (!entry)\n return;\n await this.delete(this.keyFor(`${entry.iuid}_object`));\n await this.delete(this.keyFor(`${entry.iuid}_data`));\n }\n async deleteByIuid(iuid, name) {\n if (name) {\n await this.deleteNameLookupByName(name);\n }\n await this.deleteNameLookupByIuid(iuid);\n await this.delete(this.keyFor(`${iuid}_object`));\n await this.delete(this.keyFor(`${iuid}_data`));\n }\n async getAllCachedObjects() {\n const db = await this.openDb();\n if (!db)\n return [];\n return new Promise((resolve) => {\n const results = [];\n const tx = db.transaction(CardFsCache.DATA_STORE, \"readonly\");\n const store = tx.objectStore(CardFsCache.DATA_STORE);\n const request = store.openCursor();\n request.onsuccess = (event) => {\n const cursor = event.target.result;\n if (!cursor) {\n resolve(results);\n return;\n }\n const key = cursor.key;\n if (typeof key === \"string\" && key.endsWith(\"_object\")) {\n results.push(cursor.value);\n }\n cursor.continue();\n };\n request.onerror = () => resolve(results);\n });\n }\n}\nCardFsCache.DB_VERSION = 2;\nCardFsCache.DATA_STORE = \"cardfs\";\nCardFsCache.NAME_LOOKUP_STORE = \"cardfs_name_iuid_lookup\";\nCardFsCache.INFO_STORE = \"info\";\nCardFsCache.STORE_VERSION_KEY = \"ver\";\nCardFsCache.MAX_DATA_BYTES = 5 * 1024 * 1024;\n/**\n * Use CardSdk to create webapp cards\n */\nexport class CardSdk extends DomeEmbeddedAppSdk {\n buildCardFsMessagePayload(target, extra) {\n return {\n ...(target.name ? { name: target.name } : {}),\n ...(target.iuid ? { iuid: target.iuid } : {}),\n ...(extra ?? {}),\n };\n }\n assertValidReadHandler(handler) {\n if (!handler || typeof handler.next !== \"function\") {\n throw new Error(\"cardFS.read requires a handler with a next() function\");\n }\n return handler;\n }\n invokeReadHandlerNext(handler, payload) {\n try {\n handler.next(payload);\n }\n catch (err) {\n console.error(\"cardFS.read handler next() threw\", err);\n }\n }\n invokeReadHandlerError(handler, error) {\n if (!handler.error)\n return;\n try {\n handler.error(error);\n }\n catch (err) {\n console.error(\"cardFS.read handler error() threw\", err);\n }\n }\n sanitizeReadData(data, contextLabel) {\n if (data == null) {\n return { value: data, stripped: false };\n }\n try {\n const size = CardFsCache.estimateSize(data);\n if (size > CardFsCache.MAX_DATA_BYTES) {\n const label = contextLabel ? ` for ${contextLabel}` : \"\";\n console.warn(`cardFS.read payload data exceeded ${CardFsCache.MAX_DATA_BYTES} bytes${label}; omitting data`);\n return { value: undefined, stripped: true };\n }\n }\n catch (err) {\n console.warn(\"cardFS.read payload size estimation failed\", err);\n }\n return { value: data, stripped: false };\n }\n getCardIuid() {\n return this.dataStore?.iuid || null;\n }\n ensureCardFsCache() {\n if (!this.shouldUseCardFsFallback()) {\n return null;\n }\n if (!this.cardFsCache) {\n const cardIuid = this.getCardIuid();\n if (cardIuid) {\n this.cardFsCache = new CardFsCache(cardIuid, this.containerIuid);\n }\n }\n return this.cardFsCache;\n }\n supportsParentCardFs() {\n return !!this.parentCapabilities?.card_fs;\n }\n shouldUseCardFsFallback() {\n return !this.supportsParentCardFs();\n }\n constructor() {\n super();\n this.handler = null; // Handler instance for client messages\n this.accessToken = '';\n this.devMode = false;\n // Track in-flight FS operations by messageId so we can settle promises on callback\n this.fsReadRequests = new Map();\n this.fsWriteRequests = new Map();\n this.cardFsCache = null;\n this.pendingAcks = new Map();\n // Sets up the message listener for cards to receive messages from the parent.\n this.handleMessage = (type, data) => {\n if (type === ClientMessageType.INIT_ACK) {\n this.updateParentContext(data?.host, data?.capabilities);\n }\n // Check for ACK response with messageId\n const messageId = data?.messageId;\n if (messageId && this.pendingAcks.has(messageId)) {\n const { resolve, timeout } = this.pendingAcks.get(messageId);\n clearTimeout(timeout);\n this.pendingAcks.delete(messageId);\n resolve(data);\n return;\n }\n if (!messageId && this.resolvePendingAckByType(type, data)) {\n return;\n }\n if (!this.handler) {\n throw new Error(\"Message handler not found!\");\n }\n switch (type) {\n case ClientMessageType.INIT_ACK:\n // Parent sent INIT_ACK\n console.debug(\"CardSdk: INIT_ACK received\");\n this.dataStore.kw1 = data.key_wa1;\n this.dataStore.iuid = data.iuid;\n if (typeof data?.dev_mode === \"boolean\") {\n this.devMode = data.dev_mode;\n this.dataStore.dev_mode = data.dev_mode;\n }\n if (data.iuid) {\n if (this.shouldUseCardFsFallback()) {\n this.cardFsCache = new CardFsCache(data.iuid, this.containerIuid);\n }\n else {\n this.cardFsCache = null;\n }\n }\n else if (!this.shouldUseCardFsFallback()) {\n this.cardFsCache = null;\n }\n try {\n this.cryptoA01.decrypt(this.dataStore.denc, data.key_wa1 + this.dataStore.kw2, data.iuid)\n .then((decData) => {\n console.debug(\"CardSdk: INIT_ACK: decrypted data \", decData);\n const decryptedData = JSON.parse(decData);\n const decryptedContainerIuid = decryptedData?.container?.iuid;\n if (decryptedContainerIuid) {\n this.containerIuid = decryptedContainerIuid;\n if (this.shouldUseCardFsFallback() && this.dataStore?.iuid) {\n this.cardFsCache = new CardFsCache(this.dataStore.iuid, this.containerIuid);\n }\n }\n const apiToken = typeof decryptedData?.api_token === \"string\" ? decryptedData.api_token.trim() : \"\";\n if (apiToken) {\n this.accessToken = apiToken;\n console.debug(\"CardSdk: Stored API token from INIT_ACK payload\");\n }\n else {\n console.warn(\"CardSdk: INIT_ACK payload missing api_token; fallback APIs may fail without auth\");\n }\n if (this.handler)\n this.safeInvoke(\"onInit\", this.handler, { ...decryptedData, ui: data.ui });\n // no need for orig enc data.. free to delete it\n delete this.dataStore.denc;\n })\n .catch((err) => {\n console.error(\"Final decrypt error\", err);\n throw err;\n });\n }\n catch (err) {\n console.error(\"Decryption failed!\", err);\n this.sendEventError('dec2_failed', err.message);\n }\n break;\n case ClientMessageType.FILE_DATA: {\n const responseId = data?.messageId;\n if (responseId && this.fsReadRequests.has(responseId)) {\n // cardFS.read payload from parent (cached or fresh)\n const { messageId: _ignored, ...payload } = data || {};\n this.handleFsReadDataMessage(responseId, payload);\n return;\n }\n console.warn(\"CardSdk: FILE_DATA received but no matching fsRead request\", data?.messageId ?? data?.name);\n break;\n }\n case ClientMessageType.DATA_CHANGE:\n this.safeInvoke(\"onFileChange\", this.handler, data);\n case ClientMessageType.SAVE_SUCCESS: {\n const responseId = data?.messageId;\n if (responseId && this.fsWriteRequests.has(responseId)) {\n // cardFS write/list/delete success routed by messageId\n this.handleFsWriteSuccess(responseId, data);\n return;\n }\n console.warn(\"CardSdk: SAVE_SUCCESS received but no matching fsWrite request\", data?.messageId ?? data?.name);\n break;\n }\n case ClientMessageType.SAVE_ERROR: {\n const responseId = data?.messageId;\n if (responseId && this.fsWriteRequests.has(responseId)) {\n // cardFS write/list/delete failure routed by messageId\n this.handleFsWriteError(responseId, data);\n return;\n }\n console.warn(\"CardSdk: SAVE_ERROR received but no matching fsWrite request\", data?.messageId ?? data?.name);\n break;\n }\n case ClientMessageType.ERROR: {\n const responseId = data?.messageId;\n if (responseId) {\n const message = data?.message || 'Unknown error';\n if (this.fsReadRequests.has(responseId)) {\n // cardFS read error surfaced by the parent\n this.failFsReadRequest(responseId, new Error(message));\n return;\n }\n if (this.fsWriteRequests.has(responseId)) {\n // cardFS write/delete/list error surfaced by the parent\n this.failFsWriteRequest(responseId, new Error(message));\n return;\n }\n }\n // Parent sent an ERROR\n this.safeInvoke(\"onError\", this.handler, data);\n break;\n }\n case ClientMessageType.REFRESH:\n // Asking for UI refresh\n this.safeInvoke(\"onRefreshRequest\", this.handler, data);\n break;\n case ClientMessageType.AF1_DATA_TOKEN_ACK:\n // Handled via sendMessageWithAck resolver (no-op here)\n break;\n default:\n console.warn(`No handler found for message type: ${type}`);\n }\n };\n this.cryptoA01 = new CryptoA01();\n this.cardFS = {\n read: (name, handler, allowStale = true) => {\n this.cardsFsRead(name, handler, allowStale);\n },\n readById: (iuid, handler, allowStale = true) => {\n this.cardsFsReadById(iuid, handler, allowStale);\n },\n write: (name, fileData, onResult) => this.cardsFsWrite(name, fileData, onResult),\n writeById: (iuid, fileData, onResult) => this.cardsFsWriteById(iuid, fileData, onResult),\n delete: (name, onResult) => this.cardsFsDelete(name, onResult),\n deleteById: (iuid, onResult) => this.cardsFsDeleteById(iuid, onResult),\n list: (onResult) => this.cardsFsList(onResult),\n };\n console.debug(\"CardSdk::constructor: done\");\n }\n /**\n * Static initialization method to get or create the singleton instance of CardSdk.\n * @param secret - The card developer secret key\n * @param handler - (Optional) Handler for different events emitted by the SDK\n * @returns The singleton CardSdk instance\n */\n static async init(secret, handler, options) {\n try {\n console.debug(\"CardSdk::init\");\n if (!CardSdk.instance) {\n CardSdk.instance = new CardSdk();\n // Initialize parent communication - REQUIRED!\n CardSdk.instance.setupParentConnection()\n .then(() => {\n // Connection established with parents..\n // Initialize SDK in async\n CardSdk.instance.initializeCardSdk(secret);\n })\n .catch((err) => {\n console.error(err);\n });\n }\n else {\n return CardSdk.instance;\n }\n // Setup handlers\n if (handler) {\n CardSdk.instance.setHandler(handler); // Set handler if provided during initialization\n }\n return CardSdk.instance;\n }\n catch (err) {\n console.error(\"CardSdk: Unrecoverable error in init\", err);\n throw err;\n }\n }\n /**\n * Method to set or update the handler object.\n * @param handler - Custom handler for different message types\n */\n setHandler(handler) {\n this.handler = handler;\n }\n /**\n * Sends a deep link request to the parent directly from the card.\n */\n openDeepLink(href) {\n if (!this.emitDeepLink(href)) {\n console.warn(\"openDeepLink ignored; provide a dome:// or intouchapp:// href\");\n }\n }\n deriveSecretSeed(token) {\n const reversed = token.split('').reverse().join('');\n const seed = reversed.substring(4, 25);\n if (!seed) {\n throw new Error('Cannot decrypt (1)');\n }\n return seed;\n }\n getSeedToken(url) {\n try {\n const segments = url.pathname.split(\"/wa/\").filter(Boolean);\n if (segments.length < 2) {\n return null;\n }\n const token = segments[1]?.split(\"/\")[0] ?? null;\n return token || null;\n }\n catch (err) {\n console.warn(\"CardSdk: Failed to extract legacy seed token\", err);\n return null;\n }\n }\n async requestAf1DataFromParent(requestToken) {\n const ackPayload = await this.sendMessageWithAck(CardMessageType.AF1_DATA_TOKEN, { sdk: { ver: pkg.version } }, ClientMessageType.AF1_DATA_TOKEN_ACK);\n const { messageId: _ignored, ...payload } = ackPayload || {};\n const { cie, ck, dev_token } = payload;\n if (!cie || !ck || !dev_token) {\n throw new Error(\"Invalid AF1 data token payload\");\n }\n const res = await this.fetchAf1Data(cie, ck, dev_token, requestToken);\n const dataAf1 = res?.data_af1 ?? res?.data?.data_af1;\n if (!dataAf1) {\n throw new Error(\"AF1 data fetch returned empty payload\");\n }\n window.IT_DATA_AF1 = dataAf1;\n if (res?.ver) {\n window.IT_VERSION = res.ver;\n }\n if (res?.env) {\n window.IT_ENV = res.env;\n }\n return { dataAf1, cie };\n }\n async fetchAf1Data(cie, ck, devToken, requestToken) {\n if (!cie || !ck || !devToken || !requestToken) {\n throw new Error(\"Invalid AF1 data fetch parameters\");\n }\n const endpoint = new URL(`https://dome.so/api/v1/cards/e/${encodeURIComponent(cie)}/data_af1/`);\n endpoint.searchParams.set(\"dt\", devToken);\n endpoint.searchParams.set(\"rt\", requestToken);\n endpoint.searchParams.set(\"ck\", ck);\n const response = await fetch(endpoint.toString(), { method: \"GET\" });\n if (!response.ok) {\n const message = await response.text().catch(() => response.statusText);\n throw new Error(`AF1 data fetch failed: ${response.status} ${message}`);\n }\n return response.json();\n }\n // Function to initialize SDK after instance is created\n async initializeCardSdk(secret) {\n let TAG = \"CardSdk::initializeCardSdk:\";\n try {\n console.debug(TAG, \"enter\");\n if (!secret) {\n throw new Error(\"Invalid secret\");\n }\n const url = window.location.href;\n console.debug(TAG, \"url:\", url);\n const urlObject = new URL(url);\n const requestToken = urlObject.searchParams.get(\"rt\");\n if (!requestToken) {\n throw new Error('Missing request token');\n }\n let seedToken = this.getSeedToken(urlObject);\n let data_af1 = window.IT_DATA_AF1;\n if (!data_af1) {\n console.debug(TAG, \"IT_DATA_AF1 missing. Requesting token via parent\");\n const { dataAf1, cie } = await this.requestAf1DataFromParent(requestToken);\n data_af1 = dataAf1;\n seedToken = cie || seedToken;\n }\n if (!data_af1) {\n console.error(TAG, \"No data\");\n throw new Error('No data');\n }\n if (!seedToken) {\n throw new Error('Cannot decrypt (missing seed)');\n }\n const ss = this.deriveSecretSeed(seedToken);\n console.debug(TAG, \"ss:\", ss);\n const decData = await this.cryptoA01.decrypt(data_af1, secret, ss);\n try {\n const dataFromServer = JSON.parse(decData);\n console.debug(\"CardSdk: dataFromServer:\", dataFromServer);\n if (!dataFromServer.ite) {\n throw new Error(\"Invalid data\");\n }\n this.dataStore = {\n 'denc': dataFromServer.d,\n 'kw2': dataFromServer.kw2\n };\n CardSdk.instance.sendInit(dataFromServer.ite);\n }\n catch (err) {\n console.error(\"Initial Decryption failed (2):\", err);\n throw err;\n }\n }\n catch (err) {\n console.error(TAG, \"Init failed:\", err);\n this.sendEventError('init_failed', err.message);\n }\n }\n async sendInit(token) {\n const payload = { token, sdk: { ver: pkg.version } };\n const webappDetails = this.getWebappDetails();\n if (webappDetails) {\n payload.wa = webappDetails;\n }\n this.sendMessage(CardMessageType.INIT, payload);\n }\n getWebappDetails() {\n if (typeof window === \"undefined\") {\n return null;\n }\n let wa = {};\n const version = window.IT_VERSION;\n const env = window.IT_ENV;\n if (version) {\n wa.ver = String(version);\n }\n if (env) {\n wa.env = String(env);\n }\n return Object.keys(wa).length ? wa : null;\n }\n sendMessageWithAck(type, data, ackType, timeoutMs = 15000, onMessageId) {\n const messageId = crypto.randomUUID();\n if (onMessageId) {\n try {\n onMessageId(messageId);\n }\n catch (err) {\n return Promise.reject(err);\n }\n }\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingAcks.delete(messageId);\n reject(new Error(`${ackType} not received in time`));\n }, timeoutMs);\n this.pendingAcks.set(messageId, { resolve, reject, timeout, ackType });\n this.sendMessage(type, { ...data, messageId });\n });\n }\n resolvePendingAckByType(type, data) {\n for (const [messageId, pending] of this.pendingAcks.entries()) {\n if (pending.ackType !== type) {\n continue;\n }\n clearTimeout(pending.timeout);\n this.pendingAcks.delete(messageId);\n pending.resolve(data);\n return true;\n }\n return false;\n }\n // cardsSdk.cardFS.read implementation - streams updates only via handler callbacks\n cardsFsRead(name, handler, allowStale = true) {\n const target = { name };\n const resolvedHandler = this.assertValidReadHandler(handler);\n this.cardsFsReadInternal(target, resolvedHandler, allowStale, \"read\");\n }\n cardsFsReadById(iuid, handler, allowStale = true) {\n const target = { iuid };\n const resolvedHandler = this.assertValidReadHandler(handler);\n this.cardsFsReadInternal(target, resolvedHandler, allowStale, \"readById\");\n }\n cardsFsReadInternal(target, handler, allowStale, operation) {\n if (this.shouldUseCardFsFallback()) {\n console.debug(`cardFS.${operation} using fallback implementation for`, target);\n void this.cardsFsReadFallback(target, undefined, handler, allowStale).catch((err) => {\n const error = err instanceof Error ? err : new Error(String(err));\n this.invokeReadHandlerError(handler, error);\n });\n return;\n }\n console.debug(`cardFS.${operation} delegating to parent for`, target);\n let registeredMessageId = null;\n const targetLabel = target.name ? `\"${target.name}\"` : (target.iuid ? `iuid ${target.iuid}` : \"document\");\n const registerRequest = (messageId) => {\n registeredMessageId = messageId;\n // Track this read so FILE_DATA updates can stream via handler callbacks\n const request = {\n name: targetLabel,\n handler,\n allowStale,\n };\n request.noResponseTimeout = setTimeout(() => {\n this.failFsReadRequest(messageId, new Error(`cardFS.${operation} timed out for ${targetLabel}`));\n }, CardSdk.FS_RESPONSE_TIMEOUT_MS);\n this.fsReadRequests.set(messageId, request);\n };\n // Parent ACK provides a messageId that subsequent FILE_DATA responses will reuse\n this.sendMessageWithAck(CardMessageType.READ_FILE, this.buildCardFsMessagePayload(target, { allow_stale: allowStale }), ClientMessageType.READ_FILE_ACK, CardSdk.CARD_FS_ACK_TIMEOUT_MS, registerRequest).catch((err) => {\n const error = err instanceof Error ? err : new Error(String(err));\n if (registeredMessageId) {\n this.failFsReadRequest(registeredMessageId, error);\n }\n else {\n this.invokeReadHandlerError(handler, error);\n }\n });\n }\n // cardsSdk.cardFS.write - resolves when host confirms write\n cardsFsWrite(name, fileData, onResult) {\n const target = { name };\n return this.cardsFsWriteInternal(target, fileData, onResult, \"write\");\n }\n cardsFsWriteById(iuid, fileData, onResult) {\n const target = { iuid };\n return this.cardsFsWriteInternal(target, fileData, onResult, \"writeById\");\n }\n cardsFsWriteInternal(target, fileData, onResult, operation) {\n if (this.shouldUseCardFsFallback()) {\n console.debug(`cardFS.${operation} using fallback implementation for`, target);\n return this.cardsFsWriteFallback(target, fileData)\n .then((result) => {\n try {\n onResult?.(result);\n }\n catch (callbackErr) {\n console.error(`cardFS.${operation} fallback callback threw`, callbackErr);\n }\n return result;\n });\n }\n console.debug(`cardFS.${operation} delegating to parent for`, target);\n return new Promise((resolve, reject) => {\n let registeredMessageId = null;\n const targetLabel = target.name ? `\"${target.name}\"` : (target.iuid ? `iuid ${target.iuid}` : \"document\");\n const registerRequest = (messageId) => {\n registeredMessageId = messageId;\n const request = {\n name: targetLabel,\n onResult,\n resolve,\n reject,\n timeout: setTimeout(() => {\n this.failFsWriteRequest(messageId, new Error(`cardFS.${operation} timed out for ${targetLabel}`));\n }, CardSdk.FS_RESPONSE_TIMEOUT_MS),\n };\n this.fsWriteRequests.set(messageId, request);\n };\n this.sendMessageWithAck(CardMessageType.WRITE_FILE, this.buildCardFsMessagePayload(target, { data: fileData }), ClientMessageType.WRITE_FILE_ACK, CardSdk.CARD_FS_ACK_TIMEOUT_MS, registerRequest).catch((err) => {\n const error = err instanceof Error ? err : new Error(String(err));\n if (registeredMessageId) {\n this.failFsWriteRequest(registeredMessageId, error);\n }\n else {\n reject(error);\n }\n });\n });\n }\n // cardsSdk.cardFS.delete - simple request/ack flow\n cardsFsDelete(name, onResult) {\n const target = { name };\n return this.cardsFsDeleteInternal(target, onResult, \"delete\");\n }\n cardsFsDeleteById(iuid, onResult) {\n const target = { iuid };\n return this.cardsFsDeleteInternal(target, onResult, \"deleteById\");\n }\n cardsFsDeleteInternal(target, onResult, operation) {\n if (this.shouldUseCardFsFallback()) {\n console.debug(`cardFS.${operation} using fallback implementation for`, target);\n return this.cardsFsDeleteFallback(target)\n .then((result) => {\n try {\n onResult?.(result);\n }\n catch (callbackErr) {\n console.error(`cardFS.${operation} fallback callback threw`, callbackErr);\n }\n return result;\n });\n }\n console.debug(`cardFS.${operation} delegating to parent for`, target);\n return new Promise((resolve, reject) => {\n this.sendMessageWithAck(CardMessageType.DELETE_FILE, this.buildCardFsMessagePayload(target), ClientMessageType.DELETE_FILE_ACK, CardSdk.CARD_FS_ACK_TIMEOUT_MS)\n .then((data) => {\n const { messageId: _ignored, ...result } = data || {};\n onResult?.(result);\n resolve(result);\n })\n .catch((err) => {\n reject(err instanceof Error ? err : new Error(String(err)));\n });\n });\n }\n // cardsSdk.cardFS.list - returns metadata list provided by parent\n cardsFsList(onResult) {\n if (this.shouldUseCardFsFallback()) {\n console.debug(\"cardFS.list using fallback implementation\");\n return this.cardsFsListFallback()\n .then((result) => {\n try {\n onResult?.(result);\n }\n catch (callbackErr) {\n console.error(\"cardFS.list fallback callback threw\", callbackErr);\n }\n return result;\n });\n }\n console.debug(\"cardFS.list delegating to parent\");\n return new Promise((resolve, reject) => {\n this.sendMessageWithAck(CardMessageType.LIST_FILES, {}, ClientMessageType.LIST_FILES_ACK, CardSdk.CARD_FS_ACK_TIMEOUT_MS)\n .then((data) => {\n const { messageId: _ignored, ...result } = data || {};\n onResult?.(result);\n resolve(result);\n })\n .catch((err) => {\n reject(err instanceof Error ? err : new Error(String(err)));\n });\n });\n }\n // Handle FILE_DATA updates (cached + fresh) for cardFS.read\n handleFsReadDataMessage(messageId, payload) {\n const request = this.fsReadRequests.get(messageId);\n if (!request)\n return;\n if (request.noResponseTimeout) {\n clearTimeout(request.noResponseTimeout);\n request.noResponseTimeout = undefined;\n }\n // Guard against oversized payloads even if parent misbehaves\n const sanitized = this.sanitizeReadData(payload?.data, request.name);\n const fromCache = Boolean(payload?.from_cache ?? payload?.is_stale);\n const normalizedPayload = {\n name: payload?.name,\n iuid: payload?.iuid ?? null,\n object: payload?.object,\n data: sanitized.value,\n is_stale: Boolean(payload?.is_stale ?? payload?.from_cache),\n is_complete: typeof payload?.is_complete === \"boolean\"\n ? payload.is_complete\n : (!request.allowStale || !fromCache),\n };\n this.invokeReadHandlerNext(request.handler, normalizedPayload);\n if (request.cleanupTimeout) {\n clearTimeout(request.cleanupTimeout);\n }\n request.cleanupTimeout = setTimeout(() => {\n this.clearFsReadRequest(messageId);\n }, CardSdk.FS_READ_RETENTION_MS);\n }\n // Remove read request bookkeeping and clear timers\n clearFsReadRequest(messageId) {\n const request = this.fsReadRequests.get(messageId);\n if (!request)\n return undefined;\n if (request.noResponseTimeout) {\n clearTimeout(request.noResponseTimeout);\n }\n if (request.cleanupTimeout) {\n clearTimeout(request.cleanupTimeout);\n }\n this.fsReadRequests.delete(messageId);\n return request;\n }\n failFsReadRequest(messageId, error) {\n const request = this.clearFsReadRequest(messageId);\n if (request) {\n this.invokeReadHandlerError(request.handler, error);\n }\n }\n // Remove write request bookkeeping\n clearFsWriteRequest(messageId) {\n const request = this.fsWriteRequests.get(messageId);\n if (!request)\n return undefined;\n clearTimeout(request.timeout);\n this.fsWriteRequests.delete(messageId);\n return request;\n }\n failFsWriteRequest(messageId, error) {\n const request = this.clearFsWriteRequest(messageId);\n if (request) {\n request.reject(error);\n }\n }\n // Resolve write/list/delete promise with payload and invoke optional callback\n handleFsWriteSuccess(messageId, payload) {\n const request = this.clearFsWriteRequest(messageId);\n if (!request)\n return;\n const { messageId: _ignored, ...result } = payload || {};\n if (typeof request.onResult === \"function\") {\n try {\n request.onResult(result);\n }\n catch (err) {\n console.error(\"cardFS.write callback threw\", err);\n }\n }\n else {\n console.warn(\"onResult method invalid:\", request.onResult);\n }\n request.resolve(result);\n }\n handleFsWriteError(messageId, payload) {\n const request = this.clearFsWriteRequest(messageId);\n if (!request)\n return;\n const errorMessage = payload?.message || 'Unknown write error';\n const error = payload instanceof Error ? payload : new Error(errorMessage);\n request.reject(error);\n }\n async cardsFsReadFallback(target, requestId, handler, allowStale = true) {\n if (!this.shouldUseCardFsFallback()) {\n throw new Error(\"cardFS.read fallback is disabled because parent supports card_fs\");\n }\n const cardIuid = this.getCardIuid();\n if (!cardIuid) {\n throw new Error(\"cardFS.read fallback failed: card not initialized\");\n }\n const cache = this.ensureCardFsCache();\n let firstPayload = null;\n const targetLabel = target.name ? `\"${target.name}\"` : (target.iuid ? `iuid ${target.iuid}` : \"document\");\n const emit = (object, data, fromCache, isComplete, explicitName, explicitIuid) => {\n if (!object)\n return null;\n const payloadName = explicitName ?? target.name ?? object?.name ?? target.iuid ?? \"document\";\n const payloadIuid = explicitIuid ?? object?.iuid ?? target.iuid ?? null;\n const { value: safeData } = this.sanitizeReadData(data, payloadName);\n const messagePayload = {\n name: payloadName,\n iuid: payloadIuid,\n object,\n data: safeData,\n is_stale: fromCache,\n is_complete: isComplete,\n };\n if (requestId && this.fsReadRequests.has(requestId)) {\n this.handleFsReadDataMessage(requestId, messagePayload);\n }\n else {\n this.invokeReadHandlerNext(handler, messagePayload);\n }\n if (!firstPayload) {\n firstPayload = messagePayload;\n }\n return messagePayload;\n };\n let lastCachedPayload = null;\n if (cache) {\n try {\n if (allowStale) {\n let cached = null;\n if (target.iuid) {\n cached = await cache.getByIuid(target.iuid);\n }\n if (!cached && target.name) {\n cached = await cache.getByName(target.name);\n }\n if (cached?.object) {\n lastCachedPayload = emit(cached.object, cached.data, true, false, cached.object?.name ?? target.name, cached.iuid);\n }\n }\n }\n catch (err) {\n console.warn(\"cardFS.read cache lookup failed\", err);\n }\n }\n try {\n const freshPayload = await this.fetchDocumentPayload(cardIuid, target);\n if (freshPayload) {\n await cache?.cacheDocument(freshPayload.object, freshPayload.data);\n emit(freshPayload.object, freshPayload.data, false, true, freshPayload.object?.name, freshPayload.object?.iuid);\n }\n else if (allowStale && lastCachedPayload) {\n // Host served data; cached entry kept in sync\n emit(lastCachedPayload.object, lastCachedPayload.data, true, true, lastCachedPayload.name, lastCachedPayload.iuid ?? undefined);\n }\n }\n catch (err) {\n if (!firstPayload) {\n const error = err instanceof Error ? err : new Error(String(err));\n throw error;\n }\n console.warn(\"cardFS.read fresh fetch failed\", err);\n if (allowStale && lastCachedPayload) {\n // Fresh fetch failed but we have cache — mark it complete and return data\n emit(lastCachedPayload.object, lastCachedPayload.data, true, true, lastCachedPayload.name, lastCachedPayload.iuid ?? undefined);\n }\n }\n if (!firstPayload) {\n throw new Error(`cardFS.read fallback could not locate ${targetLabel}`);\n }\n }\n async cardsFsWriteFallback(target, fileData, requestId) {\n if (!this.shouldUseCardFsFallback()) {\n throw new Error(\"cardFS.write fallback is disabled because parent supports card_fs\");\n }\n const cardIuid = this.getCardIuid();\n if (!cardIuid) {\n throw new Error(\"cardFS.write fallback failed: card not initialized\");\n }\n console.debug(\"cardFS.write fallback invoked for target\", target);\n await this.upsertDocumentViaApi(cardIuid, target, fileData);\n const payload = await this.fetchDocumentPayload(cardIuid, target);\n await this.ensureCardFsCache()?.cacheDocument(payload.object, payload.data);\n const enrichedPayload = {\n name: payload.object?.name ?? target.name ?? null,\n iuid: payload.object?.iuid ?? target.iuid ?? null,\n object: payload.object,\n data: payload.data,\n };\n if (requestId && this.fsWriteRequests.has(requestId)) {\n this.handleFsWriteSuccess(requestId, enrichedPayload);\n }\n return enrichedPayload;\n }\n async cardsFsDeleteFallback(target) {\n if (!this.shouldUseCardFsFallback()) {\n throw new Error(\"cardFS.delete fallback is disabled because parent supports card_fs\");\n }\n const cardIuid = this.getCardIuid();\n if (!cardIuid) {\n throw new Error(\"cardFS.delete fallback failed: card not initialized\");\n }\n console.debug(\"cardFS.delete fallback invoked for target\", target);\n const cache = this.ensureCardFsCache();\n const doc = await this.fetchDocumentMetadataByTarget(cardIuid, target).catch(() => null);\n const deleteIuid = doc?.iuid ?? target.iuid ?? null;\n const resolvedName = doc?.name ?? target.name ?? null;\n if (!deleteIuid) {\n if (target.name) {\n await cache?.deleteByName(target.name);\n }\n return { name: resolvedName, iuid: null, deleted: false };\n }\n const response = await fetch(`/api/v1/documents/${deleteIuid}/`, {\n method: 'DELETE',\n headers: this.authHeader(),\n });\n if (!response.ok && response.status !== 404) {\n const message = await response.text().catch(() => 'delete failed');\n throw new Error(`cardFS.delete fallback failed: ${message}`);\n }\n await cache?.deleteByIuid(deleteIuid, resolvedName ?? undefined);\n const deleted = response.status !== 404;\n return {\n name: resolvedName ?? deleteIuid,\n iuid: deleteIuid,\n deleted,\n };\n }\n async cardsFsListFallback() {\n if (!this.shouldUseCardFsFallback()) {\n throw new Error(\"cardFS.list fallback is disabled because parent supports card_fs\");\n }\n const cardIuid = this.getCardIuid();\n if (!cardIuid) {\n throw new Error(\"cardFS.list fallback failed: card not initialized\");\n }\n const cache = this.ensureCardFsCache();\n try {\n const documents = await this.fetchAllDocuments(cardIuid);\n if (cache) {\n for (const doc of documents) {\n await cache.cacheDocument(doc, undefined);\n }\n }\n return { documents, from_cache: false };\n }\n catch (err) {\n const cachedDocs = await cache?.getAllCachedObjects();\n if (cachedDocs && cachedDocs.length > 0) {\n return { documents: cachedDocs, from_cache: true };\n }\n throw err;\n }\n }\n authHeader() {\n return this.accessToken ? { 'Authorization': `Bearer ${this.accessToken}` } : {};\n }\n jsonHeaders() {\n return { ...this.authHeader(), 'Content-Type': 'application/json' };\n }\n async fetchDocumentMetadataByTarget(cardIuid, target) {\n if (target.iuid) {\n return this.fetchDocumentMetadataByIuid(target.iuid);\n }\n if (target.name) {\n return this.fetchDocumentMetadataByName(cardIuid, target.name);\n }\n return null;\n }\n async fetchDocumentMetadataByIuid(iuid) {\n const response = await fetch(`/api/v1/documents/${iuid}/`, {\n method: 'GET',\n headers: this.authHeader(),\n });\n if (response.status === 404) {\n return null;\n }\n if (!response.ok) {\n const message = await response.text().catch(() => 'metadata lookup failed');\n throw new Error(`cardFS metadata fetch failed: ${message}`);\n }\n return response.json().catch(() => null);\n }\n normalizeDocumentsResponse(body) {\n if (Array.isArray(body?.results)) {\n return body.results;\n }\n if (Array.isArray(body)) {\n return body;\n }\n return body ? [body] : [];\n }\n extractHttpErrorMessage(error, fallback) {\n if (!error) {\n return fallback;\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error instanceof Error && error.message) {\n return error.message;\n }\n const payload = error?.error ?? error;\n if (payload instanceof Blob) {\n return fallback;\n }\n if (typeof payload === \"string\") {\n return payload;\n }\n if (payload?.detail) {\n return payload.detail;\n }\n if (payload?.message) {\n return payload.message;\n }\n if (typeof payload?.statusText === \"string\" && payload.statusText.trim()) {\n return payload.statusText;\n }\n return fallback;\n }\n async fetchDocumentMetadataByName(cardIuid, name) {\n if (!name)\n return null;\n const response = await fetch(`/api/v1/documents/with_card/${cardIuid}/?name=${encodeURIComponent(name)}`, {\n method: 'GET',\n headers: this.authHeader(),\n });\n if (!response.ok) {\n if (response.status === 404)\n return null;\n const message = await response.text().catch(() => 'metadata lookup failed');\n throw new Error(`cardFS metadata fetch failed: ${message}`);\n }\n const body = await response.json().catch(() => null);\n const documents = this.normalizeDocumentsResponse(body);\n return documents.find((doc) => doc?.name === name) ?? documents[0] ?? null;\n }\n async fetchAllDocuments(cardIuid) {\n const response = await fetch(`/api/v1/documents/with_card/${cardIuid}/`, {\n method: 'GET',\n headers: this.authHeader(),\n });\n if (!response.ok) {\n const message = await response.text().catch(() => 'list failed');\n throw new Error(`cardFS.list failed: ${message}`);\n }\n const body = await response.json().catch(() => null);\n return this.normalizeDocumentsResponse(body);\n }\n async fetchDocumentPayload(cardIuid, target) {\n const resolvedTarget = typeof target === \"string\" ? { name: target } : target;\n const doc = await this.fetchDocumentMetadataByTarget(cardIuid, resolvedTarget);\n if (!doc) {\n const targetLabel = resolvedTarget.name ? `\"${resolvedTarget.name}\"` : (resolvedTarget.iuid ? `iuid ${resolvedTarget.iuid}` : \"document\");\n throw new Error(`cardFS document not found: ${targetLabel}`);\n }\n const data = await this.fetchDocumentData(doc);\n return { object: doc, data };\n }\n async fetchDocumentData(doc) {\n if (doc?.data !== undefined) {\n return doc.data;\n }\n const url = doc?.orig?.url || doc?.url?.original || doc?.url;\n if (!url || typeof url !== 'string') {\n return null;\n }\n const response = await fetch(url);\n if (!response.ok) {\n const message = await response.text().catch(() => 'download failed');\n throw new Error(`cardFS data fetch failed: ${message}`);\n }\n const contentType = response.headers.get('Content-Type') || '';\n if (contentType.includes('application/json')) {\n return response.json();\n }\n if (contentType.startsWith('text/')) {\n return response.text();\n }\n return response.arrayBuffer();\n }\n async buildFileFormData(name, fileData) {\n let file;\n const toBinaryBlob = (input) => {\n if (input instanceof ArrayBuffer) {\n return new Blob([input.slice(0)], { type: 'application/octet-stream' });\n }\n if (typeof SharedArrayBuffer !== 'undefined' && input instanceof SharedArrayBuffer) {\n const viewFromShared = new Uint8Array(input);\n const copy = new Uint8Array(viewFromShared.length);\n copy.set(viewFromShared);\n return new Blob([copy.buffer], { type: 'application/octet-stream' });\n }\n if (ArrayBuffer.isView(input)) {\n const view = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n const copy = new Uint8Array(view.length);\n copy.set(view);\n return new Blob([copy.buffer], { type: 'application/octet-stream' });\n }\n const arrayBufferLike = input;\n const view = new Uint8Array(arrayBufferLike);\n const copy = new Uint8Array(view.length);\n copy.set(view);\n return new Blob([copy.buffer], { type: 'application/octet-stream' });\n };\n if (fileData instanceof File) {\n file = fileData;\n }\n else if (typeof Blob !== 'undefined' && fileData instanceof Blob) {\n file = new File([fileData], name, { type: fileData.type || 'application/octet-stream' });\n }\n else if (typeof SharedArrayBuffer !== 'undefined' && fileData instanceof SharedArrayBuffer) {\n const blob = toBinaryBlob(fileData);\n file = new File([blob], name, { type: blob.type });\n }\n else if (fileData instanceof ArrayBuffer) {\n const blob = toBinaryBlob(fileData);\n file = new File([blob], name, { type: blob.type });\n }\n else if (ArrayBuffer.isView(fileData)) {\n const blob = toBinaryBlob(fileData);\n file = new File([blob], name, { type: blob.type });\n }\n else if (typeof fileData === 'string') {\n const blob = new Blob([fileData], { type: 'text/plain' });\n file = new File([blob], name, { type: blob.type });\n }\n else {\n const jsonString = JSON.stringify(fileData ?? {});\n const blob = new Blob([jsonString], { type: 'application/json' });\n file = new File([blob], name, { type: blob.type });\n }\n const formData = new FormData();\n formData.append('file', file);\n return formData;\n }\n async upsertDocumentViaApi(cardIuid, target, fileData) {\n const formData = await this.buildFileFormData(target.name ?? target.iuid ?? 'document', fileData);\n if (target.iuid) {\n const response = await fetch(`/api/v1/documents/${target.iuid}/`, {\n method: 'PUT',\n headers: this.authHeader(),\n body: formData,\n });\n if (!response.ok) {\n const message = await response.text().catch(() => 'update failed');\n throw new Error(`cardFS.write update failed: ${message}`);\n }\n return;\n }\n const existing = target.name\n ? await this.fetchDocumentMetadataByName(cardIuid, target.name).catch(() => null)\n : null;\n if (existing?.iuid) {\n const response = await fetch(`/api/v1/documents/${existing.iuid}/`, {\n method: 'PUT',\n headers: this.authHeader(),\n body: formData,\n });\n if (!response.ok) {\n const message = await response.text().catch(() => 'update failed');\n throw new Error(`cardFS.write update failed: ${message}`);\n }\n return;\n }\n const uploadResponse = await fetch(`/api/v1/documents/`, {\n method: 'POST',\n headers: this.authHeader(),\n body: formData,\n });\n if (!uploadResponse.ok) {\n const message = await uploadResponse.text().catch(() => 'upload failed');\n throw new Error(`cardFS.write upload failed: ${message}`);\n }\n const uploadBody = await uploadResponse.json().catch(() => null);\n const uploadedDoc = Array.isArray(uploadBody?.results) ? uploadBody.results[0] : uploadBody;\n const newIuid = uploadedDoc?.iuid;\n if (!newIuid) {\n throw new Error('cardFS.write upload failed: missing document iuid');\n }\n const attachResponse = await fetch(`/api/v1/documents/with_card/${cardIuid}/`, {\n method: 'POST',\n headers: this.jsonHeaders(),\n body: JSON.stringify({ documents: [newIuid] }),\n });\n if (!attachResponse.ok) {\n const message = await attachResponse.text().catch(() => 'attach failed');\n throw new Error(`cardFS.write attach failed: ${message}`);\n }\n }\n /**\n * Get document associated with the current card\n */\n async getDocumentAttachedToCard(card_iuid, document_name = 'default') {\n const url = new URL(`/api/v1/documents/attached_to/${card_iuid}/`);\n url.searchParams.set('name', document_name);\n const response = await fetch(url.toString(), {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${this.accessToken || ''}`,\n 'Content-Type': 'application/json'\n }\n });\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Fetch failed: ${error}`);\n }\n return response.json();\n }\n /**\n * Save document attached to current card\n */\n async postDocumentAttachedToCard(card_iuid, document) {\n const response = await fetch(`/api/v1/documents/attached_to/${card_iuid}/`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.accessToken || ''}`,\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(document)\n });\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Post failed: ${error}`);\n }\n return response.json();\n }\n async getCardDocument(card_iuid, doc_name) {\n const response = await fetch(`/api/v1/documents/with_card/${card_iuid}/?name=${doc_name}`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${this.accessToken || ''}`,\n 'Content-Type': 'application/json',\n },\n });\n const data = await response.json();\n return data;\n }\n // Send event on error (clients will get \"onError\" event)\n formatErrorMessage(input) {\n if (typeof input === \"string\" && input.trim()) {\n return input;\n }\n if (input instanceof Error) {\n return input.message || input.toString();\n }\n if (input && typeof input === \"object\") {\n if (typeof input.message === \"string\") {\n return input.message;\n }\n try {\n return JSON.stringify(input);\n }\n catch {\n return Object.prototype.toString.call(input);\n }\n }\n if (input != null) {\n return String(input);\n }\n return \"Unknown error\";\n }\n sendEventError(error_code, message, data = undefined) {\n const data_to_send = {\n message: this.formatErrorMessage(message),\n error_code,\n data: data ?? null,\n };\n if (this.handler)\n this.safeInvoke(\"onError\", this.handler, data_to_send);\n }\n setFileDirty(data) {\n this.sendMessage(CardMessageType.FILE_DIRTY, data);\n }\n // Get username string from user object received from parent\n getUsername(userObj) {\n const nameObj = userObj?.name;\n if (nameObj && Object.values(nameObj).some(value => value)) {\n return getNameString(nameObj);\n }\n return '';\n }\n}\n// How long we wait for parent responses before rejecting (ms)\nCardSdk.FS_RESPONSE_TIMEOUT_MS = 30000;\n// Keep read handlers alive briefly to allow cached+fresh events (ms)\nCardSdk.FS_READ_RETENTION_MS = 5000;\nCardSdk.CARD_FS_ACK_TIMEOUT_MS = 5000;\n","/**\n * Helper function to generate a unique requestId (UUID).\n * This uses the browser's crypto API for random UUID generation.\n */\nexport function generateUUID() {\n // If in a browser environment with crypto support (modern browsers)\n if (typeof window !== 'undefined' && window.crypto && window.crypto.randomUUID) {\n return window.crypto.randomUUID();\n }\n // Fallback for non-browser environments (e.g., Node.js)\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n // Fallback for environments without crypto support\n throw new Error('UUID generation is not supported in this environment');\n}\n/**\n * Helper function to get username from user object\n * @param nameObj the user object\n */\nexport function getNameString(nameObj) {\n const { prefix = '', given = '', middle = '', family = '', suffix = '' } = nameObj || {};\n const fullname = [prefix, given, middle, family, suffix].filter(namePart => namePart).join(' ');\n return fullname.trim();\n}\n"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","CryptoA01","constructor","subtleCrypto","window","crypto","subtle","Error","decrypt","token","password","salt","tokenBytes","base64UrlDecode","slice","iv","ciphertext","hmacFromToken","fullKey","deriveKey","hmacKey","aesKey","splitKey","hmacInput","Uint8Array","sign","every","byte","i","decrypted","name","TextDecoder","decode","err","console","log","iterations","encoder","TextEncoder","keyMaterial","importKey","encode","hash","length","rawKey","exportKey","base64","base64String","replace","decodedString","atob","map","c","charCodeAt","ViewerMessageType","CommonSdkMessageType","ClientMessageType","Set","location","origin","ALLOWED_DEEP_LINK_PROTOCOLS","DomeEmbeddedAppSdk","targetOrigin","isAppReady","port2","runtimeHost","parentHostDetails","parentCapabilities","handleDeepLinkClick","event","target","Element","anchor","closest","href","getAttribute","emitDeepLink","preventDefault","info","detectHost","setupDeepLinkInterception","AndroidBridge","webkit","debug","document","addEventListener","trim","warn","protocol","split","toLowerCase","has","sendMessage","CardMessageType","OPEN_DEEPLINK","url","updateParentContext","host","capabilities","merged","type","nextCapabilities","host_type","hostType","getHost","data","message","JSON","stringify","messageHandlers","appHandler","postMessage","error","sendAppInit","INIT","sdk","ver","safeInvoke","eventName","handlerObj","handler","String","setupParentConnection","Promise","resolve","reject","receiveFromAndroid","handleMessage","receiveFromIOS","CONNECT","ports","onmessage","e","handlePortMessage","removeEventListener","notifyConnectionSuccess","parent","INIT_MESSAGE_CHANNEL","CONNECTION_SUCCESS","ViewerSdk","super","pendingRequests","Map","pendingInitAck","init","initialized","instance","then","initializeViewerSdk","catch","trace","setHandler","canRead","perms","includes","canWrite","requestInitialData","REQUEST_INITIAL_DATA","requestSave","doc","isDataDirty","requestId","randomUUID","generateUUID","REQUEST_SAVE","set","setTimeout","delete","handleOnSave","status","setDirty","isDirty","SET_DIRTY","sendClose","SEND_CLOSE","sendException","SEND_EXCEPTION","INIT_ACK","DATA_CHANGE","REQUEST_CLOSE","SAVE_SUCCESS","SAVE_ERROR","CardFsCache","cardIuid","containerIuid","openPromise","isSupported","indexedDB","openDb","openWithVersion","DB_VERSION","version","infoAction","request","open","onupgradeneeded","oldVersion","configureStores","result","onsuccess","db","hasRequiredStores","nextVersion","close","updateStoresMetadata","finally","onerror","objectStoreNames","contains","DATA_STORE","createObjectStore","NAME_LOOKUP_STORE","INFO_STORE","stores","nowMicros","Math","trunc","Date","now","preserveExistingInfoTs","all","ensureStoreVersion","updateCardInfo","storeName","tx","transaction","store","objectStore","finalize","oncomplete","onabort","put","STORE_VERSION_KEY","preserveExistingTs","existingContainer","readInfoValue","existingTs","undefined","containerValue","timestampValue","writeInfoValue","keyFor","suffix","normalizeName","trimmed","hashName","cryptoRef","globalThis","digest","encoded","encodeText","bufferToBase64","buffer","binary","bytes","fromCharCode","btoa","getIuidForName","normalized","hashed","upsertNameLookup","iuid","openCursor","cursor","continue","deleteNameLookupByName","deleteNameLookupByIuid","estimateSize","Blob","size","ArrayBuffer","byteLength","isView","cacheDocument","normalizedName","MAX_DATA_BYTES","getByName","object","getByIuid","deleteByName","entry","deleteByIuid","getAllCachedObjects","results","endsWith","push","CardSdk","buildCardFsMessagePayload","extra","assertValidReadHandler","next","invokeReadHandlerNext","payload","invokeReadHandlerError","sanitizeReadData","contextLabel","stripped","label","getCardIuid","dataStore","ensureCardFsCache","shouldUseCardFsFallback","cardFsCache","supportsParentCardFs","card_fs","accessToken","devMode","fsReadRequests","fsWriteRequests","pendingAcks","messageId","timeout","clearTimeout","resolvePendingAckByType","kw1","key_wa1","dev_mode","cryptoA01","denc","kw2","decData","decryptedData","parse","decryptedContainerIuid","container","apiToken","api_token","ui","sendEventError","FILE_DATA","responseId","_ignored","handleFsReadDataMessage","handleFsWriteSuccess","handleFsWriteError","ERROR","failFsReadRequest","failFsWriteRequest","REFRESH","AF1_DATA_TOKEN_ACK","cardFS","read","allowStale","cardsFsRead","readById","cardsFsReadById","write","fileData","onResult","cardsFsWrite","writeById","cardsFsWriteById","cardsFsDelete","deleteById","cardsFsDeleteById","list","cardsFsList","secret","options","initializeCardSdk","openDeepLink","deriveSecretSeed","seed","reverse","join","substring","getSeedToken","segments","pathname","filter","Boolean","requestAf1DataFromParent","requestToken","ackPayload","sendMessageWithAck","AF1_DATA_TOKEN","cie","ck","dev_token","res","fetchAf1Data","dataAf1","data_af1","IT_DATA_AF1","IT_VERSION","env","IT_ENV","devToken","endpoint","URL","encodeURIComponent","searchParams","response","fetch","toString","method","ok","text","statusText","json","TAG","urlObject","seedToken","ss","dataFromServer","ite","d","sendInit","webappDetails","getWebappDetails","wa","keys","ackType","timeoutMs","onMessageId","pending","entries","resolvedHandler","cardsFsReadInternal","operation","cardsFsReadFallback","registeredMessageId","targetLabel","READ_FILE","allow_stale","READ_FILE_ACK","CARD_FS_ACK_TIMEOUT_MS","noResponseTimeout","FS_RESPONSE_TIMEOUT_MS","cardsFsWriteInternal","cardsFsWriteFallback","callbackErr","WRITE_FILE","WRITE_FILE_ACK","cardsFsDeleteInternal","cardsFsDeleteFallback","DELETE_FILE","DELETE_FILE_ACK","cardsFsListFallback","LIST_FILES","LIST_FILES_ACK","sanitized","fromCache","from_cache","is_stale","normalizedPayload","is_complete","cleanupTimeout","clearFsReadRequest","FS_READ_RETENTION_MS","clearFsWriteRequest","cache","firstPayload","emit","isComplete","explicitName","explicitIuid","payloadName","payloadIuid","safeData","messagePayload","lastCachedPayload","cached","freshPayload","fetchDocumentPayload","upsertDocumentViaApi","enrichedPayload","fetchDocumentMetadataByTarget","deleteIuid","resolvedName","deleted","headers","authHeader","documents","fetchAllDocuments","cachedDocs","jsonHeaders","fetchDocumentMetadataByIuid","fetchDocumentMetadataByName","normalizeDocumentsResponse","body","Array","isArray","extractHttpErrorMessage","fallback","detail","find","resolvedTarget","fetchDocumentData","orig","original","contentType","startsWith","arrayBuffer","buildFileFormData","file","toBinaryBlob","input","SharedArrayBuffer","viewFromShared","copy","view","byteOffset","File","blob","jsonString","formData","FormData","append","existing","uploadResponse","uploadBody","uploadedDoc","newIuid","attachResponse","getDocumentAttachedToCard","card_iuid","document_name","postDocumentAttachedToCard","getCardDocument","doc_name","formatErrorMessage","error_code","data_to_send","setFileDirty","FILE_DIRTY","getUsername","userObj","nameObj","values","some","prefix","given","middle","family","namePart","getNameString"],"sourceRoot":""}
|