@mdbase-dev/connect 0.1.0-beta.55 → 0.1.0-beta.57
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/README.md +1 -1
- package/dist/authority-sync-request.d.ts +3 -0
- package/dist/authority-sync-request.js +20 -0
- package/dist/browser/integrity.json +1 -1
- package/dist/browser/mdbase-connect.min.js +3 -3
- package/dist/browser/mdbase-connect.min.js.sha384 +1 -1
- package/dist/connect.d.ts +0 -2
- package/dist/connect.js +7 -31
- package/dist/connection-transport-internals.d.ts +22 -0
- package/dist/connection-transport-internals.js +1 -0
- package/dist/connection-transport.d.ts +2 -22
- package/dist/connection-transport.js +24 -22
- package/dist/crypto.js +22 -9
- package/dist/fresh-encrypted-request.d.ts +4 -0
- package/dist/fresh-encrypted-request.js +28 -0
- package/dist/local-file-transport.d.ts +1 -0
- package/dist/local-file-transport.js +28 -5
- package/dist/pending-recovery-transports.d.ts +4 -0
- package/dist/pending-recovery-transports.js +48 -0
- package/package.json +2 -2
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var MdbaseConnect=(()=>{var Vt=Object.defineProperty;var Oo=Object.getOwnPropertyDescriptor;var ko=Object.getOwnPropertyNames;var To=Object.prototype.hasOwnProperty;var Io=(t,e)=>{for(var n in e)Vt(t,n,{get:e[n],enumerable:!0})},Mo=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of ko(e))!To.call(t,o)&&o!==n&&Vt(t,o,{get:()=>e[o],enumerable:!(i=Oo(e,o))||i.enumerable});return t};var xo=t=>Mo(Vt({},"__esModule",{value:!0}),t);var Aa={};Io(Aa,{ApplicationIdentityStoreError:()=>me,FileTransferCryptoError:()=>Q,GrantFileTransferCipher:()=>qe,IndexedDbApplicationIdentityStore:()=>Me,IndexedDbGrantKeyStore:()=>Se,MDBASE_RECORD_CREATED_CONTRACT:()=>Hn,MDBASE_TIMER_FIRED_CONTRACT:()=>$n,MdbaseApplicationSession:()=>Te,MdbaseBrowserSelection:()=>Ht,MdbaseCollectionClient:()=>De,MdbaseConnect:()=>Kt,MdbaseConnectError:()=>v,MdbaseConnection:()=>Ne,MdbaseFileClient:()=>Ue,MdbaseMemorySelection:()=>$t,MdbaseMemoryVerificationStore:()=>et,MdbaseSession:()=>ke,MemoryApplicationIdentityStore:()=>xe,MemoryGrantKeyStore:()=>Re,RelayCryptoError:()=>S,applicationIdentity:()=>At,applicationInstallationId:()=>Ee,authorityProofMessage:()=>an,connectError:()=>l,connectFailure:()=>A,connectProblem:()=>k,connectSuccess:()=>T,createPkce:()=>Ye,decryptRelayResponse:()=>Ae,deriveFileTransferKey:()=>yn,deriveP256SharedSecret:()=>We,effectiveCapabilities:()=>ht,encryptRelayRequest:()=>pe,externalStore:()=>Ao,isRetryableConnectError:()=>Jn,operationProblem:()=>ve,operationsForApplicationCapabilities:()=>lt,parseMdbaseNativeNotificationData:()=>So,parseMdbasePushPayload:()=>An,showMdbasePushNotification:()=>Ro,signApplicationAuthorization:()=>nt,signAuthorityRequest:()=>bt,validateGrantEncryption:()=>J});var ce={access_denied:{category:"authorization",recovery:"reauthorize"},access_paused:{category:"availability",recovery:"resume_connector_access"},application_identity_unavailable:{category:"compatibility",recovery:"upgrade_application"},approval_window_blocked:{category:"authorization",recovery:"reauthorize"},authority_authorization_changed:{category:"authorization",recovery:"reauthorize"},authorization_binding_incompatible:{category:"compatibility",recovery:"upgrade_application"},authorization_cancelled:{category:"cancellation",recovery:"none"},authorization_expired:{category:"authorization",recovery:"reauthorize"},authorization_replayed:{category:"integrity",recovery:"reauthorize"},browser_required:{category:"compatibility",recovery:"none"},callback_url_required:{category:"validation",recovery:"fix_request"},capability_contract_incompatible:{category:"compatibility",recovery:"upgrade_application"},change_cursor_reset:{category:"conflict",recovery:"refresh"},collection_access_denied:{category:"authorization",recovery:"reauthorize"},collection_configuration_invalid:{category:"validation",recovery:"repair_collection"},collection_contracts_missing:{category:"compatibility",recovery:"choose_collection"},collection_incompatible:{category:"compatibility",recovery:"choose_collection"},collection_invalid:{category:"validation",recovery:"repair_collection"},collection_kind_unsupported:{category:"compatibility",recovery:"choose_collection"},collection_mismatch:{category:"selection",recovery:"choose_collection"},collection_not_found:{category:"selection",recovery:"choose_collection"},collection_not_ready:{category:"selection",recovery:"choose_collection"},collection_not_selected:{category:"selection",recovery:"choose_collection"},collection_type_registry_invalid:{category:"validation",recovery:"repair_collection"},collection_version_unsupported:{category:"compatibility",recovery:"upgrade_collection"},concurrent_modification:{category:"conflict",recovery:"refresh"},connector_identity_changed:{category:"integrity",recovery:"reauthorize"},connector_offline:{category:"availability",recovery:"retry"},connector_upgrade_required:{category:"compatibility",recovery:"upgrade_connector"},device_authorization_failed:{category:"authorization",recovery:"reauthorize"},direct_operation_rejected:{category:"authorization",recovery:"reauthorize"},discovery_failed:{category:"availability",recovery:"retry"},durable_mutation_unsupported:{category:"compatibility",recovery:"upgrade_connector"},encrypted_relay_rejected:{category:"authorization",recovery:"reauthorize"},encryption_required:{category:"authorization",recovery:"reauthorize"},expired_token:{category:"authorization",recovery:"reauthorize"},file_changed_during_move:{category:"conflict",recovery:"refresh"},file_changed_during_read:{category:"conflict",recovery:"refresh"},file_move_failed:{category:"internal",recovery:"contact_support"},file_mutation_conflict:{category:"conflict",recovery:"resolve_conflict"},file_not_found:{category:"conflict",recovery:"refresh"},file_source_mismatch:{category:"conflict",recovery:"refresh"},file_upload_incomplete:{category:"conflict",recovery:"retry"},hosted_provider_unavailable:{category:"availability",recovery:"retry"},insufficient_access:{category:"authorization",recovery:"reauthorize"},invalid_application_authorization:{category:"validation",recovery:"fix_request"},invalid_application_manifest:{category:"validation",recovery:"fix_request"},invalid_callback:{category:"validation",recovery:"fix_request"},invalid_device_authorization_response:{category:"integrity",recovery:"contact_support"},invalid_encrypted_response:{category:"integrity",recovery:"contact_support"},invalid_loopback_url:{category:"validation",recovery:"fix_request"},invalid_mutation_id:{category:"validation",recovery:"fix_request"},invalid_operation_response:{category:"integrity",recovery:"contact_support"},invalid_path:{category:"validation",recovery:"fix_request"},invalid_preflight:{category:"conflict",recovery:"refresh"},invalid_push_payload:{category:"validation",recovery:"fix_request"},invalid_push_subscription:{category:"validation",recovery:"fix_request"},invalid_request:{category:"validation",recovery:"fix_request"},invalid_token_response:{category:"integrity",recovery:"contact_support"},managed_fcm_not_declared:{category:"compatibility",recovery:"fix_request"},manifest_load_failed:{category:"availability",recovery:"retry"},manifest_required:{category:"validation",recovery:"fix_request"},missing_grant_key:{category:"authorization",recovery:"reauthorize"},mutation_recovery_expired:{category:"compatibility",recovery:"none"},mutation_request_conflict:{category:"conflict",recovery:"resolve_conflict"},no_pending_mutation:{category:"conflict",recovery:"refresh"},not_authorized:{category:"authorization",recovery:"reauthorize"},not_remote_authority:{category:"compatibility",recovery:"choose_collection"},notification_criterion_not_declared:{category:"validation",recovery:"fix_request"},notification_reauthorization_required:{category:"authorization",recovery:"reauthorize"},notification_registration_failed:{category:"availability",recovery:"retry"},notification_unregistration_failed:{category:"availability",recovery:"retry"},notifications_not_declared:{category:"compatibility",recovery:"fix_request"},notifications_unavailable:{category:"availability",recovery:"retry"},operation_cancelled:{category:"cancellation",recovery:"none"},operation_failed:{category:"internal",recovery:"contact_support"},operation_invalid:{category:"validation",recovery:"fix_request"},operation_outcome_unknown:{category:"conflict",recovery:"resolve_outcome"},path_occupied:{category:"conflict",recovery:"resolve_conflict"},pending_mutation_unresolved:{category:"conflict",recovery:"resolve_outcome"},query_snapshot_changed:{category:"conflict",recovery:"refresh"},rate_limited:{category:"availability",recovery:"retry"},reconnect_required:{category:"authorization",recovery:"reauthorize"},redirect_uri_required:{category:"validation",recovery:"fix_request"},reference_updates_unsupported:{category:"compatibility",recovery:"fix_request"},registry_backup_invalid:{category:"integrity",recovery:"contact_support"},registry_busy:{category:"availability",recovery:"retry"},registry_corrupt:{category:"integrity",recovery:"repair_collection"},registry_migration_failed:{category:"internal",recovery:"contact_support"},registry_schema_incompatible:{category:"compatibility",recovery:"upgrade_connector"},relay_authorization_expired:{category:"authorization",recovery:"reauthorize"},relay_unavailable:{category:"availability",recovery:"retry"},sandbox_unsupported:{category:"compatibility",recovery:"fix_request"},scope_denied:{category:"authorization",recovery:"reauthorize"},stale_file_revision:{category:"conflict",recovery:"refresh"},storage_required:{category:"compatibility",recovery:"none"},sync_failed:{category:"availability",recovery:"retry"},temporarily_unavailable:{category:"availability",recovery:"retry"},timeout:{category:"availability",recovery:"retry"},token_exchange_failed:{category:"availability",recovery:"retry"},transport_protocol_incompatible:{category:"compatibility",recovery:"upgrade_connector"},type_pack_provision_failed:{category:"validation",recovery:"repair_collection"},unknown_collection:{category:"selection",recovery:"choose_collection"},unsafe_file_path:{category:"validation",recovery:"fix_request"},unsupported_encryption:{category:"compatibility",recovery:"upgrade_application"},unsupported_operation:{category:"compatibility",recovery:"fix_request"}},Eo={access_denied:{type:"object",required:[],properties:{return_to:{type:"string"}}},approval_window_blocked:{type:"object",required:["user_code","verification_uri","verification_uri_complete","expires_at","interval_seconds"],properties:{user_code:{type:"string"},verification_uri:{type:"string"},verification_uri_complete:{type:"string"},expires_at:{type:"integer"},interval_seconds:{type:"integer"}}},authorization_binding_incompatible:{type:"object",required:["contract","required","supported","peer"],properties:{contract:{type:"string"},required:{type:"array",items:{type:"integer"}},supported:{type:"array",items:{type:"integer"}},peer:{type:"string"},operation:{type:"string"}}},capability_contract_incompatible:{type:"object",required:["contract","required","supported","peer"],properties:{contract:{type:"string"},required:{type:"array",items:{type:"integer"}},supported:{type:"array",items:{type:"integer"}},peer:{type:"string"},operation:{type:"string"}}},collection_configuration_invalid:{type:"object",required:["diagnostics"],properties:{diagnostics:{type:"array",items:{type:"object"}}}},collection_contracts_missing:{type:"object",required:["contracts"],properties:{contracts:{type:"array",items:{type:"object",required:["id","version"],properties:{id:{type:"string"},version:{type:"string"}}}}}},collection_invalid:{type:"object",required:["diagnostics"],properties:{diagnostics:{type:"array",items:{type:"object"}}}},collection_type_registry_invalid:{type:"object",required:["diagnostics"],properties:{diagnostics:{type:"array",items:{type:"object"}}}},collection_version_unsupported:{type:"object",required:["current_version","required_version"],properties:{current_version:{type:"string"},required_version:{type:"string"}}},connector_offline:{type:"object",required:[],properties:{connector_name:{type:"string"}}},durable_mutation_unsupported:{type:"object",required:["contract","required","supported","peer"],properties:{contract:{type:"string"},required:{type:"array",items:{type:"integer"}},supported:{type:"array",items:{type:"integer"}},peer:{type:"string"},operation:{type:"string"}}},insufficient_access:{type:"object",required:["required_operations","granted_operations","missing_operations"],properties:{required_operations:{type:"array",items:{type:"string"}},granted_operations:{type:"array",items:{type:"string"}},missing_operations:{type:"array",items:{type:"string"}}}},invalid_application_manifest:{type:"object",required:["issues"],properties:{issues:{type:"array",items:{type:"object",required:["path","keyword","message","params"],properties:{path:{type:"string"},keyword:{type:"string"},message:{type:"string"},params:{type:"object"}}}}}},mutation_request_conflict:{type:"object",required:["request_id"],properties:{request_id:{type:"string"}}},operation_invalid:{type:"object",required:["diagnostics"],properties:{diagnostics:{type:"array",items:{type:"object"}},partial_result:{}}},operation_outcome_unknown:{type:"object",required:["request_id"],properties:{request_id:{type:"string"}}},rate_limited:{type:"object",required:[],properties:{retry_after_ms:{type:"integer"}}},transport_protocol_incompatible:{type:"object",required:["contract","required","supported","peer"],properties:{contract:{type:"string"},required:{type:"array",items:{type:"integer"}},supported:{type:"array",items:{type:"integer"}},peer:{type:"string"},operation:{type:"string"}}}};function Pn(t){return Object.hasOwn(ce,t)}function Be(t){if(!On(t))return!1;let e=t;if(e.problem_version!==1||typeof e.message!="string"||e.message.length===0||e.operation_outcome!==void 0&&e.operation_outcome!=="not_sent"&&e.operation_outcome!=="rejected"&&e.operation_outcome!=="unknown"||e.trace_id!==void 0&&(typeof e.trace_id!="string"||e.trace_id.length===0))return!1;if(e.code==="unknown")return typeof e.server_code=="string"&&e.server_code.length>0&&e.category==="unknown"&&e.recovery==="none";if(typeof e.code!="string"||!Pn(e.code)||e.server_code!==void 0)return!1;let n=ce[e.code],i=Eo[e.code],o=i===void 0?e.details===void 0:e.details===void 0?(i.required?.length??0)===0:Gt(e.details,i);return e.category===n.category&&e.recovery===n.recovery&&o}function Gt(t,e){if(e.type===void 0)return!0;if(e.type==="string")return typeof t=="string";if(e.type==="integer")return typeof t=="number"&&Number.isInteger(t);if(e.type==="number")return typeof t=="number"&&Number.isFinite(t);if(e.type==="boolean")return typeof t=="boolean";if(e.type==="array")return Array.isArray(t)&&t.every(i=>Gt(i,e.items??{}));if(!On(t))return!1;if(!e.properties)return!0;let n=t;return!Object.keys(n).every(i=>Object.hasOwn(e.properties,i))||!(e.required??[]).every(i=>Object.hasOwn(n,i))?!1:Object.entries(n).every(([i,o])=>Gt(o,e.properties[i]))}function On(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Wt(t,e,n={}){if(Pn(t)){let i=ce[t],o={problem_version:1,code:t,category:i.category,recovery:i.recovery,message:e,...n.details===void 0?{}:{details:n.details},...n.operation_outcome===void 0?{}:{operation_outcome:n.operation_outcome},...n.trace_id===void 0?{}:{trace_id:n.trace_id}};if(Be(o))return o}return{problem_version:1,code:"unknown",server_code:t,category:"unknown",recovery:"none",message:e,...n.details===void 0?{}:{details:n.details},...n.operation_outcome===void 0?{}:{operation_outcome:n.operation_outcome},...n.trace_id===void 0?{}:{trace_id:n.trace_id}}}var kn=new Uint8Array([77,68,66,70]),Tn=1,In=0,Ta=new Uint8Array([77,68,66,82]);var Mn=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,C=class extends Error{code;constructor(e,n){super(n),this.code=e,this.name="FileFrameError"}};function Do(t){return t==="upload_chunk"?1:2}function qo(t){if(t===1)return"upload_chunk";if(t===2)return"download_chunk";throw new C("invalid_kind",`Unknown file frame kind ${t}`)}function Fo(t){if(!t||typeof t!="object"||Array.isArray(t))throw new C("invalid_header","File frame header must be a JSON object");return t}function rt(t,e){let n=t[e];if(typeof n!="string"||n.length===0)throw new C("invalid_header",`File frame header ${e} must be a non-empty string`);return n}function ot(t,e){let n=rt(t,e);if(!Mn.test(n))throw new C("invalid_header",`File frame header ${e} must be a UUID`);return n}function le(t,e,n=Number.MAX_SAFE_INTEGER){let i=t[e];if(!Number.isSafeInteger(i)||i<0||i>n)throw new C("invalid_header",`File frame header ${e} is outside its allowed range`);return i}function Jt(t){if(t.protocol_version!==1)throw new C("unsupported_version",`Unsupported file transfer protocol ${t.protocol_version}`);if(t.protection!=="grant_aead_v1"&&t.protection!=="transport_tls")throw new C("invalid_header","Unknown file transfer protection");if(t.direction!=="upload"&&t.direction!=="download")throw new C("invalid_header","Unknown file transfer direction");for(let[e,n]of[["grant_id",t.grant_id],["authority_id",t.authority_id],["collection_id",t.collection_id],["transfer_id",t.transfer_id]])if(!Mn.test(n))throw new C("invalid_header",`File frame header ${e} must be a UUID`);for(let[e,n,i]of[["chunk_size",t.chunk_size,4194304],["chunk_index",t.chunk_index,Number.MAX_SAFE_INTEGER],["offset",t.offset,Number.MAX_SAFE_INTEGER],["plaintext_length",t.plaintext_length,4194304],["total_size",t.total_size,Number.MAX_SAFE_INTEGER]])if(!Number.isSafeInteger(n)||n<0||n>i)throw new C("invalid_header",`File frame header ${e} is outside its allowed range`);if(t.chunk_size<64*1024)throw new C("invalid_header","File frame chunk_size is below the protocol minimum");if(!Number.isSafeInteger(t.scope_epoch)||t.scope_epoch<1)throw new C("invalid_header","File frame header scope_epoch must be a positive integer");if(t.protection==="grant_aead_v1"&&!t.key_id)throw new C("invalid_header","AEAD-protected file frames require key_id");return{protocol_version:1,protection:t.protection,grant_id:t.grant_id,authority_id:t.authority_id,collection_id:t.collection_id,transfer_id:t.transfer_id,direction:t.direction,chunk_size:t.chunk_size,chunk_index:t.chunk_index,offset:t.offset,plaintext_length:t.plaintext_length,total_size:t.total_size,scope_epoch:t.scope_epoch,...t.key_id===void 0?{}:{key_id:t.key_id}}}function zo(t){let e;try{e=new TextDecoder("utf-8",{fatal:!0}).decode(t)}catch{throw new C("invalid_header","File frame header is not valid UTF-8")}let n;try{n=Fo(JSON.parse(e))}catch(d){throw d instanceof C?d:new C("invalid_header","File frame header is not valid JSON")}let i=new Set(["protocol_version","protection","grant_id","authority_id","collection_id","transfer_id","direction","chunk_size","chunk_index","offset","plaintext_length","total_size","scope_epoch","key_id"]);if(Object.keys(n).some(d=>!i.has(d)))throw new C("invalid_header","File frame header contains an unknown field");let o=le(n,"protocol_version");if(o!==1)throw new C("unsupported_version",`Unsupported file transfer protocol ${o}`);let r=rt(n,"protection"),a=rt(n,"direction"),s=n.key_id===void 0?void 0:rt(n,"key_id"),c=Jt({protocol_version:1,protection:r,grant_id:ot(n,"grant_id"),authority_id:ot(n,"authority_id"),collection_id:ot(n,"collection_id"),transfer_id:ot(n,"transfer_id"),direction:a,chunk_size:le(n,"chunk_size",4194304),chunk_index:le(n,"chunk_index"),offset:le(n,"offset"),plaintext_length:le(n,"plaintext_length",4194304),total_size:le(n,"total_size"),scope_epoch:le(n,"scope_epoch"),...s===void 0?{}:{key_id:s}});if(JSON.stringify(c)!==e)throw new C("invalid_header","File frame header must use the canonical field order without duplicate fields or whitespace");return c}function Yt(t,e,n){let i=t==="upload_chunk"?"upload":"download";if(e.direction!==i)throw new C("invalid_header",`Frame kind ${t} requires direction ${i}`);let o=e.chunk_index*e.chunk_size;if(!Number.isSafeInteger(o)||e.offset!==o)throw new C("invalid_header","Chunk offset does not match its index and protocol chunk size");if(e.offset+e.plaintext_length>e.total_size)throw new C("invalid_header","Chunk extends past the declared transfer size");let r=e.protection==="grant_aead_v1"?e.plaintext_length+16:e.plaintext_length;if(n!==r)throw new C("invalid_length","Payload length does not match the protected plaintext length")}function Uo(t){return t.plaintext_length+(t.protection==="grant_aead_v1"?16:0)}function at(t,e){let n=Jt(e),i=Uo(n);Yt(t,n,i);let o=new TextEncoder().encode(JSON.stringify(n));if(o.byteLength>16384)throw new C("limit_exceeded","File frame header exceeds the protocol limit");let r=new Uint8Array(16+o.byteLength);r.set(kn,0);let a=new DataView(r.buffer,r.byteOffset,r.byteLength);return a.setUint8(4,Tn),a.setUint8(5,Do(t)),a.setUint16(6,In,!1),a.setUint32(8,o.byteLength,!1),a.setUint32(12,i,!1),r.set(o,16),r}function xn(t){let e=Jt(t.header);if(Yt(t.kind,e,t.payload.byteLength),t.payload.byteLength>4194320)throw new C("limit_exceeded","File frame payload exceeds the protocol limit");let n=at(t.kind,e),i=new Uint8Array(n.byteLength+t.payload.byteLength);return i.set(n,0),i.set(t.payload,n.byteLength),i}function st(t,e={}){if(t.byteLength<16)throw new C("invalid_length","File frame is shorter than its fixed prefix");if(!kn.every((f,h)=>t[h]===f))throw new C("invalid_magic","File frame magic is not MDBF");let n=new DataView(t.buffer,t.byteOffset,t.byteLength),i=n.getUint8(4);if(i!==Tn)throw new C("unsupported_version",`Unsupported file frame version ${i}`);let o=qo(n.getUint8(5));if(n.getUint16(6,!1)!==In)throw new C("unsupported_flags","File frame uses unsupported flags");let r=n.getUint32(8,!1),a=n.getUint32(12,!1),s=e.maxHeaderBytes??16384,c=e.maxPayloadBytes??4194320;if(r===0)throw new C("invalid_length","File frame header must not be empty");if(r>s||a>c)throw new C("limit_exceeded","File frame exceeds the configured decode limits");let d=16+r+a;if(!Number.isSafeInteger(d)||d!==t.byteLength)throw new C("invalid_length","File frame lengths do not match the supplied bytes");let p=16+r,u=zo(t.subarray(16,p));return Yt(o,u,a),{kind:o,header:u,payload:t.slice(p)}}var No=["describe","changes","read","query","list_views","execute_view","read_view_source","create_view_source","update_view_source","delete_view_source","validate","create","update","delete","rename","read_type","create_type","update_type","assess_type_pack","apply_type_pack","assess_collection_setup","apply_collection_setup","list_timers","put_timer","cancel_timer","reconcile_timers","sync"],Lo=["list_files","open_file_upload","open_file_download","move_file","delete_file","get_file_transfer_status","commit_file_upload","abort_file_transfer"],Bo={describe:"never",changes:"never",read:"never",query:"never",list_views:"never",execute_view:"never",read_view_source:"never",create_view_source:"always",update_view_source:"always",delete_view_source:"always",validate:"never",create:"always",update:"always",delete:"always",rename:"always",read_type:"never",create_type:"always",update_type:"always",assess_type_pack:"never",apply_type_pack:"always",assess_collection_setup:"never",apply_collection_setup:"always",list_timers:"never",put_timer:"always",cancel_timer:"always",reconcile_timers:"always",sync:"sync_action"},jo={describe:1,changes:1,read:1,query:1,list_views:1,execute_view:1,read_view_source:1,create_view_source:1,update_view_source:1,delete_view_source:1,validate:1,create:1,update:1,delete:1,rename:1,read_type:1,create_type:1,update_type:1,assess_type_pack:1,apply_type_pack:1,assess_collection_setup:1,apply_collection_setup:1,list_timers:1,put_timer:1,cancel_timer:1,reconcile_timers:1,sync:1},Ko={list_files:1,open_file_upload:1,open_file_download:1,move_file:1,delete_file:1,get_file_transfer_status:1,commit_file_upload:1,abort_file_transfer:1},Ho=new Set(["open_file_upload","move_file","delete_file","commit_file_upload","abort_file_transfer"]);var $o=new Set(No),Vo=new Set(Lo);function En(t){return $o.has(t)}function Go(t){return Vo.has(t)}function Dn(t,e){if(t==="file_control"){let n=qn(e)&&typeof e.type=="string"?e.type:"";if(!Go(n))throw new Error(`Unknown file-control message: ${n}`);return Ko[n]}return jo[t]}function ee(t,e){let n=qn(e)?e:{};if(n.dry_run===!0)return null;if(t==="file_control"){let o=typeof n.type=="string"?n.type:"";return Ho.has(o)?`file_control:${o}`:null}let i=Bo[t];return i==="always"?t:i==="sync_action"&&n.action==="mutate"?"sync:mutate":null}function ct(t,e){return ee(t,e)!==null}function qn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Wo=1,Jo="mdbase-connect mutation fingerprint v1\0",Qt=new TextEncoder;function Yo(t){return Xt(t,new Set)}function Qo(t,e){let n=ee(t,e);if(n===null)throw new TypeError("The operation is not a canonical mutation.");let i=Qt.encode(n),o=Qt.encode(Yo(e)),r=Qt.encode(Jo),a=new Uint8Array(r.length+4+8+i.length+4+8+o.length),s=new DataView(a.buffer),c=0;return a.set(r,c),c+=r.length,s.setUint32(c,Wo,!1),c+=4,c=zn(a,s,c,i),s.setUint32(c,Dn(t,e),!1),c+=4,zn(a,s,c,o),a}async function Un(t,e){let n=new Uint8Array(await globalThis.crypto.subtle.digest("SHA-256",Qo(t,e).buffer));return Xo(n)}function Xt(t,e){if(t===null)return"null";if(t===!0)return"true";if(t===!1)return"false";if(typeof t=="string")return Fn(t),JSON.stringify(t);if(typeof t=="number"){if(!Number.isFinite(t))throw new TypeError("Mutation input numbers must be finite.");return JSON.stringify(t)}if(typeof t!="object")throw new TypeError(`Mutation input contains unsupported ${typeof t}.`);if(e.has(t))throw new TypeError("Mutation input must not contain cycles.");e.add(t);try{if(Array.isArray(t)){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("Mutation input must not contain symbol properties.");let o=[];for(let r=0;r<t.length;r+=1){if(!Object.hasOwn(t,r))throw new TypeError("Mutation input arrays must not be sparse.");o.push(Xt(t[r],e))}return`[${o.join(",")}]`}let n=Object.getPrototypeOf(t);if(n!==Object.prototype&&n!==null)throw new TypeError("Mutation input objects must be plain JSON objects.");if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("Mutation input must not contain symbol properties.");let i=Object.entries(t);for(let[o]of i)Fn(o);return i.sort(([o],[r])=>o<r?-1:o>r?1:0),`{${i.map(([o,r])=>{let a=Object.getOwnPropertyDescriptor(t,o);if(!a||a.get||a.set)throw new TypeError("Mutation input must not contain accessor properties.");return`${JSON.stringify(o)}:${Xt(r,e)}`}).join(",")}}`}finally{e.delete(t)}}function Fn(t){for(let e=0;e<t.length;e+=1){let n=t.charCodeAt(e);if(n>=55296&&n<=56319){let i=t.charCodeAt(e+1);if(!(i>=56320&&i<=57343))throw new TypeError("Mutation input strings must not contain lone surrogates.");e+=1}else if(n>=56320&&n<=57343)throw new TypeError("Mutation input strings must not contain lone surrogates.")}}function zn(t,e,n,i){return e.setBigUint64(n,BigInt(i.length),!1),n+=8,t.set(i,n),n+i.length}function Xo(t){return btoa(String.fromCharCode(...t)).replaceAll("+","-").replaceAll("/","_").replace(/=+$/u,"")}var te=2,je=4;function Zt(t,e){let n={operation_transport:te,authorization_binding:je,semantic_capabilities:1};return(t.some(i=>ct(i,{action:"mutate"}))||e?.actions.some(i=>i!=="list"&&i!=="read")===!0)&&(n.durable_mutation=1),n}var Nn={"collection.inspect":["describe"],"records.watch":["changes"],"records.read":["read"],"records.query":["query"],"records.validate":["validate"],"records.create":["create"],"records.update":["update"],"records.delete":["delete"],"records.rename":["rename"],"views.list":["list_views"],"views.execute":["execute_view"],"views.source.read":["read_view_source"],"views.source.create":["create_view_source"],"views.source.update":["update_view_source"],"views.source.delete":["delete_view_source"],"definitions.contracts.current":[],"definitions.read":["read_type"],"definitions.create":["create_type"],"definitions.update":["update_type"],"definitions.type-pack.inspect":["assess_type_pack"],"definitions.type-pack.apply":["assess_type_pack","apply_type_pack"],"collection.setup.apply":["assess_collection_setup","apply_collection_setup"],"timers.list":["list_timers"],"timers.put":["put_timer"],"timers.cancel":["cancel_timer"],"timers.reconcile":["reconcile_timers"],"sync.offline-replica":["sync"],"notifications.background-delivery":[],"files.list":[],"files.read":[],"files.add":[],"files.replace":[],"files.move":[],"files.delete":[]};function lt(t,e={}){let n=e.includeOptional===!1?t.required:[...t.required,...t.optional??[]];return[...new Set(n.flatMap(i=>Nn[i]))]}function dt(t){return[...Nn[t]]}var Zo=new TextEncoder().encode("mdbase-connect application installation id v2\0"),er=new TextEncoder().encode("mdbase-connect application authorization proof v4\0");async function Bn(t){let e=ut(t),i=new Uint8Array(await crypto.subtle.digest("SHA-256",de([Zo,D(e)]))).slice(0,16);return i[6]=i[6]&15|128,i[8]=i[8]&63|128,[Ke(i.slice(0,4)),Ke(i.slice(4,6)),Ke(i.slice(6,8)),Ke(i.slice(8,10)),Ke(i.slice(10,16))].join("-")}function jn(t){let e=[ut(t.installation_signing_public_key),ut(t.grant_agreement_public_key),ut(t.grant_signing_public_key)];if(e.some((a,s)=>e.slice(s+1).some(c=>ar(a,c))))throw new Error("Application authorization keys must be distinct.");let n=en(t.authorization_nonce),i=en(t.code_challenge),o=t.contracts;if(t.protocol_version!==4||n.byteLength!==32||!/^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)+$/u.test(t.application_declaration_id)||!/^[0-9a-f]{64}$/u.test(t.application_manifest_digest)||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?Z$/u.test(t.issued_at)||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?Z$/u.test(t.expires_at)||i.byteLength!==32||![o.operation_transport,o.authorization_binding,o.semantic_capabilities,o.durable_mutation??1].every(a=>Number.isInteger(a)&&a>0)||t.requested_operations.length===0&&t.requested_files===void 0||new Set(t.requested_operations).size!==t.requested_operations.length||t.requested_operations.some(a=>!a||a.includes("\0"))||(t.flow==="authorization_code"?t.redirect_uri===void 0||t.state===void 0:t.flow!=="device_code"||t.redirect_uri!==void 0||t.state!==void 0))throw new Error("Application authorization binding is invalid.");nr(t.requested_files);let r=t.requested_operations.map(a=>D(new TextEncoder().encode(a)));return de([er,V(t.protocol_version),D(pt(t.application_id)),D(pt(t.authorization_id)),D(new TextEncoder().encode(t.application_declaration_id)),D(Kn(t.application_manifest_digest)),D(pt(t.application_installation_id)),...e.map(D),D(new TextEncoder().encode(t.flow)),D(n),D(new TextEncoder().encode(t.issued_at)),D(new TextEncoder().encode(t.expires_at)),Ln(t.redirect_uri),Ln(t.state),D(new TextEncoder().encode(t.code_challenge)),V(o.operation_transport),V(o.authorization_binding),V(o.semantic_capabilities),tr(o.durable_mutation),V(r.length),...r,ir(t.requested_files),or(t.collection_id)])}function tr(t){return t===void 0?new Uint8Array(1):de([new Uint8Array([1]),V(t)])}function nr(t){if(t!==void 0&&(t.actions.length===0||new Set(t.actions).size!==t.actions.length||t.scope.kind==="selected_folders"&&(t.scope.folders.length===0||new Set(t.scope.folders).size!==t.scope.folders.length||t.scope.folders.some(e=>!e||e.includes("\0")))))throw new Error("Application authorization file request is invalid.")}function ir(t){if(t===void 0)return new Uint8Array(1);let e=t.actions.map(n=>D(new TextEncoder().encode(n)));return de([new Uint8Array([1]),V(e.length),...e,D(new TextEncoder().encode(t.scope.kind)),...t.scope.kind==="selected_folders"?[V(t.scope.folders.length),...t.scope.folders.map(n=>D(new TextEncoder().encode(n)))]:[]])}function Ln(t){return t===void 0?new Uint8Array(1):de([new Uint8Array([1]),D(new TextEncoder().encode(t))])}function or(t){return t===void 0?new Uint8Array(1):de([new Uint8Array([1]),D(pt(t))])}function ut(t){let e=en(t);if(e.byteLength!==65||e[0]!==4)throw new Error("Application authorization public key is invalid.");return e}function en(t){if(!/^[A-Za-z0-9_-]+$/u.test(t))throw new Error("Invalid base64url value.");let e=t.replaceAll("-","+").replaceAll("_","/"),n=e.padEnd(Math.ceil(e.length/4)*4,"="),i=Uint8Array.from(atob(n),o=>o.charCodeAt(0));if(rr(i)!==t)throw new Error("Non-canonical base64url value.");return i}function pt(t){if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu.test(t))throw new Error("Invalid UUID value.");let e=t.replaceAll("-","");return Kn(e)}function Kn(t){if(!/^[0-9a-f]+$/u.test(t)||t.length%2!==0)throw new Error("Invalid hexadecimal value.");return Uint8Array.from({length:t.length/2},(e,n)=>Number.parseInt(t.slice(n*2,n*2+2),16))}function D(t){return de([V(t.byteLength),t])}function V(t){let e=new Uint8Array(4);return new DataView(e.buffer).setUint32(0,t,!1),e}function de(t){let e=new Uint8Array(t.reduce((i,o)=>i+o.byteLength,0)),n=0;for(let i of t)e.set(i,n),n+=i.byteLength;return e}function rr(t){return btoa(String.fromCharCode(...t)).replaceAll("+","-").replaceAll("/","_").replace(/=+$/u,"")}function ar(t,e){return t.byteLength===e.byteLength&&t.every((n,i)=>n===e[i])}function Ke(t){return[...t].map(e=>e.toString(16).padStart(2,"0")).join("")}var Hn={id:"mdbase.record.created",version:"1.0.0",digest:"sha256:7f3bed6baa356ee9389e977ae7b77a102e2bee871a7c1d9f2026fc21cacdbfc9"};var $n={id:"mdbase.runtime.timer.fired",version:"1.0.0",digest:"sha256:41105be7a7abf33b31ced47e1e1965242236e40ccaea286b959b0a8c591f5642"};var Vn=28485,He="P256-HKDF-SHA256-AES256GCM",ft=1;var sr="contract-setup-v1",cr="file-relay-v1",lr=["application-authorization-v4","authorization-activation","encrypted-relay","policy-ack"];var dr=["durable-mutation-journal-v1","durable-file-lifecycle-v1"],Na=[...dr,"mutation-replay-after-credential-retirement-v1"],La=[...lr,sr,cr],tn=1;var Gn="mdbase-authority-request-proof-v1",$e={version:"x-mdbase-proof-version",timestamp:"x-mdbase-proof-timestamp",nonce:"x-mdbase-proof-nonce",signature:"x-mdbase-proof-signature"};function ht(t,e,n){let i=new Set(t.required),o=[...new Set([...t.required,...t.optional??[]])],r={};for(let a of o)r[a]=ur(a,i.has(a),e,n);return{contractVersion:1,values:r,requiredAvailable:t.required.every(a=>r[a]?.state==="available")}}function ur(t,e,n,i){let o=dt(t),r=o.filter(s=>!i.operations.includes(s)),a={id:t,requirement:e?"required":"optional",operations:o,missingOperations:r,evidence:[{source:"application",fact:`${e?"Required":"Optional"} in capability contract v1.`}]};if(r.length>0)return{...a,state:"requires_authorization",evidence:[...a.evidence,{source:"authorization",fact:`Missing ${r.join(", ")}.`}],reason:"The current grant does not include every operation for this capability."};if(t==="definitions.contracts.current"&&i.scope.access!=="full_collection"){let s=new Set(i.scope.contracts.map(({id:d,version:p,digest:u})=>`${d}@${p}:${u}`)),c=(n.requirements?.contracts??[]).filter(({id:d,version:p,digest:u})=>!s.has(`${d}@${p}:${u}`));if(c.length>0)return{...a,state:"requires_authorization",reason:"The current grant does not approve the exact required contract definitions.",evidence:[...a.evidence,{source:"authorization",fact:`Missing ${c.map(({id:d,version:p})=>`${d}@${p}`).join(", ")}.`}],details:{missingContracts:c}}}if(t.startsWith("files.")){let s=t.slice(6);if(!i.fileCapability?.actions.includes(s))return{...a,state:i.fileCapability?"requires_authorization":"unsupported",reason:i.fileCapability?`The current file grant does not include ${s}.`:"This connection has no file capability.",evidence:[...a.evidence,{source:"authorization",fact:i.fileCapability?`Granted file actions: ${i.fileCapability.actions.join(", ")}.`:"No file capability was granted."}]}}return t==="notifications.background-delivery"&&(n.notifications?.criteria.length??0)===0?{...a,state:"requires_setup",reason:"The application manifest declares no notification criteria.",evidence:[...a.evidence,{source:"application",fact:"No authority notification criteria are declared."}]}:{...a,state:"available",evidence:[...a.evidence,{source:"authorization",fact:o.length>0?`Granted operations: ${o.join(", ")}.`:"No record operation is required."},{source:"authority",fact:i.authority.kind==="hosted"?"Backed by a durable hosted mdbase authority.":"Backed by a user-operated mdbase connector."}],...t==="sync.offline-replica"?{details:{durability:"device",writes:"queued",authority:i.authority.kind}}:{},...t==="notifications.background-delivery"?{details:{delivery:"authority",payload:"opaque"}}:{}}}var v=class extends Error{constructor(n,i={}){super(n.message,i.cause===void 0?void 0:{cause:i.cause});this.problem=n;this.name="MdbaseConnectError",this.code=n.code,this.status=i.status}problem;code;status;get retryable(){return this.problem.recovery==="retry"&&this.problem.operation_outcome!=="unknown"}get requiresAuthorization(){return this.problem.category==="authorization"}get outcomeUnknown(){return this.problem.operation_outcome==="unknown"}get recovery(){return this.problem.recovery}get details(){return this.problem.details}};function k(t,e,...[n={}]){let i=ce[t];return{problem_version:1,code:t,category:i.category,recovery:i.recovery,message:e,...n.details===void 0?{}:{details:n.details},...n.operationOutcome===void 0?{}:{operation_outcome:n.operationOutcome},...n.traceId===void 0?{}:{trace_id:n.traceId}}}function Wn(t,e,n={}){return Wt(t,e,{details:n.details,operation_outcome:n.operationOutcome,trace_id:n.traceId})}function l(t,e,...n){let i=n[0];return new v(k(t,e,...n),{status:i?.status,cause:i?.cause})}function z(t,e,n={}){let{status:i,cause:o,...r}=n;return new v(Wt(t,e,{details:r.details,operation_outcome:r.operationOutcome,trace_id:r.traceId}),{status:i,cause:o})}function ve(t){let e=fr(t.diagnostics),n=mr(t.diagnostics);if(e==="collection_version_unsupported"){let i=hr(t.diagnostics);return k(e,n,{operationOutcome:"rejected",details:i})}return e!=="operation_invalid"?k(e,n,{operationOutcome:"rejected",details:{diagnostics:t.diagnostics}}):k(e,n,{operationOutcome:"rejected",details:{diagnostics:t.diagnostics,partial_result:t.result}})}function fr(t){let e=new Set(t.filter(n=>n.severity==="error").map(n=>n.code));return["migration_required","migration_lossy","unsupported_version"].some(n=>e.has(n))?"collection_version_unsupported":["invalid_config","invalid_configuration","missing_config","missing_spec_version"].some(n=>e.has(n))?"collection_configuration_invalid":["duplicate_type","invalid_contract_definition","invalid_data_contract","invalid_type_definition","invalid_type_path"].some(n=>e.has(n))?"collection_type_registry_invalid":["collection_invalid","collection_open_failed"].some(n=>e.has(n))?"collection_invalid":"operation_invalid"}function hr(t){let e=t.map(n=>n.details).find(n=>yr(n));return{current_version:typeof e?.current_version=="string"?e.current_version:"0.2.x",required_version:typeof e?.required_version=="string"?e.required_version:"0.3.0"}}function yr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Jn(t){return t instanceof v&&t.retryable}function mr(t){return t.filter(e=>e.severity==="error").map(e=>e.message).join(" ")||t.map(e=>e.message).join(" ")||"The collection rejected this operation."}var gr=["access_denied","access_paused","authorization_binding_incompatible","authorization_expired","capability_contract_incompatible","collection_access_denied","connector_identity_changed","connector_offline","connector_upgrade_required","direct_operation_rejected","durable_mutation_unsupported","operation_outcome_unknown","encryption_required","encrypted_relay_rejected","hosted_provider_unavailable","insufficient_access","invalid_encrypted_response","invalid_operation_response","invalid_request","missing_grant_key","mutation_recovery_expired","mutation_request_conflict","not_authorized","operation_cancelled","operation_failed","rate_limited","relay_authorization_expired","relay_unavailable","temporarily_unavailable","timeout","transport_protocol_incompatible","unsupported_operation"],Yn=Object.keys(ce),ue=["discovery_failed","invalid_operation_response","invalid_application_manifest","invalid_request","manifest_load_failed","rate_limited","temporarily_unavailable","timeout"],Ce=[...ue,"access_denied","application_identity_unavailable","approval_window_blocked","authorization_binding_incompatible","authorization_cancelled","authorization_replayed","browser_required","capability_contract_incompatible","collection_access_denied","collection_configuration_invalid","collection_contracts_missing","collection_incompatible","collection_invalid","collection_kind_unsupported","collection_mismatch","collection_not_found","collection_type_registry_invalid","collection_version_unsupported","connector_identity_changed","connector_offline","connector_upgrade_required","device_authorization_failed","durable_mutation_unsupported","encryption_required","expired_token","invalid_application_authorization","invalid_callback","invalid_device_authorization_response","invalid_token_response","scope_denied","reconnect_required","token_exchange_failed","transport_protocol_incompatible"],Ve=[...ue,"authorization_expired","invalid_operation_response","invalid_push_subscription","managed_fcm_not_declared","not_authorized","notification_criterion_not_declared","notification_reauthorization_required","notification_registration_failed","notification_unregistration_failed","notifications_not_declared","notifications_unavailable"],nn=["connector_offline","connector_upgrade_required","invalid_operation_response","not_authorized","operation_failed","temporarily_unavailable","timeout"],os=[...Ce,"collection_not_ready","collection_not_selected","unknown_collection"],_r=["collection_configuration_invalid","collection_invalid","collection_type_registry_invalid","collection_version_unsupported"],yt=[...gr,..._r],G=[...yt,"invalid_path","operation_invalid"],Qn=[...G,"query_snapshot_changed","sandbox_unsupported"],q=[...G,"concurrent_modification","invalid_preflight","pending_mutation_unresolved"],mt=[...yt,"change_cursor_reset"],ne=[...q,"type_pack_provision_failed"];function T(t,e=[]){return{ok:!0,value:t,diagnostics:e}}function A(t){return{ok:!1,problem:t}}async function I(t,e){try{return T(await t())}catch(n){if(!(n instanceof v))throw n;let i=n.problem;return i.code==="unknown"||e.includes(i.code)?A(i):A(Wn(i.code,i.message,{details:i.details,operationOutcome:i.operation_outcome,traceId:i.trace_id}))}}var _t=3e4,br=1e4,vr=12e4,Cr=6e4;function we(t={}){return{requestMs:gt(t.requestMs,_t,"requestMs"),watchStartMs:gt(t.watchStartMs,br,"watchStartMs"),uploadMs:gt(t.uploadMs,vr,"uploadMs"),syncMs:gt(t.syncMs,Cr,"syncMs")}}function ie(t={},e=_t,n=Date.now){let i=t.timeoutMs===void 0?e:t.timeoutMs,o=i===null?null:wr(i),r=new AbortController,a=o===null?null:n()+o,s=()=>r.abort(t.signal?.reason);t.signal?.aborted?s():t.signal?.addEventListener("abort",s,{once:!0});let c=o===null?void 0:setTimeout(()=>r.abort(l("timeout","The operation exceeded its request deadline.",{operationOutcome:"not_sent"})),o),d=!1;return{signal:r.signal,deadline:a,remainingMs:()=>a===null?null:Math.max(0,a-n()),dispose:()=>{d||(d=!0,c!==void 0&&clearTimeout(c),t.signal?.removeEventListener("abort",s))}}}async function F(t,e,n){let i=ie(t,e),o,r=new Promise((s,c)=>{o=c}),a=()=>o?.(W(i.signal));i.signal.addEventListener("abort",a,{once:!0});try{if(i.signal.aborted)throw W(i.signal);return await Promise.race([n(i),r])}finally{i.signal.removeEventListener("abort",a),i.dispose()}}async function L(t,e,n){let i=ie(t,e);try{if(i.signal.aborted)throw W(i.signal);return await n(i)}finally{i.dispose()}}function W(t){return t.reason instanceof v?t.reason:l("operation_cancelled","The operation was cancelled before it changed the collection.",{operationOutcome:"not_sent",cause:t.reason})}function wr(t){if(!Number.isSafeInteger(t)||t<=0)throw new TypeError("timeoutMs must be a positive safe integer or null.");return t}function gt(t,e,n){if(t===void 0)return e;if(t===null)return null;if(!Number.isSafeInteger(t)||t<=0)throw new TypeError(`${n} must be a positive safe integer or null.`);return t}var Sr="mdbase-connect-keys",oe="grant-keys",rn=18446744073709551615n,Rr="mdbase-connect relay request key v1",Ar="mdbase-connect relay response key v1",Xn=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,Se=class{database=null;async create(e){let n=await ti(e),i=await this.open();return await ei(i,o=>o.add({...n,counter:"0"})),n}async get(e){let n=await this.open(),i=await Tr(n.transaction(oe).objectStore(oe).get(e));return i?{handle:i.handle,agreementPrivateKey:i.agreementPrivateKey,agreementPublicKey:i.agreementPublicKey,signingPrivateKey:i.signingPrivateKey,signingPublicKey:i.signingPublicKey}:null}async nextCounter(e){let n=await this.open();return new Promise((i,o)=>{let r=n.transaction(oe,"readwrite"),a=r.objectStore(oe),s=a.get(e),c=null;s.onerror=()=>o(s.error),s.onsuccess=()=>{let d=s.result;if(!d){r.abort(),o(new S("missing_grant_key","The encrypted grant key is unavailable."));return}let p=BigInt(d.counter)+1n;if(p>rn){r.abort(),o(new S("counter_exhausted","The encrypted grant must be authorized again."));return}c=p.toString(),a.put({...d,counter:c})},r.onerror=()=>o(r.error),r.onabort=()=>o(r.error??new Error("Key counter transaction aborted.")),r.oncomplete=()=>{c&&i(c)}})}async delete(e){let n=await this.open();await ei(n,i=>i.delete(e))}open(){if(typeof indexedDB>"u")throw new S("key_storage_unavailable","Encrypted relay authorization requires browser IndexedDB or an injected grant key store.");return this.database||(this.database=new Promise((e,n)=>{let i=indexedDB.open(Sr,1);i.onupgradeneeded=()=>{i.result.objectStoreNames.contains(oe)||i.result.createObjectStore(oe,{keyPath:"handle"})},i.onerror=()=>n(i.error),i.onsuccess=()=>e(i.result)})),this.database}},Re=class{records=new Map;sequence=Promise.resolve();async create(e){if(this.records.has(e))throw new Error(`Grant key already exists: ${e}`);let n=await ti(e);return this.records.set(e,{...n,counter:"0"}),n}async get(e){let n=this.records.get(e);return n?{handle:n.handle,agreementPrivateKey:n.agreementPrivateKey,agreementPublicKey:n.agreementPublicKey,signingPrivateKey:n.signingPrivateKey,signingPublicKey:n.signingPublicKey}:null}nextCounter(e){let n,i,o=new Promise((r,a)=>{n=r,i=a});return this.sequence=this.sequence.then(()=>{let r=this.records.get(e);if(!r)throw new S("missing_grant_key","The encrypted grant key is unavailable.");let a=BigInt(r.counter)+1n;if(a>rn)throw new S("counter_exhausted","The encrypted grant must be authorized again.");r.counter=a.toString(),n(r.counter)}).catch(r=>{i(r)}),o}async delete(e){this.records.delete(e)}};async function bt(t,e,n,i){let o=await Pr(t,e,n),r=i.timestamp??Math.floor(Date.now()/1e3),a=i.nonce??crypto.randomUUID(),s=await an({...i,timestamp:r,nonce:a}),c=await crypto.subtle.sign({name:"ECDSA",hash:"SHA-256"},o.signingPrivateKey,new TextEncoder().encode(s));return{[$e.version]:String(tn),[$e.timestamp]:String(r),[$e.nonce]:a,[$e.signature]:Ge(new Uint8Array(c))}}async function an(t){let e=t.method.toUpperCase(),n=await Zn(t.body??""),i=await Zn(t.credential);for(let o of[e,t.target,String(t.timestamp),t.nonce])if(!o||o.includes(`
|
|
2
|
-
`)||o.includes("\r"))throw new S("invalid_proof_input","Authority request proof metadata is invalid.");return[
|
|
3
|
-
`)}async function pe(t,e,n,i,o,r=crypto.randomUUID()){J(n.encryption);let a=await ni(t,e,n.encryption.application_agreement_public_key),s=await t.nextCounter(e),c={binding:n,requestId:r,operation:i,counter:s},d=await ii(a.agreementPrivateKey,n,"request"),p=new TextEncoder().encode(JSON.stringify(o??{})),u=await crypto.subtle.encrypt({name:"AES-GCM",iv:ai(s),additionalData:new TextEncoder().encode(ri(c,"request")),tagLength:128},d,p);return{type:"encrypted_operation_request",...Or(c),ciphertext:Ge(new Uint8Array(u))}}async function Ae(t,e,n,i,o){if(!kr(i,o))throw new S("invalid_encrypted_response","Encrypted response metadata does not match its request.");let r=await ni(t,e,n.encryption.application_agreement_public_key),a={binding:n,requestId:i.request_id,operation:i.operation,counter:i.counter},s=await ii(r.agreementPrivateKey,n,"response");try{let c=await crypto.subtle.decrypt({name:"AES-GCM",iv:ai(i.counter),additionalData:new TextEncoder().encode(ri(a,"response")),tagLength:128},s,ci(si(o.ciphertext))),d=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(c));if(d?.ok===!0&&"result"in d||d?.ok===!1&&Be(d.problem))return d;throw new Error("invalid response body")}catch(c){throw c instanceof S?c:new S("encrypted_response_rejected","The encrypted connector response could not be authenticated.")}}var S=class extends Error{constructor(n,i){super(i);this.code=n}code};async function ti(t){let e=await crypto.subtle.generateKey({name:"ECDH",namedCurve:"P-256"},!0,["deriveBits"]),n=Ge(new Uint8Array(await crypto.subtle.exportKey("raw",e.publicKey))),i=await crypto.subtle.exportKey("pkcs8",e.privateKey),o=await crypto.subtle.importKey("pkcs8",i,{name:"ECDH",namedCurve:"P-256"},!1,["deriveBits"]),r=await crypto.subtle.generateKey({name:"ECDSA",namedCurve:"P-256"},!0,["sign","verify"]),a=Ge(new Uint8Array(await crypto.subtle.exportKey("raw",r.publicKey))),s=await crypto.subtle.exportKey("pkcs8",r.privateKey),c=await crypto.subtle.importKey("pkcs8",s,{name:"ECDSA",namedCurve:"P-256"},!1,["sign"]);return{handle:t,agreementPrivateKey:o,agreementPublicKey:n,signingPrivateKey:c,signingPublicKey:a}}async function ni(t,e,n){let i=await t.get(e);if(!i||i.agreementPublicKey!==n)throw new S("missing_grant_key","The encrypted grant key is unavailable or does not match the grant.");return i}async function Pr(t,e,n){let i=await t.get(e);if(!i||i.signingPublicKey!==n)throw new S("missing_grant_key","The remote authority signing key is unavailable or does not match the grant.");return i}async function ii(t,e,n){let i=await We(t,e.encryption.connector_agreement_public_key),o=await crypto.subtle.importKey("raw",i,"HKDF",!1,["deriveKey"]),r=new TextEncoder().encode(oi(e)),a=await crypto.subtle.digest("SHA-256",r);return crypto.subtle.deriveKey({name:"HKDF",hash:"SHA-256",salt:a,info:new TextEncoder().encode(n==="request"?Rr:Ar)},o,{name:"AES-GCM",length:256},!1,n==="request"?["encrypt"]:["decrypt"])}async function We(t,e){try{let n=await crypto.subtle.importKey("raw",ci(on(e)),{name:"ECDH",namedCurve:"P-256"},!1,[]);return await crypto.subtle.deriveBits({name:"ECDH",public:n},t,256)}catch{throw new S("invalid_public_key","The connector relay public key is invalid.")}}function oi(t){let e=t.encryption;return["mdbase-connect",te,e.suite,t.grantId,t.applicationId,e.connector_id,e.collection_id,e.scope_epoch,e.key_id].join("|")}function ri(t,e){return[oi(t.binding),t.requestId,e,t.operation,t.counter].join("|")}function Or(t){let e=t.binding.encryption;return{protocol_version:te,suite:He,request_id:t.requestId,grant_id:t.binding.grantId,application_id:t.binding.applicationId,connector_id:e.connector_id,collection_id:e.collection_id,operation:t.operation,scope_epoch:e.scope_epoch,key_id:e.key_id,counter:t.counter}}function kr(t,e){return e.type==="encrypted_operation_response"&&typeof e.ciphertext=="string"&&t.protocol_version===e.protocol_version&&t.suite===e.suite&&t.request_id===e.request_id&&t.grant_id===e.grant_id&&t.application_id===e.application_id&&t.connector_id===e.connector_id&&t.collection_id===e.collection_id&&t.operation===e.operation&&t.scope_epoch===e.scope_epoch&&t.key_id===e.key_id&&t.counter===e.counter}function J(t){if(t.protocol_version!==ft||t.suite!==He||!Number.isSafeInteger(t.scope_epoch)||t.scope_epoch<=0||typeof t.key_id!="string"||t.key_id.length===0||t.key_id.length>200||t.key_id.includes("|"))throw new S("unsupported_encryption","The grant uses an unsupported relay encryption profile.");if(typeof t.connector_id!="string"||!Xn.test(t.connector_id)||typeof t.collection_id!="string"||!Xn.test(t.collection_id))throw new S("unsupported_encryption","The grant uses invalid encrypted relay identities.");on(t.application_agreement_public_key),on(t.connector_agreement_public_key)}function ai(t){let e=BigInt(t);if(e<=0n||e>rn||e.toString()!==t)throw new S("invalid_counter","The encrypted relay counter is invalid.");let n=new Uint8Array(new ArrayBuffer(12));return new DataView(n.buffer).setBigUint64(4,e,!1),n}function Ge(t){let e="";for(let n of t)e+=String.fromCharCode(n);return btoa(e).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}async function Zn(t){let e=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(t));return Ge(new Uint8Array(e))}function si(t){if(!/^[A-Za-z0-9_-]+$/.test(t))throw new S("invalid_base64","Encrypted relay data is malformed.");let e="=".repeat((4-t.length%4)%4),n=atob(t.replaceAll("-","+").replaceAll("_","/")+e);return Uint8Array.from(n,i=>i.charCodeAt(0))}function on(t){let e=si(t);if(e.length!==65||e[0]!==4)throw new S("invalid_public_key","Encrypted relay public keys must be uncompressed P-256 points.");return e}function ci(t){return Uint8Array.from(t).buffer}function Tr(t){return new Promise((e,n)=>{t.onerror=()=>n(t.error),t.onsuccess=()=>e(t.result)})}function ei(t,e){return new Promise((n,i)=>{let o=t.transaction(oe,"readwrite"),r=e(o.objectStore(oe));r.onerror=()=>i(r.error),o.onerror=()=>i(o.error),o.onabort=()=>i(o.error??new Error("Grant key transaction aborted.")),o.oncomplete=()=>n()})}function fe(t){return{...t,credentials:"omit",targetAddressSpace:"loopback"}}async function Je(){if(typeof navigator>"u"||!navigator.permissions?.query)return null;try{return(await navigator.permissions.query({name:"local-network-access"})).state}catch{return null}}function Pe(t){return t===404||t===405||t===426||t>=500}function li(t,e){return ct(t,e)}function H(t){return[...new Set(t)]}function di(t,e){return t.grantId||e.grantId?t.grantId===e.grantId&&t.keyHandle===e.keyHandle&&t.encryption?.key_id===e.encryption?.key_id:t.accessToken===e.accessToken}function he(t){if(t?.aborted)throw l("operation_cancelled","The operation was cancelled before it changed the collection.",{operationOutcome:"not_sent",cause:t.reason})}function vt(t,e,n,i){return t instanceof v?t:e?.aborted?n?B(n,t):e.reason instanceof v?e.reason:l("operation_cancelled","The operation was cancelled before it changed the collection.",{operationOutcome:"not_sent",cause:t}):n?B(n,t):t instanceof TypeError?l(i,i==="hosted_provider_unavailable"?"The hosted collection provider is unavailable.":"The Connect relay is unavailable.",{cause:t}):t instanceof Error?t:new Error(String(t))}function cn(t,e){return e?.aborted===!0||t instanceof v&&t.code==="operation_cancelled"}function ui(t,e){if(e.dryRun!==!0||e.wouldRename!==!0||e.from!==t.from||e.to!==t.to)throw l("invalid_preflight","The rename preview does not match this mutation. Run the preview again.")}function pi(t,e){if(e.dryRun!==!0||e.wouldDelete!==!0||e.path!==t.path)throw l("invalid_preflight","The delete preview does not match this mutation. Run the preview again.")}function fi(t,e){if(t.updateRefs===!1)return{affectedRecords:0,totalUnits:1,warnings:0};let n=e.referencesAffected??[];return{affectedRecords:new Set(n.map(i=>i.path)).size,totalUnits:1+n.length,warnings:e.warnings?.length??0}}function hi(t){return{affectedRecords:new Set((t.brokenLinks??[]).map(e=>e.path)).size,totalUnits:1,warnings:0}}async function yi(t,e){return Un(t,e??{})}function mi(t){return JSON.stringify(sn(t))}function sn(t){return Array.isArray(t)?t.map(e=>sn(e)):t&&typeof t=="object"?Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0).sort(([e],[n])=>e<n?-1:e>n?1:0).map(([e,n])=>[e,sn(n)])):t}function B(t,e){return l("operation_outcome_unknown","The write may have completed, but mdbase could not recover its authoritative result. Retry the exact same write to recover safely.",{operationOutcome:"unknown",details:{request_id:t},cause:e})}function K(t){let e=new Uint8Array(t);return crypto.getRandomValues(e),ln(e)}function ln(t){let e="";for(let n of t)e+=String.fromCharCode(n);return btoa(e).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function gi(t){let e=t.replaceAll("-","+").replaceAll("_","/").padEnd(Math.ceil(t.length/4)*4,"="),n=atob(e),i=new Uint8Array(new ArrayBuffer(n.length));for(let o=0;o<n.length;o+=1)i[o]=n.charCodeAt(o);return i}async function Y(t,e,n,i){try{return await fetch(t,e)}catch(o){throw l(n,i,{cause:o})}}async function R(t,e,n){let i;try{i=await t.text()}catch(o){throw z(e,n,{status:t.status,cause:o})}if(i.trim()==="")throw z(e,n,{status:t.status});try{return JSON.parse(i)}catch(o){throw z(e,n,{status:t.status,cause:o})}}function _i(t){let e=new URL(t);if(e.protocol!=="http:"||!["127.0.0.1","[::1]"].includes(e.hostname)||e.username||e.password||e.pathname!=="/"||e.search||e.hash)throw l("invalid_loopback_url","loopbackUrl must be an HTTP origin on 127.0.0.1 or ::1.");return e.origin}async function Ye(){let t=K(32),e=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(t));return{verifier:t,challenge:ln(new Uint8Array(e))}}function P(t,e,n,i){return z(Qe(t)??t?.error?.code??e,t?.error_description??t?.error?.message??n,{status:i,details:t?.error?.details})}function Qe(t){return typeof t?.error=="string"?t.error:void 0}function Xe(t,e){if(!t||typeof t!="object"||Array.isArray(t)||typeof e!="string")return!1;let n=t;if(typeof n.operations_url!="string"||typeof n.sync_url!="string"||typeof n.files_url!="string"||typeof n.replica_id!="string"||n.replica_id.length===0||typeof n.access_token!="string"||n.access_token.length===0||n.proof_public_key!==void 0&&(typeof n.proof_public_key!="string"||n.proof_public_key.length===0))return!1;try{let i=new URL(n.operations_url),o=new URL(n.sync_url),r=new URL(n.files_url);return[i,o,r].every(a=>(a.protocol==="https:"||a.protocol==="http:"&&["localhost","127.0.0.1","[::1]","::1"].includes(a.hostname))&&!a.username&&!a.password&&!a.search&&!a.hash)&&/^\/v1\/authorities\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\/operations$/i.test(i.pathname)&&/^\/v1\/authorities\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\/sync$/i.test(o.pathname)&&/^\/v1\/authorities\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\/files$/i.test(r.pathname)&&i.origin===o.origin&&i.origin===r.origin&&i.pathname.split("/")[3]===e&&o.pathname.split("/")[3]===e&&r.pathname.split("/")[3]===e}catch{return!1}}function bi(t,e){return Xe({operations_url:t?.operationsUrl,sync_url:t?.syncUrl,files_url:t?.filesUrl,replica_id:t?.replicaId,access_token:t?.accessToken,proof_public_key:t?.proofPublicKey},e)}function Ct(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;let e=t,n=e.actions;if(e.kind!=="files"||e.protocol_version!==1||!Array.isArray(n)||n.length===0||n.length>6||new Set(n).size!==n.length||n.some(o=>!["list","read","add","replace","move","delete"].includes(o)))return!1;let i=e.scope;return!i||typeof i!="object"||Array.isArray(i)?!1:i.kind==="collection"?Object.keys(i).length===1:i.kind==="selected_folders"&&Object.keys(i).length===2&&Array.isArray(i.folders)&&i.folders.length>0&&i.folders.length<=100&&new Set(i.folders).size===i.folders.length&&i.folders.every(o=>typeof o=="string"&&o.length>0&&o.length<=1024&&Ir(o))}function Ir(t){let e=new Set([".mdbase",".git","node_modules","_contracts","_schemas","_types","_views"]);return!t.startsWith("/")&&!t.endsWith("/")&&!t.includes("\\")&&t.split("/").every(n=>{let i=n.split(".")[0]?.toUpperCase()??"";return n!==""&&n!=="."&&n!==".."&&!n.startsWith(".")&&!n.endsWith(" ")&&!n.endsWith(".")&&!/[<>:"|?*]/.test(n)&&!e.has(n.toLowerCase())&&!["CON","PRN","AUX","NUL"].includes(i)&&!/^(COM|LPT)[1-9]$/.test(i)})}function vi(t,e){if(!t||typeof t!="object"||Array.isArray(t)||t.collection_id!==e)return!1;try{return J(t),!0}catch{return!1}}function Ci(t){if(typeof t?.device_code!="string"||typeof t?.user_code!="string"||typeof t?.verification_uri!="string"||typeof t?.verification_uri_complete!="string"||!Number.isFinite(t?.expires_in)||!Number.isFinite(t?.interval))throw l("invalid_device_authorization_response","Connect returned an invalid downloaded application authorization response.");return{userCode:t.user_code,verificationUri:t.verification_uri,verificationUriComplete:t.verification_uri_complete,expiresAt:Date.now()+Math.max(1,t.expires_in)*1e3,intervalSeconds:Math.max(1,t.interval)}}function x(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function wt(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t;return e.access!=="contract"&&e.access!=="full_collection"||!Array.isArray(e.contracts)||e.contracts.some(n=>!n||typeof n!="object"||n.contract_type!=="record"||typeof n.id!="string"||typeof n.version!="string"||!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(n.version)||!/^sha256:[0-9a-f]{64}$/.test(n.digest)||!n.schema||typeof n.schema!="object"||Array.isArray(n.schema)||!Array.isArray(n.implementations)||n.implementations.some(i=>!i||typeof i!="object"||typeof i.type_name!="string"||!Number.isInteger(i.type_version)||!/^sha256:[0-9a-f]{64}$/.test(i.digest)||!i.fields||typeof i.fields!="object"||Array.isArray(i.fields)||Object.values(i.fields).some(o=>typeof o!="string")))?null:e}function wi(t){return t.endsWith("/")?t.slice(0,-1):t}function Si(){if(typeof location>"u")throw l("manifest_required","manifest is required outside a browser environment.");if(location.origin==="null")throw l("manifest_required","Downloaded applications must provide their v1 portable manifest inline.");return new URL("/.well-known/mdbase-app.json",location.origin).href}function Ri(){if(typeof location>"u")throw l("redirect_uri_required","redirectUri is required outside a browser environment.");return location.href.split(/[?#]/)[0]}function Ai(t,e,n,i){if(typeof t!="string"&&t.distribution==="portable"||i)return"null";let o=new URL(n);if(["http:","https:"].includes(o.protocol))return o.origin;if(typeof location<"u")return location.origin;if(typeof t!="string")return new URL(t.homepage).origin;try{return new URL(e).origin}catch{return""}}function Pi(t){let e=":token:",n=t.lastIndexOf(e);return n<0?"":t.slice(n+e.length)}function St(){if(typeof location>"u")throw l("callback_url_required","callbackUrl is required outside a browser environment.");return location.href}function Oi(t){if(t)return new Oe;if(typeof localStorage>"u")throw l("storage_required","storage is required outside a browser environment.");try{let e=`mdbase-connect:probe:${K(8)}`;return localStorage.setItem(e,"1"),localStorage.removeItem(e),localStorage}catch{return new Oe}}var Oe=class{values=new Map;get length(){return this.values.size}clear(){this.values.clear()}getItem(e){return this.values.get(e)??null}key(e){return[...this.values.keys()][e]??null}removeItem(e){this.values.delete(e)}setItem(e,n){this.values.set(String(e),String(n))}};function ki(t){return typeof t=="string"||t.distribution!=="portable"?!1:typeof location>"u"||location.origin==="null"||!["http:","https:"].includes(location.protocol)}function Ti(t){let e=mi(t),n=2166136261,i=2654435769;for(let o=0;o<e.length;o+=1){let r=e.charCodeAt(o);n=Math.imul(n^r,16777619),i=Math.imul(i^r,2246822507)}return`${(n>>>0).toString(16).padStart(8,"0")}${(i>>>0).toString(16).padStart(8,"0")}`}function Ze(t){for(let e of["code","state","error","error_description"])t.searchParams.delete(e);return t}function Rt(t){let e;try{e=new URL(t)}catch{return!1}return e.searchParams.has("state")&&(e.searchParams.has("code")||e.searchParams.has("error"))}function Ii(t){if(!t.details||typeof t.details!="object"||Array.isArray(t.details))return;let e=t.details.return_to;return typeof e=="string"?e:void 0}var ye=["describe","changes","read","query"];var ke=class{constructor(e,n){this.connect=e;this.operations=H(n.operations??ye),this.selection=n.selection,this.autoSelect=n.autoSelect??"only",this.snapshot={status:"unselected",connections:[]},this.refresh()}connect;operations;selection;autoSelect;listeners=new Set;snapshot;snapshotKey="";stopConnections;stopSelection;stopActiveConnection;activeCollectionId=null;unavailableReason="not_authorized";started=!1;refreshing=!1;refreshQueued=!1;transactionDepth=0;callbackPromise=null;async start(e){this.started||(this.started=!0,this.stopConnections=this.connect.onConnectionsChange(()=>this.refresh()),this.stopSelection=this.selection.subscribe(()=>{this.unavailableReason="not_authorized",this.refresh()}));let n=this.selection.authorizationCallback();if(n){let i=await this.handleAuthorizationCallback(n,e);if(!i.ok)return i}else this.autoSelectOnlyConnection();return this.refresh(),T(this.snapshot)}destroy(){this.stopConnections?.(),this.stopSelection?.(),this.stopActiveConnection?.(),this.stopConnections=void 0,this.stopSelection=void 0,this.stopActiveConnection=void 0,this.activeCollectionId=null,this.started=!1}getSnapshot(){return this.snapshot}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}select(e,n={}){let i=this.connect.connection(e);return i?(this.unavailableReason="not_authorized",this.selection.select(e,n),this.refresh(),T(i)):A(k("unknown_collection","This collection is not authorized for this application."))}clearSelection(e={}){this.unavailableReason="not_authorized",this.selection.select(null,e),this.refresh()}forget(e){this.transactionDepth+=1;try{let n=this.selection.selectedCollectionId()===e;this.connect.connection(e)?.forget(),n&&this.selection.select(null,{history:"replace"})}finally{this.transactionDepth-=1,this.refresh()}}async authorize(e,n={}){let i=this.selection.selectedCollectionId();if(e==="selected"&&!i)return A(k("collection_not_selected","Choose a collection before updating its access."));let o=typeof e=="object"?e.collectionId:e==="selected"?i:null;this.transactionDepth+=1;try{let r=await this.connect.authorize({...n,operations:this.operations,target:o===null?{kind:"choose"}:{kind:"collection",collectionId:o},returnTo:this.selection.authorizationReturnTo()});return r.ok&&r.value.kind==="connected"&&this.selection.finishAuthorization(r.value.returnTo,r.value.connection.collectionId),r}finally{this.transactionDepth-=1,this.refresh()}}async ensureOperations(e,n){let i=this.snapshot;if(i.status!=="ready")return A(k("collection_not_ready","Choose an authorized collection first."));let o=H(e),r=i.connection.authorizationCapabilities(o);if(r.sufficient)return T({kind:"unchanged",connection:i.connection});this.transactionDepth+=1;try{let a=await this.connect.authorize({...n,operations:H([...r.grantedOperations,...r.missingOperations]),target:{kind:"collection",collectionId:i.collectionId},returnTo:this.selection.authorizationReturnTo()});return a.ok&&a.value.kind==="connected"&&this.selection.finishAuthorization(a.value.returnTo,a.value.connection.collectionId),a}finally{this.transactionDepth-=1,this.refresh()}}handleAuthorizationCallback(e,n){if(!Rt(e))return Promise.resolve(A(k("invalid_callback","This URL is not an authorization callback.")));if(this.callbackPromise)return this.callbackPromise;this.transactionDepth+=1;let i=this.connect.completeAuthorization(e,n).then(o=>{if(!o.ok){let a=Ii(o.problem);return this.selection.clearAuthorizationCallback(a),this.refresh(),o}let r=o.value;return this.unavailableReason="not_authorized",this.selection.finishAuthorization(r.returnTo,r.connection.collectionId),this.refresh(),T(r.connection,o.diagnostics)}).catch(o=>{throw this.selection.clearAuthorizationCallback(),this.refresh(),o}).finally(()=>{this.transactionDepth-=1,this.refresh(),this.callbackPromise===i&&(this.callbackPromise=null)});return this.callbackPromise=i,i}autoSelectOnlyConnection(){if(this.autoSelect!=="only"||this.selection.selectedCollectionId())return;let e=this.connect.connections();e.length===1&&this.selection.select(e[0].collectionId,{history:"replace"})}refresh(){if(this.transactionDepth>0){this.refreshQueued=!0;return}if(this.refreshing){this.refreshQueued=!0;return}this.refreshing=!0;try{do this.refreshQueued=!1,this.refreshOnce();while(this.refreshQueued)}finally{this.refreshing=!1}}refreshOnce(){let e=this.selection.selectedCollectionId(),n=this.connect.connections(),i=e?this.connect.connection(e):null;i?.collectionId!==this.activeCollectionId&&(this.stopActiveConnection?.(),this.activeCollectionId=i?.collectionId??null,this.stopActiveConnection=i?.onConnectionChange(a=>{!a&&this.selection.selectedCollectionId()===i.collectionId&&(this.unavailableReason="authorization_lost"),this.refresh()}));let o;if(!e)o={status:"unselected",connections:n};else if(!i||!i.info())o={status:"unavailable",collectionId:e,reason:this.connect.unavailableReason(e)??this.unavailableReason,connections:n};else{let a=i.info();o={status:"ready",collectionId:e,connection:i,info:a,access:i.authorizationCapabilities(this.operations),connections:n}}let r=Mr(o);if(r!==this.snapshotKey){this.snapshot=o,this.snapshotKey=r;for(let a of this.listeners)a()}}};function Mr(t){return t.status==="unselected"?JSON.stringify({status:t.status,connections:t.connections}):t.status==="unavailable"?JSON.stringify({status:t.status,collectionId:t.collectionId,reason:t.reason,connections:t.connections}):JSON.stringify({status:t.status,collectionId:t.collectionId,info:t.info,access:t.access,connections:t.connections})}var et=class{values=new Map;read(e){return this.values.get(e)??null}write(e,n){this.values.set(e,n)}remove(e){this.values.delete(e)}},Te=class{constructor(e,n,i=we()){this.connect=e;this.options=n;this.timeouts=i;this.verificationStore=n.verificationStore??Nr()}connect;options;timeouts;listeners=new Set;verificationStore;snapshot={status:"opening",connections:[]};manifest=null;application=null;base=null;stopBase;setupAssessment=null;setupTypePackAdoptions=null;verificationGeneration=0;lifecycleGeneration=0;startOperation=null;start(e){if(this.base&&!this.startOperation)return Promise.resolve(T(this.snapshot));let n=this.startOperation??this.beginStart();return n.waiters+=1,F(e,this.timeouts.watchStartMs,()=>n.promise).finally(()=>{n.waiters-=1,n.waiters===0&&this.startOperation===n&&(n.controller.abort(),this.startOperation=null,this.lifecycleGeneration+=1)})}beginStart(){this.snapshot={status:"opening",connections:[]};let e=new AbortController,n=++this.lifecycleGeneration,i={promise:this.startWithinBudget({signal:e.signal,timeoutMs:null},n),controller:e,waiters:0,generation:n};this.startOperation=i;let o=()=>{this.startOperation===i&&(this.startOperation=null)};return i.promise.then(o,o),i}async startWithinBudget(e,n){let i=await this.connect.register(e);if(!i.ok)return i;let o=await this.connect.manifest(e);if(!o.ok)return o;let r=o.value.requirements?.capabilities;if(!r)return A(k("invalid_application_manifest","Application sessions require a versioned semantic capability contract.",{details:{issues:[{path:"/requirements/capabilities",keyword:"required",message:"is required for application sessions",params:{}}]}}));if(n!==this.lifecycleGeneration||e.signal?.aborted)throw W(e.signal??new AbortController().signal);this.application=i.value,this.manifest=o.value;let a=new ke(this.connect,{selection:this.options.selection,autoSelect:this.options.autoSelect,operations:xr(r)});this.base=a;try{let s=await a.start(e);if(!s.ok)return this.cleanupBase(a),s;if(n!==this.lifecycleGeneration||e.signal?.aborted)throw W(e.signal??new AbortController().signal);if(this.stopBase=a.subscribe(()=>{this.base===a&&this.refresh()}),await this.refresh(!0,e),n!==this.lifecycleGeneration||e.signal?.aborted)throw W(e.signal??new AbortController().signal);return T(this.snapshot)}catch(s){throw this.cleanupBase(a),s}}destroy(){this.lifecycleGeneration+=1,this.verificationGeneration+=1,this.startOperation?.controller.abort(),this.startOperation=null,this.base&&this.cleanupBase(this.base),this.application=null,this.manifest=null,this.setupAssessment=null,this.setupTypePackAdoptions=null,this.snapshot={status:"opening",connections:[]},this.listeners.clear()}cleanupBase(e){this.base===e&&(this.stopBase?.(),this.stopBase=void 0,e.destroy(),this.base=null)}getSnapshot(){return this.snapshot}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}connection(){let e=this.base?.getSnapshot();return e?.status==="ready"?e.connection:null}select(e,n={}){return this.requireBase().select(e,n)}clearSelection(e={}){this.requireBase().clearSelection(e)}forget(e){this.requireBase().forget(e)}authorize(e,n={}){return this.requireBase().authorize(e,n)}handleAuthorizationCallback(e,n){return this.requireBase().handleAuthorizationCallback(String(e),n)}completeAuthorization(e,n){return this.requireBase().handleAuthorizationCallback(e===void 0?St():String(e),n)}ensureCapabilities(e,n){let i=this.requireManifest().requirements?.capabilities,o=new Set([...i?.required??[],...i?.optional??[]]);return e.some(r=>!o.has(r))?Promise.resolve(A(k("invalid_application_manifest","Applications may only request capabilities declared in their manifest.",{details:{issues:[{path:"/requirements/capabilities",keyword:"undeclaredCapability",message:"must declare every capability requested by the application",params:{requested:e,declared:[...o]}}]}}))):this.requireBase().ensureOperations(Er(e),n)}async applyCollectionSetup(e){if(this.snapshot.status!=="setup_review_required"||!this.setupAssessment)return A(k("collection_not_ready","There is no reviewed collection setup to apply."));if(!this.setupAssessment.applicable)return A(k("collection_not_ready","Resolve the collection setup conflicts before applying this update."));let n=this.connection();if(!n)return A(k("collection_not_ready","The collection is not ready."));let i=this.setupAssessment,o={...this.collectionSetupInput(this.setupTypePackAdoptions??void 0),expectedAssessmentDigest:i.assessmentDigest,expectedCollectionRevision:i.collectionRevision,expectedProvisionDigest:i.provisionDigest,allowTypePackDowngrades:i.typePacks.filter(s=>s.status==="downgrade").map(s=>s.desired.id)},r=ie(e,this.timeouts.requestMs),a={signal:r.signal,timeoutMs:null};try{let s=await n.applyCollectionSetup(o,a);return s.ok?(this.setupAssessment=null,this.setupTypePackAdoptions=null,await this.verifySetup(this.context(n),++this.verificationGeneration,a),T(this.snapshot)):s}finally{r.dispose()}}async refresh(e=!1,n){if(!this.base||!this.manifest)return;let i=this.base.getSnapshot();this.verificationGeneration+=1;let o=this.verificationGeneration;if(this.setupAssessment=null,this.setupTypePackAdoptions=null,i.status==="unselected"){this.publish({status:"unselected",connections:i.connections});return}if(i.status==="unavailable"){this.publish(i);return}let r=this.context(i.connection);if(!r.capabilities.requiredAvailable||!zr(this.manifest,r.info)){this.publish({status:"authorization_required",...r});return}if(!(this.manifest.requirements?.capabilities?.required.includes("collection.setup.apply")??!1)){this.publish({status:"ready",verification:"verified",...r});return}let s=dn(this.manifest,i.collectionId);this.verificationStore.read(s)===Mi(this.manifest)?this.publish({status:"ready",verification:"cached",...r}):this.publish({status:"checking_setup",...r});let c=this.verifySetup(r,o,n);e&&await c}async verifySetup(e,n,i){let o=this.connection(),r=this.requireManifest();if(!o||o.collectionId!==e.collectionId)return;let a=this.collectionSetupInput(),s=i?await o.assessCollectionSetup(a,i):await o.assessCollectionSetup(a);if(n===this.verificationGeneration){if(!s.ok){this.publish({status:"blocked",problem:s.problem,...e});return}if(!s.value.applicable){let c=Fr(s.value);if(Object.keys(c).length>0){if(s=i?await o.assessCollectionSetup(this.collectionSetupInput(c),i):await o.assessCollectionSetup(this.collectionSetupInput(c)),n!==this.verificationGeneration)return;if(!s.ok){this.publish({status:"blocked",problem:s.problem,...e});return}this.setupTypePackAdoptions=c}}if(n===this.verificationGeneration){if(s.value.status!=="current"){this.setupAssessment=s.value,this.verificationStore.remove(dn(r,e.collectionId)),this.publish({status:"setup_review_required",update:qr(s.value,r.provisions?.type_packs??[]),...e});return}this.verificationStore.write(dn(r,e.collectionId),Mi(r)),this.publish({status:"ready",verification:"verified",...e})}}}collectionSetupInput(e){let n=this.requireManifest(),i=this.requireApplication();return{applicationId:Ur(i.family_identity),declarationDigest:`sha256:${i.manifest_digest}`,requirements:{configuration:n.requirements?.configuration??[]},provisions:{configuration:n.provisions?.configuration??[],typePacks:n.provisions?.type_packs??[]},...e?{typePackAdoptions:e}:{}}}context(e){let n=e.info();return{collectionId:e.collectionId,info:n,capabilities:ht(this.requireManifest().requirements.capabilities,this.requireManifest(),n),connections:this.connect.connections()}}publish(e){if(JSON.stringify(this.snapshot)!==JSON.stringify(e)){this.snapshot=e;for(let n of this.listeners)n()}}requireBase(){if(!this.base)throw new Error("Start the application session before using it.");return this.base}requireManifest(){if(!this.manifest)throw new Error("Start the application session before using it.");return this.manifest}requireApplication(){if(!this.application)throw new Error("Start the application session before using it.");return this.application}};function xr(t){return lt(t)}function Er(t){let e=t.flatMap(n=>dt(n));return[...new Set(e)]}function Dr(t,e){let n=e.status==="conflict"?"Existing user-owned resources conflict with this application definition pack.":e.status==="install"?"This collection needs the application definitions installed.":`This collection has a ${e.status} definition change to review.`;return{id:e.desired.id,name:t.manifest.name??e.desired.id,status:e.status,applicable:e.applicable,assessmentDigest:e.assessmentDigest,...e.current?{currentVersion:e.current.version}:{},desiredVersion:e.desired.version,resources:e.resources,contractSetups:e.contractSetups,canApply:e.applicable,reason:n}}function qr(t,e){let n=t.typePacks.map(r=>{let a=e.find(s=>s.manifest.id===r.desired.id);if(!a)throw new Error(`Collection setup returned undeclared type pack '${r.desired.id}'.`);return Dr(a,r)}),i=t.configuration.filter(r=>r.action!=="current").length,o=t.status==="conflict"?"Existing collection policy conflicts with this application's required setup.":`This application requires ${i} configuration change${i===1?"":"s"} and ${n.length} definition update${n.length===1?"":"s"}.`;return{status:t.status,applicable:t.applicable,assessmentDigest:t.assessmentDigest,collectionRevision:t.collectionRevision,provisionDigest:t.provisionDigest,configuration:t.configuration,typePacks:n,canApply:t.applicable,reason:o}}function Fr(t){let e={};for(let n of t.typePacks){let i=Object.fromEntries(n.resources.filter(o=>o.action==="conflict"&&o.mode==="managed"&&o.currentDigest!==void 0&&o.installedDigest===void 0).map(o=>[o.target,o.currentDigest]));Object.keys(i).length>0&&(e[n.desired.id]=i)}return e}function dn(t,e){return`mdbase-application-session:v1:${t.id}:${e}`}function Mi(t){return JSON.stringify({capabilities:t.requirements?.capabilities,requirements:t.requirements?.configuration??[],provisions:t.provisions??{}})}function zr(t,e){return t.requirements?.access!=="full_collection"||e.scope.access==="full_collection"}function Ur(t){let e="bundle:";if(!t.startsWith(e)||t.length===e.length)throw new Error("The registered application has no valid declaration identity.");return t.slice(e.length)}function Nr(){return typeof localStorage<"u"?{read:t=>localStorage.getItem(t),write:(t,e)=>localStorage.setItem(t,e),remove:t=>localStorage.removeItem(t)}:new et}function tt(t,e){return new Promise((n,i)=>{if(e?.aborted){i(e?.reason??new DOMException("Aborted","AbortError"));return}let o=()=>e?.removeEventListener("abort",a),r=setTimeout(()=>{o(),n()},t),a=()=>{clearTimeout(r),o(),i(e?.reason??new DOMException("Aborted","AbortError"))};e?.addEventListener("abort",a,{once:!0})})}var Lr="mdbase-connect-identities",Ie="application-identities",un=BigInt("0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551"),Br=un/2n,Me=class{database=null;async create(e){let n=await Ei(e),i=await this.open();return await xi(i,o=>o.add(n)),n}async get(e){let n=await this.open();return await jr(n.transaction(Ie).objectStore(Ie).get(e))??null}async delete(e){let n=await this.open();await xi(n,i=>i.delete(e))}open(){if(typeof indexedDB>"u")throw new me("Persistent application identity requires browser IndexedDB or an injected identity store.");return this.database||(this.database=new Promise((e,n)=>{let i=indexedDB.open(Lr,1);i.onupgradeneeded=()=>{i.result.objectStoreNames.contains(Ie)||i.result.createObjectStore(Ie,{keyPath:"handle"})},i.onerror=()=>n(i.error),i.onsuccess=()=>e(i.result)})),this.database}},xe=class{records=new Map;async create(e){if(this.records.has(e))throw new Error(`Application identity already exists: ${e}`);let n=await Ei(e);return this.records.set(e,n),n}async get(e){return this.records.get(e)??null}async delete(e){this.records.delete(e)}},me=class extends Error{constructor(e){super(e),this.name="ApplicationIdentityStoreError"}};async function Ee(t){return Bn(t.signingPublicKey)}async function nt(t,e){if(t.installation_signing_public_key!==e.signingPublicKey||t.application_installation_id!==await Ee(e))throw new Error("Application authorization identity does not match its binding.");let n=Hr(new Uint8Array(await crypto.subtle.sign({name:"ECDSA",hash:"SHA-256"},e.signingPrivateKey,jn(t))));return{binding:t,signature:Di(n)}}async function At(t,e,n){let i=`application-installation:v2:${e}:${n.id}`,o=await t.get(i);if(o)return o;try{return await t.create(i)}catch(r){let a=await t.get(i);if(a)return a;throw r}}async function Ei(t){let e=await crypto.subtle.generateKey({name:"ECDSA",namedCurve:"P-256"},!0,["sign","verify"]),n=Di(new Uint8Array(await crypto.subtle.exportKey("raw",e.publicKey))),i=await crypto.subtle.exportKey("pkcs8",e.privateKey),o=await crypto.subtle.importKey("pkcs8",i,{name:"ECDSA",namedCurve:"P-256"},!1,["sign"]);return{handle:t,signingPrivateKey:o,signingPublicKey:n}}function jr(t){return new Promise((e,n)=>{t.onerror=()=>n(t.error),t.onsuccess=()=>e(t.result)})}function xi(t,e){return new Promise((n,i)=>{let o=t.transaction(Ie,"readwrite");e(o.objectStore(Ie)).onerror=()=>i(o.error),o.onerror=()=>i(o.error),o.onabort=()=>i(o.error??new Error("Identity transaction aborted.")),o.oncomplete=()=>n()})}function Kr(t){let e=new Uint8Array(t.reduce((i,o)=>i+o.byteLength,0)),n=0;for(let i of t)e.set(i,n),n+=i.byteLength;return e}function Di(t){return btoa(String.fromCharCode(...t)).replaceAll("+","-").replaceAll("/","_").replace(/=+$/u,"")}function Hr(t){if(t.byteLength!==64)throw new Error("Application authorization signature is invalid.");let e=$r(t.slice(32));if(e===0n||e>=un)throw new Error("Application authorization signature is invalid.");return e<=Br?t:Kr([t.slice(0,32),Vr(un-e,32)])}function $r(t){return BigInt(`0x${Gr(t)}`)}function Vr(t,e){let n=t.toString(16).padStart(e*2,"0");return Uint8Array.from({length:e},(i,o)=>Number.parseInt(n.slice(o*2,o*2+2),16))}function Gr(t){return[...t].map(e=>e.toString(16).padStart(2,"0")).join("")}function qi(t){if(t!==!1)return{initialDelayMs:Math.max(0,t?.initialDelayMs??500),maxDelayMs:Math.max(0,t?.maxDelayMs??15e3),multiplier:Math.max(1,t?.multiplier??2),...t?.maxAttempts===void 0?{}:{maxAttempts:Math.max(0,t.maxAttempts)}}}var De=class{constructor(e,n=_t){this.transport=e;this.requestTimeoutMs=n}transport;requestTimeoutMs;operation(e,n,i){return I(()=>this.transport.operation(e,n,i),Yn)}async describe(e){let n=await this.rawOperation("describe",{},yt,e);return E(n,la)}async changes(e={},n){let i=await this.rawOperation("changes",e,mt,n);return E(i,ca)}async read(e,n){let i=await this.envelopeOperation("read",Wr(e),G,n);return E(i,Pt)}async query(e={},n){let i=await this.envelopeOperation("query",Jr(e),Qn,n);return E(i,({results:o,meta:r})=>({results:o.map(Gi),...r?{meta:{totalCount:r.total_count,hasMore:r.has_more,...r.snapshot?{snapshot:r.snapshot}:{}}}:{}}))}async*queryPages(e={},n={}){let{offset:i,limit:o,snapshot:r,...a}=e,s=da(i,0),c=Bi(n.firstPageSize??o,200),d=Bi(n.pageSize??o,1e3),p=r,u=0,f=0;for(;!n.signal?.aborted;){let h=await this.query({...a,offset:s,limit:f===0?c:d,...p?{snapshot:p}:{}},{signal:n.signal,timeoutMs:n.pageTimeoutMs});if(!h.ok){yield h;return}let _=h.value,y=_.meta?.snapshot;if(p&&y&&p!==y){yield A(k("query_snapshot_changed","The collection query snapshot changed while paging. Refresh the query before continuing."));return}!p&&y&&(p=y),u+=_.results.length;let w=!_.meta?.hasMore||_.results.length===0,m={results:_.results,..._.meta?{meta:_.meta}:{},page:f,offset:s,loaded:u,complete:w,...p?{snapshot:p}:{}};if(n.onProgress?.(m),yield T(m,h.diagnostics),w)return;s+=_.results.length,f+=1}}async queryAll(e={},n={}){let i=ie(n,this.requestTimeoutMs),o=[],r,a=[];try{for await(let s of this.queryPages(e,{firstPageSize:n.firstPageSize,pageSize:n.pageSize,signal:i.signal,pageTimeoutMs:null,onProgress:n.onProgress})){if(!s.ok)return s;let c=s.value;o.push(...c.results),r=c,a.push(...s.diagnostics)}if(i.signal.aborted)throw W(i.signal);return T({results:o,meta:{...r?.meta??{},totalCount:r?.meta?.totalCount??o.length,hasMore:r?!r.complete:!1,...r?.snapshot?{snapshot:r.snapshot}:{}}},a)}catch(s){if(s instanceof v)return A(s.problem);throw s}finally{i.dispose()}}async listViews(e){let n=await this.envelopeOperation("list_views",{},G,e);return E(n,i=>({views:i.views,meta:{totalCount:i.meta.total_count}}))}async executeView(e,n){let i=await this.envelopeOperation("execute_view",e,G,n);return E(i,ia)}readViewSource(e,n){return this.envelopeOperation("read_view_source",e,G,n)}createViewSource(e,n){return this.envelopeOperation("create_view_source",e,q,n)}updateViewSource(e,n){return this.envelopeOperation("update_view_source",pn(e),q,n)}deleteViewSource(e,n){return this.envelopeOperation("delete_view_source",pn(e),q,n)}async create(e,n){let i=await this.envelopeOperation("create",Yr(e),q,n);return E(i,Pt)}async update(e,n){let i=await this.envelopeOperation("update",Qr(e),q,n);return E(i,Pt)}async delete(e,n){let i=await this.envelopeOperation("delete",Fi(e),q,n);return E(i,Hi)}async preflightDelete(e,n){let i=await this.envelopeOperation("delete",{...Fi(e),check_backlinks:!0,dry_run:!0},q,n);return E(i,ea)}async rename(e,n){let i=await this.envelopeOperation("rename",zi(e),q,n);return E(i,ta)}async preflightRename(e,n){let i=await this.envelopeOperation("rename",{...zi(e),dry_run:!0},q,n);return E(i,na)}validate(e={},n){return this.envelopeOperation("validate",e,G,n)}readType(e,n){return this.envelopeOperation("read_type",e,ne,n)}createType(e,n){return this.envelopeOperation("create_type",e,ne,n)}updateType(e,n){return this.envelopeOperation("update_type",pn(e),ne,n)}async assessTypePack(e,n){let i=await this.envelopeOperation("assess_type_pack",ji(e),ne,n);return E(i,hn)}async applyTypePack(e,n){let i=await this.envelopeOperation("apply_type_pack",Xr(e),ne,n);return E(i,ra)}async assessCollectionSetup(e,n){let i=await this.envelopeOperation("assess_collection_setup",Ki(e),ne,n);return E(i,Li)}async applyCollectionSetup(e,n){let i=await this.envelopeOperation("apply_collection_setup",Zr(e),ne,n);return E(i,o=>({assessment:Li(o.assessment),receipt:aa(o.receipt)}))}async listTimers(e,n){let i=await this.rawOperation("list_timers",{namespace:e},G,n);return E(i,o=>({namespace:o.namespace,timers:o.timers.map(fn)}))}async putTimer(e,n){let i=await this.rawOperation("put_timer",{namespace:e.namespace,criterion_id:e.criterionId,timer:Ui(e.timer)},q,n);return E(i,fn)}cancelTimer(e,n){return this.rawOperation("cancel_timer",e,q,n)}async reconcileTimers(e,n){let i=await this.rawOperation("reconcile_timers",{namespace:e.namespace,criterion_id:e.criterionId,timers:e.timers.map(Ui)},q,n);return E(i,o=>({namespace:o.namespace,timers:o.timers.map(fn),cancelledIds:o.cancelled_ids}))}async*watch(e={}){let n=e.cursor,i=Math.max(100,e.pollIntervalMs??1e3),o=qi(e.retry),r=0,a=!1;for(e.onStatus?.({state:"connecting",...n===void 0?{}:{cursor:n}});!e.signal?.aborted;){let s=await this.changes(n===void 0?{}:{after:n,limit:200},{signal:e.signal,timeoutMs:e.timeoutMs});if(!s.ok){let p=s.problem;if(e.signal?.aborted)return;if(!o||p.recovery!=="retry"){yield s;return}if(a=!1,r+=1,o.maxAttempts!==void 0&&r>o.maxAttempts){yield s;return}let u=Math.min(o.maxDelayMs,Math.round(o.initialDelayMs*o.multiplier**(r-1)));e.onStatus?.({state:"reconnecting",...n===void 0?{}:{cursor:n},attempt:r,retryInMs:u,problem:p});try{await tt(u,e.signal)}catch{if(!e.signal?.aborted)throw l("operation_failed","Watch retry delay failed unexpectedly.")}continue}let c=s.value;if(n===void 0){n=c.cursor;continue}if(c.reset){let p=k("change_cursor_reset","The collection change cursor expired. Refresh collection state before subscribing again.");e.onStatus?.({state:"reset_required",cursor:n,problem:p}),yield A(p);return}let d=r>0;r=0,(!a||d)&&e.onStatus?.({state:"connected",cursor:n,recovered:d}),a=!0;for(let p of c.events)yield T(p);if(n=c.cursor,!c.hasMore)try{await tt(i,e.signal)}catch{if(!e.signal?.aborted)throw l("operation_failed","Watch polling delay failed unexpectedly.")}}}rawOperation(e,n,i,o){return I(()=>this.transport.operation(e,n,o),i)}async envelopeOperation(e,n,i,o){let r=await I(()=>this.transport.operation(e,n,o),i);if(!r.ok)return r;let a=r.value;return a.valid?T(a.result,a.diagnostics):A(ve(a))}};function E(t,e){return t.ok?T(e(t.value),t.diagnostics):t}function Wr(t){return{path:t.path,...t.contract?{contract:t.contract}:{},...t.includeDocument===void 0?{}:{include_document:t.includeDocument}}}function Jr(t){return{...t.types?{types:t.types}:{},...t.timezone?{timezone:t.timezone}:{},...t.context?{context:t.context}:{},...t.projections?{projections:Object.fromEntries(Object.entries(t.projections).map(([e,n])=>[e,{expr:n.expression,...n.description?{description:n.description}:{}}]))}:{},...t.where?{where:t.where}:{},...t.select?{select:t.select.map(e=>typeof e=="string"?e:{name:e.name,expr:e.expression,...e.label?{label:e.label}:{},...e.description?{description:e.description}:{}})}:{},...t.orderBy?{order_by:t.orderBy}:{},...t.groupBy?{group_by:t.groupBy}:{},...t.summaryFunctions?{summary_functions:Object.fromEntries(Object.entries(t.summaryFunctions).map(([e,n])=>[e,{expr:n.expression,...n.description?{description:n.description}:{}}]))}:{},...t.summaries?{summaries:t.summaries}:{},...t.limit===void 0?{}:{limit:t.limit},...t.offset===void 0?{}:{offset:t.offset},...t.snapshot?{snapshot:t.snapshot}:{},...t.includeBody===void 0?{}:{include_body:t.includeBody},...t.frontmatterMode?{frontmatter_mode:t.frontmatterMode}:{},...t.contract?{contract:t.contract}:{}}}function Yr(t){return{...t.path?{path:t.path}:{},...t.type?{type:t.type}:{},...t.contract?{contract:t.contract}:{},...t.frontmatter?{frontmatter:t.frontmatter}:{},...t.body===void 0?{}:{body:t.body},...t.ifRevision?{if_revision:t.ifRevision}:{},...t.includeDocument===void 0?{}:{include_document:t.includeDocument}}}function Qr(t){return{path:t.path,...t.contract?{contract:t.contract}:{},...t.ifRevision?{if_revision:t.ifRevision}:{},...t.includeDocument===void 0?{}:{include_document:t.includeDocument},...t.document===void 0?{patch:t.patch,...t.body===void 0?{}:{body:t.body}}:{document:t.document}}}function Fi(t){return{path:t.path,...t.contract?{contract:t.contract}:{},...t.checkBacklinks===void 0?{}:{check_backlinks:t.checkBacklinks},...t.ifRevision?{if_revision:t.ifRevision}:{}}}function zi(t){return{from:t.from,to:t.to,...t.contract?{contract:t.contract}:{},...t.updateRefs===void 0?{}:{update_refs:t.updateRefs},...t.ifRevision?{if_revision:t.ifRevision}:{},...t.includeDocument===void 0?{}:{include_document:t.includeDocument}}}function pn(t){let{ifRevision:e,...n}=t;return{...n,...e?{if_revision:e}:{}}}function ji(t){return{provision:t.provision,installed_by:t.installedBy,...t.adoptResources?{adopt_resources:t.adoptResources}:{},...t.preserveSeedTargets?{preserve_seed_targets:t.preserveSeedTargets}:{},...t.targetOverrides?{target_overrides:t.targetOverrides}:{},...t.contractSetups?{contract_setups:t.contractSetups.map($i)}:{}}}function Xr(t){return{...ji(t),expected_assessment_digest:t.expectedAssessmentDigest,...t.allowDowngrade===void 0?{}:{allow_downgrade:t.allowDowngrade}}}function Ki(t){return{application_id:t.applicationId,declaration_digest:t.declarationDigest,requirements:t.requirements,provisions:{configuration:t.provisions.configuration,type_packs:t.provisions.typePacks},...t.contractSetups?{contract_setups:t.contractSetups.map($i)}:{},...t.typePackAdoptions?{type_pack_adoptions:t.typePackAdoptions}:{}}}function Zr(t){return{...Ki(t),expected_assessment_digest:t.expectedAssessmentDigest,expected_collection_revision:t.expectedCollectionRevision,expected_provision_digest:t.expectedProvisionDigest,...t.allowTypePackDowngrades?{allow_type_pack_downgrades:t.allowTypePackDowngrades}:{}}}function Hi(t){return{path:t.path,deleted:t.deleted,...t.broken_links?{brokenLinks:t.broken_links}:{}}}function ea(t){return{...Hi(t),deleted:!1,dryRun:!0,wouldDelete:!0}}function ta(t){let{references_updated:e,...n}=t;return{...Pt(n),from:t.from,to:t.to,...e?{referencesUpdated:e}:{}}}function na(t){return{from:t.from,to:t.to,dryRun:!0,wouldRename:!0,...t.references_affected?{referencesAffected:t.references_affected}:{},...t.warnings?{warnings:t.warnings}:{}}}function Ui(t){return{id:t.id,fire_at:t.fireAt,...t.data===void 0?{}:{data:t.data}}}function fn(t){return{id:t.id,fireAt:t.fire_at,...t.data===void 0?{}:{data:t.data},criterionId:t.criterion_id,generation:t.generation,status:t.status,createdAt:t.created_at,updatedAt:t.updated_at,firedAt:t.fired_at}}function $i(t){return t.mode==="starter"?t:{contract:t.contract,mode:"existing",type_name:t.typeName,type_revision:t.typeRevision,fields:t.fields,...t.binding?{binding:t.binding}:{}}}function Vi(t){return{id:t.id,version:t.version,digest:t.digest,type:t.type,implementationDigest:t.implementation_digest}}function Gi(t){let{effective_frontmatter:e,contract:n,...i}=t;return{...i,...e===void 0?{}:{effectiveFrontmatter:e},...n?{contract:Vi(n)}:{}}}function Pt(t){let{effective_frontmatter:e,contract:n,...i}=t;return{...i,effectiveFrontmatter:e,...n?{contract:Vi(n)}:{}}}function ia(t){return{results:t.results.map(e=>{let n=Gi(e);if(!n.effectiveFrontmatter)throw new Error("Saved view result omitted canonical effective frontmatter.");return{...n,effectiveFrontmatter:n.effectiveFrontmatter}}),meta:{totalCount:t.meta.total_count,hasMore:t.meta.has_more,view:t.meta.view,...t.meta.context?{context:t.meta.context}:{},...t.meta.groups?{groups:t.meta.groups}:{}}}}function Ni(t){return{source:t.source,target:t.target,kind:t.kind,mode:t.mode,action:t.action,digest:t.digest,...t.current_digest?{currentDigest:t.current_digest}:{},...t.installed_digest?{installedDigest:t.installed_digest}:{},...t.adopted_from_digest?{adoptedFromDigest:t.adopted_from_digest}:{},...t.reason?{reason:t.reason}:{}}}function Ot(t){return{id:t.id,version:t.version,digest:t.digest,installedBy:t.installed_by,resources:t.resources.map(e=>({source:e.source,target:e.target,kind:e.kind,mode:e.mode,digest:e.digest,...e.adopted_from_digest?{adoptedFromDigest:e.adopted_from_digest}:{}}))}}function oa(t){return t.mode==="starter"?t:{contract:t.contract,mode:"existing",typeName:t.type_name,typeRevision:t.type_revision,fields:t.fields,...t.binding?{binding:t.binding}:{}}}function hn(t){return{status:t.status,applicable:t.applicable,assessmentDigest:t.assessment_digest,...t.current?{current:Ot(t.current)}:{},desired:Ot(t.desired),resources:t.resources.map(Ni),lock:t.lock,contractSetups:{choices:t.contract_setups.choices.map(oa),resources:t.contract_setups.resources.map(Ni)}}}function ra(t){return{...hn(t),receipt:Ot(t.receipt),cleanupDeferred:t.cleanup_deferred}}function Li(t){return{status:t.status,applicable:t.applicable,applicationId:t.application_id,declarationDigest:t.declaration_digest,provisionDigest:t.provision_digest,collectionRevision:t.collection_revision,finalCollectionRevision:t.final_collection_revision,baselineDiagnosticCount:t.baseline_diagnostic_count,finalDiagnosticCount:t.final_diagnostic_count,resolvedDiagnosticCount:t.resolved_diagnostic_count,introducedDiagnosticCount:t.introduced_diagnostic_count,baselineDiagnosticDigest:t.baseline_diagnostic_digest,configuration:t.configuration,typePacks:t.type_packs.map(hn),finalResourceRevisions:t.final_resource_revisions,assessmentDigest:t.assessment_digest}}function aa(t){return{applicationId:t.application_id,declarationDigest:t.declaration_digest,provisionDigest:t.provision_digest,assessmentDigest:t.assessment_digest,collectionRevision:t.collection_revision,configuration:t.configuration,typePacks:t.type_packs.map(Ot),cleanupDeferred:t.cleanup_deferred}}function sa(t){return{cursor:t.cursor,type:t.type,occurredAt:t.occurred_at,payload:t.payload}}function ca(t){return{events:t.events.map(sa),cursor:t.cursor,hasMore:t.has_more,reset:t.reset}}function la(t){return{protocolVersion:t.protocol_version,collectionId:t.collection_id,displayName:t.display_name,specVersion:t.spec_version,operations:t.operations,changeCursor:t.change_cursor,types:t.types,contracts:t.contracts.map(e=>({contractType:e.contract_type,id:e.id,version:e.version,digest:e.digest,schema:e.schema,...e.binding_schema?{bindingSchema:e.binding_schema}:{},implementations:e.implementations.map(n=>({typeName:n.type_name,typeVersion:n.type_version,...n.type_path?{typePath:n.type_path}:{},digest:n.digest,fields:n.fields,...n.binding?{binding:n.binding}:{}}))})),...t.configuration?{configuration:t.configuration}:{}}}function da(t,e){return typeof t=="number"&&Number.isFinite(t)?Math.max(0,Math.floor(t)):e}function Bi(t,e){return typeof t=="number"&&Number.isFinite(t)&&t>0?Math.floor(t):e}var kt=class{constructor(e){this.context=e}context;async registerNotifications(e){return F(e,this.context.requestTimeoutMs,n=>this.registerNotificationsWithinBudget(e,n.signal))}async registerNotificationsWithinBudget(e,n){let i=await this.context.authorizedToken(n);if(!i)throw l("not_authorized","Connect this application before enabling notifications.");let r=(await this.context.register(n)).notifications?.criteria.map(m=>m.id)??[],a=[...new Set(e.criteria??r)],s=a.find(m=>!r.includes(m));if(s)throw l("notification_criterion_not_declared",`The application manifest does not declare notification criterion ${s}.`);if(a.length===0)throw l("notifications_not_declared","This application manifest does not declare any notification criteria.");let c=await Y(`${this.context.serverUrl}/v1/notifications/vapid-public-key`,{signal:n},"notifications_unavailable","Push notifications are unavailable."),d=await R(c,"invalid_operation_response","Connect returned an invalid notification key response.");if(!c.ok)throw P(d,"notifications_unavailable","Push notifications are unavailable.",c.status);let p=await e.serviceWorker.pushManager.getSubscription();p||(p=await e.serviceWorker.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:gi(d.public_key)}));let u=p.toJSON();if(!u.endpoint||!u.keys?.p256dh||!u.keys.auth)throw l("invalid_push_subscription","The browser returned an incomplete push subscription.");let f=x(this.context.storage.getItem(this.context.notificationKey())),h=e.installationId??f?.installationId??K(24),_=await Y(`${this.context.serverUrl}/v1/notifications/channels`,{method:"POST",headers:{authorization:`Bearer ${i.accessToken}`,"content-type":"application/json"},body:JSON.stringify({installation_id:h,criteria:a,subscription:{endpoint:u.endpoint,expirationTime:u.expirationTime??null,keys:u.keys}}),signal:n},"notification_registration_failed","Could not register push notifications."),y=await R(_,"invalid_operation_response","Connect returned an invalid notification registration response.");if(!_.ok)throw P(y,"notification_registration_failed","Could not register push notifications.",_.status);f?.channelId&&f.channelId!==y.channel_id&&fetch(`${this.context.serverUrl}/v1/notifications/channels/${f.channelId}`,{method:"DELETE",headers:{authorization:`Bearer ${i.accessToken}`},signal:n}).catch(()=>{});let w={channelId:y.channel_id,installationId:h,criteria:a};return this.context.storage.setItem(this.context.notificationKey(),JSON.stringify(w)),w}async registerNativeNotifications(e){return F(e,this.context.requestTimeoutMs,n=>this.registerNativeNotificationsWithinBudget(e,n.signal))}async registerNativeNotificationsWithinBudget(e,n){let i=await this.context.authorizedToken(n);if(!i)throw l("not_authorized","Connect this application before enabling notifications.");let o=await this.context.register(n);if(o.notifications?.native_delivery?.mode!=="managed_fcm")throw l("managed_fcm_not_declared","This application does not declare Connect-managed native notifications.");let r=o.notifications.criteria.map(_=>_.id),a=[...new Set(e.criteria??r)],s=a.find(_=>!r.includes(_));if(s)throw l("notification_criterion_not_declared",`The application manifest does not declare notification criterion ${s}.`);if(a.length===0)throw l("notifications_not_declared","This application manifest does not declare any notification criteria.");let c=this.context.notificationKey("fcm"),d=x(this.context.storage.getItem(c)),p=e.installationId??d?.installationId??K(24),u=await Y(`${this.context.serverUrl}/v1/notifications/channels`,{method:"POST",headers:{authorization:`Bearer ${i.accessToken}`,"content-type":"application/json"},body:JSON.stringify({installation_id:p,criteria:a,transport:"fcm",token:e.token}),signal:n},"notification_registration_failed","Could not register native notifications."),f=await R(u,"invalid_operation_response","Connect returned an invalid native notification response.");if(!u.ok)throw P(f,"notification_registration_failed","Could not register native notifications.",u.status);d?.channelId&&d.channelId!==f.channel_id&&this.deleteNotificationChannel(d.channelId,i.accessToken,n).catch(()=>{});let h={channelId:f.channel_id,installationId:p,transport:"fcm",criteria:a};return this.context.storage.setItem(c,JSON.stringify(h)),h}async unregisterNativeNotifications(e={}){return F(e,this.context.requestTimeoutMs,n=>this.unregisterNativeNotificationsWithinBudget(n.signal))}async unregisterNativeNotificationsWithinBudget(e){let n=this.context.notificationKey("fcm"),i=x(this.context.storage.getItem(n)),o=await this.context.authorizedToken(e);if(i?.channelId&&!o)throw l("not_authorized","Reconnect this application before disabling native notifications.");i?.channelId&&o&&await this.deleteNotificationChannel(i.channelId,o.accessToken,e),this.context.storage.removeItem(n)}async unregisterNotifications(e,n={}){return F(n,this.context.requestTimeoutMs,i=>this.unregisterNotificationsWithinBudget(e,i.signal))}async unregisterNotificationsWithinBudget(e,n){let i=x(this.context.storage.getItem(this.context.notificationKey())),o=await this.context.authorizedToken(n);if(i?.channelId&&!o)throw l("not_authorized","Reconnect this application before disabling push notifications.");if(i?.channelId&&o){let a=await Y(`${this.context.serverUrl}/v1/notifications/channels/${i.channelId}`,{method:"DELETE",headers:{authorization:`Bearer ${o.accessToken}`},signal:n},"notification_unregistration_failed","Could not unregister push notifications.");if(!a.ok&&a.status!==404){let s=await R(a,"invalid_operation_response","Connect returned an invalid notification response.");throw P(s,"notification_unregistration_failed","Could not unregister push notifications.",a.status)}}this.context.storage.removeItem(this.context.notificationKey()),await(await e?.pushManager.getSubscription())?.unsubscribe()}async deleteNotificationChannel(e,n,i){let o=await Y(`${this.context.serverUrl}/v1/notifications/channels/${e}`,{method:"DELETE",headers:{authorization:`Bearer ${n}`},signal:i},"notification_unregistration_failed","Could not unregister push notifications.");if(!o.ok&&o.status!==404){let r=await R(o,"invalid_operation_response","Connect returned an invalid notification response.");throw P(r,"notification_unregistration_failed","Could not unregister push notifications.",o.status)}}};async function Tt(t,e,n,i,o,r){if(!t.authority)throw l("not_remote_authority","This authorization has no remote authority endpoint.");let a=n===""||n.startsWith("?")?n:`/${n}`,s=`${t.authority.filesUrl}${a}`,c=i===void 0?void 0:JSON.stringify(i),d=await r(t,e,s,c,t.authority.accessToken);return fetch(s,{method:e,redirect:"error",headers:{authorization:`Bearer ${t.authority.accessToken}`,...c===void 0?{}:{"content-type":"application/json"},...d},...c===void 0?{}:{body:c},...o?{signal:o}:{}})}async function Wi(t,e,n,i,o,r,a){let s=t,c=await Tt(s,e,n,i,o,a);if(c.status===401&&s.refreshToken){if(s=await r(),!s.authority||!s.fileCapability)throw l("authority_authorization_changed","Reconnect this collection before accessing its files.");c=await Tt(s,e,n,i,o,a)}let d=await R(c,"invalid_operation_response","The hosted authority returned an invalid file response.");if(!c.ok)throw P(d,"operation_failed","Collection file request failed.",c.status);return d}async function Ji(t,e,n,i,o,r){let a=t,s=await Tt(a,"GET",e,void 0,i,r);if(s.status===401&&a.refreshToken){if(a=await o(),!a.authority||!a.fileCapability)throw l("authority_authorization_changed","Reconnect this collection before accessing its files.");s=await Tt(a,"GET",e,void 0,i,r)}if(!s.ok){let d=await R(s,"invalid_operation_response","The hosted authority returned an invalid file range error response.");throw P(d,"operation_failed","Collection file range request failed.",s.status)}let c=s.headers.get("content-length");if(c===null||!/^(0|[1-9][0-9]*)$/u.test(c)||Number(c)!==n)throw await s.body?.cancel().catch(()=>{}),l("invalid_operation_response","The hosted file response declared an unexpected byte length.");if(!s.body)throw l("invalid_operation_response","The hosted file response did not contain a byte stream.");return s.body}var ua="mdbase-connect file chunk key v1",It=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,Q=class extends Error{constructor(n,i){super(i);this.code=n;this.name="FileTransferCryptoError"}code},qe=class t{constructor(e,n){this.binding=e;this.key=n}binding;key;static async open(e,n,i){Yi(i);let o=await e.get(n);if(!o||o.agreementPublicKey!==i.encryption.application_agreement_public_key)throw new S("missing_grant_key","The encrypted grant key is unavailable or does not match the file transfer grant.");let r=await We(o.agreementPrivateKey,i.encryption.connector_agreement_public_key);return t.fromSharedSecret(r,i)}static async fromSharedSecret(e,n){Yi(n);let i=await yn(e,n);return new t(n,i)}async encryptChunk(e,n,i){if(this.validateHeader(n),i.byteLength!==n.plaintext_length)throw new Q("plaintext_length_mismatch","File chunk plaintext length does not match its authenticated header.");let o=at(e,n),r=await crypto.subtle.encrypt({name:"AES-GCM",iv:Qi(n.chunk_index),additionalData:Mt(o),tagLength:128},this.key,Mt(i));return xn({kind:e,header:n,payload:new Uint8Array(r)})}async decryptChunk(e){let n=st(e);this.validateHeader(n.header);let i=at(n.kind,n.header);try{let o=await crypto.subtle.decrypt({name:"AES-GCM",iv:Qi(n.header.chunk_index),additionalData:Mt(i),tagLength:128},this.key,Mt(n.payload));return new Uint8Array(o)}catch{throw new Q("authentication_failed","The encrypted file chunk could not be authenticated.")}}validateHeader(e){let n=this.binding.encryption;if(e.protocol_version!==1||e.protection!=="grant_aead_v1"||e.grant_id!==this.binding.grantId||e.authority_id!==this.binding.authorityId||e.collection_id!==n.collection_id||e.transfer_id!==this.binding.transferId||e.direction!==this.binding.direction||e.scope_epoch!==n.scope_epoch||e.key_id!==n.key_id)throw new Q("header_binding_mismatch","The file frame does not match its transfer encryption binding.")}};async function yn(t,e){let n=new TextEncoder().encode(pa(e)),i=await crypto.subtle.digest("SHA-256",n),o=await crypto.subtle.importKey("raw",t,"HKDF",!1,["deriveKey"]);return crypto.subtle.deriveKey({name:"HKDF",hash:"SHA-256",salt:i,info:new TextEncoder().encode(ua)},o,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}function Yi(t){if(J(t.encryption),!It.test(t.grantId)||!It.test(t.applicationId)||!It.test(t.authorityId)||!It.test(t.transferId)||t.direction!=="upload"&&t.direction!=="download")throw new Q("invalid_binding","The file transfer encryption binding is invalid.")}function pa(t){let e=t.encryption;return["mdbase-connect","file-transfer",1,e.suite,t.grantId,t.applicationId,e.connector_id,t.authorityId,e.collection_id,e.scope_epoch,e.key_id,t.transferId,t.direction].join("|")}function Qi(t){if(!Number.isSafeInteger(t)||t<0)throw new Q("invalid_chunk_index","The file chunk index is invalid.");let e=new Uint8Array(new ArrayBuffer(12));return new DataView(e.buffer).setBigUint64(4,BigInt(t),!1),e}function Mt(t){return Uint8Array.from(t).buffer}var Et=class{constructor(e){this.options=e}options;async control(e,n,i,o,r){Fe(e);let a=_a(n,i,o),s=await this.encryptControl(e,a),c;if(await this.options.shouldAttemptDirect(e)){try{c=await fetch(`${this.options.loopbackUrl}/v1/files/control`,fe({method:"POST",headers:{"content-type":"application/mdbase-connect+json"},body:JSON.stringify(s),signal:r}))}catch(d){if(r?.aborted)throw d;this.options.onDirectUnavailable()}if(c&&!Pe(c.status))return c.ok&&this.options.onDirectAvailable(),this.decryptControlResponse(e,s,c);c&&this.options.onDirectUnavailable()}return c=await this.sendRelayControl(e,s,r),await ha(c,e)&&(e=await this.options.refreshAuthorization(r),mn(e),s=await this.encryptControl(e,a),c=await this.sendRelayControl(e,s,r)),c.ok&&this.options.onRelayAvailable(),this.decryptControlResponse(e,s,c)}async decryptControlResponse(e,n,i){let o=await R(i,"invalid_operation_response","The collection authority returned an invalid file control response.");if(!i.ok)throw P(o,"operation_failed","Collection file request failed.",i.status);let r=o?.envelope;if(!r)throw l("invalid_encrypted_response","The connector omitted its encrypted file response.");let a=await Ae(this.options.keyStore,e.keyHandle,gn(e),n,r);return a.ok||ga(a.problem),a.result}async uploadChunk(e,n,i,o){let a=await this.localFileToken(e,"upload",o),s=await Xi(this.options.keyStore,a,e,n,i),c;if(await this.options.shouldAttemptDirect(a)){try{c=await fetch(`${this.options.loopbackUrl}/v1/files/upload`,fe(Zi(s,o)))}catch(d){if(o?.aborted)throw d;this.options.onDirectUnavailable()}if(c&&!Pe(c.status))return c.ok&&this.options.onDirectAvailable(),fa(c,"Encrypted file chunk upload failed.");c&&this.options.onDirectUnavailable()}if(c=await this.sendRelayUpload(a,s,o),c.status===401&&a.refreshToken&&(a=await this.options.refreshAuthorization(o),mn(a),s=await Xi(this.options.keyStore,a,e,n,i),c=await this.sendRelayUpload(a,s,o)),!c.ok){let d=await R(c,"invalid_operation_response","The collection authority returned an invalid file upload response.");throw P(d,"operation_failed","Encrypted file chunk upload failed.",c.status)}this.options.onRelayAvailable()}async downloadChunk(e,n,i){let o=await this.localFileToken(e,"download",i),r;if(await this.options.shouldAttemptDirect(o)){try{r=await fetch(`${this.options.loopbackUrl}/v1/files/download/${encodeURIComponent(o.grantId)}/${encodeURIComponent(e.transfer_id)}/${n}`,fe({method:"GET",signal:i}))}catch(a){if(i?.aborted)throw a;this.options.onDirectUnavailable()}if(r&&!Pe(r.status))return r.ok&&this.options.onDirectAvailable(),this.decryptDownloadResponse(o,e,n,r);r&&this.options.onDirectUnavailable()}return r=await this.sendRelayDownload(o,e,n,i),r.status===401&&o.refreshToken&&(o=await this.options.refreshAuthorization(i),mn(o),r=await this.sendRelayDownload(o,e,n,i)),r.ok&&this.options.onRelayAvailable(),this.decryptDownloadResponse(o,e,n,r)}async decryptDownloadResponse(e,n,i,o){if(!o.ok){let s=await R(o,"invalid_operation_response","The collection authority returned an invalid file download response.");throw P(s,"operation_failed","Encrypted file chunk download failed.",o.status)}if(o.headers.get("content-type")?.split(";",1)[0]!=="application/mdbase-connect-file")throw l("invalid_operation_response","The connector returned an invalid file response media type.");let r=new Uint8Array(await o.arrayBuffer()),a;try{ma(n,i,r),a=await(await to(this.options.keyStore,e,n)).decryptChunk(r)}catch(s){throw s instanceof v?s:l("invalid_operation_response","The connector returned an invalid encrypted file frame.",{cause:s})}if(a.byteLength!==_n(n,i))throw l("invalid_operation_response","The connector returned a truncated file chunk.");return a}encryptControl(e,n){return Fe(e),pe(this.options.keyStore,e.keyHandle,gn(e),"file_control",n)}sendRelayControl(e,n,i){return fetch(`${this.options.serverUrl}/v1/authorities/${encodeURIComponent(e.collectionId)}/files/control`,{method:"POST",headers:{authorization:`Bearer ${e.accessToken}`,"content-type":"application/json"},body:JSON.stringify(n),signal:i})}sendRelayUpload(e,n,i){return fetch(`${this.options.serverUrl}/v1/authorities/${encodeURIComponent(e.collectionId)}/files/upload`,{...Zi(n,i),headers:{authorization:`Bearer ${e.accessToken}`,"content-type":"application/mdbase-connect-file"}})}sendRelayDownload(e,n,i,o){return fetch(`${this.options.serverUrl}/v1/authorities/${encodeURIComponent(e.collectionId)}/files/download/${encodeURIComponent(n.transfer_id)}/${i}`,{method:"GET",headers:{authorization:`Bearer ${e.accessToken}`},signal:o})}async localFileToken(e,n,i){let o=await this.options.authorizedToken(i);if(!o||o.authority||!o.fileCapability||!o.encryption||!o.grantId||!o.keyHandle||e.direction!==n||e.protection!=="grant_aead_v1")throw l("not_authorized","This connection cannot use encrypted local file delivery.");return Dt(e),o}};function mn(t){if(t.authority||!t.fileCapability)throw l("not_authorized","This connection cannot use encrypted local file delivery.");Fe(t)}async function Xi(t,e,n,i,o){let r=ya(e,n,i,o.byteLength);return(await to(t,e,n)).encryptChunk("upload_chunk",r,o)}function Zi(t,e){return{method:"POST",headers:{"content-type":"application/mdbase-connect-file"},body:Uint8Array.from(t).buffer,signal:e}}async function fa(t,e){if(t.ok)return;let n=await R(t,"invalid_operation_response","The collection authority returned an invalid file transfer response.");throw P(n,"operation_failed",e,t.status)}async function ha(t,e){return e.refreshToken?t.status===401?!0:t.status!==409?!1:(await R(t.clone(),"invalid_operation_response","The collection authority returned an invalid file response.").catch(()=>null))?.error?.code==="encryption_binding_stale":!1}function Fe(t){if(!t.encryption||!t.grantId||!t.keyHandle)throw l("missing_grant_key","Reconnect this application to restore encrypted file access.")}function gn(t){return Fe(t),{grantId:t.grantId,applicationId:t.clientId,encryption:t.encryption}}function to(t,e,n){return Fe(e),qe.open(t,e.keyHandle,{...gn(e),authorityId:e.encryption.connector_id,transferId:n.transfer_id,direction:n.direction})}function ya(t,e,n,i){Fe(t);let o=Dt(e),r=_n(e,n);if(i!==r)throw l("invalid_request","The file chunk has the wrong byte length.");return{protocol_version:1,protection:"grant_aead_v1",grant_id:t.grantId,authority_id:t.encryption.connector_id,collection_id:t.collectionId,transfer_id:e.transfer_id,direction:e.direction,chunk_size:o,chunk_index:n,offset:n*o,plaintext_length:i,total_size:e.total_size,scope_epoch:t.encryption.scope_epoch,key_id:t.encryption.key_id}}function ma(t,e,n){let i=st(n),o=_n(t,e),r=Dt(t);if(i.kind!=="download_chunk"||i.header.chunk_index!==e||i.header.chunk_size!==r||i.header.offset!==e*r||i.header.plaintext_length!==o||i.header.total_size!==t.total_size)throw l("invalid_operation_response","The connector returned a file frame for a different chunk.")}function ga(t){throw z(t.code==="unknown"?t.server_code:t.code,t.message,{details:t.details,operationOutcome:t.operation_outcome??"rejected",traceId:t.trace_id})}function _a(t,e,n){if(t==="GET"&&(e===""||e.startsWith("?"))){let o=new URLSearchParams(e.startsWith("?")?e.slice(1):e),r=o.get("limit");return{protocol_version:1,type:"list_files",...o.get("folder")?{folder:o.get("folder")}:{},...o.get("after")?{after:o.get("after")}:{},...r?{limit:Number(r)}:{}}}let i=e.split("/");if(t==="GET"&&i.length===2&&i[0]==="transfers")return eo("get_file_transfer_status",i[1]);if(t==="DELETE"&&i.length===2&&i[0]==="transfers")return eo("abort_file_transfer",i[1]);if(t==="POST"&&ba(n)){let o=e==="uploads"?"open_file_upload":e==="downloads"?"open_file_download":i.length===3&&i[0]==="uploads"&&i[2]==="commit"?"commit_file_upload":i.length===2&&i[1]==="move"&&n.file_id===decodeURIComponent(i[0])?"move_file":i.length===2&&i[1]==="delete"&&n.file_id===decodeURIComponent(i[0])?"delete_file":null;if(o&&n.type===o)return{...n}}throw l("invalid_request","The file control request path is invalid.")}function eo(t,e){return{protocol_version:1,type:t,transfer_id:decodeURIComponent(e)}}function Dt(t){if(t.strategy.kind!=="framed_chunks"||!Number.isSafeInteger(t.strategy.chunk_size)||t.strategy.chunk_size<=0)throw l("invalid_operation_response","The connector returned an invalid framed transfer strategy.");return t.strategy.chunk_size}function _n(t,e){let n=Dt(t);if(!Number.isSafeInteger(e)||e<0||!Number.isSafeInteger(t.total_size)||t.total_size<0)throw l("invalid_request","The file chunk index is invalid.");let i=e*n;if(!Number.isSafeInteger(i)||i>=t.total_size)throw l("invalid_request","The file chunk index is outside the transfer.");return Math.min(n,t.total_size-i)}function ba(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var qt=class{constructor(e){this.options=e;this.local=new Et(e)}options;local;async control(e,n="",i,o){let r=await this.requireFileToken(o);return r.authority?Wi(r,e,n,i,o,this.options.refreshAuthorization,this.options.authorityProofHeaders):this.local.control(r,e,n,i,o)}uploadChunk(e,n,i,o){return this.local.uploadChunk(e,n,i,o)}downloadChunk(e,n,i){return this.local.downloadChunk(e,n,i)}async downloadHostedPart(e,n,i,o){let r=await this.requireFileToken(o);if(!r.authority)throw l("not_remote_authority","Hosted file delivery requires a remote authority endpoint.");return Ji(r,`downloads/${encodeURIComponent(e.transfer_id)}/parts/${n}`,i,o,this.options.refreshAuthorization,this.options.authorityProofHeaders)}async requireFileToken(e){let n=await this.options.authorizedToken(e);if(!n?.fileCapability)throw l("not_authorized","This connection has no file capability.");return n}};async function it(t,e,n,i,o,r){if(!e.authority?.proofPublicKey)return{};if(!e.keyHandle)throw l("missing_grant_key","Reconnect this application to restore remote authority request signing.");try{let a=new URL(i);return await bt(t,e.keyHandle,e.authority.proofPublicKey,{method:n,target:`${a.pathname}${a.search}`,body:o,credential:r})}catch(a){throw a instanceof S?z(a.code,a.message):a}}var Ft=class{constructor(e,n){this.storage=e;this.baseKey=n}storage;baseKey;list(e){if(!e)return[];let n=x(this.storage.getItem(this.baseKey));if(no(n)&&n.collectionId===e){let o=this.key(n.requestId);this.storage.getItem(o)||this.storage.setItem(o,JSON.stringify(n)),this.storage.removeItem(this.baseKey)}let i=[];for(let o=0;o<this.storage.length;o+=1){let r=this.storage.key(o);r?.startsWith(`${this.baseKey}:`)&&i.push(r)}return i.map(o=>x(this.storage.getItem(o))).filter(o=>no(o)&&o.collectionId===e).sort((o,r)=>o.createdAt-r.createdAt||o.requestId.localeCompare(r.requestId))}find(e,n){return this.list(e).find(i=>i.requestId===n)??null}identifier(e){return e.mutation??ee(e.operation,e.request?.input??(e.operation==="sync"?{action:"mutate"}:{}))??(e.operation==="sync"?"sync:mutate":e.operation)}store(e){this.storage.setItem(this.key(e.requestId),JSON.stringify(e))}take(e){let n=this.key(e),i=x(this.storage.getItem(n));return this.storage.removeItem(n),i}key(e){return`${this.baseKey}:${encodeURIComponent(e)}`}};function no(t){return!!(t&&typeof t.collectionId=="string"&&typeof t.requestId=="string"&&t.requestId.length>0&&En(t.operation)&&typeof t.inputFingerprint=="string"&&Number.isFinite(t.createdAt)&&t.createdAt>0&&(t.envelope||t.request)&&(t.operation==="sync"||ee(t.operation,t.request?.input??{})!==null))}function io({stored:t,collectionId:e,relayEncryption:n,invalidate:i,directCapable:o}){let r=x(t),a=s=>(i(typeof s=="string"?s:void 0),null);if(!r)return t&&a(),null;if(r.version!==1||typeof r.accessToken!="string"||r.accessToken.length===0||typeof r.clientId!="string"||r.clientId.length===0||r.collectionId!==e||typeof r.collectionName!="string"||r.collectionName.length===0||!Array.isArray(r.operations)||r.operations.some(s=>typeof s!="string")||typeof r.expiresAt!="number"||!Number.isFinite(r.expiresAt)||r.refreshToken!==void 0&&(typeof r.refreshToken!="string"||r.refreshToken.length===0)||r.refreshExpiresAt!==void 0&&(typeof r.refreshExpiresAt!="number"||!Number.isFinite(r.refreshExpiresAt))||!wt(r.scope)||r.fileCapability&&!Ct(r.fileCapability)||r.authority&&!bi(r.authority,r.collectionId))return a(r.keyHandle);if(n==="required"){if(r.authority){if(!r.keyHandle||!r.authority.proofPublicKey)return a(r.keyHandle)}else if(!r.grantId||!r.keyHandle||!vi(r.encryption,r.collectionId))return a(r.keyHandle)}return r.expiresAt<=Date.now()&&(!r.refreshToken||(r.refreshExpiresAt??0)<=Date.now())?o(r)?r:(i(r.keyHandle),null):r}var zt=class{serverUrl;storage;keyStore;directAccessMode;loopbackUrl;collectionId;internals;onChange;timeouts;pendingMutationStore;files;refreshPromise=null;directStatus;currentRoute="relay";directFailures=0;directRetryAt=0;constructor(e){this.serverUrl=e.serverUrl,this.storage=e.storage,this.keyStore=e.keyStore,this.directAccessMode=e.directAccessMode,this.loopbackUrl=e.loopbackUrl,this.collectionId=e.collectionId,this.internals=e.internals,this.onChange=e.onChange,this.timeouts=e.timeouts,this.pendingMutationStore=new Ft(this.storage,this.internals.pendingMutationKey(this.collectionId)),this.files=new qt({keyStore:this.keyStore,serverUrl:this.serverUrl,loopbackUrl:this.loopbackUrl,authorizedToken:n=>this.authorizedToken({signal:n,timeoutMs:null}),refreshAuthorization:n=>this.refreshAuthorization(n),shouldAttemptDirect:n=>this.shouldAttemptDirect(n),onDirectAvailable:()=>{this.markDirectAvailable(),this.setRoute("direct")},onDirectUnavailable:()=>this.markDirectUnavailable(),onRelayAvailable:()=>this.setRoute("relay"),authorityProofHeaders:(n,i,o,r,a)=>it(this.keyStore,n,i,o,r,a)}),this.directStatus=this.directAccessMode==="disabled"?"disabled":"unavailable"}get directAccess(){return this.currentToken()?.authority?"disabled":this.directStatus}get route(){return this.currentToken()?.authority?"remote":this.currentRoute}notifyStorageChanged(){this.emitConnection()}async checkDirectAccess(e={}){return F(e,this.timeouts.watchStartMs,n=>this.checkDirectAccessWithinBudget(n.signal))}async checkDirectAccessWithinBudget(e){let n=this.currentToken();if(!this.directEligible(n))return this.setDirectStatus("disabled");let i=await Je();return i==="denied"?this.setDirectStatus("denied"):(i==="prompt"||i===null)&&this.storage.getItem(this.internals.directPreferenceKey())!=="enabled"?this.setDirectStatus("permission_required"):this.probeDirectAccess(e)}async requestDirectAccess(e={}){return F(e,this.timeouts.watchStartMs,n=>this.requestDirectAccessWithinBudget(n.signal))}async requestDirectAccessWithinBudget(e){let n=this.currentToken();return this.directCapable(n)?(this.storage.setItem(this.internals.directPreferenceKey(),"enabled"),this.directRetryAt=0,this.probeDirectAccess(e)):this.setDirectStatus("disabled")}disableDirectAccess(){this.storage.setItem(this.internals.directPreferenceKey(),"disabled"),this.setDirectStatus("disabled"),this.setRoute("relay")}pendingMutations(){return this.storedPendingMutations().map(e=>({requestId:e.requestId,operation:this.pendingMutationStore.identifier(e),fingerprint:e.inputFingerprint,status:"outcome_unknown",createdAt:new Date(e.createdAt).toISOString()}))}pendingMutation(e){let n=this.storedPendingMutation(e);return n?{requestId:n.requestId,operation:this.pendingMutationStore.identifier(n),fingerprint:n.inputFingerprint,status:"outcome_unknown",createdAt:new Date(n.createdAt).toISOString()}:null}async recoverPendingMutation(e,n){let i=this.storedPendingMutation(e);if(!i)throw l("no_pending_mutation","There is no interrupted mutation to resume.");return L(n,this.timeouts.requestMs,o=>this.performOperationWithinBudget(i.operation,i.request?.input??{},{...n,signal:o.signal},i))}async performOperation(e,n,i={}){return L(i,this.timeouts.requestMs,o=>this.performOperationWithinBudget(e,n,{...i,signal:o.signal}))}async performOperationWithinBudget(e,n,i,o){he(i.signal);let r=this.currentToken();if(!r)throw l("not_authorized","Connect this application before accessing a collection.");if(!r.operations.includes(e))throw l("insufficient_access",`This connection does not allow ${e}.`,{details:{required_operations:[e],granted_operations:[...r.operations],missing_operations:[e]}});let a=await this.shouldAttemptDirect(r);if(!a&&(r=await this.authorizedToken({signal:i.signal,timeoutMs:null}),!r))throw l("not_authorized","Reconnect this application to continue.");let s=o?.requestId??(li(e,n)?crypto.randomUUID():void 0),c;try{c=await this.sendOperation(r,e,n,a,i,s)}catch(f){throw vt(f,i.signal,s!==void 0&&this.storedPendingMutation(s)!==null?s:void 0,r.authority?"hosted_provider_unavailable":"relay_unavailable")}let d=c.response,p=d.status===409&&(await R(d.clone(),"invalid_operation_response","The collection authority returned an invalid operation response.").catch(()=>null))?.error?.code==="encryption_binding_stale";if((d.status===401||p)&&r.refreshToken){if(c.pendingMutation&&(c.directDeliveryUncertain||c.encryptedRequest&&c.resumingMutation))throw l("operation_outcome_unknown","The direct operation may have completed, but its encrypted grant changed before the response could be recovered. Refresh before making another change.",{operationOutcome:"unknown",details:{request_id:c.requestId}});c.pendingMutation&&this.clearPendingMutation(c.requestId),r=await this.refreshAuthorization(i.signal),a=await this.shouldAttemptDirect(r);try{c=await this.sendOperation(r,e,n,a,i,s)}catch(f){throw vt(f,i.signal,s!==void 0&&this.storedPendingMutation(s)!==null?s:void 0,r.authority?"hosted_provider_unavailable":"relay_unavailable")}d=c.response}let u;try{u=await R(d,"invalid_operation_response","The collection authority returned a response that is not valid JSON.")}catch(f){throw c.pendingMutation?B(c.requestId,f):l("invalid_operation_response","The collection authority returned a response that is not valid JSON.",{cause:f})}if(!d.ok){let f=P(u,"operation_failed","Collection operation failed.",d.status);throw c.pendingMutation&&(c.directDeliveryUncertain||c.encryptedRequest&&c.resumingMutation)?B(c.requestId,f):(c.pendingMutation&&!c.directDeliveryUncertain&&this.clearPendingMutation(c.requestId),f.code==="direct_operation_rejected"&&f.status===403&&this.invalidateRejectedAuthorization(r),f)}if(c.encryptedRequest){let f=u?.envelope,h=c.pendingMutationRecord,_=h?.encryption??r.encryption,y=h?.grantId??r.grantId,w=h?.applicationId??r.clientId,m=h?.keyHandle??r.keyHandle;if(!f||!_||!y||!m)throw c.pendingMutation?B(c.requestId,new Error("Encrypted operation response was missing its envelope.")):l("invalid_encrypted_response","The relay did not return an encrypted connector response.");try{let g=await Ae(this.keyStore,m,{grantId:y,applicationId:w,encryption:_},c.encryptedRequest,f);if(c.pendingMutation&&this.clearPendingMutation(c.requestId),!g.ok)throw z(g.problem.code==="unknown"?g.problem.server_code:g.problem.code,g.problem.message,{details:g.problem.details,operationOutcome:g.problem.operation_outcome??"rejected",traceId:g.problem.trace_id});return g.result}catch(g){throw g instanceof v?g:g instanceof S?c.pendingMutation?B(c.requestId,g):z(g.code,g.message):g}}if(u?.protocol_version!==te||u?.request_id!==c.requestId)throw c.pendingMutation?B(c.requestId,new Error("Operation response protocol or request ID did not match.")):l("invalid_operation_response","The collection authority returned a response for a different protocol request.");if(u.ok===!1)throw Be(u.problem)?(c.pendingMutation&&this.clearPendingMutation(c.requestId),new v(u.problem)):c.pendingMutation?B(c.requestId,new Error("Operation rejection did not contain a canonical problem.")):l("invalid_operation_response","The collection authority returned an invalid operation problem.");if(u.ok!==!0||!("result"in u))throw c.pendingMutation?B(c.requestId,new Error("Successful operation response did not contain a result.")):l("invalid_operation_response","The collection authority returned an incomplete operation response.");return c.pendingMutation&&this.clearPendingMutation(c.requestId),u.result}async performAuthoritySyncRequest(e,n,i,o,r,a={}){return L(a,this.timeouts.syncMs,async s=>{let c=await this.authorizedToken({signal:s.signal,timeoutMs:null});if(!c?.authority||c.collectionId!==e||c.authority.replicaId!==n)throw l("authority_authorization_changed","Reconnect this collection authority before synchronizing.");try{let d=await this.sendAuthoritySyncRequest(c,i,o,r,s.signal);if(d.status===401&&c.refreshToken){if(c=await this.refreshAuthorization(s.signal),!c.authority||c.collectionId!==e||c.authority.replicaId!==n)throw l("authority_authorization_changed","Reconnect this collection authority before synchronizing.");d=await this.sendAuthoritySyncRequest(c,i,o,r,s.signal)}let p=await R(d,"invalid_operation_response","The collection authority returned an invalid synchronization response.");if(!d.ok)throw P(p,"sync_failed","Collection synchronization failed.",d.status);return p}catch(d){let p=i==="POST"&&o==="mutations"&&r&&typeof r=="object"&&typeof r.mutation_id=="string"?r.mutation_id:void 0;throw vt(d,s.signal,p,"hosted_provider_unavailable")}})}async sendAuthoritySyncRequest(e,n,i,o,r){if(!e.authority)throw l("not_remote_authority","This authorization has no remote authority endpoint.");let a=`${e.authority.syncUrl}/${i}`,s=o===void 0?void 0:JSON.stringify(o),c=await it(this.keyStore,e,n,a,s,e.authority.accessToken);return fetch(a,{method:n,headers:{authorization:`Bearer ${e.authority.accessToken}`,...o===void 0?{}:{"content-type":"application/json"},...c},...s===void 0?{}:{body:s},signal:r})}async sendOperation(e,n,i,o,r={},a){let s=i??{},c,d=!1,p=!1,u=a??crypto.randomUUID(),f=null,h;if(a!==void 0){if(f=this.storedPendingMutation(a),h=f?.inputFingerprint??await yi(n,i),f){if(f.collectionId!==e.collectionId||f.operation!==n||f.inputFingerprint!==h)throw l("pending_mutation_unresolved","A previous write still has an unknown outcome. Retry that exact write before making another change.");u=f.requestId,p=!0}d=!0}let _=f?.mutation??ee(n,i);if(f?.envelope&&(e.authority||!e.encryption))throw l("pending_mutation_unresolved","The pending write requires its encrypted relay authority. Reconnect that authority before recovery.");if(f?.request&&e.encryption&&!e.authority)throw l("pending_mutation_unresolved","The pending write belongs to a different authority transport. Reconnect that authority before recovery.");if(e.encryption&&!e.authority){if(!e.grantId||!e.keyHandle)throw l("missing_grant_key","Reconnect this application to restore encrypted access.");try{if(d)if(f){if(!f.envelope)throw l("pending_mutation_unresolved","The pending write belongs to a different transport. Reconnect before retrying it.");c=f.envelope}else c=await pe(this.keyStore,e.keyHandle,{grantId:e.grantId,applicationId:e.clientId,encryption:e.encryption},n,i,u),this.pendingMutationStore.store({collectionId:e.collectionId,...e.grantId?{grantId:e.grantId}:{},keyId:e.encryption.key_id,keyHandle:e.keyHandle,applicationId:e.clientId,encryption:e.encryption,operation:n,mutation:_,inputFingerprint:h,requestId:u,envelope:c,createdAt:Date.now()});else c=await pe(this.keyStore,e.keyHandle,{grantId:e.grantId,applicationId:e.clientId,encryption:e.encryption},n,i)}catch(M){throw M instanceof S?z(M.code,M.message):M}s=c}else{let M=f?.request??{protocol_version:te,request_id:u,input:s};s=M,d&&!f&&this.pendingMutationStore.store({collectionId:e.collectionId,...e.grantId?{grantId:e.grantId}:{},operation:n,mutation:_,inputFingerprint:h,requestId:u,request:M,createdAt:Date.now()})}if(o&&c&&!e.authority){let M=!1;try{let b=await fetch(`${this.loopbackUrl}/v1/operations`,fe({method:"POST",headers:{"content-type":"application/mdbase-connect+json"},body:JSON.stringify(c),signal:r.signal}));if(!Pe(b.status))return b.ok&&(this.markDirectAvailable(),this.setRoute("direct")),{response:b,requestId:u,encryptedRequest:c,pendingMutation:d,...d?{pendingMutationRecord:f??this.storedPendingMutation(u)??void 0}:{},resumingMutation:p};M=b.status>=500,this.markDirectUnavailable()}catch(b){if(r.signal?.aborted)throw b;M=!0,await Je()==="denied"?this.setDirectStatus("denied"):this.markDirectUnavailable()}let U;try{U=e.expiresAt>Date.now()+3e4?e:await this.refreshAuthorization(r.signal)}catch(b){throw d&&(M||p)?B(u,b):b}let N;try{N=await fetch(`${this.serverUrl}/v1/authorities/${encodeURIComponent(U.collectionId)}/operations/${n}`,{method:"POST",headers:{authorization:`Bearer ${U.accessToken}`,"content-type":"application/json"},body:JSON.stringify(c),signal:r.signal})}catch(b){throw d&&(M||p)?B(u,b):b}return N.ok&&this.setRoute("relay"),{response:N,requestId:u,encryptedRequest:c,directDeliveryUncertain:M,pendingMutation:d,...d?{pendingMutationRecord:f??this.storedPendingMutation(u)??void 0}:{},resumingMutation:p}}let y=e.authority?`${e.authority.operationsUrl}/${n}`:`${this.serverUrl}/v1/authorities/${encodeURIComponent(e.collectionId)}/operations/${n}`,w=JSON.stringify(s),m=e.authority?await it(this.keyStore,e,"POST",y,w,e.authority.accessToken):{},g=await fetch(y,{method:"POST",headers:{authorization:`Bearer ${e.authority?.accessToken??e.accessToken}`,"content-type":"application/json",...m},body:w,signal:r.signal});return g.ok&&this.setRoute(e.authority?"remote":"relay"),{response:g,requestId:u,encryptedRequest:c,pendingMutation:d,...d?{pendingMutationRecord:f??this.storedPendingMutation(u)??void 0}:{},resumingMutation:p}}directCapable(e){return!(!e||e.authority||!e.encryption||!e.grantId||!e.keyHandle||this.directAccessMode==="disabled"||typeof location<"u"&&e.applicationOrigin&&e.applicationOrigin!==location.origin)}hasResumableMutationTransport(){return!!this.currentToken()}directEligible(e){return e!==null&&this.directCapable(e)&&this.storage.getItem(this.internals.directPreferenceKey())!=="disabled"}async shouldAttemptDirect(e){if(!this.directEligible(e))return!1;if(this.directStatus==="available")return!0;if(this.directStatus==="unavailable"&&Date.now()<this.directRetryAt)return!1;let n=await Je();return n==="denied"?(this.setDirectStatus("denied"),!1):(n==="prompt"||n===null)&&this.storage.getItem(this.internals.directPreferenceKey())!=="enabled"?(this.setDirectStatus("permission_required"),!1):(this.setDirectStatus("checking"),!0)}async probeDirectAccess(e){this.setDirectStatus("checking");try{let n=await fetch(`${this.loopbackUrl}/v1/ready`,fe({method:"GET",cache:"no-store",signal:e})),i=await R(n,"invalid_operation_response","The connector returned an invalid readiness response.").catch(()=>null);if(n.ok&&i?.service==="mdbase-connect"&&i?.loopback_protocol_version===1&&i?.operation_transport_protocol_version===te)return this.markDirectAvailable(),"available"}catch{}return await Je()==="denied"?this.setDirectStatus("denied"):(this.markDirectUnavailable(),"unavailable")}markDirectAvailable(){this.directFailures=0,this.directRetryAt=0,this.setDirectStatus("available")}markDirectUnavailable(){this.directFailures+=1,this.directRetryAt=Date.now()+Math.min(6e4,1e3*2**(this.directFailures-1)),this.setDirectStatus("unavailable")}setDirectStatus(e){return this.directStatus!==e&&(this.directStatus=e,this.emitConnection()),e}setRoute(e){this.currentRoute!==e&&(this.currentRoute=e,this.emitConnection())}emitConnection(){this.onChange()}invalidateRejectedAuthorization(e){let n=x(this.storage.getItem(this.internals.tokenKey(this.collectionId)));!n||!di(n,e)||(this.internals.removeToken(this.collectionId,n.keyHandle),this.currentRoute="relay",this.directStatus=this.directAccessMode==="disabled"?"disabled":"unavailable",this.emitConnection())}currentToken(){return io({stored:this.storage.getItem(this.internals.tokenKey(this.collectionId)),collectionId:this.collectionId,relayEncryption:this.internals.relayEncryption,invalidate:e=>this.internals.removeToken(this.collectionId,e,"invalid_stored_grant"),directCapable:e=>this.directCapable(e)})}async authorizedToken(e={}){let n=this.currentToken();if(!n)return null;if(n.expiresAt>Date.now()+3e4)return n;if(!n.refreshToken||(n.refreshExpiresAt??0)<=Date.now()){if(this.directCapable(n))throw l("relay_authorization_expired","Direct access is still available on this computer, but using the relay requires reconnecting this application.");return this.internals.removeToken(this.collectionId,n.keyHandle),null}return this.refreshAuthorization(e.signal)}refreshAuthorization(e){return this.refreshPromise?this.refreshPromise:(this.refreshPromise=this.performRefresh(e).finally(()=>{this.refreshPromise=null}),this.refreshPromise)}async performRefresh(e){let n=this.currentToken();if(!n?.refreshToken)throw l("not_authorized","Reconnect this application to continue.");if((n.refreshExpiresAt??0)<=Date.now())throw l("relay_authorization_expired","Direct access is still available on this computer, but using the relay requires reconnecting this application.");let i=n.refreshToken,o=`${this.serverUrl}/oauth/token`,r=new URLSearchParams({grant_type:"refresh_token",refresh_token:n.refreshToken,client_id:n.clientId}).toString(),a=n.authority?await it(this.keyStore,n,"POST",o,r,n.refreshToken):{},s=await fetch(o,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",...a},body:r,signal:e}),c=await R(s,"invalid_token_response","The authorization service returned an invalid token response.");if(!s.ok){let d=this.currentToken();if(d?.refreshToken&&d.refreshToken!==i)return d;throw this.directCapable(n)||this.internals.removeToken(this.collectionId,n.keyHandle),(Qe(c)??c?.error?.code)==="invalid_grant"?l("authorization_expired",c?.error_description??c?.error?.message??"Reconnect this application to continue.",{status:s.status}):P(c,"authorization_expired","Reconnect this application to continue.",s.status)}return this.storeTokenResponse(c,n.clientId,n.keyHandle)}storeTokenResponse(e,n,i){if(e.collection_id!==this.collectionId)throw l("collection_mismatch","The refreshed authorization belongs to a different collection.");let o=this.internals.storeTokenResponse(e,n,i);return this.currentRoute=o.authority?"remote":"relay",this.directStatus=o.authority||this.directAccessMode==="disabled"?"disabled":"unavailable",this.emitConnection(),o}storedPendingMutations(){return this.pendingMutationStore.list(this.currentToken()?.collectionId??null)}storedPendingMutation(e){return this.pendingMutationStore.find(this.currentToken()?.collectionId??null,e)}clearPendingMutation(e){let n=this.pendingMutationStore.take(e),i=this.currentToken()?.keyHandle;n?.keyHandle&&n.keyHandle!==i&&this.keyStore.delete(n.keyHandle).catch(()=>{})}};var va=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),Ca=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),ge=class{state=Ca.slice();block=new Uint8Array(64);words=new Uint32Array(64);blockLength=0;byteLength=0;finished=!1;update(e){if(this.finished)throw new Error("SHA-256 digest is already finalized.");if(this.byteLength+=e.byteLength,!Number.isSafeInteger(this.byteLength))throw new Error("SHA-256 input exceeds the safe browser byte range.");let n=0;if(this.blockLength>0){let i=Math.min(64-this.blockLength,e.byteLength);this.block.set(e.subarray(0,i),this.blockLength),this.blockLength+=i,n+=i,this.blockLength===64&&(this.compress(this.block),this.blockLength=0)}for(;n+64<=e.byteLength;)this.compress(e.subarray(n,n+64)),n+=64;return n<e.byteLength&&(this.block.set(e.subarray(n),0),this.blockLength=e.byteLength-n),this}digestHex(){if(this.finished)throw new Error("SHA-256 digest is already finalized.");this.finished=!0,this.block[this.blockLength]=128,this.block.fill(0,this.blockLength+1),this.blockLength>=56&&(this.compress(this.block),this.block.fill(0));let e=this.byteLength*8,n=Math.floor(e/4294967296),i=e>>>0;return oo(this.block,56,n),oo(this.block,60,i),this.compress(this.block),[...this.state].map(o=>o.toString(16).padStart(8,"0")).join("")}compress(e){let n=this.words;for(let u=0;u<16;u+=1){let f=u*4;n[u]=(e[f]<<24|e[f+1]<<16|e[f+2]<<8|e[f+3])>>>0}for(let u=16;u<64;u+=1){let f=n[u-15],h=n[u-2],_=$(f,7)^$(f,18)^f>>>3,y=$(h,17)^$(h,19)^h>>>10;n[u]=n[u-16]+_+n[u-7]+y>>>0}let i=this.state[0],o=this.state[1],r=this.state[2],a=this.state[3],s=this.state[4],c=this.state[5],d=this.state[6],p=this.state[7];for(let u=0;u<64;u+=1){let f=$(s,6)^$(s,11)^$(s,25),h=s&c^~s&d,_=p+f+h+va[u]+n[u]>>>0,y=$(i,2)^$(i,13)^$(i,22),w=i&o^i&r^o&r,m=y+w>>>0;p=d,d=c,c=s,s=a+_>>>0,a=r,r=o,o=i,i=_+m>>>0}this.state[0]=this.state[0]+i>>>0,this.state[1]=this.state[1]+o>>>0,this.state[2]=this.state[2]+r>>>0,this.state[3]=this.state[3]+a>>>0,this.state[4]=this.state[4]+s>>>0,this.state[5]=this.state[5]+c>>>0,this.state[6]=this.state[6]+d>>>0,this.state[7]=this.state[7]+p>>>0}};function $(t,e){return t>>>e|t<<32-e}function oo(t,e,n){t[e]=n>>>24,t[e+1]=n>>>16,t[e+2]=n>>>8,t[e+3]=n}var Ut=class{constructor(e,n){this.signal=n;this.iterator=wa(e)}signal;iterator;remainder=new Uint8Array;remainderOffset=0;maxSourceChunkBytes=null;iteratorClosing=!1;ended=!1;setMaxSourceChunkBytes(e){this.maxSourceChunkBytes=e}async read(e){let n=new Uint8Array(e),i=0;for(;i<e;){if(this.remainderOffset===this.remainder.byteLength){let r=await this.nextSourceChunk();if(r.done)throw this.ended=!0,l("invalid_request","Streamed file bytes ended before the declared size.");if(!(r.value instanceof Uint8Array))throw l("invalid_request","A streamed file chunk was not a Uint8Array.");if(this.maxSourceChunkBytes===null)throw new Error("Stream source was read before upload negotiation completed.");if(r.value.byteLength>this.maxSourceChunkBytes)throw l("invalid_request",`A streamed file chunk exceeded the negotiated ${this.maxSourceChunkBytes}-byte upload part size.`);if(this.remainder=r.value,this.remainderOffset=0,this.remainder.byteLength===0)continue}let o=Math.min(e-i,this.remainder.byteLength-this.remainderOffset);n.set(this.remainder.subarray(this.remainderOffset,this.remainderOffset+o),i),i+=o,this.remainderOffset+=o}return n}async expectEnd(){if(this.remainderOffset<this.remainder.byteLength)throw l("invalid_request","Streamed file bytes exceed the declared size.");for(;!this.ended;){let e=await this.nextSourceChunk();if(e.done){this.ended=!0;return}if(!(e.value instanceof Uint8Array))throw l("invalid_request","A streamed file chunk was not a Uint8Array.");if(e.value.byteLength>0)throw l("invalid_request","Streamed file bytes exceed the declared size.")}}async close(){this.ended=!0,this.closeIterator()}async nextSourceChunk(){ro(this.signal);let e=this.iterator.next(),n=this.signal;if(!n)return e;let i=()=>{},o=new Promise((r,a)=>{let s=()=>{this.closeIterator(),a(ao(n))};n.addEventListener("abort",s,{once:!0}),i=()=>n.removeEventListener("abort",s),n.aborted&&s()});try{let r=await Promise.race([e,o]);return ro(n),r}finally{i()}}closeIterator(){if(!this.iteratorClosing){this.iteratorClosing=!0;try{this.iterator.return?.()?.catch(()=>{})}catch{}}}};function wa(t){if(typeof t.getReader=="function"){let n=t.getReader(),i=!1,o=()=>{i||(i=!0,n.releaseLock())};return{async next(){if(i)return{done:!0,value:void 0};let r=await n.read();return r.done&&o(),r},async return(){if(!i)try{await n.cancel()}finally{o()}return{done:!0,value:void 0}}}}let e=t;if(typeof e[Symbol.asyncIterator]!="function")throw l("invalid_request","Streamed files require a readable byte stream.");return e[Symbol.asyncIterator]()}function ro(t){if(t?.aborted)throw ao(t)}function ao(t){return l("operation_cancelled","The file transfer was cancelled.",{operationOutcome:"not_sent",cause:t?.reason})}var so=1024*1024,Sa=4,co=8,_e=3,bn=64*1024*1024,lo=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu,uo=/^sha256:[0-9a-f]{64}$/u;async function po(t,e,n){let i=new ge;for(let o=0;o<t.size;o+=so){re(e);let r=new Uint8Array(await t.slice(o,o+so).arrayBuffer());i.update(r),n(Math.min(t.size,o+r.byteLength))}return t.size===0&&n(0),i.digestHex()}function fo(t,e){if(t instanceof Blob)return e&&e!==t.type?t.slice(0,t.size,e):t;if(t instanceof ArrayBuffer)return new Blob([t],{type:e});let n=new Uint8Array(t.byteLength);return n.set(new Uint8Array(t.buffer,t.byteOffset,t.byteLength)),new Blob([n.buffer],{type:e})}function ho(t){return t instanceof Blob?t.size:t.byteLength}async function yo(t){return t instanceof Blob?new Uint8Array(await t.arrayBuffer()):t}function vn(t=Sa){if(!Number.isInteger(t)||t<1||t>co)throw l("invalid_request",`File concurrency must be between 1 and ${co}.`);return t}function mo(t){if(!Number.isInteger(t)||t<1||t>1e3)throw l("invalid_request","File page size must be between 1 and 1000.");return t}function Cn(t,e,n){if(t.protocol_version!==1||t.type!=="file_transfer"||t.transfer_id!==e||t.direction!==n||!Number.isSafeInteger(t.total_size)||t.total_size<0||!Array.isArray(t.received)||!Ra(t))throw l("invalid_operation_response","The authority returned an invalid file transfer session.");let i=t.strategy.kind==="framed_chunks"?t.strategy.chunk_size:t.strategy.kind==="object_put"?Math.max(1,t.total_size):t.strategy.part_size,o=t.strategy.kind==="object_put"?1:Math.ceil(t.total_size/i);if(new Set(t.received).size!==t.received.length||t.received.some(a=>!Number.isSafeInteger(a)||a<0||a>=o))throw l("invalid_operation_response","The authority returned invalid transfer progress.");let r=t.uploaded_parts??[];if(!Array.isArray(r)||r.some((a,s)=>!Number.isSafeInteger(a?.part_number)||a.part_number<1||a.part_number>o||typeof a.etag!="string"||a.etag.length===0||a.etag.length>255||s>0&&r[s-1].part_number>=a.part_number)||(t.strategy.kind==="object_multipart"?r.length!==t.received.length||r.some((a,s)=>a.part_number-1!==t.received[s]):r.length!==0))throw l("invalid_operation_response","The authority returned invalid uploaded part receipts.")}function go(t,e){let n=e.strategy.kind==="framed_chunks"?e.strategy.chunk_size:e.strategy.kind==="object_put"?Math.max(1,e.total_size):e.strategy.part_size,i=e.strategy.kind==="object_put"?1:Math.ceil(e.total_size/n);if(t?.protocol_version!==1||t.type!=="file_transfer_status"||t.transfer_id!==e.transfer_id||!["open","committed","aborted","expired"].includes(t.state)||!Array.isArray(t.received)||new Set(t.received).size!==t.received.length||t.received.some(r=>!Number.isSafeInteger(r)||r<0||r>=i)||!Number.isSafeInteger(t.received_bytes)||t.received_bytes<0||t.received_bytes>e.total_size||t.received.reduce((r,a)=>r+wn(e.total_size,n,a),0)!==t.received_bytes)throw l("invalid_operation_response","The authority returned invalid transfer status.");let o=t.uploaded_parts;if(!Array.isArray(o)||o.some((r,a)=>!Number.isSafeInteger(r?.part_number)||r.part_number<1||r.part_number>i||typeof r.etag!="string"||r.etag.length===0||r.etag.length>255||a>0&&o[a-1].part_number>=r.part_number)||(e.strategy.kind==="object_multipart"?o.length!==t.received.length||o.some((r,a)=>r.part_number-1!==t.received[a]):o.length!==0))throw l("invalid_operation_response","The authority returned invalid uploaded part status.")}function Ra(t){return t.strategy.kind==="framed_chunks"?t.protection==="grant_aead_v1"&&Number.isSafeInteger(t.strategy.chunk_size)&&t.strategy.chunk_size>0:t.protection!=="transport_tls"?!1:t.strategy.kind==="object_put"?!0:Number.isSafeInteger(t.strategy.part_size)&&t.strategy.part_size>0}function wn(t,e,n){return Math.min(e,Math.max(0,t-n*e))}async function Nt(t,e){for(let n=1;n<=_e;n+=1){re(e);try{return await t()}catch(i){if(e?.aborted||n===_e)throw i}}throw new Error("Unreachable file chunk retry state.")}function _o(t,e,n,i,o,r){let a;try{a=new URL(t.url)}catch{throw l("invalid_operation_response","The authority returned an invalid object URL.")}if(t.protocol_version!==1||t.type!=="file_part"||t.transfer_id!==e||t.part_index!==n||t.offset!==i||t.content_length!==o||t.method.toUpperCase()!==r||a.protocol!=="https:"&&!(a.protocol==="http:"&&["localhost","127.0.0.1","[::1]","::1"].includes(a.hostname))||a.username||a.password)throw l("invalid_operation_response","The authority returned an invalid prepared file part.")}function bo(t){let e=new Headers;for(let[n,i]of Object.entries(t))["host","content-length"].includes(n.toLowerCase())||e.set(n,i);return e}async function vo(t,e,n){let i=new Array(t),o=0;return await Promise.all(Array.from({length:Math.min(t,e)},async()=>{for(;o<t;){let r=o;o+=1,i[r]=await n(r)}})),i}function re(t){if(t?.aborted)throw l("operation_cancelled","The file transfer was cancelled.",{operationOutcome:"not_sent",cause:t.reason})}function ze(t){return t instanceof v?t:typeof DOMException<"u"&&t instanceof DOMException&&t.name==="AbortError"?l("operation_cancelled","The file transfer was cancelled.",{operationOutcome:"not_sent",cause:t}):l("temporarily_unavailable","The file transfer could not be completed.",{cause:t})}var Ue=class{constructor(e,n,i,o,r=we()){this.capability=e;this.request=n;this.framed=i;this.hosted=o;this.timeouts=r}capability;request;framed;hosted;timeouts;async*list(e={}){let n=ie(e,this.timeouts.requestMs),i=n.signal;try{this.requireAction("list");let o;do{re(i);let r=new URLSearchParams({protocol_version:String(1),...e.folder?{folder:e.folder}:{},...o?{after:o}:{},...e.pageSize?{limit:String(mo(e.pageSize))}:{}}),a=await this.request("GET",`?${r.toString()}`,void 0,i);if(a.protocol_version!==1||a.type!=="files_page"||!Array.isArray(a.files))throw l("invalid_operation_response","The authority returned an invalid file page.");for(let s of a.files)re(i),yield Lt(s);o=a.next}while(o)}finally{n.dispose()}}async upload(e,n,i={}){return L(i,this.timeouts.uploadMs,o=>this.uploadWithinBudget(e,n,{...i,signal:o.signal,timeoutMs:null}))}async uploadWithinBudget(e,n,i){this.requireAction(i.ifRevision?"replace":"add");let o=fo(n,i.mediaType),r=vn(i.concurrency),a=await po(o,i.signal,s=>{i.onProgress?.({phase:"hashing",transferredBytes:s,totalBytes:o.size})});return this.uploadKnownSource(e,o.size,`sha256:${a}`,(i.mediaType??o.type)||void 0,i,r,async(s,c,d)=>o.slice(c,c+d))}async uploadStream(e,n,i={}){return L(i,this.timeouts.uploadMs,o=>this.uploadStreamWithinBudget(e,n,{...i,signal:o.signal,timeoutMs:null}))}async uploadStreamWithinBudget(e,n,i){if(this.requireAction(i.ifRevision?"replace":"add"),!Number.isSafeInteger(n.size)||n.size<0)throw l("invalid_request","Streamed file size must be a non-negative safe integer.");if(!uo.test(n.contentDigest))throw l("invalid_request","Streamed files require a lowercase SHA-256 content digest.");let o=new Ut(n.stream,i.signal),r=new ge;return this.uploadKnownSource(e,n.size,n.contentDigest,i.mediaType??n.mediaType,i,1,async(a,s,c)=>{let d=await o.read(c);return r.update(d),d},async()=>{if(await o.expectEnd(),`sha256:${r.digestHex()}`!==n.contentDigest)throw l("invalid_request","Streamed file bytes do not match the declared SHA-256 digest.")},()=>o.close(),a=>o.setMaxSourceChunkBytes(a))}async uploadKnownSource(e,n,i,o,r,a,s,c,d,p){let u=r.transferId??crypto.randomUUID();if(!lo.test(u))throw l("invalid_request","File transfer ID must be a UUID.");let f=!1;try{let h=await this.request("POST","uploads",{protocol_version:1,type:"open_file_upload",transfer_id:u,path:e,size:n,content_digest:i,...o?{media_type:o}:{},...r.ifRevision?{if_revision:r.ifRevision}:{}},r.signal);if(Cn(h,u,"upload"),h.total_size!==n||h.strategy.kind==="object_ranges")throw l("invalid_operation_response","The authority returned an incompatible upload strategy.");let _=h.strategy.kind==="framed_chunks";if(_&&!this.framed)throw l("invalid_operation_response","Encrypted file chunk delivery is unavailable.");let y=h.strategy.kind==="object_put"?Math.max(1,n):h.strategy.kind==="framed_chunks"?h.strategy.chunk_size:h.strategy.part_size,w=h.strategy.kind==="object_put"?1:Math.ceil(n/y),m=await this.request("GET",`transfers/${encodeURIComponent(u)}`,void 0,r.signal);if(go(m,h),m.state!=="open"&&m.state!=="committed")throw l("invalid_operation_response",`The authority cannot resume a ${m.state} file transfer.`);if(p?.(y),!_&&m.received.length===w){let O=await this.tryReplayUploadCommit(u,h.strategy.kind==="object_multipart"?m.uploaded_parts:void 0,r.signal);if(O)return f=!0,Lt(O.file)}let g=new Set(m.received),M=new Map(m.uploaded_parts.map(O=>[O.part_number-1,O])),U=[...g].reduce((O,j)=>O+wn(n,y,j),0),N=await vo(w,a,async O=>{let j=O*y,ae=Math.min(y,Math.max(0,n-j)),se=await s(O,j,ae);if(ho(se)!==ae)throw l("invalid_request","Streamed file bytes ended before the declared size.");if(g.has(O))return M.get(O)??null;let be=_?await Nt(async()=>this.framed.uploadChunk(h,O,await yo(se),r.signal),r.signal).then(()=>null):await this.uploadPart(u,O,j,se,ae,h.strategy.kind==="object_multipart",r.signal);return U+=ae,r.onProgress?.({phase:"uploading",transferredBytes:U,totalBytes:n}),be});await c?.();let b=await this.commitUpload(u,h.strategy.kind==="object_multipart"?N.filter(O=>O!==null):void 0,r.signal);if(b.protocol_version!==1||b.type!=="file_upload_committed"||b.transfer_id!==u||b.file.path!==e||b.file.size!==n||b.file.content_digest!==i)throw l("invalid_operation_response","The authority returned an invalid file receipt.");return f=!0,Lt(b.file)}catch(h){throw ze(h)}finally{await d?.().catch(()=>{}),!f&&r.transferId===void 0&&await this.abort(u)}}async download(e,n={}){if(e.size>bn)throw l("invalid_request",`download() buffers at most ${bn} bytes; use downloadStream() for larger files.`);let i=await this.downloadStream(e,n),o=[],r=i.getReader();for(;;){let a=await r.read();if(a.done)break;o.push(a.value)}return new Blob(o.map(a=>{let s=new Uint8Array(a.byteLength);return s.set(a),s.buffer}),{type:e.mediaType??""})}async downloadStream(e,n={}){return L(n,this.timeouts.requestMs,i=>this.openDownloadStream(e,n,i.signal))}async openDownloadStream(e,n,i){this.requireAction("read");let o=vn(n.concurrency),r=crypto.randomUUID(),a;try{if(a=await this.request("POST","downloads",{protocol_version:1,type:"open_file_download",transfer_id:r,file_id:e.fileId,revision:e.revision},i),Cn(a,r,"download"),a.total_size!==e.size||a.strategy.kind!=="object_ranges"&&a.strategy.kind!=="framed_chunks")throw l("invalid_operation_response","The authority returned an incompatible download session.");if(a.strategy.kind==="framed_chunks"&&!this.framed)throw l("invalid_operation_response","Encrypted file chunk delivery is unavailable.");if(a.strategy.kind==="object_ranges"&&e.size>0&&!this.hosted)throw l("invalid_operation_response","Authenticated hosted file delivery is unavailable.")}catch(b){throw await this.abort(r),ze(b)}let s=a.strategy.kind==="framed_chunks"?a.strategy.chunk_size:a.strategy.part_size,c=Math.ceil(e.size/s),d=new ge,p=0,u=0,f=null,h=0,_=!1,y=new AbortController,w=n.signal?AbortSignal.any([n.signal,y.signal]):y.signal,m=new Map,g=0,M=()=>{if(a.strategy.kind==="framed_chunks")for(;g<c&&m.size<o;){let b=g;g+=1;let O=Nt(()=>this.framed.downloadChunk(a,b,w),w).then(j=>({ok:!0,chunk:j}),j=>({ok:!1,error:j}));m.set(b,O)}},U=async()=>{_||(_=!0,y.abort(),await f?.cancel().catch(()=>{}),f=null,await Promise.all(m.values()),m.clear(),await this.abort(r))},N=()=>{if(h!==e.size||`sha256:${d.digestHex()}`!==e.contentDigest)throw l("invalid_operation_response","Downloaded file bytes failed integrity verification.")};return new ReadableStream({pull:async b=>{try{if(re(w),a.strategy.kind==="object_ranges")for(;;){if(!f){if(p>=c){N(),b.close(),U();return}let Po=p*s;u=Math.min(s,e.size-Po),f=(await Nt(()=>this.hosted.downloadPart(a,p,u,w),w)).getReader()}let Z=await f.read();if(Z.done){if(f.releaseLock(),f=null,u!==0)throw l("invalid_operation_response","A hosted file range ended before its declared byte length.");p+=1;continue}if(!(Z.value instanceof Uint8Array))throw l("invalid_operation_response","A hosted file range returned a non-byte chunk.");if(Z.value.byteLength!==0){if(Z.value.byteLength>u)throw l("invalid_operation_response","A hosted file range exceeded its declared byte length.");u-=Z.value.byteLength,d.update(Z.value),h+=Z.value.byteLength,n.onProgress?.({phase:"downloading",transferredBytes:h,totalBytes:e.size}),b.enqueue(Z.value);return}}if(p>=c){N(),b.close(),U();return}let O=p*s,j=Math.min(s,e.size-O);M();let ae=m.get(p);if(!ae)throw l("invalid_operation_response","A file chunk was not scheduled.");let se=await ae;if(m.delete(p),!se.ok)throw se.error;let be=se.chunk;if(be.byteLength!==j)throw l("invalid_operation_response","A file chunk had the wrong byte length.");d.update(be),h+=be.byteLength,p+=1,M(),n.onProgress?.({phase:"downloading",transferredBytes:h,totalBytes:e.size}),p===c&&N(),b.enqueue(be),p===c&&(b.close(),U())}catch(O){await U(),b.error(ze(O))}},cancel:U})}async downloadBytes(e,n={}){return new Uint8Array(await(await this.download(e,n)).arrayBuffer())}async move(e,n,i={}){return L(i,this.timeouts.requestMs,o=>this.moveWithinBudget(e,n,{...i,signal:o.signal,timeoutMs:null}))}async moveWithinBudget(e,n,i){this.requireAction("move");let o=i.mutationId??crypto.randomUUID(),r;try{r=await this.request("POST",`${encodeURIComponent(e.fileId)}/move`,{protocol_version:1,type:"move_file",mutation_id:o,file_id:e.fileId,if_revision:i.ifRevision??e.revision,from_path:e.path,path:n,update_references:!1},i.signal)}catch(a){throw ze(a)}if(r.protocol_version!==1||r.type!=="file_moved"||r.mutation_id!==o||r.file.file_id!==e.fileId||r.file.path!==n)throw l("invalid_operation_response","The authority returned an invalid file move receipt.");return Lt(r.file)}async delete(e,n={}){return L(n,this.timeouts.requestMs,i=>this.deleteWithinBudget(e,{...n,signal:i.signal,timeoutMs:null}))}async deleteWithinBudget(e,n){this.requireAction("delete");let i=n.mutationId??crypto.randomUUID(),o;try{o=await this.request("POST",`${encodeURIComponent(e.fileId)}/delete`,{protocol_version:1,type:"delete_file",mutation_id:i,file_id:e.fileId,if_revision:n.ifRevision??e.revision,path:e.path},n.signal)}catch(r){throw ze(r)}if(o.protocol_version!==1||o.type!=="file_deleted"||o.mutation_id!==i||o.file_id!==e.fileId||o.previous_path!==e.path)throw l("invalid_operation_response","The authority returned an invalid file delete receipt.");return{protocolVersion:o.protocol_version,type:o.type,mutationId:o.mutation_id,fileId:o.file_id,previousPath:o.previous_path,revision:o.revision}}async uploadPart(e,n,i,o,r,a,s){for(let c=1;c<=_e;c+=1){re(s);try{let d=await this.request("POST",`uploads/${encodeURIComponent(e)}/parts`,{protocol_version:1,type:"prepare_file_upload_part",transfer_id:e,part_number:n+1,content_length:r},s);_o(d,e,n,i,r,"PUT");let p=await fetch(d.url,{method:d.method,headers:bo(d.headers),body:o,redirect:"error",signal:s});if(!p.ok)throw new Error(`Object upload failed with HTTP ${p.status}.`);let u=p.headers.get("etag");if(a&&!u)throw new Error("Multipart object upload did not return an ETag.");return{part_number:n+1,etag:u??""}}catch(d){if(s?.aborted||c===_e)throw d}}throw new Error("Unreachable upload retry state.")}async tryReplayUploadCommit(e,n,i){try{return await this.commitUpload(e,n,i)}catch(o){if(o instanceof v&&o.code==="file_upload_incomplete")return null;throw o}}async commitUpload(e,n,i){let o;for(let r=1;r<=_e;r+=1){re(i);try{return await this.request("POST",`uploads/${encodeURIComponent(e)}/commit`,{protocol_version:1,type:"commit_file_upload",transfer_id:e,...n===void 0?{}:{parts:n}},i)}catch(a){if(o=a,i?.aborted||a instanceof v||r===_e)throw a}}throw o}requireAction(e){if(!this.capability()?.actions.includes(e))throw l("not_authorized",`This connection is not authorized to ${e} files.`)}async abort(e){await this.request("DELETE",`transfers/${encodeURIComponent(e)}`).catch(()=>{})}};function Lt(t){return{fileId:t.file_id,path:t.path,revision:t.revision,contentDigest:t.content_digest,size:t.size,...t.media_type?{mediaType:t.media_type}:{},mediaClass:t.media_class,modifiedAt:t.modified_at}}var Ne=class{constructor(e,n){this.internals=e;this.collectionId=n;this.transport=new zt({serverUrl:e.serverUrl,storage:e.storage,keyStore:e.keyStore,directAccessMode:e.directAccessMode,loopbackUrl:e.loopbackUrl,collectionId:n,internals:e,timeouts:e.timeouts,onChange:()=>this.emitConnection()}),this.files=new Ue(()=>this.fileCapability,(i,o,r,a)=>this.transport.files.control(i,o,r,a),{uploadChunk:(i,o,r,a)=>this.transport.files.uploadChunk(i,o,r,a),downloadChunk:(i,o,r)=>this.transport.files.downloadChunk(i,o,r)},{downloadPart:(i,o,r,a)=>this.transport.files.downloadHostedPart(i,o,r,a)},e.timeouts),this.collectionClient=new De({operation:(i,o,r)=>this.transport.performOperation(i,o,r)},e.timeouts.requestMs),this.notifications=new kt({serverUrl:e.serverUrl,storage:e.storage,authorizedToken:i=>this.transport.authorizedToken({signal:i,timeoutMs:null}),register:i=>this.internals.register({signal:i,timeoutMs:null}),notificationKey:i=>e.notificationKey(n,i),requestTimeoutMs:e.timeouts.requestMs})}internals;collectionId;collectionClient;notifications;transport;files;connectionListeners=new Set;get displayName(){return this.transport.currentToken()?.collectionName??`Collection ${this.collectionId.slice(0,8)}`}get operations(){return[...this.transport.currentToken()?.operations??[]]}get scope(){return this.transport.currentToken()?.scope??null}get fileCapability(){return this.transport.currentToken()?.fileCapability??null}get directAccess(){return this.transport.directAccess}get route(){return this.transport.route}register(e){return I(()=>this.internals.register(e),ue)}info(){let e=this.transport.currentToken();return e?{collectionId:e.collectionId,displayName:e.collectionName,operations:[...e.operations],scope:e.scope,...e.fileCapability?{fileCapability:e.fileCapability}:{},authority:e.authority?{kind:"hosted",durability:"provider"}:{kind:"connector",durability:"computer"},route:this.transport.route,directAccess:this.transport.directAccess}:null}authorizationCapabilities(e=ye){let n=this.operations,i=H(e).filter(o=>!n.includes(o));return{authorized:this.info()!==null,sufficient:this.info()!==null&&i.length===0,collectionId:this.collectionId,grantedOperations:n,missingOperations:i}}hasOperations(e){return this.authorizationCapabilities(e).sufficient}authorize(e={}){return I(()=>this.internals.authorize({...e,target:{kind:"collection",collectionId:this.collectionId}}),Ce)}async requestOperations(e,n={}){let i=this.authorizationCapabilities(e);return i.sufficient?T({kind:"unchanged",connection:this}):this.authorize({...n,operations:H([...i.grantedOperations,...i.missingOperations])})}onConnectionChange(e){return this.connectionListeners.add(e),e(this.info()),()=>this.connectionListeners.delete(e)}notifyStorageChanged(){this.transport.notifyStorageChanged()}checkDirectAccess(e){return I(()=>this.transport.checkDirectAccess(e),nn)}requestDirectAccess(e){return I(()=>this.transport.requestDirectAccess(e),nn)}disableDirectAccess(){this.transport.disableDirectAccess()}sync(){let e=this.transport.currentToken();if(!e)return null;let n=e.collectionId;if(!e.authority){if(!e.grantId||!e.operations.includes("sync"))return null;let o=e.grantId;return{collectionId:n,replicaId:o,transport:{openSession:r=>this.transport.performOperation("sync",{action:"open_session"},Bt(r,this.internals.timeouts.syncMs)),snapshot:(r,a,s)=>this.transport.performOperation("sync",{action:"snapshot",snapshot_id:r,...a?{page:a}:{}},Bt(s,this.internals.timeouts.syncMs)),changes:(r,a=200,s)=>this.transport.performOperation("sync",{action:"changes",after:r,limit:a},Bt(s,this.internals.timeouts.syncMs)),mutate:(r,a)=>this.transport.performOperation("sync",{action:"mutate",mutation:r},Bt(a,this.internals.timeouts.syncMs))}}}let i=e.authority.replicaId;return{collectionId:n,replicaId:i,transport:{openSession:o=>this.transport.performAuthoritySyncRequest(n,i,"POST","sessions",void 0,o),snapshot:(o,r,a)=>{let s=new URLSearchParams({snapshot_id:o});return r&&s.set("page",r),this.transport.performAuthoritySyncRequest(n,i,"GET",`snapshot?${s}`,void 0,a)},changes:(o,r=200,a)=>this.transport.performAuthoritySyncRequest(n,i,"GET",`changes?${new URLSearchParams({after:String(o),limit:String(r)})}`,void 0,a),mutate:(o,r)=>this.transport.performAuthoritySyncRequest(n,i,"POST","mutations",o,r)}}}registerNotifications(e){return I(()=>this.notifications.registerNotifications(e),Ve)}registerNativeNotifications(e){return I(()=>this.notifications.registerNativeNotifications(e),Ve)}unregisterNativeNotifications(e){return I(()=>this.notifications.unregisterNativeNotifications(e),Ve)}unregisterNotifications(e,n){return I(()=>this.notifications.unregisterNotifications(e,n),Ve)}forget(){let e=this.transport.currentToken();this.internals.removeToken(this.collectionId,e?.keyHandle,"not_authorized",!0),this.transport.notifyStorageChanged()}describe(e){return this.collectionClient.describe(e)}changes(e={},n){return this.collectionClient.changes(e,n)}read(e,n){return this.collectionClient.read(e,n)}query(e={},n){return this.collectionClient.query(e,n)}queryPages(e={},n={}){return this.collectionClient.queryPages(e,n)}queryAll(e={},n={}){return this.collectionClient.queryAll(e,n)}listViews(e){return this.collectionClient.listViews(e)}executeView(e,n){return this.collectionClient.executeView(e,n)}readViewSource(e,n){return this.collectionClient.readViewSource(e,n)}createViewSource(e,n){return this.collectionClient.createViewSource(e,n)}updateViewSource(e,n){return this.collectionClient.updateViewSource(e,n)}deleteViewSource(e,n){return this.collectionClient.deleteViewSource(e,n)}create(e,n){return this.collectionClient.create(e,n)}update(e,n){return this.collectionClient.update(e,n)}delete(e,n){return this.collectionClient.delete(e,n)}preflightDelete(e,n){return this.collectionClient.preflightDelete(e,n)}rename(e,n){return this.collectionClient.rename(e,n)}preflightRename(e,n){return this.collectionClient.preflightRename(e,n)}async renameWithProgress(e,n={}){return L(n,this.internals.timeouts.requestMs,async i=>{let o=Date.now(),r=!1,a,s=(c,d,p=0)=>{n.onProgress?.({operation:"rename",state:c,elapsedMs:Date.now()-o,cancellable:d,resumed:r,completedUnits:p,...a?{estimate:a}:{}})};try{he(i.signal),s("preflighting",!0);let c=n.preflight?T(n.preflight):await this.preflightRename(e,{signal:i.signal,timeoutMs:null});if(!c.ok)return c;let d=c.value;try{ui(e,d)}catch(f){if(f instanceof v)return A(f.problem);throw f}a=fi(e,d),s("ready",!0),he(i.signal);let p=this.transport.hasResumableMutationTransport();s("applying",p);let u=await this.rename(e,p?{signal:i.signal,timeoutMs:null}:{timeoutMs:Co(i.remainingMs())});return u.ok&&s("completed",!1,a.totalUnits),u}catch(c){if(cn(c,i.signal)&&s("cancelled",!1),c instanceof v)return A(c.problem);throw c}})}async deleteWithProgress(e,n={}){return L(n,this.internals.timeouts.requestMs,async i=>{let o=Date.now(),r=!1,a,s=(c,d,p=0)=>{n.onProgress?.({operation:"delete",state:c,elapsedMs:Date.now()-o,cancellable:d,resumed:r,completedUnits:p,...a?{estimate:a}:{}})};try{he(i.signal),s("preflighting",!0);let c=n.preflight?T(n.preflight):await this.preflightDelete(e,{signal:i.signal,timeoutMs:null});if(!c.ok)return c;let d=c.value;try{pi(e,d)}catch(f){if(f instanceof v)return A(f.problem);throw f}a=hi(d),s("ready",!0),he(i.signal);let p=this.transport.hasResumableMutationTransport();s("applying",p);let u=await this.delete(e,p?{signal:i.signal,timeoutMs:null}:{timeoutMs:Co(i.remainingMs())});return u.ok&&s("completed",!1,a.totalUnits),u}catch(c){if(cn(c,i.signal)&&s("cancelled",!1),c instanceof v)return A(c.problem);throw c}})}pendingMutations(){return this.transport.pendingMutations().map(e=>({...e,recover:n=>I(()=>this.recoverPendingMutation(e.requestId,n),q)}))}pendingMutation(e){let n=this.transport.pendingMutation(e);return n?{...n,recover:i=>I(()=>this.recoverPendingMutation(e,i),q)}:null}async recoverPendingMutation(e,n){let i=await this.transport.recoverPendingMutation(e,n);if(i&&typeof i=="object"&&"valid"in i){let o=i;if(!o.valid)throw new v(ve(o));return o.result}return i}validate(e={},n){return this.collectionClient.validate(e,n)}readType(e,n){return this.collectionClient.readType(e,n)}createType(e,n){return this.collectionClient.createType(e,n)}updateType(e,n){return this.collectionClient.updateType(e,n)}assessTypePack(e,n){return this.collectionClient.assessTypePack(e,n)}applyTypePack(e,n){return this.collectionClient.applyTypePack(e,n)}assessCollectionSetup(e,n){return this.collectionClient.assessCollectionSetup(e,n)}applyCollectionSetup(e,n){return this.collectionClient.applyCollectionSetup(e,n)}listTimers(e,n){return this.collectionClient.listTimers(e,n)}putTimer(e,n){return this.collectionClient.putTimer(e,n)}cancelTimer(e,n){return this.collectionClient.cancelTimer(e,n)}reconcileTimers(e,n){return this.collectionClient.reconcileTimers(e,n)}watch(e={},n={}){return I(()=>F(n,this.internals.timeouts.watchStartMs,async i=>{let o=await this.collectionClient.changes(e.cursor===void 0?{}:{after:e.cursor,limit:200},{signal:i.signal,timeoutMs:null});if(!o.ok)throw new v(o.problem);if(o.value.reset)throw new v(k("change_cursor_reset","The collection change cursor expired. Refresh collection state before subscribing again."));return new Sn(this.collectionClient,o.value.cursor,e,e.cursor===void 0?[]:o.value.events,this.internals.timeouts.watchStartMs)}),mt)}emitConnection(){let e=this.info();for(let n of this.connectionListeners)n(e)}},Sn=class{constructor(e,n,i,o,r){this.client=e;this.input=i;this.watchStartTimeoutMs=r;this.pendingChanges=[...o],this.currentStatus={state:"connected",cursor:n,recovered:!1};let a=i.lifetimeSignal;if(a?.aborted)this.close();else if(a){let s=()=>this.close();a.addEventListener("abort",s,{once:!0}),this.removeLifetimeAbort=()=>a.removeEventListener("abort",s)}this.controller.signal.aborted||this.run(n)}client;input;watchStartTimeoutMs;changes=new Set;statuses=new Set;problems=new Set;controller=new AbortController;removeLifetimeAbort;currentStatus;currentProblem=null;pendingChanges;get status(){return this.currentStatus}get problem(){return this.currentProblem}subscribe(e,n,i){this.changes.add(e),n&&(this.statuses.add(n),n(this.currentStatus)),i&&(this.problems.add(i),this.currentProblem&&i(this.currentProblem));for(let o of this.pendingChanges)e(o);return this.pendingChanges=[],()=>{this.changes.delete(e),n&&this.statuses.delete(n),i&&this.problems.delete(i)}}close(){if(this.controller.signal.aborted)return;this.controller.abort(),this.removeLifetimeAbort?.(),this.removeLifetimeAbort=void 0;let e="cursor"in this.currentStatus?this.currentStatus.cursor:void 0;this.publishStatus({state:"closed",...e===void 0?{}:{cursor:e}})}async run(e){let n=!0,i=this.client.watch({cursor:e,pollIntervalMs:this.input.pollIntervalMs,retry:this.input.retry,signal:this.controller.signal,timeoutMs:this.watchStartTimeoutMs,onStatus:o=>{if(n&&o.state==="connecting"){n=!1;return}n=!1,this.publishStatus(o)}});try{for await(let o of i){if(this.controller.signal.aborted)return;if(!o.ok){this.currentProblem=o.problem;for(let r of this.problems)r(o.problem);return}for(let r of this.changes)r(o.value)}}finally{this.controller.signal.aborted||this.close()}}publishStatus(e){this.currentStatus=e;for(let n of this.statuses)n(e)}};function Bt(t,e){return{...t,timeoutMs:t?.timeoutMs===void 0?e:t.timeoutMs}}function Co(t){return t===null?null:Math.max(1,Math.ceil(t))}function Rn(t){let e="bundle:";if(!t.startsWith(e)||t.length===e.length)throw new Error("The registered application has no valid declaration identity.");return t.slice(e.length)}function Le(t,e,n){return t.reason instanceof v?t.reason:l("authorization_cancelled",e,{cause:n})}function wo({body:t,clientId:e,keyHandle:n,previous:i,defaultApplicationOrigin:o,pinConnectorIdentity:r}){let a=t.collection_id;if(typeof a!="string")throw l("invalid_token_response","Authorization returned no collection ID.");let s=wt(t.scope);if(!s)throw l("invalid_token_response","Authorization returned no valid collection scope.");if(t.authority&&!Xe(t.authority,a))throw l("invalid_token_response","Authorization returned an invalid remote authority capability.");if(t.authority&&t.encryption)throw l("invalid_token_response","Authorization returned conflicting collection transports.");if(t.file_capability!==null&&t.file_capability!==void 0&&!Ct(t.file_capability))throw l("invalid_token_response","Authorization returned an invalid file capability.");if(t.encryption){try{J(t.encryption)}catch{throw l("invalid_token_response","Authorization returned an invalid encrypted relay binding.")}if(r(t.encryption.connector_id,t.encryption.connector_agreement_public_key),t.encryption.collection_id!==a||typeof t.grant_id!="string"||t.grant_id.length===0)throw l("invalid_token_response","Authorization returned an encrypted relay binding for another grant.")}if(i?.encryption&&t.encryption&&i.keyHandle&&i.keyHandle===n&&(i.grantId!==t.grant_id||i.encryption.connector_id!==t.encryption.connector_id||i.encryption.connector_agreement_public_key!==t.encryption.connector_agreement_public_key||i.encryption.application_agreement_public_key!==t.encryption.application_agreement_public_key))throw l("connector_identity_changed","The connector identity changed during authorization renewal. Reauthorize before sending collection data.");return{version:1,accessToken:t.access_token,refreshToken:t.refresh_token,clientId:e,collectionId:a,collectionName:t.collection_name??`Collection ${a.slice(0,8)}`,operations:t.operations,scope:s,expiresAt:Date.now()+t.expires_in*1e3,refreshExpiresAt:t.refresh_expires_in?Date.now()+t.refresh_expires_in*1e3:void 0,grantId:t.grant_id,encryption:t.encryption??void 0,fileCapability:t.file_capability??void 0,applicationOrigin:t.application_origin??o,keyHandle:n,savedAt:Date.now(),authority:t.authority?{operationsUrl:t.authority.operations_url,syncUrl:t.authority.sync_url,filesUrl:t.authority.files_url,replicaId:t.authority.replica_id,accessToken:t.authority.access_token,proofPublicKey:t.authority.proof_public_key}:void 0}}var jt=class{serverUrl;manifest;manifestSource;redirectUri;storage;relayEncryption;keyStore;identityStore;directAccessMode;loopbackUrl;navigate;timeouts;credentialStorage;application=null;manifestPromise=null;completionPromises=new Map;connectionCache=new Map;listeners=new Set;invalidatedConnections=new Map;constructor(e){this.serverUrl=wi(String(e.serverUrl)),this.manifest=e.manifest instanceof URL?e.manifest.href:e.manifest??Si(),this.manifestSource=typeof this.manifest=="string"?this.manifest:this.manifest.distribution==="portable"?`bundle:${this.manifest.id}:${Ti(this.manifest)}`:`bundle:${this.manifest.id}`;let n=ki(this.manifest);this.redirectUri=e.redirectUri===void 0?typeof this.manifest!="string"&&this.manifest.distribution==="portable"?"":Ri():String(e.redirectUri),this.storage=e.storage??Oi(n),this.relayEncryption=e.relayEncryption??"required",this.keyStore=e.keyStore??(n?new Re:new Se),this.identityStore=e.identityStore??(n?new xe:new Me),this.credentialStorage=e.storage||e.keyStore||e.identityStore?"custom":this.storage instanceof Oe?"memory":"persistent",this.directAccessMode=e.directAccess??"auto",this.loopbackUrl=_i(String(e.loopbackUrl??`http://127.0.0.1:${Vn}`)),this.navigate=e.navigate,this.timeouts=we(e.timeouts),typeof window<"u"&&this.storage===window.localStorage&&window.addEventListener("storage",i=>{i.storageArea!==this.storage||!i.key?.startsWith(this.storagePrefix())||(this.connectionCache.get(Pi(i.key))?.notifyStorageChanged(),this.emitConnections())})}environment(){let e=typeof this.manifest!="string"&&this.manifest.distribution==="portable"?"portable":this.application?.distribution??"web";return{distribution:e,applicationOrigin:e==="portable"?"null":this.defaultApplicationOrigin(),credentialStorage:this.credentialStorage}}register(e={}){return F(e,this.timeouts.requestMs,n=>this.registerWithinBudget(n.signal))}async registerWithinBudget(e){if(this.application)return this.application;let n=await Y(`${this.serverUrl}/v1/apps/register`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({manifest:await this.manifestDeclaration({signal:e,timeoutMs:null})}),signal:e},"temporarily_unavailable","Application registration is temporarily unavailable."),i=await R(n,"invalid_operation_response","Connect returned an invalid application registration response.");if(!n.ok)throw P(i,"discovery_failed","Application discovery failed.",n.status);return this.application=i.application,this.application}manifestDeclaration(e={}){if(this.manifestPromise)return this.manifestPromise;let i=F(e,this.timeouts.requestMs,o=>this.loadManifest(o.signal)).catch(o=>{throw this.manifestPromise===i&&(this.manifestPromise=null),o});return this.manifestPromise=i,this.manifestPromise}async loadManifest(e){if(typeof this.manifest!="string")return this.manifest;let n=this.manifest,i;try{i=await fetch(n,{headers:{accept:"application/json"},signal:e})}catch(o){throw l("manifest_load_failed","The bundled application declaration could not be loaded.",{cause:o})}if(!i.ok)throw l("manifest_load_failed",`The bundled application declaration returned HTTP ${i.status}.`,{status:i.status});try{return await R(i,"invalid_application_manifest","The bundled application declaration is not valid JSON.")}catch(o){throw l("invalid_application_manifest","The bundled application declaration is not valid JSON.",{cause:o,details:{issues:[{path:"/",keyword:"json",message:"must be valid JSON",params:{}}]}})}}async authorize(e={}){return F(e,this.timeouts.requestMs,n=>this.authorizeWithinBudget({...e,signal:n.signal,timeoutMs:null}))}async authorizeWithinBudget(e){if(typeof location>"u"&&!this.navigate&&!e.openVerification)throw l("browser_required","Authorization navigation requires a browser environment.");let i=typeof this.manifest!="string"&&this.manifest.distribution==="portable"&&!e.openVerification&&!this.navigate&&typeof window<"u"?window.open("","mdbase-connect-authorization","popup,width=620,height=760"):null,o;try{o=await this.registerWithinBudget(e.signal)}catch(r){throw i?.close(),r}return o.distribution==="portable"?(e.openVerification&&i?.close(),this.authorizePortable(o,e,e.openVerification?null:i)):(i?.close(),this.authorizeWeb(o,e))}async authorizeWeb(e,n){let{verifier:i,challenge:o}=await Ye(),r=K(24),a=crypto.randomUUID(),s=n.target?.kind==="collection"?n.target.collectionId:void 0,c=`grant:${e.id}:${r}`,d=await this.keyStore.create(c),p;try{p=await this.loadApplicationIdentity(e)}catch(y){throw await this.keyStore.delete(c),y}let u=H(n.operations??ye),f=new Date,h=await nt({protocol_version:je,authorization_id:a,application_id:e.id,application_declaration_id:Rn(e.family_identity),application_manifest_digest:e.manifest_digest,application_installation_id:await Ee(p),installation_signing_public_key:p.signingPublicKey,grant_agreement_public_key:d.agreementPublicKey,grant_signing_public_key:d.signingPublicKey,flow:"authorization_code",authorization_nonce:K(32),issued_at:f.toISOString(),expires_at:new Date(f.getTime()+600*1e3).toISOString(),redirect_uri:this.redirectUri,state:r,code_challenge:o,contracts:Zt(u,e.requirements?.files),requested_operations:u,...e.requirements?.files?{requested_files:e.requirements.files}:{},...s?{collection_id:s}:{}},p),_={version:1,verifier:i,state:r,clientId:e.id,redirectUri:this.redirectUri,relayEncryption:this.relayEncryption,collectionId:s,returnTo:n.returnTo,keyHandle:c,authorizationId:a,applicationAgreementPublicKey:d.agreementPublicKey,applicationSigningPublicKey:d.signingPublicKey};this.storage.setItem(this.pendingKey(r),JSON.stringify(_));try{let y=await fetch(`${this.serverUrl}/oauth/authorization_request`,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:e.id,redirect_uri:this.redirectUri,code_challenge:o,code_challenge_method:"S256",state:r,operations:u.join(","),...s?{collection_id:s}:{},application_authorization:JSON.stringify(h)}),signal:n.signal}),w=await R(y,"invalid_device_authorization_response","The authorization service returned an invalid authorization response.");if(!y.ok)throw P(w,"device_authorization_failed","Application authorization could not be started.",y.status);if(typeof w.authorization_uri!="string"||w.authorization_id!==a||!Number.isInteger(w.expires_in)||w.expires_in<=0)throw l("invalid_device_authorization_response","The authorization service returned an invalid authorization response.");if(this.navigate)await this.navigate(w.authorization_uri);else if(typeof location<"u")location.assign(w.authorization_uri);else throw l("browser_required","Authorization navigation requires a browser environment.");return{kind:"redirecting"}}catch(y){throw this.storage.removeItem(this.pendingKey(r)),await this.keyStore.delete(c),n.signal?.aborted?Le(n.signal,"Application authorization was cancelled.",y):y}}async authorizePortable(e,n,i){if(this.relayEncryption!=="required")throw i?.close(),l("encryption_required","Downloaded applications require encrypted relay authorization.");let{verifier:o,challenge:r}=await Ye(),a=`grant:${e.id}:${K(24)}`,s=await this.keyStore.create(a),c;try{c=await this.loadApplicationIdentity(e)}catch(m){throw i?.close(),await this.keyStore.delete(a),m}let d=H(n.operations??ye),p=crypto.randomUUID(),u=new Date,f=await nt({protocol_version:je,authorization_id:p,application_id:e.id,application_declaration_id:Rn(e.family_identity),application_manifest_digest:e.manifest_digest,application_installation_id:await Ee(c),installation_signing_public_key:c.signingPublicKey,grant_agreement_public_key:s.agreementPublicKey,grant_signing_public_key:s.signingPublicKey,flow:"device_code",authorization_nonce:K(32),issued_at:u.toISOString(),expires_at:new Date(u.getTime()+600*1e3).toISOString(),code_challenge:r,contracts:Zt(d,e.requirements?.files),requested_operations:d,...e.requirements?.files?{requested_files:e.requirements.files}:{},...n.target?.kind==="collection"?{collection_id:n.target.collectionId}:{}},c),h,_;try{h=await fetch(`${this.serverUrl}/oauth/device_authorization`,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:e.id,operations:d.join(","),...n.target?.kind==="collection"?{collection_id:n.target.collectionId}:{},code_challenge:r,code_challenge_method:"S256",application_authorization:JSON.stringify(f)}),signal:n.signal}),_=await R(h,"invalid_device_authorization_response","The authorization service returned an invalid device authorization response.")}catch(m){throw i?.close(),await this.keyStore.delete(a),l("device_authorization_failed","Downloaded application authorization could not be started.",{cause:m})}if(!h.ok)throw i?.close(),await this.keyStore.delete(a),P(_,"device_authorization_failed","Downloaded application authorization could not be started.",h.status);let y;try{y=Ci(_)}catch(m){throw i?.close(),await this.keyStore.delete(a),n.signal?.aborted?Le(n.signal,"Downloaded application authorization was cancelled.",m):m}if(n.onDeviceCode?.(y),n.openVerification)await n.openVerification(y);else if(i)try{i.location.href=y.verificationUriComplete}catch{}else throw await this.keyStore.delete(a),l("approval_window_blocked","The approval window was blocked. Show the provided verification link and code, then try again.",{details:{user_code:y.userCode,verification_uri:y.verificationUri,verification_uri_complete:y.verificationUriComplete,expires_at:y.expiresAt,interval_seconds:y.intervalSeconds}});let w=y.intervalSeconds;try{for(;Date.now()<y.expiresAt;){if(await tt(w*1e3,n.signal),n.signal?.aborted)throw Le(n.signal,"Downloaded application authorization was cancelled.");let m;try{m=await fetch(`${this.serverUrl}/oauth/token`,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:_.device_code,client_id:e.id,code_verifier:o}),signal:n.signal})}catch(b){if(n.signal?.aborted)throw Le(n.signal,"Downloaded application authorization was cancelled.",b);continue}let g=await R(m,"invalid_token_response","The authorization service returned an invalid token response.");if(!m.ok){let b=Qe(g);if(b==="authorization_pending")continue;if(b==="slow_down"){w+=5;continue}throw P(g,"token_exchange_failed","Downloaded application authorization could not be completed.",m.status)}let M=Xe(g.authority,g.collection_id),U=g.encryption&&g.encryption.protocol_version===ft&&g.encryption.suite===He&&g.encryption.application_agreement_public_key===s.agreementPublicKey;if(g.application_origin!=="null")throw l("invalid_token_response","Authorization did not bind the portable grant to its opaque application origin.");if(g.authority&&(!M||g.encryption!=null||g.authority.proof_public_key!==s.signingPublicKey))throw l("invalid_token_response","Authorization returned a remote authority capability that is not bound to this portable grant key.");if(!g.authority&&!U)throw l("encryption_required","Authorization did not establish the expected key-bound local portable grant.");let N=this.storeTokenResponse(g,e.id,a);if(n.target?.kind==="collection"&&n.target.collectionId!==N.collectionId)throw this.removeToken(N.collectionId,N.keyHandle),l("collection_mismatch","The approved collection does not match the collection requested by this link.");return i?.close(),{kind:"connected",connection:this.connection(N.collectionId),...n.returnTo?{returnTo:n.returnTo}:{}}}throw l("expired_token","The downloaded application authorization code expired.")}catch(m){throw i?.close(),await this.keyStore.delete(a),n.signal?.aborted?Le(n.signal,"Downloaded application authorization was cancelled.",m):m}}completeAuthorization(e,n={}){return F(n,this.timeouts.requestMs,i=>this.completeAuthorizationWithinBudget(e,i.signal))}completeAuthorizationWithinBudget(e,n){let i=new URL(e).searchParams.get("state");if(!i)return Promise.reject(l("invalid_callback","Authorization callback is missing its state."));let o=this.completionPromises.get(i);if(o)return o;let a=this.performAuthorizationCompletion(e,i,n).finally(()=>{this.completionPromises.get(i)===a&&this.completionPromises.delete(i)});return this.completionPromises.set(i,a),a}async performAuthorizationCompletion(e,n,i){let o=new URL(e),r=o.searchParams.get("code"),a=this.pendingKey(n),s=x(this.storage.getItem(a));if(!s||s.version!==1||n!==s.state)throw l("invalid_callback","Authorization callback is missing or does not match this browser session.");if(o.searchParams.has("error"))throw s.keyHandle&&await this.keyStore.delete(s.keyHandle),this.storage.removeItem(a),z(o.searchParams.get("error")??"access_denied",o.searchParams.get("error_description")??"Collection access was not approved.",{details:s.returnTo?{return_to:s.returnTo}:void 0});if(!r)throw l("invalid_callback","Authorization callback is missing its code.");let c=await Y(`${this.serverUrl}/oauth/token`,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",code:r,client_id:s.clientId,redirect_uri:s.redirectUri,code_verifier:s.verifier}),signal:i},"temporarily_unavailable","Authorization completion is temporarily unavailable."),d=await R(c,"invalid_token_response","The authorization service returned an invalid token response.");if(!c.ok)throw P(d,"token_exchange_failed","Authorization could not be completed.",c.status);if(s.relayEncryption==="required"&&!d.authority&&(!d.encryption||!s.keyHandle||d.encryption.application_agreement_public_key!==s.applicationAgreementPublicKey))throw s.keyHandle&&await this.keyStore.delete(s.keyHandle),this.storage.removeItem(a),l("encryption_required","Authorization did not establish the required encrypted relay grant.");if(d.authority?.proof_public_key){if(!s.keyHandle||!s.applicationSigningPublicKey||d.authority.proof_public_key!==s.applicationSigningPublicKey)throw s.keyHandle&&await this.keyStore.delete(s.keyHandle),this.storage.removeItem(a),l("invalid_token_response","Authorization returned a remote authority capability bound to another application key.")}else d.authority&&s.keyHandle&&await this.keyStore.delete(s.keyHandle);let p=this.storeTokenResponse(d,s.clientId,d.authority?.proof_public_key?s.keyHandle:d.authority?void 0:s.keyHandle);if(s.collectionId&&s.collectionId!==p.collectionId)throw this.removeToken(p.collectionId,p.keyHandle),this.storage.removeItem(a),l("collection_mismatch","The approved collection does not match the collection requested by this link.");return this.storage.removeItem(a),{connection:this.connection(p.collectionId),...s.returnTo?{returnTo:s.returnTo}:{}}}connections(){let e=[];for(let n of this.connectionIds()){let i=this.connection(n)?.info();i&&e.push(i)}return e.sort((n,i)=>n.displayName.localeCompare(i.displayName)||n.collectionId.localeCompare(i.collectionId))}connection(e){if(!this.storage.getItem(this.tokenKey(e)))return null;let n=this.connectionCache.get(e);return n||(n=new Ne(this,e),this.connectionCache.set(e,n)),n.info()?n:null}unavailableReason(e){return this.invalidatedConnections.get(e)??null}onConnectionsChange(e){return this.listeners.add(e),e(this.connections()),()=>this.listeners.delete(e)}storeTokenResponse(e,n,i){let o=e.collection_id;if(typeof o!="string")throw l("invalid_token_response","Authorization returned no collection ID.");let r=x(this.storage.getItem(this.tokenKey(o))),a=wo({body:e,clientId:n,keyHandle:i,previous:r,defaultApplicationOrigin:this.defaultApplicationOrigin(),pinConnectorIdentity:(s,c)=>this.pinConnectorIdentity(s,c)});return r?.keyHandle&&r.keyHandle!==i&&this.keyStore.delete(r.keyHandle).catch(()=>{}),this.storage.setItem(this.tokenKey(o),JSON.stringify(a)),this.addConnectionId(o),this.invalidatedConnections.delete(o),this.connectionCache.delete(o),this.emitConnections(),a}forgetConnectorIdentity(e){this.storage.removeItem(this.connectorPinKey(e))}pinConnectorIdentity(e,n){let i=this.connectorPinKey(e),o=x(this.storage.getItem(i));if(o&&(o.version!==1||o.publicKey!==n))throw l("connector_identity_changed","The connector identity changed since this application first connected. Forget the saved connector identity only after verifying the computer, then authorize again.");o||this.storage.setItem(i,JSON.stringify({version:1,publicKey:n}))}connectorPinKey(e){return`mdbase-connect:${this.serverUrl}:connector-pin:${e}`}async loadApplicationIdentity(e){try{return await At(this.identityStore,this.serverUrl,e)}catch(n){throw l("application_identity_unavailable",n instanceof me?n.message:"The application installation identity is unavailable.",{cause:n})}}removeToken(e,n,i="authorization_lost",o=!1){this.invalidatedConnections.set(e,i),n&&(o||!this.pendingMutationsUseKey(e,n))&&this.keyStore.delete(n).catch(()=>{}),this.storage.removeItem(this.tokenKey(e)),o&&this.removePendingMutations(e);for(let r of["web_push","fcm"])this.storage.removeItem(this.notificationKey(e,r));this.storage.setItem(this.connectionsKey(),JSON.stringify({version:1,collectionIds:this.connectionIds().filter(r=>r!==e)})),this.connectionCache.delete(e),this.emitConnections()}tokenKey(e){return`${this.storagePrefix()}:token:${e}`}pendingMutationKey(e){return`${this.storagePrefix()}:pending-mutation:${e}`}removePendingMutations(e){let n=this.pendingMutationKey(e),i=[n];for(let o=0;o<this.storage.length;o+=1){let r=this.storage.key(o);r?.startsWith(`${n}:`)&&i.push(r)}for(let o of i){let r=x(this.storage.getItem(o));r?.keyHandle&&this.keyStore.delete(r.keyHandle).catch(()=>{}),this.storage.removeItem(o)}}pendingMutationsUseKey(e,n){let i=this.pendingMutationKey(e);for(let o=0;o<this.storage.length;o+=1){let r=this.storage.key(o);if(r!==i&&!r?.startsWith(`${i}:`))continue;if(x(this.storage.getItem(r))?.keyHandle===n)return!0}return!1}notificationKey(e,n="web_push"){return`${this.storagePrefix()}:notifications:${e}:${n}`}directPreferenceKey(){return`mdbase-connect:direct:${this.defaultApplicationOrigin()}`}defaultApplicationOrigin(){return Ai(this.manifest,this.manifestSource,this.redirectUri,this.application?.distribution==="portable")}pendingKey(e){return`${this.storagePrefix()}:pending:${e}`}storagePrefix(){return`mdbase-connect:${this.serverUrl}:${this.manifestSource}`}connectionsKey(){return`${this.storagePrefix()}:connections`}connectionIds(){let e=x(this.storage.getItem(this.connectionsKey()));return e?.version===1&&Array.isArray(e.collectionIds)&&e.collectionIds.every(n=>typeof n=="string")?e.collectionIds:[]}addConnectionId(e){this.storage.setItem(this.connectionsKey(),JSON.stringify({version:1,collectionIds:[...new Set([...this.connectionIds(),e])]}))}emitConnections(){let e=this.connections();for(let n of this.listeners)n(e)}};var Kt=class{internals;constructor(e){this.internals=new jt(e)}register(e){return I(()=>this.internals.register(e),ue)}authorize(e={}){return I(()=>this.internals.authorize(e),Ce)}application(e){return new Te(this,e,this.internals.timeouts)}manifest(e){return I(()=>this.internals.manifestDeclaration(e),ue)}environment(){return this.internals.environment()}completeAuthorization(e,n){return I(()=>this.internals.completeAuthorization(e===void 0?St():String(e),n),Ce)}connections(){return this.internals.connections()}connection(e){return this.internals.connection(e)}unavailableReason(e){return this.internals.unavailableReason(e)}onConnectionsChange(e){return this.internals.onConnectionsChange(e)}forgetAll(){for(let e of this.connections())this.connection(e.collectionId)?.forget()}forgetConnectorIdentity(e){this.internals.forgetConnectorIdentity(e)}};function An(t){if(!t||typeof t!="object")throw l("invalid_push_payload","The push payload is not an object.");let e=t;if(e.type!=="mdbase.notification"||e.version!==1||typeof e.signal_id!="string"||typeof e.criterion_id!="string"||typeof e.cursor!="string"||!e.presentation||typeof e.presentation.title!="string")throw l("invalid_push_payload","The push payload is not an mdbase notification.");return e}function So(t){if(!t||typeof t!="object")throw l("invalid_push_payload","The native notification data is not an object.");let e=t;if(e.type!=="mdbase.notification"||e.version!==1&&e.version!=="1"||typeof e.signal_id!="string"||typeof e.criterion_id!="string"||typeof e.cursor!="string")throw l("invalid_push_payload","The native notification data is not an mdbase notification.");return{type:"mdbase.notification",version:1,signal_id:e.signal_id,criterion_id:e.criterion_id,cursor:e.cursor}}function Ro(t,e){let n=An(e);return t.showNotification(n.presentation.title,{...n.presentation.body?{body:n.presentation.body}:{},...n.presentation.tag?{tag:n.presentation.tag}:{},data:{type:n.type,signal_id:n.signal_id,criterion_id:n.criterion_id,cursor:n.cursor}})}function Ao(t){return{subscribe:e=>t.subscribe(e),getSnapshot:()=>t.getSnapshot()}}var Ht=class{collectionParameter;fallbackPath;listeners=new Set;handlePopState=()=>this.emit();constructor(e={}){this.collectionParameter=e.collectionParameter??"collection",this.fallbackPath=e.fallbackPath??"/"}selectedCollectionId(){return this.currentUrl().searchParams.get(this.collectionParameter)}select(e,n={}){let i=Ze(this.currentUrl());e?i.searchParams.set(this.collectionParameter,e):i.searchParams.delete(this.collectionParameter);let o=this.browserHistory();o[n.history==="push"?"pushState":"replaceState"](o.state,"",i),this.emit()}authorizationReturnTo(){let e=Ze(this.currentUrl());return`${e.pathname}${e.search}${e.hash}`}authorizationCallback(){let e=this.currentUrl().href;return Rt(e)?e:null}finishAuthorization(e,n){let i=this.safeAppUrl(e??this.fallbackPath);Ze(i),i.searchParams.set(this.collectionParameter,n),this.browserHistory().replaceState(null,"",i),this.emit()}clearAuthorizationCallback(e){let n=e?this.safeAppUrl(e):this.currentUrl(),i=this.browserHistory();i.replaceState(i.state,"",Ze(n)),this.emit()}subscribe(e){let n=this.listeners.size===0;return this.listeners.add(e),n&&typeof window<"u"&&window.addEventListener("popstate",this.handlePopState),()=>{this.listeners.delete(e),this.listeners.size===0&&typeof window<"u"&&window.removeEventListener("popstate",this.handlePopState)}}emit(){for(let e of this.listeners)e()}safeAppUrl(e){let n=this.currentUrl(),i=new URL(e,n.origin);return i.origin===n.origin?i:new URL(this.fallbackPath,n.origin)}currentUrl(){if(typeof location>"u")throw l("browser_required","Browser selection requires a browser environment.");return new URL(location.href)}browserHistory(){if(typeof history>"u")throw l("browser_required","Browser selection requires a browser environment.");return history}},$t=class{collectionId=null;listeners=new Set;selectedCollectionId(){return this.collectionId}select(e){if(e!==this.collectionId){this.collectionId=e;for(let n of this.listeners)n()}}authorizationReturnTo(){}authorizationCallback(){return null}finishAuthorization(e,n){this.select(n)}clearAuthorizationCallback(){}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}};return xo(Aa);})();
|
|
1
|
+
"use strict";var MdbaseConnect=(()=>{var Wt=Object.defineProperty;var zo=Object.getOwnPropertyDescriptor;var Uo=Object.getOwnPropertyNames;var No=Object.prototype.hasOwnProperty;var Lo=(t,e)=>{for(var n in e)Wt(t,n,{get:e[n],enumerable:!0})},Bo=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Uo(e))!No.call(t,o)&&o!==n&&Wt(t,o,{get:()=>e[o],enumerable:!(i=zo(e,o))||i.enumerable});return t};var jo=t=>Bo(Wt({},"__esModule",{value:!0}),t);var La={};Lo(La,{ApplicationIdentityStoreError:()=>ge,FileTransferCryptoError:()=>ee,GrantFileTransferCipher:()=>ze,IndexedDbApplicationIdentityStore:()=>Ee,IndexedDbGrantKeyStore:()=>Pe,MDBASE_RECORD_CREATED_CONTRACT:()=>Qn,MDBASE_TIMER_FIRED_CONTRACT:()=>Xn,MdbaseApplicationSession:()=>Me,MdbaseBrowserSelection:()=>$t,MdbaseCollectionClient:()=>Fe,MdbaseConnect:()=>Vt,MdbaseConnectError:()=>b,MdbaseConnection:()=>je,MdbaseFileClient:()=>Be,MdbaseMemorySelection:()=>Gt,MdbaseMemoryVerificationStore:()=>it,MdbaseSession:()=>Ie,MemoryApplicationIdentityStore:()=>De,MemoryGrantKeyStore:()=>Ae,RelayCryptoError:()=>S,applicationIdentity:()=>At,applicationInstallationId:()=>qe,authorityProofMessage:()=>ln,connectError:()=>d,connectFailure:()=>A,connectProblem:()=>I,connectSuccess:()=>M,createPkce:()=>Ze,decryptRelayResponse:()=>Oe,deriveFileTransferKey:()=>_n,deriveP256SharedSecret:()=>Qe,effectiveCapabilities:()=>yt,encryptRelayRequest:()=>Q,externalStore:()=>qo,isRetryableConnectError:()=>ni,operationProblem:()=>we,operationsForApplicationCapabilities:()=>dt,parseMdbaseNativeNotificationData:()=>Eo,parseMdbasePushPayload:()=>kn,showMdbasePushNotification:()=>Do,signApplicationAuthorization:()=>rt,signAuthorityRequest:()=>vt,validateGrantEncryption:()=>X});var de={access_denied:{category:"authorization",recovery:"reauthorize"},access_paused:{category:"availability",recovery:"resume_connector_access"},application_identity_unavailable:{category:"compatibility",recovery:"upgrade_application"},approval_window_blocked:{category:"authorization",recovery:"reauthorize"},authority_authorization_changed:{category:"authorization",recovery:"reauthorize"},authorization_binding_incompatible:{category:"compatibility",recovery:"upgrade_application"},authorization_cancelled:{category:"cancellation",recovery:"none"},authorization_expired:{category:"authorization",recovery:"reauthorize"},authorization_replayed:{category:"integrity",recovery:"reauthorize"},browser_required:{category:"compatibility",recovery:"none"},callback_url_required:{category:"validation",recovery:"fix_request"},capability_contract_incompatible:{category:"compatibility",recovery:"upgrade_application"},change_cursor_reset:{category:"conflict",recovery:"refresh"},collection_access_denied:{category:"authorization",recovery:"reauthorize"},collection_configuration_invalid:{category:"validation",recovery:"repair_collection"},collection_contracts_missing:{category:"compatibility",recovery:"choose_collection"},collection_incompatible:{category:"compatibility",recovery:"choose_collection"},collection_invalid:{category:"validation",recovery:"repair_collection"},collection_kind_unsupported:{category:"compatibility",recovery:"choose_collection"},collection_mismatch:{category:"selection",recovery:"choose_collection"},collection_not_found:{category:"selection",recovery:"choose_collection"},collection_not_ready:{category:"selection",recovery:"choose_collection"},collection_not_selected:{category:"selection",recovery:"choose_collection"},collection_type_registry_invalid:{category:"validation",recovery:"repair_collection"},collection_version_unsupported:{category:"compatibility",recovery:"upgrade_collection"},concurrent_modification:{category:"conflict",recovery:"refresh"},connector_busy:{category:"availability",recovery:"retry"},connector_identity_changed:{category:"integrity",recovery:"reauthorize"},connector_offline:{category:"availability",recovery:"retry"},connector_upgrade_required:{category:"compatibility",recovery:"upgrade_connector"},device_authorization_failed:{category:"authorization",recovery:"reauthorize"},direct_operation_rejected:{category:"authorization",recovery:"reauthorize"},discovery_failed:{category:"availability",recovery:"retry"},durable_mutation_unsupported:{category:"compatibility",recovery:"upgrade_connector"},encrypted_relay_rejected:{category:"authorization",recovery:"reauthorize"},encryption_required:{category:"authorization",recovery:"reauthorize"},expired_token:{category:"authorization",recovery:"reauthorize"},file_changed_during_move:{category:"conflict",recovery:"refresh"},file_changed_during_read:{category:"conflict",recovery:"refresh"},file_move_failed:{category:"internal",recovery:"contact_support"},file_mutation_conflict:{category:"conflict",recovery:"resolve_conflict"},file_not_found:{category:"conflict",recovery:"refresh"},file_source_mismatch:{category:"conflict",recovery:"refresh"},file_upload_incomplete:{category:"conflict",recovery:"retry"},fresh_request_required:{category:"availability",recovery:"retry"},hosted_provider_unavailable:{category:"availability",recovery:"retry"},insufficient_access:{category:"authorization",recovery:"reauthorize"},invalid_application_authorization:{category:"validation",recovery:"fix_request"},invalid_application_manifest:{category:"validation",recovery:"fix_request"},invalid_callback:{category:"validation",recovery:"fix_request"},invalid_device_authorization_response:{category:"integrity",recovery:"contact_support"},invalid_encrypted_response:{category:"integrity",recovery:"contact_support"},invalid_loopback_url:{category:"validation",recovery:"fix_request"},invalid_mutation_id:{category:"validation",recovery:"fix_request"},invalid_operation_response:{category:"integrity",recovery:"contact_support"},invalid_path:{category:"validation",recovery:"fix_request"},invalid_preflight:{category:"conflict",recovery:"refresh"},invalid_push_payload:{category:"validation",recovery:"fix_request"},invalid_push_subscription:{category:"validation",recovery:"fix_request"},invalid_request:{category:"validation",recovery:"fix_request"},invalid_token_response:{category:"integrity",recovery:"contact_support"},managed_fcm_not_declared:{category:"compatibility",recovery:"fix_request"},manifest_load_failed:{category:"availability",recovery:"retry"},manifest_required:{category:"validation",recovery:"fix_request"},missing_grant_key:{category:"authorization",recovery:"reauthorize"},mutation_recovery_expired:{category:"compatibility",recovery:"none"},mutation_request_conflict:{category:"conflict",recovery:"resolve_conflict"},no_pending_mutation:{category:"conflict",recovery:"refresh"},not_authorized:{category:"authorization",recovery:"reauthorize"},not_remote_authority:{category:"compatibility",recovery:"choose_collection"},notification_criterion_not_declared:{category:"validation",recovery:"fix_request"},notification_reauthorization_required:{category:"authorization",recovery:"reauthorize"},notification_registration_failed:{category:"availability",recovery:"retry"},notification_unregistration_failed:{category:"availability",recovery:"retry"},notifications_not_declared:{category:"compatibility",recovery:"fix_request"},notifications_unavailable:{category:"availability",recovery:"retry"},operation_cancelled:{category:"cancellation",recovery:"none"},operation_failed:{category:"internal",recovery:"contact_support"},operation_invalid:{category:"validation",recovery:"fix_request"},operation_outcome_unknown:{category:"conflict",recovery:"resolve_outcome"},path_occupied:{category:"conflict",recovery:"resolve_conflict"},pending_mutation_unresolved:{category:"conflict",recovery:"resolve_outcome"},query_snapshot_changed:{category:"conflict",recovery:"refresh"},rate_limited:{category:"availability",recovery:"retry"},reconnect_required:{category:"authorization",recovery:"reauthorize"},redirect_uri_required:{category:"validation",recovery:"fix_request"},reference_updates_unsupported:{category:"compatibility",recovery:"fix_request"},registry_backup_invalid:{category:"integrity",recovery:"contact_support"},registry_busy:{category:"availability",recovery:"retry"},registry_corrupt:{category:"integrity",recovery:"repair_collection"},registry_migration_failed:{category:"internal",recovery:"contact_support"},registry_schema_incompatible:{category:"compatibility",recovery:"upgrade_connector"},relay_authorization_expired:{category:"authorization",recovery:"reauthorize"},relay_unavailable:{category:"availability",recovery:"retry"},sandbox_unsupported:{category:"compatibility",recovery:"fix_request"},scope_denied:{category:"authorization",recovery:"reauthorize"},stale_file_revision:{category:"conflict",recovery:"refresh"},storage_required:{category:"compatibility",recovery:"none"},sync_failed:{category:"availability",recovery:"retry"},temporarily_unavailable:{category:"availability",recovery:"retry"},timeout:{category:"availability",recovery:"retry"},token_exchange_failed:{category:"availability",recovery:"retry"},transport_protocol_incompatible:{category:"compatibility",recovery:"upgrade_connector"},type_pack_provision_failed:{category:"validation",recovery:"repair_collection"},unknown_collection:{category:"selection",recovery:"choose_collection"},unsafe_file_path:{category:"validation",recovery:"fix_request"},unsupported_encryption:{category:"compatibility",recovery:"upgrade_application"},unsupported_operation:{category:"compatibility",recovery:"fix_request"}},Ko={access_denied:{type:"object",required:[],properties:{return_to:{type:"string"}}},approval_window_blocked:{type:"object",required:["user_code","verification_uri","verification_uri_complete","expires_at","interval_seconds"],properties:{user_code:{type:"string"},verification_uri:{type:"string"},verification_uri_complete:{type:"string"},expires_at:{type:"integer"},interval_seconds:{type:"integer"}}},authorization_binding_incompatible:{type:"object",required:["contract","required","supported","peer"],properties:{contract:{type:"string"},required:{type:"array",items:{type:"integer"}},supported:{type:"array",items:{type:"integer"}},peer:{type:"string"},operation:{type:"string"}}},capability_contract_incompatible:{type:"object",required:["contract","required","supported","peer"],properties:{contract:{type:"string"},required:{type:"array",items:{type:"integer"}},supported:{type:"array",items:{type:"integer"}},peer:{type:"string"},operation:{type:"string"}}},collection_configuration_invalid:{type:"object",required:["diagnostics"],properties:{diagnostics:{type:"array",items:{type:"object"}}}},collection_contracts_missing:{type:"object",required:["contracts"],properties:{contracts:{type:"array",items:{type:"object",required:["id","version"],properties:{id:{type:"string"},version:{type:"string"}}}}}},collection_invalid:{type:"object",required:["diagnostics"],properties:{diagnostics:{type:"array",items:{type:"object"}}}},collection_type_registry_invalid:{type:"object",required:["diagnostics"],properties:{diagnostics:{type:"array",items:{type:"object"}}}},collection_version_unsupported:{type:"object",required:["current_version","required_version"],properties:{current_version:{type:"string"},required_version:{type:"string"}}},connector_offline:{type:"object",required:[],properties:{connector_name:{type:"string"}}},durable_mutation_unsupported:{type:"object",required:["contract","required","supported","peer"],properties:{contract:{type:"string"},required:{type:"array",items:{type:"integer"}},supported:{type:"array",items:{type:"integer"}},peer:{type:"string"},operation:{type:"string"}}},insufficient_access:{type:"object",required:["required_operations","granted_operations","missing_operations"],properties:{required_operations:{type:"array",items:{type:"string"}},granted_operations:{type:"array",items:{type:"string"}},missing_operations:{type:"array",items:{type:"string"}}}},invalid_application_manifest:{type:"object",required:["issues"],properties:{issues:{type:"array",items:{type:"object",required:["path","keyword","message","params"],properties:{path:{type:"string"},keyword:{type:"string"},message:{type:"string"},params:{type:"object"}}}}}},mutation_request_conflict:{type:"object",required:["request_id"],properties:{request_id:{type:"string"}}},operation_invalid:{type:"object",required:["diagnostics"],properties:{diagnostics:{type:"array",items:{type:"object"}},partial_result:{}}},operation_outcome_unknown:{type:"object",required:["request_id"],properties:{request_id:{type:"string"}}},rate_limited:{type:"object",required:[],properties:{retry_after_ms:{type:"integer"}}},transport_protocol_incompatible:{type:"object",required:["contract","required","supported","peer"],properties:{contract:{type:"string"},required:{type:"array",items:{type:"integer"}},supported:{type:"array",items:{type:"integer"}},peer:{type:"string"},operation:{type:"string"}}}};function In(t){return Object.hasOwn(de,t)}function He(t){if(!Mn(t))return!1;let e=t;if(e.problem_version!==1||typeof e.message!="string"||e.message.length===0||e.operation_outcome!==void 0&&e.operation_outcome!=="not_sent"&&e.operation_outcome!=="rejected"&&e.operation_outcome!=="unknown"||e.trace_id!==void 0&&(typeof e.trace_id!="string"||e.trace_id.length===0))return!1;if(e.code==="unknown")return typeof e.server_code=="string"&&e.server_code.length>0&&e.category==="unknown"&&e.recovery==="none";if(typeof e.code!="string"||!In(e.code)||e.server_code!==void 0)return!1;let n=de[e.code],i=Ko[e.code],o=i===void 0?e.details===void 0:e.details===void 0?(i.required?.length??0)===0:Yt(e.details,i);return e.category===n.category&&e.recovery===n.recovery&&o}function Yt(t,e){if(e.type===void 0)return!0;if(e.type==="string")return typeof t=="string";if(e.type==="integer")return typeof t=="number"&&Number.isInteger(t);if(e.type==="number")return typeof t=="number"&&Number.isFinite(t);if(e.type==="boolean")return typeof t=="boolean";if(e.type==="array")return Array.isArray(t)&&t.every(i=>Yt(i,e.items??{}));if(!Mn(t))return!1;if(!e.properties)return!0;let n=t;return!Object.keys(n).every(i=>Object.hasOwn(e.properties,i))||!(e.required??[]).every(i=>Object.hasOwn(n,i))?!1:Object.entries(n).every(([i,o])=>Yt(o,e.properties[i]))}function Mn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Jt(t,e,n={}){if(In(t)){let i=de[t],o={problem_version:1,code:t,category:i.category,recovery:i.recovery,message:e,...n.details===void 0?{}:{details:n.details},...n.operation_outcome===void 0?{}:{operation_outcome:n.operation_outcome},...n.trace_id===void 0?{}:{trace_id:n.trace_id}};if(He(o))return o}return{problem_version:1,code:"unknown",server_code:t,category:"unknown",recovery:"none",message:e,...n.details===void 0?{}:{details:n.details},...n.operation_outcome===void 0?{}:{operation_outcome:n.operation_outcome},...n.trace_id===void 0?{}:{trace_id:n.trace_id}}}var xn=new Uint8Array([77,68,66,70]),En=1,Dn=0,Ha=new Uint8Array([77,68,66,82]);var qn=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,C=class extends Error{code;constructor(e,n){super(n),this.code=e,this.name="FileFrameError"}};function Ho(t){return t==="upload_chunk"?1:2}function Vo(t){if(t===1)return"upload_chunk";if(t===2)return"download_chunk";throw new C("invalid_kind",`Unknown file frame kind ${t}`)}function $o(t){if(!t||typeof t!="object"||Array.isArray(t))throw new C("invalid_header","File frame header must be a JSON object");return t}function st(t,e){let n=t[e];if(typeof n!="string"||n.length===0)throw new C("invalid_header",`File frame header ${e} must be a non-empty string`);return n}function at(t,e){let n=st(t,e);if(!qn.test(n))throw new C("invalid_header",`File frame header ${e} must be a UUID`);return n}function ue(t,e,n=Number.MAX_SAFE_INTEGER){let i=t[e];if(!Number.isSafeInteger(i)||i<0||i>n)throw new C("invalid_header",`File frame header ${e} is outside its allowed range`);return i}function Qt(t){if(t.protocol_version!==1)throw new C("unsupported_version",`Unsupported file transfer protocol ${t.protocol_version}`);if(t.protection!=="grant_aead_v1"&&t.protection!=="transport_tls")throw new C("invalid_header","Unknown file transfer protection");if(t.direction!=="upload"&&t.direction!=="download")throw new C("invalid_header","Unknown file transfer direction");for(let[e,n]of[["grant_id",t.grant_id],["authority_id",t.authority_id],["collection_id",t.collection_id],["transfer_id",t.transfer_id]])if(!qn.test(n))throw new C("invalid_header",`File frame header ${e} must be a UUID`);for(let[e,n,i]of[["chunk_size",t.chunk_size,4194304],["chunk_index",t.chunk_index,Number.MAX_SAFE_INTEGER],["offset",t.offset,Number.MAX_SAFE_INTEGER],["plaintext_length",t.plaintext_length,4194304],["total_size",t.total_size,Number.MAX_SAFE_INTEGER]])if(!Number.isSafeInteger(n)||n<0||n>i)throw new C("invalid_header",`File frame header ${e} is outside its allowed range`);if(t.chunk_size<64*1024)throw new C("invalid_header","File frame chunk_size is below the protocol minimum");if(!Number.isSafeInteger(t.scope_epoch)||t.scope_epoch<1)throw new C("invalid_header","File frame header scope_epoch must be a positive integer");if(t.protection==="grant_aead_v1"&&!t.key_id)throw new C("invalid_header","AEAD-protected file frames require key_id");return{protocol_version:1,protection:t.protection,grant_id:t.grant_id,authority_id:t.authority_id,collection_id:t.collection_id,transfer_id:t.transfer_id,direction:t.direction,chunk_size:t.chunk_size,chunk_index:t.chunk_index,offset:t.offset,plaintext_length:t.plaintext_length,total_size:t.total_size,scope_epoch:t.scope_epoch,...t.key_id===void 0?{}:{key_id:t.key_id}}}function Go(t){let e;try{e=new TextDecoder("utf-8",{fatal:!0}).decode(t)}catch{throw new C("invalid_header","File frame header is not valid UTF-8")}let n;try{n=$o(JSON.parse(e))}catch(l){throw l instanceof C?l:new C("invalid_header","File frame header is not valid JSON")}let i=new Set(["protocol_version","protection","grant_id","authority_id","collection_id","transfer_id","direction","chunk_size","chunk_index","offset","plaintext_length","total_size","scope_epoch","key_id"]);if(Object.keys(n).some(l=>!i.has(l)))throw new C("invalid_header","File frame header contains an unknown field");let o=ue(n,"protocol_version");if(o!==1)throw new C("unsupported_version",`Unsupported file transfer protocol ${o}`);let r=st(n,"protection"),a=st(n,"direction"),s=n.key_id===void 0?void 0:st(n,"key_id"),c=Qt({protocol_version:1,protection:r,grant_id:at(n,"grant_id"),authority_id:at(n,"authority_id"),collection_id:at(n,"collection_id"),transfer_id:at(n,"transfer_id"),direction:a,chunk_size:ue(n,"chunk_size",4194304),chunk_index:ue(n,"chunk_index"),offset:ue(n,"offset"),plaintext_length:ue(n,"plaintext_length",4194304),total_size:ue(n,"total_size"),scope_epoch:ue(n,"scope_epoch"),...s===void 0?{}:{key_id:s}});if(JSON.stringify(c)!==e)throw new C("invalid_header","File frame header must use the canonical field order without duplicate fields or whitespace");return c}function Xt(t,e,n){let i=t==="upload_chunk"?"upload":"download";if(e.direction!==i)throw new C("invalid_header",`Frame kind ${t} requires direction ${i}`);let o=e.chunk_index*e.chunk_size;if(!Number.isSafeInteger(o)||e.offset!==o)throw new C("invalid_header","Chunk offset does not match its index and protocol chunk size");if(e.offset+e.plaintext_length>e.total_size)throw new C("invalid_header","Chunk extends past the declared transfer size");let r=e.protection==="grant_aead_v1"?e.plaintext_length+16:e.plaintext_length;if(n!==r)throw new C("invalid_length","Payload length does not match the protected plaintext length")}function Wo(t){return t.plaintext_length+(t.protection==="grant_aead_v1"?16:0)}function ct(t,e){let n=Qt(e),i=Wo(n);Xt(t,n,i);let o=new TextEncoder().encode(JSON.stringify(n));if(o.byteLength>16384)throw new C("limit_exceeded","File frame header exceeds the protocol limit");let r=new Uint8Array(16+o.byteLength);r.set(xn,0);let a=new DataView(r.buffer,r.byteOffset,r.byteLength);return a.setUint8(4,En),a.setUint8(5,Ho(t)),a.setUint16(6,Dn,!1),a.setUint32(8,o.byteLength,!1),a.setUint32(12,i,!1),r.set(o,16),r}function Fn(t){let e=Qt(t.header);if(Xt(t.kind,e,t.payload.byteLength),t.payload.byteLength>4194320)throw new C("limit_exceeded","File frame payload exceeds the protocol limit");let n=ct(t.kind,e),i=new Uint8Array(n.byteLength+t.payload.byteLength);return i.set(n,0),i.set(t.payload,n.byteLength),i}function lt(t,e={}){if(t.byteLength<16)throw new C("invalid_length","File frame is shorter than its fixed prefix");if(!xn.every((f,h)=>t[h]===f))throw new C("invalid_magic","File frame magic is not MDBF");let n=new DataView(t.buffer,t.byteOffset,t.byteLength),i=n.getUint8(4);if(i!==En)throw new C("unsupported_version",`Unsupported file frame version ${i}`);let o=Vo(n.getUint8(5));if(n.getUint16(6,!1)!==Dn)throw new C("unsupported_flags","File frame uses unsupported flags");let r=n.getUint32(8,!1),a=n.getUint32(12,!1),s=e.maxHeaderBytes??16384,c=e.maxPayloadBytes??4194320;if(r===0)throw new C("invalid_length","File frame header must not be empty");if(r>s||a>c)throw new C("limit_exceeded","File frame exceeds the configured decode limits");let l=16+r+a;if(!Number.isSafeInteger(l)||l!==t.byteLength)throw new C("invalid_length","File frame lengths do not match the supplied bytes");let u=16+r,p=Go(t.subarray(16,u));return Xt(o,p,a),{kind:o,header:p,payload:t.slice(u)}}var Yo=["describe","changes","read","query","list_views","execute_view","read_view_source","create_view_source","update_view_source","delete_view_source","validate","create","update","delete","rename","read_type","create_type","update_type","assess_type_pack","apply_type_pack","assess_collection_setup","apply_collection_setup","list_timers","put_timer","cancel_timer","reconcile_timers","sync"],Jo=["list_files","open_file_upload","open_file_download","move_file","delete_file","get_file_transfer_status","commit_file_upload","abort_file_transfer"],Qo={describe:"never",changes:"never",read:"never",query:"never",list_views:"never",execute_view:"never",read_view_source:"never",create_view_source:"always",update_view_source:"always",delete_view_source:"always",validate:"never",create:"always",update:"always",delete:"always",rename:"always",read_type:"never",create_type:"always",update_type:"always",assess_type_pack:"never",apply_type_pack:"always",assess_collection_setup:"never",apply_collection_setup:"always",list_timers:"never",put_timer:"always",cancel_timer:"always",reconcile_timers:"always",sync:"sync_action"},Xo={describe:1,changes:1,read:1,query:1,list_views:1,execute_view:1,read_view_source:1,create_view_source:1,update_view_source:1,delete_view_source:1,validate:1,create:1,update:1,delete:1,rename:1,read_type:1,create_type:1,update_type:1,assess_type_pack:1,apply_type_pack:1,assess_collection_setup:1,apply_collection_setup:1,list_timers:1,put_timer:1,cancel_timer:1,reconcile_timers:1,sync:1},Zo={list_files:1,open_file_upload:1,open_file_download:1,move_file:1,delete_file:1,get_file_transfer_status:1,commit_file_upload:1,abort_file_transfer:1},er=new Set(["open_file_upload","move_file","delete_file","commit_file_upload","abort_file_transfer"]);var tr=new Set(Yo),nr=new Set(Jo);function zn(t){return tr.has(t)}function ir(t){return nr.has(t)}function Un(t,e){if(t==="file_control"){let n=Nn(e)&&typeof e.type=="string"?e.type:"";if(!ir(n))throw new Error(`Unknown file-control message: ${n}`);return Zo[n]}return Xo[t]}function ie(t,e){let n=Nn(e)?e:{};if(n.dry_run===!0)return null;if(t==="file_control"){let o=typeof n.type=="string"?n.type:"";return er.has(o)?`file_control:${o}`:null}let i=Qo[t];return i==="always"?t:i==="sync_action"&&n.action==="mutate"?"sync:mutate":null}function Ce(t,e){return ie(t,e)!==null}function Nn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var or=1,rr="mdbase-connect mutation fingerprint v1\0",Zt=new TextEncoder;function ar(t){return en(t,new Set)}function sr(t,e){let n=ie(t,e);if(n===null)throw new TypeError("The operation is not a canonical mutation.");let i=Zt.encode(n),o=Zt.encode(ar(e)),r=Zt.encode(rr),a=new Uint8Array(r.length+4+8+i.length+4+8+o.length),s=new DataView(a.buffer),c=0;return a.set(r,c),c+=r.length,s.setUint32(c,or,!1),c+=4,c=Bn(a,s,c,i),s.setUint32(c,Un(t,e),!1),c+=4,Bn(a,s,c,o),a}async function jn(t,e){let n=new Uint8Array(await globalThis.crypto.subtle.digest("SHA-256",sr(t,e).buffer));return cr(n)}function en(t,e){if(t===null)return"null";if(t===!0)return"true";if(t===!1)return"false";if(typeof t=="string")return Ln(t),JSON.stringify(t);if(typeof t=="number"){if(!Number.isFinite(t))throw new TypeError("Mutation input numbers must be finite.");return JSON.stringify(t)}if(typeof t!="object")throw new TypeError(`Mutation input contains unsupported ${typeof t}.`);if(e.has(t))throw new TypeError("Mutation input must not contain cycles.");e.add(t);try{if(Array.isArray(t)){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("Mutation input must not contain symbol properties.");let o=[];for(let r=0;r<t.length;r+=1){if(!Object.hasOwn(t,r))throw new TypeError("Mutation input arrays must not be sparse.");o.push(en(t[r],e))}return`[${o.join(",")}]`}let n=Object.getPrototypeOf(t);if(n!==Object.prototype&&n!==null)throw new TypeError("Mutation input objects must be plain JSON objects.");if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("Mutation input must not contain symbol properties.");let i=Object.entries(t);for(let[o]of i)Ln(o);return i.sort(([o],[r])=>o<r?-1:o>r?1:0),`{${i.map(([o,r])=>{let a=Object.getOwnPropertyDescriptor(t,o);if(!a||a.get||a.set)throw new TypeError("Mutation input must not contain accessor properties.");return`${JSON.stringify(o)}:${en(r,e)}`}).join(",")}}`}finally{e.delete(t)}}function Ln(t){for(let e=0;e<t.length;e+=1){let n=t.charCodeAt(e);if(n>=55296&&n<=56319){let i=t.charCodeAt(e+1);if(!(i>=56320&&i<=57343))throw new TypeError("Mutation input strings must not contain lone surrogates.");e+=1}else if(n>=56320&&n<=57343)throw new TypeError("Mutation input strings must not contain lone surrogates.")}}function Bn(t,e,n,i){return e.setBigUint64(n,BigInt(i.length),!1),n+=8,t.set(i,n),n+i.length}function cr(t){return btoa(String.fromCharCode(...t)).replaceAll("+","-").replaceAll("/","_").replace(/=+$/u,"")}var L=3,lr=2,Kn=[L,lr],$=5,tn=4,Hn=[$,tn],dr=1,ur=1,Ja={operation_transport:[...Kn],authorization_binding:[...Hn],semantic_capabilities:[dr],durable_mutation:[ur]};function nn(t,e,n=[]){let i={operation_transport:L,authorization_binding:$,semantic_capabilities:1},o=[...new Set(n)].filter(r=>r!==L).sort((r,a)=>a-r);return o.length>0&&(i.operation_transport_recovery=o),(t.some(r=>Ce(r,{action:"mutate"}))||e?.actions.some(r=>r!=="list"&&r!=="read")===!0)&&(i.durable_mutation=1),i}function Ve(t){return Kn.includes(t)}function Vn(t){return Hn.includes(t)}var $n={"collection.inspect":["describe"],"records.watch":["changes"],"records.read":["read"],"records.query":["query"],"records.validate":["validate"],"records.create":["create"],"records.update":["update"],"records.delete":["delete"],"records.rename":["rename"],"views.list":["list_views"],"views.execute":["execute_view"],"views.source.read":["read_view_source"],"views.source.create":["create_view_source"],"views.source.update":["update_view_source"],"views.source.delete":["delete_view_source"],"definitions.contracts.current":[],"definitions.read":["read_type"],"definitions.create":["create_type"],"definitions.update":["update_type"],"definitions.type-pack.inspect":["assess_type_pack"],"definitions.type-pack.apply":["assess_type_pack","apply_type_pack"],"collection.setup.apply":["assess_collection_setup","apply_collection_setup"],"timers.list":["list_timers"],"timers.put":["put_timer"],"timers.cancel":["cancel_timer"],"timers.reconcile":["reconcile_timers"],"sync.offline-replica":["sync"],"notifications.background-delivery":[],"files.list":[],"files.read":[],"files.add":[],"files.replace":[],"files.move":[],"files.delete":[]};function dt(t,e={}){let n=e.includeOptional===!1?t.required:[...t.required,...t.optional??[]];return[...new Set(n.flatMap(i=>$n[i]))]}function ut(t){return[...$n[t]]}var pr=new TextEncoder().encode("mdbase-connect application installation id v2\0"),fr=new TextEncoder().encode("mdbase-connect application authorization proof v4\0"),hr=new TextEncoder().encode("mdbase-connect application authorization proof v5\0");async function Wn(t){let e=pt(t),i=new Uint8Array(await crypto.subtle.digest("SHA-256",pe([pr,q(e)]))).slice(0,16);return i[6]=i[6]&15|128,i[8]=i[8]&63|128,[$e(i.slice(0,4)),$e(i.slice(4,6)),$e(i.slice(6,8)),$e(i.slice(8,10)),$e(i.slice(10,16))].join("-")}function Yn(t){let e=[pt(t.installation_signing_public_key),pt(t.grant_agreement_public_key),pt(t.grant_signing_public_key)];if(e.some((c,l)=>e.slice(l+1).some(u=>vr(c,u))))throw new Error("Application authorization keys must be distinct.");let n=on(t.authorization_nonce),i=on(t.code_challenge),o=t.contracts,r=o.operation_transport_recovery??[],a=t.requested_operations.some(c=>Ce(c,{action:"mutate"}))||t.requested_files?.actions.some(c=>!["list","read"].includes(c))===!0;if(!Vn(t.protocol_version)||n.byteLength!==32||!/^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)+$/u.test(t.application_declaration_id)||!/^[0-9a-f]{64}$/u.test(t.application_manifest_digest)||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?Z$/u.test(t.issued_at)||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?Z$/u.test(t.expires_at)||i.byteLength!==32||![o.operation_transport,o.authorization_binding,o.semantic_capabilities,o.durable_mutation??1].every(c=>Number.isInteger(c)&&c>0)||o.authorization_binding!==t.protocol_version||!Ve(o.operation_transport)||t.protocol_version===$&&o.operation_transport!==L||r.some(c=>!Ve(c)||c===o.operation_transport)||new Set(r).size!==r.length||t.protocol_version===tn&&r.length>0||r.length>0&&!a||(a?o.durable_mutation!==1:o.durable_mutation!==void 0)||t.requested_operations.length===0&&t.requested_files===void 0||new Set(t.requested_operations).size!==t.requested_operations.length||t.requested_operations.some(c=>!c||c.includes("\0"))||(t.flow==="authorization_code"?t.redirect_uri===void 0||t.state===void 0:t.flow!=="device_code"||t.redirect_uri!==void 0||t.state!==void 0))throw new Error("Application authorization binding is invalid.");mr(t.requested_files);let s=t.requested_operations.map(c=>q(new TextEncoder().encode(c)));return pe([t.protocol_version===$?hr:fr,H(t.protocol_version),q(ft(t.application_id)),q(ft(t.authorization_id)),q(new TextEncoder().encode(t.application_declaration_id)),q(Jn(t.application_manifest_digest)),q(ft(t.application_installation_id)),...e.map(q),q(new TextEncoder().encode(t.flow)),q(n),q(new TextEncoder().encode(t.issued_at)),q(new TextEncoder().encode(t.expires_at)),Gn(t.redirect_uri),Gn(t.state),q(new TextEncoder().encode(t.code_challenge)),H(o.operation_transport),...t.protocol_version===$?[H(r.length),...r.map(H)]:[],H(o.authorization_binding),H(o.semantic_capabilities),yr(o.durable_mutation),H(s.length),...s,gr(t.requested_files),_r(t.collection_id)])}function yr(t){return t===void 0?new Uint8Array(1):pe([new Uint8Array([1]),H(t)])}function mr(t){if(t!==void 0&&(t.actions.length===0||new Set(t.actions).size!==t.actions.length||t.scope.kind==="selected_folders"&&(t.scope.folders.length===0||new Set(t.scope.folders).size!==t.scope.folders.length||t.scope.folders.some(e=>!e||e.includes("\0")))))throw new Error("Application authorization file request is invalid.")}function gr(t){if(t===void 0)return new Uint8Array(1);let e=t.actions.map(n=>q(new TextEncoder().encode(n)));return pe([new Uint8Array([1]),H(e.length),...e,q(new TextEncoder().encode(t.scope.kind)),...t.scope.kind==="selected_folders"?[H(t.scope.folders.length),...t.scope.folders.map(n=>q(new TextEncoder().encode(n)))]:[]])}function Gn(t){return t===void 0?new Uint8Array(1):pe([new Uint8Array([1]),q(new TextEncoder().encode(t))])}function _r(t){return t===void 0?new Uint8Array(1):pe([new Uint8Array([1]),q(ft(t))])}function pt(t){let e=on(t);if(e.byteLength!==65||e[0]!==4)throw new Error("Application authorization public key is invalid.");return e}function on(t){if(!/^[A-Za-z0-9_-]+$/u.test(t))throw new Error("Invalid base64url value.");let e=t.replaceAll("-","+").replaceAll("_","/"),n=e.padEnd(Math.ceil(e.length/4)*4,"="),i=Uint8Array.from(atob(n),o=>o.charCodeAt(0));if(br(i)!==t)throw new Error("Non-canonical base64url value.");return i}function ft(t){if(!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/iu.test(t))throw new Error("Invalid UUID value.");let e=t.replaceAll("-","");return Jn(e)}function Jn(t){if(!/^[0-9a-f]+$/u.test(t)||t.length%2!==0)throw new Error("Invalid hexadecimal value.");return Uint8Array.from({length:t.length/2},(e,n)=>Number.parseInt(t.slice(n*2,n*2+2),16))}function q(t){return pe([H(t.byteLength),t])}function H(t){let e=new Uint8Array(4);return new DataView(e.buffer).setUint32(0,t,!1),e}function pe(t){let e=new Uint8Array(t.reduce((i,o)=>i+o.byteLength,0)),n=0;for(let i of t)e.set(i,n),n+=i.byteLength;return e}function br(t){return btoa(String.fromCharCode(...t)).replaceAll("+","-").replaceAll("/","_").replace(/=+$/u,"")}function vr(t,e){return t.byteLength===e.byteLength&&t.every((n,i)=>n===e[i])}function $e(t){return[...t].map(e=>e.toString(16).padStart(2,"0")).join("")}var Qn={id:"mdbase.record.created",version:"1.0.0",digest:"sha256:7f3bed6baa356ee9389e977ae7b77a102e2bee871a7c1d9f2026fc21cacdbfc9"};var Xn={id:"mdbase.runtime.timer.fired",version:"1.0.0",digest:"sha256:41105be7a7abf33b31ced47e1e1965242236e40ccaea286b959b0a8c591f5642"};var Zn=28485,Ge="P256-HKDF-SHA256-AES256GCM",ht=1;var Cr="contract-setup-v1",wr="file-relay-v1",Sr="protocol-usage-report-v1",Rr=["application-authorization-v4","authorization-activation","encrypted-relay","policy-ack"];var Pr=["durable-mutation-journal-v1","durable-file-lifecycle-v1"],is=[...Pr,"mutation-replay-after-credential-retirement-v1"],os=[...Rr,"application-authorization-v5",Cr,wr,Sr],rn=1;var ei="mdbase-authority-request-proof-v1",We={version:"x-mdbase-proof-version",timestamp:"x-mdbase-proof-timestamp",nonce:"x-mdbase-proof-nonce",signature:"x-mdbase-proof-signature"};function yt(t,e,n){let i=new Set(t.required),o=[...new Set([...t.required,...t.optional??[]])],r={};for(let a of o)r[a]=Ar(a,i.has(a),e,n);return{contractVersion:1,values:r,requiredAvailable:t.required.every(a=>r[a]?.state==="available")}}function Ar(t,e,n,i){let o=ut(t),r=o.filter(s=>!i.operations.includes(s)),a={id:t,requirement:e?"required":"optional",operations:o,missingOperations:r,evidence:[{source:"application",fact:`${e?"Required":"Optional"} in capability contract v1.`}]};if(r.length>0)return{...a,state:"requires_authorization",evidence:[...a.evidence,{source:"authorization",fact:`Missing ${r.join(", ")}.`}],reason:"The current grant does not include every operation for this capability."};if(t==="definitions.contracts.current"&&i.scope.access!=="full_collection"){let s=new Set(i.scope.contracts.map(({id:l,version:u,digest:p})=>`${l}@${u}:${p}`)),c=(n.requirements?.contracts??[]).filter(({id:l,version:u,digest:p})=>!s.has(`${l}@${u}:${p}`));if(c.length>0)return{...a,state:"requires_authorization",reason:"The current grant does not approve the exact required contract definitions.",evidence:[...a.evidence,{source:"authorization",fact:`Missing ${c.map(({id:l,version:u})=>`${l}@${u}`).join(", ")}.`}],details:{missingContracts:c}}}if(t.startsWith("files.")){let s=t.slice(6);if(!i.fileCapability?.actions.includes(s))return{...a,state:i.fileCapability?"requires_authorization":"unsupported",reason:i.fileCapability?`The current file grant does not include ${s}.`:"This connection has no file capability.",evidence:[...a.evidence,{source:"authorization",fact:i.fileCapability?`Granted file actions: ${i.fileCapability.actions.join(", ")}.`:"No file capability was granted."}]}}return t==="notifications.background-delivery"&&(n.notifications?.criteria.length??0)===0?{...a,state:"requires_setup",reason:"The application manifest declares no notification criteria.",evidence:[...a.evidence,{source:"application",fact:"No authority notification criteria are declared."}]}:{...a,state:"available",evidence:[...a.evidence,{source:"authorization",fact:o.length>0?`Granted operations: ${o.join(", ")}.`:"No record operation is required."},{source:"authority",fact:i.authority.kind==="hosted"?"Backed by a durable hosted mdbase authority.":"Backed by a user-operated mdbase connector."}],...t==="sync.offline-replica"?{details:{durability:"device",writes:"queued",authority:i.authority.kind}}:{},...t==="notifications.background-delivery"?{details:{delivery:"authority",payload:"opaque"}}:{}}}var b=class extends Error{constructor(n,i={}){super(n.message,i.cause===void 0?void 0:{cause:i.cause});this.problem=n;this.name="MdbaseConnectError",this.code=n.code,this.status=i.status}problem;code;status;get retryable(){return this.problem.recovery==="retry"&&this.problem.operation_outcome!=="unknown"}get requiresAuthorization(){return this.problem.category==="authorization"}get outcomeUnknown(){return this.problem.operation_outcome==="unknown"}get recovery(){return this.problem.recovery}get details(){return this.problem.details}};function I(t,e,...[n={}]){let i=de[t];return{problem_version:1,code:t,category:i.category,recovery:i.recovery,message:e,...n.details===void 0?{}:{details:n.details},...n.operationOutcome===void 0?{}:{operation_outcome:n.operationOutcome},...n.traceId===void 0?{}:{trace_id:n.traceId}}}function ti(t,e,n={}){return Jt(t,e,{details:n.details,operation_outcome:n.operationOutcome,trace_id:n.traceId})}function d(t,e,...n){let i=n[0];return new b(I(t,e,...n),{status:i?.status,cause:i?.cause})}function F(t,e,n={}){let{status:i,cause:o,...r}=n;return new b(Jt(t,e,{details:r.details,operation_outcome:r.operationOutcome,trace_id:r.traceId}),{status:i,cause:o})}function we(t){let e=Tr(t.diagnostics),n=Mr(t.diagnostics);if(e==="collection_version_unsupported"){let i=kr(t.diagnostics);return I(e,n,{operationOutcome:"rejected",details:i})}return e!=="operation_invalid"?I(e,n,{operationOutcome:"rejected",details:{diagnostics:t.diagnostics}}):I(e,n,{operationOutcome:"rejected",details:{diagnostics:t.diagnostics,partial_result:t.result}})}function Tr(t){let e=new Set(t.filter(n=>n.severity==="error").map(n=>n.code));return["migration_required","migration_lossy","unsupported_version"].some(n=>e.has(n))?"collection_version_unsupported":["invalid_config","invalid_configuration","missing_config","missing_spec_version"].some(n=>e.has(n))?"collection_configuration_invalid":["duplicate_type","invalid_contract_definition","invalid_data_contract","invalid_type_definition","invalid_type_path"].some(n=>e.has(n))?"collection_type_registry_invalid":["collection_invalid","collection_open_failed"].some(n=>e.has(n))?"collection_invalid":"operation_invalid"}function kr(t){let e=t.map(n=>n.details).find(n=>Ir(n));return{current_version:typeof e?.current_version=="string"?e.current_version:"0.2.x",required_version:typeof e?.required_version=="string"?e.required_version:"0.3.0"}}function Ir(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function ni(t){return t instanceof b&&t.retryable}function Mr(t){return t.filter(e=>e.severity==="error").map(e=>e.message).join(" ")||t.map(e=>e.message).join(" ")||"The collection rejected this operation."}var xr=["access_denied","access_paused","authorization_binding_incompatible","authorization_expired","capability_contract_incompatible","collection_access_denied","connector_identity_changed","connector_offline","connector_upgrade_required","direct_operation_rejected","durable_mutation_unsupported","operation_outcome_unknown","encryption_required","encrypted_relay_rejected","hosted_provider_unavailable","insufficient_access","invalid_encrypted_response","invalid_operation_response","invalid_request","missing_grant_key","mutation_recovery_expired","mutation_request_conflict","not_authorized","operation_cancelled","operation_failed","rate_limited","relay_authorization_expired","relay_unavailable","temporarily_unavailable","timeout","transport_protocol_incompatible","unsupported_operation"],ii=Object.keys(de),fe=["discovery_failed","invalid_operation_response","invalid_application_manifest","invalid_request","manifest_load_failed","rate_limited","temporarily_unavailable","timeout"],Se=[...fe,"access_denied","application_identity_unavailable","approval_window_blocked","authorization_binding_incompatible","authorization_cancelled","authorization_replayed","browser_required","capability_contract_incompatible","collection_access_denied","collection_configuration_invalid","collection_contracts_missing","collection_incompatible","collection_invalid","collection_kind_unsupported","collection_mismatch","collection_not_found","collection_type_registry_invalid","collection_version_unsupported","connector_identity_changed","connector_offline","connector_upgrade_required","device_authorization_failed","durable_mutation_unsupported","encryption_required","expired_token","invalid_application_authorization","invalid_callback","invalid_device_authorization_response","invalid_token_response","scope_denied","reconnect_required","token_exchange_failed","transport_protocol_incompatible"],Ye=[...fe,"authorization_expired","invalid_operation_response","invalid_push_subscription","managed_fcm_not_declared","not_authorized","notification_criterion_not_declared","notification_reauthorization_required","notification_registration_failed","notification_unregistration_failed","notifications_not_declared","notifications_unavailable"],an=["connector_offline","connector_upgrade_required","invalid_operation_response","not_authorized","operation_failed","temporarily_unavailable","timeout"],ws=[...Se,"collection_not_ready","collection_not_selected","unknown_collection"],Er=["collection_configuration_invalid","collection_invalid","collection_type_registry_invalid","collection_version_unsupported"],mt=[...xr,...Er],Y=[...mt,"invalid_path","operation_invalid"],oi=[...Y,"query_snapshot_changed","sandbox_unsupported"],z=[...Y,"concurrent_modification","invalid_preflight","pending_mutation_unresolved"],gt=[...mt,"change_cursor_reset"],oe=[...z,"type_pack_provision_failed"];function M(t,e=[]){return{ok:!0,value:t,diagnostics:e}}function A(t){return{ok:!1,problem:t}}async function E(t,e){try{return M(await t())}catch(n){if(!(n instanceof b))throw n;let i=n.problem;return i.code==="unknown"||e.includes(i.code)?A(i):A(ti(i.code,i.message,{details:i.details,operationOutcome:i.operation_outcome,traceId:i.trace_id}))}}var bt=3e4,Dr=1e4,qr=12e4,Fr=6e4;function Re(t={}){return{requestMs:_t(t.requestMs,bt,"requestMs"),watchStartMs:_t(t.watchStartMs,Dr,"watchStartMs"),uploadMs:_t(t.uploadMs,qr,"uploadMs"),syncMs:_t(t.syncMs,Fr,"syncMs")}}function re(t={},e=bt,n=Date.now){let i=t.timeoutMs===void 0?e:t.timeoutMs,o=i===null?null:zr(i),r=new AbortController,a=o===null?null:n()+o,s=()=>r.abort(t.signal?.reason);t.signal?.aborted?s():t.signal?.addEventListener("abort",s,{once:!0});let c=o===null?void 0:setTimeout(()=>r.abort(d("timeout","The operation exceeded its request deadline.",{operationOutcome:"not_sent"})),o),l=!1;return{signal:r.signal,deadline:a,remainingMs:()=>a===null?null:Math.max(0,a-n()),dispose:()=>{l||(l=!0,c!==void 0&&clearTimeout(c),t.signal?.removeEventListener("abort",s))}}}async function U(t,e,n){let i=re(t,e),o,r=new Promise((s,c)=>{o=c}),a=()=>o?.(J(i.signal));i.signal.addEventListener("abort",a,{once:!0});try{if(i.signal.aborted)throw J(i.signal);return await Promise.race([n(i),r])}finally{i.signal.removeEventListener("abort",a),i.dispose()}}async function B(t,e,n){let i=re(t,e);try{if(i.signal.aborted)throw J(i.signal);return await n(i)}finally{i.dispose()}}function J(t){return t.reason instanceof b?t.reason:d("operation_cancelled","The operation was cancelled before it changed the collection.",{operationOutcome:"not_sent",cause:t.reason})}function zr(t){if(!Number.isSafeInteger(t)||t<=0)throw new TypeError("timeoutMs must be a positive safe integer or null.");return t}function _t(t,e,n){if(t===void 0)return e;if(t===null)return null;if(!Number.isSafeInteger(t)||t<=0)throw new TypeError(`${n} must be a positive safe integer or null.`);return t}var Ur="mdbase-connect-keys",ae="grant-keys",cn=18446744073709551615n,Nr="mdbase-connect relay request key v1",Lr="mdbase-connect relay response key v1",ri=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,Pe=class{database=null;async create(e){let n=await ci(e),i=await this.open();return await si(i,o=>o.add({...n,counter:"0"})),n}async get(e){let n=await this.open(),i=await Hr(n.transaction(ae).objectStore(ae).get(e));return i?{handle:i.handle,agreementPrivateKey:i.agreementPrivateKey,agreementPublicKey:i.agreementPublicKey,signingPrivateKey:i.signingPrivateKey,signingPublicKey:i.signingPublicKey}:null}async nextCounter(e){let n=await this.open();return new Promise((i,o)=>{let r=n.transaction(ae,"readwrite"),a=r.objectStore(ae),s=a.get(e),c=null;s.onerror=()=>o(s.error),s.onsuccess=()=>{let l=s.result;if(!l){r.abort(),o(new S("missing_grant_key","The encrypted grant key is unavailable."));return}let u=BigInt(l.counter)+1n;if(u>cn){r.abort(),o(new S("counter_exhausted","The encrypted grant must be authorized again."));return}c=u.toString(),a.put({...l,counter:c})},r.onerror=()=>o(r.error),r.onabort=()=>o(r.error??new Error("Key counter transaction aborted.")),r.oncomplete=()=>{c&&i(c)}})}async delete(e){let n=await this.open();await si(n,i=>i.delete(e))}open(){if(typeof indexedDB>"u")throw new S("key_storage_unavailable","Encrypted relay authorization requires browser IndexedDB or an injected grant key store.");return this.database||(this.database=new Promise((e,n)=>{let i=indexedDB.open(Ur,1);i.onupgradeneeded=()=>{i.result.objectStoreNames.contains(ae)||i.result.createObjectStore(ae,{keyPath:"handle"})},i.onerror=()=>n(i.error),i.onsuccess=()=>e(i.result)})),this.database}},Ae=class{records=new Map;sequence=Promise.resolve();async create(e){if(this.records.has(e))throw new Error(`Grant key already exists: ${e}`);let n=await ci(e);return this.records.set(e,{...n,counter:"0"}),n}async get(e){let n=this.records.get(e);return n?{handle:n.handle,agreementPrivateKey:n.agreementPrivateKey,agreementPublicKey:n.agreementPublicKey,signingPrivateKey:n.signingPrivateKey,signingPublicKey:n.signingPublicKey}:null}nextCounter(e){let n,i,o=new Promise((r,a)=>{n=r,i=a});return this.sequence=this.sequence.then(()=>{let r=this.records.get(e);if(!r)throw new S("missing_grant_key","The encrypted grant key is unavailable.");let a=BigInt(r.counter)+1n;if(a>cn)throw new S("counter_exhausted","The encrypted grant must be authorized again.");r.counter=a.toString(),n(r.counter)}).catch(r=>{i(r)}),o}async delete(e){this.records.delete(e)}};async function vt(t,e,n,i){let o=await Br(t,e,n),r=i.timestamp??Math.floor(Date.now()/1e3),a=i.nonce??crypto.randomUUID(),s=await ln({...i,timestamp:r,nonce:a}),c=await crypto.subtle.sign({name:"ECDSA",hash:"SHA-256"},o.signingPrivateKey,new TextEncoder().encode(s));return{[We.version]:String(rn),[We.timestamp]:String(r),[We.nonce]:a,[We.signature]:Je(new Uint8Array(c))}}async function ln(t){let e=t.method.toUpperCase(),n=await ai(t.body??""),i=await ai(t.credential);for(let o of[e,t.target,String(t.timestamp),t.nonce])if(!o||o.includes(`
|
|
2
|
+
`)||o.includes("\r"))throw new S("invalid_proof_input","Authority request proof metadata is invalid.");return[ei,rn,e,t.target,n,i,t.timestamp,t.nonce].join(`
|
|
3
|
+
`)}async function Q(t,e,n,i,o,r=crypto.randomUUID()){X(n.encryption);let a=await li(t,e,n.encryption.application_agreement_public_key),s=await t.nextCounter(e),c={binding:n,protocolVersion:L,requestId:r,operation:i,counter:s},l=await di(a.agreementPrivateKey,n,c.protocolVersion,"request"),u=new TextEncoder().encode(JSON.stringify(o??{})),p=await crypto.subtle.encrypt({name:"AES-GCM",iv:fi(s),additionalData:new TextEncoder().encode(pi(c,"request")),tagLength:128},l,u);return{type:"encrypted_operation_request",...jr(c),ciphertext:Je(new Uint8Array(p))}}async function Oe(t,e,n,i,o){if(!Kr(i,o))throw new S("invalid_encrypted_response","Encrypted response metadata does not match its request.");let r=await li(t,e,n.encryption.application_agreement_public_key),a={binding:n,protocolVersion:i.protocol_version,requestId:i.request_id,operation:i.operation,counter:i.counter},s=await di(r.agreementPrivateKey,n,i.protocol_version,"response");try{let c=await crypto.subtle.decrypt({name:"AES-GCM",iv:fi(i.counter),additionalData:new TextEncoder().encode(pi(a,"response")),tagLength:128},s,yi(hi(o.ciphertext))),l=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(c));if(l?.ok===!0&&"result"in l||l?.ok===!1&&He(l.problem))return l;throw new Error("invalid response body")}catch(c){throw c instanceof S?c:new S("encrypted_response_rejected","The encrypted connector response could not be authenticated.")}}var S=class extends Error{constructor(n,i){super(i);this.code=n}code};async function ci(t){let e=await crypto.subtle.generateKey({name:"ECDH",namedCurve:"P-256"},!0,["deriveBits"]),n=Je(new Uint8Array(await crypto.subtle.exportKey("raw",e.publicKey))),i=await crypto.subtle.exportKey("pkcs8",e.privateKey),o=await crypto.subtle.importKey("pkcs8",i,{name:"ECDH",namedCurve:"P-256"},!1,["deriveBits"]),r=await crypto.subtle.generateKey({name:"ECDSA",namedCurve:"P-256"},!0,["sign","verify"]),a=Je(new Uint8Array(await crypto.subtle.exportKey("raw",r.publicKey))),s=await crypto.subtle.exportKey("pkcs8",r.privateKey),c=await crypto.subtle.importKey("pkcs8",s,{name:"ECDSA",namedCurve:"P-256"},!1,["sign"]);return{handle:t,agreementPrivateKey:o,agreementPublicKey:n,signingPrivateKey:c,signingPublicKey:a}}async function li(t,e,n){let i=await t.get(e);if(!i||i.agreementPublicKey!==n)throw new S("missing_grant_key","The encrypted grant key is unavailable or does not match the grant.");return i}async function Br(t,e,n){let i=await t.get(e);if(!i||i.signingPublicKey!==n)throw new S("missing_grant_key","The remote authority signing key is unavailable or does not match the grant.");return i}async function di(t,e,n,i){let o=await Qe(t,e.encryption.connector_agreement_public_key),r=await crypto.subtle.importKey("raw",o,"HKDF",!1,["deriveKey"]),a=new TextEncoder().encode(ui(e,n)),s=await crypto.subtle.digest("SHA-256",a);return crypto.subtle.deriveKey({name:"HKDF",hash:"SHA-256",salt:s,info:new TextEncoder().encode(i==="request"?Nr:Lr)},r,{name:"AES-GCM",length:256},!1,i==="request"?["encrypt"]:["decrypt"])}async function Qe(t,e){try{let n=await crypto.subtle.importKey("raw",yi(sn(e)),{name:"ECDH",namedCurve:"P-256"},!1,[]);return await crypto.subtle.deriveBits({name:"ECDH",public:n},t,256)}catch{throw new S("invalid_public_key","The connector relay public key is invalid.")}}function ui(t,e){let n=t.encryption;return["mdbase-connect",e,n.suite,t.grantId,t.applicationId,n.connector_id,n.collection_id,n.scope_epoch,n.key_id].join("|")}function pi(t,e){return[ui(t.binding,t.protocolVersion),t.requestId,e,t.operation,t.counter].join("|")}function jr(t){let e=t.binding.encryption;return{protocol_version:t.protocolVersion,suite:Ge,request_id:t.requestId,grant_id:t.binding.grantId,application_id:t.binding.applicationId,connector_id:e.connector_id,collection_id:e.collection_id,operation:t.operation,scope_epoch:e.scope_epoch,key_id:e.key_id,counter:t.counter}}function Kr(t,e){return e.type==="encrypted_operation_response"&&typeof e.ciphertext=="string"&&t.protocol_version===e.protocol_version&&t.suite===e.suite&&t.request_id===e.request_id&&t.grant_id===e.grant_id&&t.application_id===e.application_id&&t.connector_id===e.connector_id&&t.collection_id===e.collection_id&&t.operation===e.operation&&t.scope_epoch===e.scope_epoch&&t.key_id===e.key_id&&t.counter===e.counter}function X(t){if(t.protocol_version!==ht||t.suite!==Ge||!Number.isSafeInteger(t.scope_epoch)||t.scope_epoch<=0||typeof t.key_id!="string"||t.key_id.length===0||t.key_id.length>200||t.key_id.includes("|"))throw new S("unsupported_encryption","The grant uses an unsupported relay encryption profile.");if(typeof t.connector_id!="string"||!ri.test(t.connector_id)||typeof t.collection_id!="string"||!ri.test(t.collection_id))throw new S("unsupported_encryption","The grant uses invalid encrypted relay identities.");sn(t.application_agreement_public_key),sn(t.connector_agreement_public_key)}function fi(t){let e=BigInt(t);if(e<=0n||e>cn||e.toString()!==t)throw new S("invalid_counter","The encrypted relay counter is invalid.");let n=new Uint8Array(new ArrayBuffer(12));return new DataView(n.buffer).setBigUint64(4,e,!1),n}function Je(t){let e="";for(let n of t)e+=String.fromCharCode(n);return btoa(e).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}async function ai(t){let e=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(t));return Je(new Uint8Array(e))}function hi(t){if(!/^[A-Za-z0-9_-]+$/.test(t))throw new S("invalid_base64","Encrypted relay data is malformed.");let e="=".repeat((4-t.length%4)%4),n=atob(t.replaceAll("-","+").replaceAll("_","/")+e);return Uint8Array.from(n,i=>i.charCodeAt(0))}function sn(t){let e=hi(t);if(e.length!==65||e[0]!==4)throw new S("invalid_public_key","Encrypted relay public keys must be uncompressed P-256 points.");return e}function yi(t){return Uint8Array.from(t).buffer}function Hr(t){return new Promise((e,n)=>{t.onerror=()=>n(t.error),t.onsuccess=()=>e(t.result)})}function si(t,e){return new Promise((n,i)=>{let o=t.transaction(ae,"readwrite"),r=e(o.objectStore(ae));r.onerror=()=>i(r.error),o.onerror=()=>i(o.error),o.onabort=()=>i(o.error??new Error("Grant key transaction aborted.")),o.oncomplete=()=>n()})}function he(t){return{...t,credentials:"omit",targetAddressSpace:"loopback"}}async function Xe(){if(typeof navigator>"u"||!navigator.permissions?.query)return null;try{return(await navigator.permissions.query({name:"local-network-access"})).state}catch{return null}}function Te(t){return t===404||t===405||t===426||t>=500}function mi(t,e){return Ce(t,e)}function G(t){return[...new Set(t)]}function gi(t,e){return t.grantId||e.grantId?t.grantId===e.grantId&&t.keyHandle===e.keyHandle&&t.encryption?.key_id===e.encryption?.key_id:t.accessToken===e.accessToken}function ye(t){if(t?.aborted)throw d("operation_cancelled","The operation was cancelled before it changed the collection.",{operationOutcome:"not_sent",cause:t.reason})}function Ct(t,e,n,i){return t instanceof b?t:e?.aborted?n?j(n,t):e.reason instanceof b?e.reason:d("operation_cancelled","The operation was cancelled before it changed the collection.",{operationOutcome:"not_sent",cause:t}):n?j(n,t):t instanceof TypeError?d(i,i==="hosted_provider_unavailable"?"The hosted collection provider is unavailable.":"The Connect relay is unavailable.",{cause:t}):t instanceof Error?t:new Error(String(t))}function un(t,e){return e?.aborted===!0||t instanceof b&&t.code==="operation_cancelled"}function _i(t,e){if(e.dryRun!==!0||e.wouldRename!==!0||e.from!==t.from||e.to!==t.to)throw d("invalid_preflight","The rename preview does not match this mutation. Run the preview again.")}function bi(t,e){if(e.dryRun!==!0||e.wouldDelete!==!0||e.path!==t.path)throw d("invalid_preflight","The delete preview does not match this mutation. Run the preview again.")}function vi(t,e){if(t.updateRefs===!1)return{affectedRecords:0,totalUnits:1,warnings:0};let n=e.referencesAffected??[];return{affectedRecords:new Set(n.map(i=>i.path)).size,totalUnits:1+n.length,warnings:e.warnings?.length??0}}function Ci(t){return{affectedRecords:new Set((t.brokenLinks??[]).map(e=>e.path)).size,totalUnits:1,warnings:0}}async function wi(t,e){return jn(t,e??{})}function Si(t){return JSON.stringify(dn(t))}function dn(t){return Array.isArray(t)?t.map(e=>dn(e)):t&&typeof t=="object"?Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0).sort(([e],[n])=>e<n?-1:e>n?1:0).map(([e,n])=>[e,dn(n)])):t}function j(t,e){return d("operation_outcome_unknown","The write may have completed, but mdbase could not recover its authoritative result. Retry the exact same write to recover safely.",{operationOutcome:"unknown",details:{request_id:t},cause:e})}function V(t){let e=new Uint8Array(t);return crypto.getRandomValues(e),pn(e)}function pn(t){let e="";for(let n of t)e+=String.fromCharCode(n);return btoa(e).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function Ri(t){let e=t.replaceAll("-","+").replaceAll("_","/").padEnd(Math.ceil(t.length/4)*4,"="),n=atob(e),i=new Uint8Array(new ArrayBuffer(n.length));for(let o=0;o<n.length;o+=1)i[o]=n.charCodeAt(o);return i}async function Z(t,e,n,i){try{return await fetch(t,e)}catch(o){throw d(n,i,{cause:o})}}async function R(t,e,n){let i;try{i=await t.text()}catch(o){throw F(e,n,{status:t.status,cause:o})}if(i.trim()==="")throw F(e,n,{status:t.status});try{return JSON.parse(i)}catch(o){throw F(e,n,{status:t.status,cause:o})}}function Pi(t){let e=new URL(t);if(e.protocol!=="http:"||!["127.0.0.1","[::1]"].includes(e.hostname)||e.username||e.password||e.pathname!=="/"||e.search||e.hash)throw d("invalid_loopback_url","loopbackUrl must be an HTTP origin on 127.0.0.1 or ::1.");return e.origin}async function Ze(){let t=V(32),e=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(t));return{verifier:t,challenge:pn(new Uint8Array(e))}}function O(t,e,n,i){return F(et(t)??t?.error?.code??e,t?.error_description??t?.error?.message??n,{status:i,details:t?.error?.details})}function et(t){return typeof t?.error=="string"?t.error:void 0}function tt(t,e){if(!t||typeof t!="object"||Array.isArray(t)||typeof e!="string")return!1;let n=t;if(typeof n.operations_url!="string"||typeof n.sync_url!="string"||typeof n.files_url!="string"||typeof n.replica_id!="string"||n.replica_id.length===0||typeof n.access_token!="string"||n.access_token.length===0||n.proof_public_key!==void 0&&(typeof n.proof_public_key!="string"||n.proof_public_key.length===0))return!1;try{let i=new URL(n.operations_url),o=new URL(n.sync_url),r=new URL(n.files_url);return[i,o,r].every(a=>(a.protocol==="https:"||a.protocol==="http:"&&["localhost","127.0.0.1","[::1]","::1"].includes(a.hostname))&&!a.username&&!a.password&&!a.search&&!a.hash)&&/^\/v1\/authorities\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\/operations$/i.test(i.pathname)&&/^\/v1\/authorities\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\/sync$/i.test(o.pathname)&&/^\/v1\/authorities\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\/files$/i.test(r.pathname)&&i.origin===o.origin&&i.origin===r.origin&&i.pathname.split("/")[3]===e&&o.pathname.split("/")[3]===e&&r.pathname.split("/")[3]===e}catch{return!1}}function Ai(t,e){return tt({operations_url:t?.operationsUrl,sync_url:t?.syncUrl,files_url:t?.filesUrl,replica_id:t?.replicaId,access_token:t?.accessToken,proof_public_key:t?.proofPublicKey},e)}function wt(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;let e=t,n=e.actions;if(e.kind!=="files"||e.protocol_version!==1||!Array.isArray(n)||n.length===0||n.length>6||new Set(n).size!==n.length||n.some(o=>!["list","read","add","replace","move","delete"].includes(o)))return!1;let i=e.scope;return!i||typeof i!="object"||Array.isArray(i)?!1:i.kind==="collection"?Object.keys(i).length===1:i.kind==="selected_folders"&&Object.keys(i).length===2&&Array.isArray(i.folders)&&i.folders.length>0&&i.folders.length<=100&&new Set(i.folders).size===i.folders.length&&i.folders.every(o=>typeof o=="string"&&o.length>0&&o.length<=1024&&Vr(o))}function Vr(t){let e=new Set([".mdbase",".git","node_modules","_contracts","_schemas","_types","_views"]);return!t.startsWith("/")&&!t.endsWith("/")&&!t.includes("\\")&&t.split("/").every(n=>{let i=n.split(".")[0]?.toUpperCase()??"";return n!==""&&n!=="."&&n!==".."&&!n.startsWith(".")&&!n.endsWith(" ")&&!n.endsWith(".")&&!/[<>:"|?*]/.test(n)&&!e.has(n.toLowerCase())&&!["CON","PRN","AUX","NUL"].includes(i)&&!/^(COM|LPT)[1-9]$/.test(i)})}function Oi(t,e){if(!t||typeof t!="object"||Array.isArray(t)||t.collection_id!==e)return!1;try{return X(t),!0}catch{return!1}}function Ti(t){if(typeof t?.device_code!="string"||typeof t?.user_code!="string"||typeof t?.verification_uri!="string"||typeof t?.verification_uri_complete!="string"||!Number.isFinite(t?.expires_in)||!Number.isFinite(t?.interval))throw d("invalid_device_authorization_response","Connect returned an invalid downloaded application authorization response.");return{userCode:t.user_code,verificationUri:t.verification_uri,verificationUriComplete:t.verification_uri_complete,expiresAt:Date.now()+Math.max(1,t.expires_in)*1e3,intervalSeconds:Math.max(1,t.interval)}}function x(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function St(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t;return e.access!=="contract"&&e.access!=="full_collection"||!Array.isArray(e.contracts)||e.contracts.some(n=>!n||typeof n!="object"||n.contract_type!=="record"||typeof n.id!="string"||typeof n.version!="string"||!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(n.version)||!/^sha256:[0-9a-f]{64}$/.test(n.digest)||!n.schema||typeof n.schema!="object"||Array.isArray(n.schema)||!Array.isArray(n.implementations)||n.implementations.some(i=>!i||typeof i!="object"||typeof i.type_name!="string"||!Number.isInteger(i.type_version)||!/^sha256:[0-9a-f]{64}$/.test(i.digest)||!i.fields||typeof i.fields!="object"||Array.isArray(i.fields)||Object.values(i.fields).some(o=>typeof o!="string")))?null:e}function ki(t){return t.endsWith("/")?t.slice(0,-1):t}function Ii(){if(typeof location>"u")throw d("manifest_required","manifest is required outside a browser environment.");if(location.origin==="null")throw d("manifest_required","Downloaded applications must provide their v1 portable manifest inline.");return new URL("/.well-known/mdbase-app.json",location.origin).href}function Mi(){if(typeof location>"u")throw d("redirect_uri_required","redirectUri is required outside a browser environment.");return location.href.split(/[?#]/)[0]}function xi(t,e,n,i){if(typeof t!="string"&&t.distribution==="portable"||i)return"null";let o=new URL(n);if(["http:","https:"].includes(o.protocol))return o.origin;if(typeof location<"u")return location.origin;if(typeof t!="string")return new URL(t.homepage).origin;try{return new URL(e).origin}catch{return""}}function Ei(t){let e=":token:",n=t.lastIndexOf(e);return n<0?"":t.slice(n+e.length)}function Rt(){if(typeof location>"u")throw d("callback_url_required","callbackUrl is required outside a browser environment.");return location.href}function Di(t){if(t)return new ke;if(typeof localStorage>"u")throw d("storage_required","storage is required outside a browser environment.");try{let e=`mdbase-connect:probe:${V(8)}`;return localStorage.setItem(e,"1"),localStorage.removeItem(e),localStorage}catch{return new ke}}var ke=class{values=new Map;get length(){return this.values.size}clear(){this.values.clear()}getItem(e){return this.values.get(e)??null}key(e){return[...this.values.keys()][e]??null}removeItem(e){this.values.delete(e)}setItem(e,n){this.values.set(String(e),String(n))}};function qi(t){return typeof t=="string"||t.distribution!=="portable"?!1:typeof location>"u"||location.origin==="null"||!["http:","https:"].includes(location.protocol)}function Fi(t){let e=Si(t),n=2166136261,i=2654435769;for(let o=0;o<e.length;o+=1){let r=e.charCodeAt(o);n=Math.imul(n^r,16777619),i=Math.imul(i^r,2246822507)}return`${(n>>>0).toString(16).padStart(8,"0")}${(i>>>0).toString(16).padStart(8,"0")}`}function nt(t){for(let e of["code","state","error","error_description"])t.searchParams.delete(e);return t}function Pt(t){let e;try{e=new URL(t)}catch{return!1}return e.searchParams.has("state")&&(e.searchParams.has("code")||e.searchParams.has("error"))}function zi(t){if(!t.details||typeof t.details!="object"||Array.isArray(t.details))return;let e=t.details.return_to;return typeof e=="string"?e:void 0}var me=["describe","changes","read","query"];var Ie=class{constructor(e,n){this.connect=e;this.operations=G(n.operations??me),this.selection=n.selection,this.autoSelect=n.autoSelect??"only",this.snapshot={status:"unselected",connections:[]},this.refresh()}connect;operations;selection;autoSelect;listeners=new Set;snapshot;snapshotKey="";stopConnections;stopSelection;stopActiveConnection;activeCollectionId=null;unavailableReason="not_authorized";started=!1;refreshing=!1;refreshQueued=!1;transactionDepth=0;callbackPromise=null;async start(e){this.started||(this.started=!0,this.stopConnections=this.connect.onConnectionsChange(()=>this.refresh()),this.stopSelection=this.selection.subscribe(()=>{this.unavailableReason="not_authorized",this.refresh()}));let n=this.selection.authorizationCallback();if(n){let i=await this.handleAuthorizationCallback(n,e);if(!i.ok)return i}else this.autoSelectOnlyConnection();return this.refresh(),M(this.snapshot)}destroy(){this.stopConnections?.(),this.stopSelection?.(),this.stopActiveConnection?.(),this.stopConnections=void 0,this.stopSelection=void 0,this.stopActiveConnection=void 0,this.activeCollectionId=null,this.started=!1}getSnapshot(){return this.snapshot}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}select(e,n={}){let i=this.connect.connection(e);return i?(this.unavailableReason="not_authorized",this.selection.select(e,n),this.refresh(),M(i)):A(I("unknown_collection","This collection is not authorized for this application."))}clearSelection(e={}){this.unavailableReason="not_authorized",this.selection.select(null,e),this.refresh()}forget(e){this.transactionDepth+=1;try{let n=this.selection.selectedCollectionId()===e;this.connect.connection(e)?.forget(),n&&this.selection.select(null,{history:"replace"})}finally{this.transactionDepth-=1,this.refresh()}}async authorize(e,n={}){let i=this.selection.selectedCollectionId();if(e==="selected"&&!i)return A(I("collection_not_selected","Choose a collection before updating its access."));let o=typeof e=="object"?e.collectionId:e==="selected"?i:null;this.transactionDepth+=1;try{let r=await this.connect.authorize({...n,operations:this.operations,target:o===null?{kind:"choose"}:{kind:"collection",collectionId:o},returnTo:this.selection.authorizationReturnTo()});return r.ok&&r.value.kind==="connected"&&this.selection.finishAuthorization(r.value.returnTo,r.value.connection.collectionId),r}finally{this.transactionDepth-=1,this.refresh()}}async ensureOperations(e,n){let i=this.snapshot;if(i.status!=="ready")return A(I("collection_not_ready","Choose an authorized collection first."));let o=G(e),r=i.connection.authorizationCapabilities(o);if(r.sufficient)return M({kind:"unchanged",connection:i.connection});this.transactionDepth+=1;try{let a=await this.connect.authorize({...n,operations:G([...r.grantedOperations,...r.missingOperations]),target:{kind:"collection",collectionId:i.collectionId},returnTo:this.selection.authorizationReturnTo()});return a.ok&&a.value.kind==="connected"&&this.selection.finishAuthorization(a.value.returnTo,a.value.connection.collectionId),a}finally{this.transactionDepth-=1,this.refresh()}}handleAuthorizationCallback(e,n){if(!Pt(e))return Promise.resolve(A(I("invalid_callback","This URL is not an authorization callback.")));if(this.callbackPromise)return this.callbackPromise;this.transactionDepth+=1;let i=this.connect.completeAuthorization(e,n).then(o=>{if(!o.ok){let a=zi(o.problem);return this.selection.clearAuthorizationCallback(a),this.refresh(),o}let r=o.value;return this.unavailableReason="not_authorized",this.selection.finishAuthorization(r.returnTo,r.connection.collectionId),this.refresh(),M(r.connection,o.diagnostics)}).catch(o=>{throw this.selection.clearAuthorizationCallback(),this.refresh(),o}).finally(()=>{this.transactionDepth-=1,this.refresh(),this.callbackPromise===i&&(this.callbackPromise=null)});return this.callbackPromise=i,i}autoSelectOnlyConnection(){if(this.autoSelect!=="only"||this.selection.selectedCollectionId())return;let e=this.connect.connections();e.length===1&&this.selection.select(e[0].collectionId,{history:"replace"})}refresh(){if(this.transactionDepth>0){this.refreshQueued=!0;return}if(this.refreshing){this.refreshQueued=!0;return}this.refreshing=!0;try{do this.refreshQueued=!1,this.refreshOnce();while(this.refreshQueued)}finally{this.refreshing=!1}}refreshOnce(){let e=this.selection.selectedCollectionId(),n=this.connect.connections(),i=e?this.connect.connection(e):null;i?.collectionId!==this.activeCollectionId&&(this.stopActiveConnection?.(),this.activeCollectionId=i?.collectionId??null,this.stopActiveConnection=i?.onConnectionChange(a=>{!a&&this.selection.selectedCollectionId()===i.collectionId&&(this.unavailableReason="authorization_lost"),this.refresh()}));let o;if(!e)o={status:"unselected",connections:n};else if(!i||!i.info())o={status:"unavailable",collectionId:e,reason:this.connect.unavailableReason(e)??this.unavailableReason,connections:n};else{let a=i.info();o={status:"ready",collectionId:e,connection:i,info:a,access:i.authorizationCapabilities(this.operations),connections:n}}let r=$r(o);if(r!==this.snapshotKey){this.snapshot=o,this.snapshotKey=r;for(let a of this.listeners)a()}}};function $r(t){return t.status==="unselected"?JSON.stringify({status:t.status,connections:t.connections}):t.status==="unavailable"?JSON.stringify({status:t.status,collectionId:t.collectionId,reason:t.reason,connections:t.connections}):JSON.stringify({status:t.status,collectionId:t.collectionId,info:t.info,access:t.access,connections:t.connections})}var it=class{values=new Map;read(e){return this.values.get(e)??null}write(e,n){this.values.set(e,n)}remove(e){this.values.delete(e)}},Me=class{constructor(e,n,i=Re()){this.connect=e;this.options=n;this.timeouts=i;this.verificationStore=n.verificationStore??ea()}connect;options;timeouts;listeners=new Set;verificationStore;snapshot={status:"opening",connections:[]};manifest=null;application=null;base=null;stopBase;setupAssessment=null;setupTypePackAdoptions=null;verificationGeneration=0;lifecycleGeneration=0;startOperation=null;start(e){if(this.base&&!this.startOperation)return Promise.resolve(M(this.snapshot));let n=this.startOperation??this.beginStart();return n.waiters+=1,U(e,this.timeouts.watchStartMs,()=>n.promise).finally(()=>{n.waiters-=1,n.waiters===0&&this.startOperation===n&&(n.controller.abort(),this.startOperation=null,this.lifecycleGeneration+=1)})}beginStart(){this.snapshot={status:"opening",connections:[]};let e=new AbortController,n=++this.lifecycleGeneration,i={promise:this.startWithinBudget({signal:e.signal,timeoutMs:null},n),controller:e,waiters:0,generation:n};this.startOperation=i;let o=()=>{this.startOperation===i&&(this.startOperation=null)};return i.promise.then(o,o),i}async startWithinBudget(e,n){let i=await this.connect.register(e);if(!i.ok)return i;let o=await this.connect.manifest(e);if(!o.ok)return o;let r=o.value.requirements?.capabilities;if(!r)return A(I("invalid_application_manifest","Application sessions require a versioned semantic capability contract.",{details:{issues:[{path:"/requirements/capabilities",keyword:"required",message:"is required for application sessions",params:{}}]}}));if(n!==this.lifecycleGeneration||e.signal?.aborted)throw J(e.signal??new AbortController().signal);this.application=i.value,this.manifest=o.value;let a=new Ie(this.connect,{selection:this.options.selection,autoSelect:this.options.autoSelect,operations:Gr(r)});this.base=a;try{let s=await a.start(e);if(!s.ok)return this.cleanupBase(a),s;if(n!==this.lifecycleGeneration||e.signal?.aborted)throw J(e.signal??new AbortController().signal);if(this.stopBase=a.subscribe(()=>{this.base===a&&this.refresh()}),await this.refresh(!0,e),n!==this.lifecycleGeneration||e.signal?.aborted)throw J(e.signal??new AbortController().signal);return M(this.snapshot)}catch(s){throw this.cleanupBase(a),s}}destroy(){this.lifecycleGeneration+=1,this.verificationGeneration+=1,this.startOperation?.controller.abort(),this.startOperation=null,this.base&&this.cleanupBase(this.base),this.application=null,this.manifest=null,this.setupAssessment=null,this.setupTypePackAdoptions=null,this.snapshot={status:"opening",connections:[]},this.listeners.clear()}cleanupBase(e){this.base===e&&(this.stopBase?.(),this.stopBase=void 0,e.destroy(),this.base=null)}getSnapshot(){return this.snapshot}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}connection(){let e=this.base?.getSnapshot();return e?.status==="ready"?e.connection:null}select(e,n={}){return this.requireBase().select(e,n)}clearSelection(e={}){this.requireBase().clearSelection(e)}forget(e){this.requireBase().forget(e)}authorize(e,n={}){return this.requireBase().authorize(e,n)}handleAuthorizationCallback(e,n){return this.requireBase().handleAuthorizationCallback(String(e),n)}completeAuthorization(e,n){return this.requireBase().handleAuthorizationCallback(e===void 0?Rt():String(e),n)}ensureCapabilities(e,n){let i=this.requireManifest().requirements?.capabilities,o=new Set([...i?.required??[],...i?.optional??[]]);return e.some(r=>!o.has(r))?Promise.resolve(A(I("invalid_application_manifest","Applications may only request capabilities declared in their manifest.",{details:{issues:[{path:"/requirements/capabilities",keyword:"undeclaredCapability",message:"must declare every capability requested by the application",params:{requested:e,declared:[...o]}}]}}))):this.requireBase().ensureOperations(Wr(e),n)}async applyCollectionSetup(e){if(this.snapshot.status!=="setup_review_required"||!this.setupAssessment)return A(I("collection_not_ready","There is no reviewed collection setup to apply."));if(!this.setupAssessment.applicable)return A(I("collection_not_ready","Resolve the collection setup conflicts before applying this update."));let n=this.connection();if(!n)return A(I("collection_not_ready","The collection is not ready."));let i=this.setupAssessment,o={...this.collectionSetupInput(this.setupTypePackAdoptions??void 0),expectedAssessmentDigest:i.assessmentDigest,expectedCollectionRevision:i.collectionRevision,expectedProvisionDigest:i.provisionDigest,allowTypePackDowngrades:i.typePacks.filter(s=>s.status==="downgrade").map(s=>s.desired.id)},r=re(e,this.timeouts.requestMs),a={signal:r.signal,timeoutMs:null};try{let s=await n.applyCollectionSetup(o,a);return s.ok?(this.setupAssessment=null,this.setupTypePackAdoptions=null,await this.verifySetup(this.context(n),++this.verificationGeneration,a),M(this.snapshot)):s}finally{r.dispose()}}async refresh(e=!1,n){if(!this.base||!this.manifest)return;let i=this.base.getSnapshot();this.verificationGeneration+=1;let o=this.verificationGeneration;if(this.setupAssessment=null,this.setupTypePackAdoptions=null,i.status==="unselected"){this.publish({status:"unselected",connections:i.connections});return}if(i.status==="unavailable"){this.publish(i);return}let r=this.context(i.connection);if(!r.capabilities.requiredAvailable||!Xr(this.manifest,r.info)){this.publish({status:"authorization_required",...r});return}if(!(this.manifest.requirements?.capabilities?.required.includes("collection.setup.apply")??!1)){this.publish({status:"ready",verification:"verified",...r});return}let s=fn(this.manifest,i.collectionId);this.verificationStore.read(s)===Ui(this.manifest)?this.publish({status:"ready",verification:"cached",...r}):this.publish({status:"checking_setup",...r});let c=this.verifySetup(r,o,n);e&&await c}async verifySetup(e,n,i){let o=this.connection(),r=this.requireManifest();if(!o||o.collectionId!==e.collectionId)return;let a=this.collectionSetupInput(),s=i?await o.assessCollectionSetup(a,i):await o.assessCollectionSetup(a);if(n===this.verificationGeneration){if(!s.ok){this.publish({status:"blocked",problem:s.problem,...e});return}if(!s.value.applicable){let c=Qr(s.value);if(Object.keys(c).length>0){if(s=i?await o.assessCollectionSetup(this.collectionSetupInput(c),i):await o.assessCollectionSetup(this.collectionSetupInput(c)),n!==this.verificationGeneration)return;if(!s.ok){this.publish({status:"blocked",problem:s.problem,...e});return}this.setupTypePackAdoptions=c}}if(n===this.verificationGeneration){if(s.value.status!=="current"){this.setupAssessment=s.value,this.verificationStore.remove(fn(r,e.collectionId)),this.publish({status:"setup_review_required",update:Jr(s.value,r.provisions?.type_packs??[]),...e});return}this.verificationStore.write(fn(r,e.collectionId),Ui(r)),this.publish({status:"ready",verification:"verified",...e})}}}collectionSetupInput(e){let n=this.requireManifest(),i=this.requireApplication();return{applicationId:Zr(i.family_identity),declarationDigest:`sha256:${i.manifest_digest}`,requirements:{configuration:n.requirements?.configuration??[]},provisions:{configuration:n.provisions?.configuration??[],typePacks:n.provisions?.type_packs??[]},...e?{typePackAdoptions:e}:{}}}context(e){let n=e.info();return{collectionId:e.collectionId,info:n,capabilities:yt(this.requireManifest().requirements.capabilities,this.requireManifest(),n),connections:this.connect.connections()}}publish(e){if(JSON.stringify(this.snapshot)!==JSON.stringify(e)){this.snapshot=e;for(let n of this.listeners)n()}}requireBase(){if(!this.base)throw new Error("Start the application session before using it.");return this.base}requireManifest(){if(!this.manifest)throw new Error("Start the application session before using it.");return this.manifest}requireApplication(){if(!this.application)throw new Error("Start the application session before using it.");return this.application}};function Gr(t){return dt(t)}function Wr(t){let e=t.flatMap(n=>ut(n));return[...new Set(e)]}function Yr(t,e){let n=e.status==="conflict"?"Existing user-owned resources conflict with this application definition pack.":e.status==="install"?"This collection needs the application definitions installed.":`This collection has a ${e.status} definition change to review.`;return{id:e.desired.id,name:t.manifest.name??e.desired.id,status:e.status,applicable:e.applicable,assessmentDigest:e.assessmentDigest,...e.current?{currentVersion:e.current.version}:{},desiredVersion:e.desired.version,resources:e.resources,contractSetups:e.contractSetups,canApply:e.applicable,reason:n}}function Jr(t,e){let n=t.typePacks.map(r=>{let a=e.find(s=>s.manifest.id===r.desired.id);if(!a)throw new Error(`Collection setup returned undeclared type pack '${r.desired.id}'.`);return Yr(a,r)}),i=t.configuration.filter(r=>r.action!=="current").length,o=t.status==="conflict"?"Existing collection policy conflicts with this application's required setup.":`This application requires ${i} configuration change${i===1?"":"s"} and ${n.length} definition update${n.length===1?"":"s"}.`;return{status:t.status,applicable:t.applicable,assessmentDigest:t.assessmentDigest,collectionRevision:t.collectionRevision,provisionDigest:t.provisionDigest,configuration:t.configuration,typePacks:n,canApply:t.applicable,reason:o}}function Qr(t){let e={};for(let n of t.typePacks){let i=Object.fromEntries(n.resources.filter(o=>o.action==="conflict"&&o.mode==="managed"&&o.currentDigest!==void 0&&o.installedDigest===void 0).map(o=>[o.target,o.currentDigest]));Object.keys(i).length>0&&(e[n.desired.id]=i)}return e}function fn(t,e){return`mdbase-application-session:v1:${t.id}:${e}`}function Ui(t){return JSON.stringify({capabilities:t.requirements?.capabilities,requirements:t.requirements?.configuration??[],provisions:t.provisions??{}})}function Xr(t,e){return t.requirements?.access!=="full_collection"||e.scope.access==="full_collection"}function Zr(t){let e="bundle:";if(!t.startsWith(e)||t.length===e.length)throw new Error("The registered application has no valid declaration identity.");return t.slice(e.length)}function ea(){return typeof localStorage<"u"?{read:t=>localStorage.getItem(t),write:(t,e)=>localStorage.setItem(t,e),remove:t=>localStorage.removeItem(t)}:new it}function ot(t,e){return new Promise((n,i)=>{if(e?.aborted){i(e?.reason??new DOMException("Aborted","AbortError"));return}let o=()=>e?.removeEventListener("abort",a),r=setTimeout(()=>{o(),n()},t),a=()=>{clearTimeout(r),o(),i(e?.reason??new DOMException("Aborted","AbortError"))};e?.addEventListener("abort",a,{once:!0})})}var ta="mdbase-connect-identities",xe="application-identities",hn=BigInt("0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551"),na=hn/2n,Ee=class{database=null;async create(e){let n=await Li(e),i=await this.open();return await Ni(i,o=>o.add(n)),n}async get(e){let n=await this.open();return await ia(n.transaction(xe).objectStore(xe).get(e))??null}async delete(e){let n=await this.open();await Ni(n,i=>i.delete(e))}open(){if(typeof indexedDB>"u")throw new ge("Persistent application identity requires browser IndexedDB or an injected identity store.");return this.database||(this.database=new Promise((e,n)=>{let i=indexedDB.open(ta,1);i.onupgradeneeded=()=>{i.result.objectStoreNames.contains(xe)||i.result.createObjectStore(xe,{keyPath:"handle"})},i.onerror=()=>n(i.error),i.onsuccess=()=>e(i.result)})),this.database}},De=class{records=new Map;async create(e){if(this.records.has(e))throw new Error(`Application identity already exists: ${e}`);let n=await Li(e);return this.records.set(e,n),n}async get(e){return this.records.get(e)??null}async delete(e){this.records.delete(e)}},ge=class extends Error{constructor(e){super(e),this.name="ApplicationIdentityStoreError"}};async function qe(t){return Wn(t.signingPublicKey)}async function rt(t,e){if(t.installation_signing_public_key!==e.signingPublicKey||t.application_installation_id!==await qe(e))throw new Error("Application authorization identity does not match its binding.");let n=ra(new Uint8Array(await crypto.subtle.sign({name:"ECDSA",hash:"SHA-256"},e.signingPrivateKey,Yn(t))));return{binding:t,signature:Bi(n)}}async function At(t,e,n){let i=`application-installation:v2:${e}:${n.id}`,o=await t.get(i);if(o)return o;try{return await t.create(i)}catch(r){let a=await t.get(i);if(a)return a;throw r}}async function Li(t){let e=await crypto.subtle.generateKey({name:"ECDSA",namedCurve:"P-256"},!0,["sign","verify"]),n=Bi(new Uint8Array(await crypto.subtle.exportKey("raw",e.publicKey))),i=await crypto.subtle.exportKey("pkcs8",e.privateKey),o=await crypto.subtle.importKey("pkcs8",i,{name:"ECDSA",namedCurve:"P-256"},!1,["sign"]);return{handle:t,signingPrivateKey:o,signingPublicKey:n}}function ia(t){return new Promise((e,n)=>{t.onerror=()=>n(t.error),t.onsuccess=()=>e(t.result)})}function Ni(t,e){return new Promise((n,i)=>{let o=t.transaction(xe,"readwrite");e(o.objectStore(xe)).onerror=()=>i(o.error),o.onerror=()=>i(o.error),o.onabort=()=>i(o.error??new Error("Identity transaction aborted.")),o.oncomplete=()=>n()})}function oa(t){let e=new Uint8Array(t.reduce((i,o)=>i+o.byteLength,0)),n=0;for(let i of t)e.set(i,n),n+=i.byteLength;return e}function Bi(t){return btoa(String.fromCharCode(...t)).replaceAll("+","-").replaceAll("/","_").replace(/=+$/u,"")}function ra(t){if(t.byteLength!==64)throw new Error("Application authorization signature is invalid.");let e=aa(t.slice(32));if(e===0n||e>=hn)throw new Error("Application authorization signature is invalid.");return e<=na?t:oa([t.slice(0,32),sa(hn-e,32)])}function aa(t){return BigInt(`0x${ca(t)}`)}function sa(t,e){let n=t.toString(16).padStart(e*2,"0");return Uint8Array.from({length:e},(i,o)=>Number.parseInt(n.slice(o*2,o*2+2),16))}function ca(t){return[...t].map(e=>e.toString(16).padStart(2,"0")).join("")}function ji(t){if(t!==!1)return{initialDelayMs:Math.max(0,t?.initialDelayMs??500),maxDelayMs:Math.max(0,t?.maxDelayMs??15e3),multiplier:Math.max(1,t?.multiplier??2),...t?.maxAttempts===void 0?{}:{maxAttempts:Math.max(0,t.maxAttempts)}}}var Fe=class{constructor(e,n=bt){this.transport=e;this.requestTimeoutMs=n}transport;requestTimeoutMs;operation(e,n,i){return E(()=>this.transport.operation(e,n,i),ii)}async describe(e){let n=await this.rawOperation("describe",{},mt,e);return D(n,Ra)}async changes(e={},n){let i=await this.rawOperation("changes",e,gt,n);return D(i,Sa)}async read(e,n){let i=await this.envelopeOperation("read",la(e),Y,n);return D(i,Ot)}async query(e={},n){let i=await this.envelopeOperation("query",da(e),oi,n);return D(i,({results:o,meta:r})=>({results:o.map(eo),...r?{meta:{totalCount:r.total_count,hasMore:r.has_more,...r.snapshot?{snapshot:r.snapshot}:{}}}:{}}))}async*queryPages(e={},n={}){let{offset:i,limit:o,snapshot:r,...a}=e,s=Pa(i,0),c=Wi(n.firstPageSize??o,200),l=Wi(n.pageSize??o,1e3),u=r,p=0,f=0;for(;!n.signal?.aborted;){let h=await this.query({...a,offset:s,limit:f===0?c:l,...u?{snapshot:u}:{}},{signal:n.signal,timeoutMs:n.pageTimeoutMs});if(!h.ok){yield h;return}let y=h.value,m=y.meta?.snapshot;if(u&&m&&u!==m){yield A(I("query_snapshot_changed","The collection query snapshot changed while paging. Refresh the query before continuing."));return}!u&&m&&(u=m),p+=y.results.length;let w=!y.meta?.hasMore||y.results.length===0,g={results:y.results,...y.meta?{meta:y.meta}:{},page:f,offset:s,loaded:p,complete:w,...u?{snapshot:u}:{}};if(n.onProgress?.(g),yield M(g,h.diagnostics),w)return;s+=y.results.length,f+=1}}async queryAll(e={},n={}){let i=re(n,this.requestTimeoutMs),o=[],r,a=[];try{for await(let s of this.queryPages(e,{firstPageSize:n.firstPageSize,pageSize:n.pageSize,signal:i.signal,pageTimeoutMs:null,onProgress:n.onProgress})){if(!s.ok)return s;let c=s.value;o.push(...c.results),r=c,a.push(...s.diagnostics)}if(i.signal.aborted)throw J(i.signal);return M({results:o,meta:{...r?.meta??{},totalCount:r?.meta?.totalCount??o.length,hasMore:r?!r.complete:!1,...r?.snapshot?{snapshot:r.snapshot}:{}}},a)}catch(s){if(s instanceof b)return A(s.problem);throw s}finally{i.dispose()}}async listViews(e){let n=await this.envelopeOperation("list_views",{},Y,e);return D(n,i=>({views:i.views,meta:{totalCount:i.meta.total_count}}))}async executeView(e,n){let i=await this.envelopeOperation("execute_view",e,Y,n);return D(i,_a)}readViewSource(e,n){return this.envelopeOperation("read_view_source",e,Y,n)}createViewSource(e,n){return this.envelopeOperation("create_view_source",e,z,n)}updateViewSource(e,n){return this.envelopeOperation("update_view_source",yn(e),z,n)}deleteViewSource(e,n){return this.envelopeOperation("delete_view_source",yn(e),z,n)}async create(e,n){let i=await this.envelopeOperation("create",ua(e),z,n);return D(i,Ot)}async update(e,n){let i=await this.envelopeOperation("update",pa(e),z,n);return D(i,Ot)}async delete(e,n){let i=await this.envelopeOperation("delete",Ki(e),z,n);return D(i,Qi)}async preflightDelete(e,n){let i=await this.envelopeOperation("delete",{...Ki(e),check_backlinks:!0,dry_run:!0},z,n);return D(i,ya)}async rename(e,n){let i=await this.envelopeOperation("rename",Hi(e),z,n);return D(i,ma)}async preflightRename(e,n){let i=await this.envelopeOperation("rename",{...Hi(e),dry_run:!0},z,n);return D(i,ga)}validate(e={},n){return this.envelopeOperation("validate",e,Y,n)}readType(e,n){return this.envelopeOperation("read_type",e,oe,n)}createType(e,n){return this.envelopeOperation("create_type",e,oe,n)}updateType(e,n){return this.envelopeOperation("update_type",yn(e),oe,n)}async assessTypePack(e,n){let i=await this.envelopeOperation("assess_type_pack",Yi(e),oe,n);return D(i,gn)}async applyTypePack(e,n){let i=await this.envelopeOperation("apply_type_pack",fa(e),oe,n);return D(i,va)}async assessCollectionSetup(e,n){let i=await this.envelopeOperation("assess_collection_setup",Ji(e),oe,n);return D(i,Gi)}async applyCollectionSetup(e,n){let i=await this.envelopeOperation("apply_collection_setup",ha(e),oe,n);return D(i,o=>({assessment:Gi(o.assessment),receipt:Ca(o.receipt)}))}async listTimers(e,n){let i=await this.rawOperation("list_timers",{namespace:e},Y,n);return D(i,o=>({namespace:o.namespace,timers:o.timers.map(mn)}))}async putTimer(e,n){let i=await this.rawOperation("put_timer",{namespace:e.namespace,criterion_id:e.criterionId,timer:Vi(e.timer)},z,n);return D(i,mn)}cancelTimer(e,n){return this.rawOperation("cancel_timer",e,z,n)}async reconcileTimers(e,n){let i=await this.rawOperation("reconcile_timers",{namespace:e.namespace,criterion_id:e.criterionId,timers:e.timers.map(Vi)},z,n);return D(i,o=>({namespace:o.namespace,timers:o.timers.map(mn),cancelledIds:o.cancelled_ids}))}async*watch(e={}){let n=e.cursor,i=Math.max(100,e.pollIntervalMs??1e3),o=ji(e.retry),r=0,a=!1;for(e.onStatus?.({state:"connecting",...n===void 0?{}:{cursor:n}});!e.signal?.aborted;){let s=await this.changes(n===void 0?{}:{after:n,limit:200},{signal:e.signal,timeoutMs:e.timeoutMs});if(!s.ok){let u=s.problem;if(e.signal?.aborted)return;if(!o||u.recovery!=="retry"){yield s;return}if(a=!1,r+=1,o.maxAttempts!==void 0&&r>o.maxAttempts){yield s;return}let p=Math.min(o.maxDelayMs,Math.round(o.initialDelayMs*o.multiplier**(r-1)));e.onStatus?.({state:"reconnecting",...n===void 0?{}:{cursor:n},attempt:r,retryInMs:p,problem:u});try{await ot(p,e.signal)}catch{if(!e.signal?.aborted)throw d("operation_failed","Watch retry delay failed unexpectedly.")}continue}let c=s.value;if(n===void 0){n=c.cursor;continue}if(c.reset){let u=I("change_cursor_reset","The collection change cursor expired. Refresh collection state before subscribing again.");e.onStatus?.({state:"reset_required",cursor:n,problem:u}),yield A(u);return}let l=r>0;r=0,(!a||l)&&e.onStatus?.({state:"connected",cursor:n,recovered:l}),a=!0;for(let u of c.events)yield M(u);if(n=c.cursor,!c.hasMore)try{await ot(i,e.signal)}catch{if(!e.signal?.aborted)throw d("operation_failed","Watch polling delay failed unexpectedly.")}}}rawOperation(e,n,i,o){return E(()=>this.transport.operation(e,n,o),i)}async envelopeOperation(e,n,i,o){let r=await E(()=>this.transport.operation(e,n,o),i);if(!r.ok)return r;let a=r.value;return a.valid?M(a.result,a.diagnostics):A(we(a))}};function D(t,e){return t.ok?M(e(t.value),t.diagnostics):t}function la(t){return{path:t.path,...t.contract?{contract:t.contract}:{},...t.includeDocument===void 0?{}:{include_document:t.includeDocument}}}function da(t){return{...t.types?{types:t.types}:{},...t.timezone?{timezone:t.timezone}:{},...t.context?{context:t.context}:{},...t.projections?{projections:Object.fromEntries(Object.entries(t.projections).map(([e,n])=>[e,{expr:n.expression,...n.description?{description:n.description}:{}}]))}:{},...t.where?{where:t.where}:{},...t.select?{select:t.select.map(e=>typeof e=="string"?e:{name:e.name,expr:e.expression,...e.label?{label:e.label}:{},...e.description?{description:e.description}:{}})}:{},...t.orderBy?{order_by:t.orderBy}:{},...t.groupBy?{group_by:t.groupBy}:{},...t.summaryFunctions?{summary_functions:Object.fromEntries(Object.entries(t.summaryFunctions).map(([e,n])=>[e,{expr:n.expression,...n.description?{description:n.description}:{}}]))}:{},...t.summaries?{summaries:t.summaries}:{},...t.limit===void 0?{}:{limit:t.limit},...t.offset===void 0?{}:{offset:t.offset},...t.snapshot?{snapshot:t.snapshot}:{},...t.includeBody===void 0?{}:{include_body:t.includeBody},...t.frontmatterMode?{frontmatter_mode:t.frontmatterMode}:{},...t.contract?{contract:t.contract}:{}}}function ua(t){return{...t.path?{path:t.path}:{},...t.type?{type:t.type}:{},...t.contract?{contract:t.contract}:{},...t.frontmatter?{frontmatter:t.frontmatter}:{},...t.body===void 0?{}:{body:t.body},...t.ifRevision?{if_revision:t.ifRevision}:{},...t.includeDocument===void 0?{}:{include_document:t.includeDocument}}}function pa(t){return{path:t.path,...t.contract?{contract:t.contract}:{},...t.ifRevision?{if_revision:t.ifRevision}:{},...t.includeDocument===void 0?{}:{include_document:t.includeDocument},...t.document===void 0?{patch:t.patch,...t.body===void 0?{}:{body:t.body}}:{document:t.document}}}function Ki(t){return{path:t.path,...t.contract?{contract:t.contract}:{},...t.checkBacklinks===void 0?{}:{check_backlinks:t.checkBacklinks},...t.ifRevision?{if_revision:t.ifRevision}:{}}}function Hi(t){return{from:t.from,to:t.to,...t.contract?{contract:t.contract}:{},...t.updateRefs===void 0?{}:{update_refs:t.updateRefs},...t.ifRevision?{if_revision:t.ifRevision}:{},...t.includeDocument===void 0?{}:{include_document:t.includeDocument}}}function yn(t){let{ifRevision:e,...n}=t;return{...n,...e?{if_revision:e}:{}}}function Yi(t){return{provision:t.provision,installed_by:t.installedBy,...t.adoptResources?{adopt_resources:t.adoptResources}:{},...t.preserveSeedTargets?{preserve_seed_targets:t.preserveSeedTargets}:{},...t.targetOverrides?{target_overrides:t.targetOverrides}:{},...t.contractSetups?{contract_setups:t.contractSetups.map(Xi)}:{}}}function fa(t){return{...Yi(t),expected_assessment_digest:t.expectedAssessmentDigest,...t.allowDowngrade===void 0?{}:{allow_downgrade:t.allowDowngrade}}}function Ji(t){return{application_id:t.applicationId,declaration_digest:t.declarationDigest,requirements:t.requirements,provisions:{configuration:t.provisions.configuration,type_packs:t.provisions.typePacks},...t.contractSetups?{contract_setups:t.contractSetups.map(Xi)}:{},...t.typePackAdoptions?{type_pack_adoptions:t.typePackAdoptions}:{}}}function ha(t){return{...Ji(t),expected_assessment_digest:t.expectedAssessmentDigest,expected_collection_revision:t.expectedCollectionRevision,expected_provision_digest:t.expectedProvisionDigest,...t.allowTypePackDowngrades?{allow_type_pack_downgrades:t.allowTypePackDowngrades}:{}}}function Qi(t){return{path:t.path,deleted:t.deleted,...t.broken_links?{brokenLinks:t.broken_links}:{}}}function ya(t){return{...Qi(t),deleted:!1,dryRun:!0,wouldDelete:!0}}function ma(t){let{references_updated:e,...n}=t;return{...Ot(n),from:t.from,to:t.to,...e?{referencesUpdated:e}:{}}}function ga(t){return{from:t.from,to:t.to,dryRun:!0,wouldRename:!0,...t.references_affected?{referencesAffected:t.references_affected}:{},...t.warnings?{warnings:t.warnings}:{}}}function Vi(t){return{id:t.id,fire_at:t.fireAt,...t.data===void 0?{}:{data:t.data}}}function mn(t){return{id:t.id,fireAt:t.fire_at,...t.data===void 0?{}:{data:t.data},criterionId:t.criterion_id,generation:t.generation,status:t.status,createdAt:t.created_at,updatedAt:t.updated_at,firedAt:t.fired_at}}function Xi(t){return t.mode==="starter"?t:{contract:t.contract,mode:"existing",type_name:t.typeName,type_revision:t.typeRevision,fields:t.fields,...t.binding?{binding:t.binding}:{}}}function Zi(t){return{id:t.id,version:t.version,digest:t.digest,type:t.type,implementationDigest:t.implementation_digest}}function eo(t){let{effective_frontmatter:e,contract:n,...i}=t;return{...i,...e===void 0?{}:{effectiveFrontmatter:e},...n?{contract:Zi(n)}:{}}}function Ot(t){let{effective_frontmatter:e,contract:n,...i}=t;return{...i,effectiveFrontmatter:e,...n?{contract:Zi(n)}:{}}}function _a(t){return{results:t.results.map(e=>{let n=eo(e);if(!n.effectiveFrontmatter)throw new Error("Saved view result omitted canonical effective frontmatter.");return{...n,effectiveFrontmatter:n.effectiveFrontmatter}}),meta:{totalCount:t.meta.total_count,hasMore:t.meta.has_more,view:t.meta.view,...t.meta.context?{context:t.meta.context}:{},...t.meta.groups?{groups:t.meta.groups}:{}}}}function $i(t){return{source:t.source,target:t.target,kind:t.kind,mode:t.mode,action:t.action,digest:t.digest,...t.current_digest?{currentDigest:t.current_digest}:{},...t.installed_digest?{installedDigest:t.installed_digest}:{},...t.adopted_from_digest?{adoptedFromDigest:t.adopted_from_digest}:{},...t.reason?{reason:t.reason}:{}}}function Tt(t){return{id:t.id,version:t.version,digest:t.digest,installedBy:t.installed_by,resources:t.resources.map(e=>({source:e.source,target:e.target,kind:e.kind,mode:e.mode,digest:e.digest,...e.adopted_from_digest?{adoptedFromDigest:e.adopted_from_digest}:{}}))}}function ba(t){return t.mode==="starter"?t:{contract:t.contract,mode:"existing",typeName:t.type_name,typeRevision:t.type_revision,fields:t.fields,...t.binding?{binding:t.binding}:{}}}function gn(t){return{status:t.status,applicable:t.applicable,assessmentDigest:t.assessment_digest,...t.current?{current:Tt(t.current)}:{},desired:Tt(t.desired),resources:t.resources.map($i),lock:t.lock,contractSetups:{choices:t.contract_setups.choices.map(ba),resources:t.contract_setups.resources.map($i)}}}function va(t){return{...gn(t),receipt:Tt(t.receipt),cleanupDeferred:t.cleanup_deferred}}function Gi(t){return{status:t.status,applicable:t.applicable,applicationId:t.application_id,declarationDigest:t.declaration_digest,provisionDigest:t.provision_digest,collectionRevision:t.collection_revision,finalCollectionRevision:t.final_collection_revision,baselineDiagnosticCount:t.baseline_diagnostic_count,finalDiagnosticCount:t.final_diagnostic_count,resolvedDiagnosticCount:t.resolved_diagnostic_count,introducedDiagnosticCount:t.introduced_diagnostic_count,baselineDiagnosticDigest:t.baseline_diagnostic_digest,configuration:t.configuration,typePacks:t.type_packs.map(gn),finalResourceRevisions:t.final_resource_revisions,assessmentDigest:t.assessment_digest}}function Ca(t){return{applicationId:t.application_id,declarationDigest:t.declaration_digest,provisionDigest:t.provision_digest,assessmentDigest:t.assessment_digest,collectionRevision:t.collection_revision,configuration:t.configuration,typePacks:t.type_packs.map(Tt),cleanupDeferred:t.cleanup_deferred}}function wa(t){return{cursor:t.cursor,type:t.type,occurredAt:t.occurred_at,payload:t.payload}}function Sa(t){return{events:t.events.map(wa),cursor:t.cursor,hasMore:t.has_more,reset:t.reset}}function Ra(t){return{protocolVersion:t.protocol_version,collectionId:t.collection_id,displayName:t.display_name,specVersion:t.spec_version,operations:t.operations,changeCursor:t.change_cursor,types:t.types,contracts:t.contracts.map(e=>({contractType:e.contract_type,id:e.id,version:e.version,digest:e.digest,schema:e.schema,...e.binding_schema?{bindingSchema:e.binding_schema}:{},implementations:e.implementations.map(n=>({typeName:n.type_name,typeVersion:n.type_version,...n.type_path?{typePath:n.type_path}:{},digest:n.digest,fields:n.fields,...n.binding?{binding:n.binding}:{}}))})),...t.configuration?{configuration:t.configuration}:{}}}function Pa(t,e){return typeof t=="number"&&Number.isFinite(t)?Math.max(0,Math.floor(t)):e}function Wi(t,e){return typeof t=="number"&&Number.isFinite(t)&&t>0?Math.floor(t):e}var kt=class{constructor(e){this.context=e}context;async registerNotifications(e){return U(e,this.context.requestTimeoutMs,n=>this.registerNotificationsWithinBudget(e,n.signal))}async registerNotificationsWithinBudget(e,n){let i=await this.context.authorizedToken(n);if(!i)throw d("not_authorized","Connect this application before enabling notifications.");let r=(await this.context.register(n)).notifications?.criteria.map(g=>g.id)??[],a=[...new Set(e.criteria??r)],s=a.find(g=>!r.includes(g));if(s)throw d("notification_criterion_not_declared",`The application manifest does not declare notification criterion ${s}.`);if(a.length===0)throw d("notifications_not_declared","This application manifest does not declare any notification criteria.");let c=await Z(`${this.context.serverUrl}/v1/notifications/vapid-public-key`,{signal:n},"notifications_unavailable","Push notifications are unavailable."),l=await R(c,"invalid_operation_response","Connect returned an invalid notification key response.");if(!c.ok)throw O(l,"notifications_unavailable","Push notifications are unavailable.",c.status);let u=await e.serviceWorker.pushManager.getSubscription();u||(u=await e.serviceWorker.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:Ri(l.public_key)}));let p=u.toJSON();if(!p.endpoint||!p.keys?.p256dh||!p.keys.auth)throw d("invalid_push_subscription","The browser returned an incomplete push subscription.");let f=x(this.context.storage.getItem(this.context.notificationKey())),h=e.installationId??f?.installationId??V(24),y=await Z(`${this.context.serverUrl}/v1/notifications/channels`,{method:"POST",headers:{authorization:`Bearer ${i.accessToken}`,"content-type":"application/json"},body:JSON.stringify({installation_id:h,criteria:a,subscription:{endpoint:p.endpoint,expirationTime:p.expirationTime??null,keys:p.keys}}),signal:n},"notification_registration_failed","Could not register push notifications."),m=await R(y,"invalid_operation_response","Connect returned an invalid notification registration response.");if(!y.ok)throw O(m,"notification_registration_failed","Could not register push notifications.",y.status);f?.channelId&&f.channelId!==m.channel_id&&fetch(`${this.context.serverUrl}/v1/notifications/channels/${f.channelId}`,{method:"DELETE",headers:{authorization:`Bearer ${i.accessToken}`},signal:n}).catch(()=>{});let w={channelId:m.channel_id,installationId:h,criteria:a};return this.context.storage.setItem(this.context.notificationKey(),JSON.stringify(w)),w}async registerNativeNotifications(e){return U(e,this.context.requestTimeoutMs,n=>this.registerNativeNotificationsWithinBudget(e,n.signal))}async registerNativeNotificationsWithinBudget(e,n){let i=await this.context.authorizedToken(n);if(!i)throw d("not_authorized","Connect this application before enabling notifications.");let o=await this.context.register(n);if(o.notifications?.native_delivery?.mode!=="managed_fcm")throw d("managed_fcm_not_declared","This application does not declare Connect-managed native notifications.");let r=o.notifications.criteria.map(y=>y.id),a=[...new Set(e.criteria??r)],s=a.find(y=>!r.includes(y));if(s)throw d("notification_criterion_not_declared",`The application manifest does not declare notification criterion ${s}.`);if(a.length===0)throw d("notifications_not_declared","This application manifest does not declare any notification criteria.");let c=this.context.notificationKey("fcm"),l=x(this.context.storage.getItem(c)),u=e.installationId??l?.installationId??V(24),p=await Z(`${this.context.serverUrl}/v1/notifications/channels`,{method:"POST",headers:{authorization:`Bearer ${i.accessToken}`,"content-type":"application/json"},body:JSON.stringify({installation_id:u,criteria:a,transport:"fcm",token:e.token}),signal:n},"notification_registration_failed","Could not register native notifications."),f=await R(p,"invalid_operation_response","Connect returned an invalid native notification response.");if(!p.ok)throw O(f,"notification_registration_failed","Could not register native notifications.",p.status);l?.channelId&&l.channelId!==f.channel_id&&this.deleteNotificationChannel(l.channelId,i.accessToken,n).catch(()=>{});let h={channelId:f.channel_id,installationId:u,transport:"fcm",criteria:a};return this.context.storage.setItem(c,JSON.stringify(h)),h}async unregisterNativeNotifications(e={}){return U(e,this.context.requestTimeoutMs,n=>this.unregisterNativeNotificationsWithinBudget(n.signal))}async unregisterNativeNotificationsWithinBudget(e){let n=this.context.notificationKey("fcm"),i=x(this.context.storage.getItem(n)),o=await this.context.authorizedToken(e);if(i?.channelId&&!o)throw d("not_authorized","Reconnect this application before disabling native notifications.");i?.channelId&&o&&await this.deleteNotificationChannel(i.channelId,o.accessToken,e),this.context.storage.removeItem(n)}async unregisterNotifications(e,n={}){return U(n,this.context.requestTimeoutMs,i=>this.unregisterNotificationsWithinBudget(e,i.signal))}async unregisterNotificationsWithinBudget(e,n){let i=x(this.context.storage.getItem(this.context.notificationKey())),o=await this.context.authorizedToken(n);if(i?.channelId&&!o)throw d("not_authorized","Reconnect this application before disabling push notifications.");if(i?.channelId&&o){let a=await Z(`${this.context.serverUrl}/v1/notifications/channels/${i.channelId}`,{method:"DELETE",headers:{authorization:`Bearer ${o.accessToken}`},signal:n},"notification_unregistration_failed","Could not unregister push notifications.");if(!a.ok&&a.status!==404){let s=await R(a,"invalid_operation_response","Connect returned an invalid notification response.");throw O(s,"notification_unregistration_failed","Could not unregister push notifications.",a.status)}}this.context.storage.removeItem(this.context.notificationKey()),await(await e?.pushManager.getSubscription())?.unsubscribe()}async deleteNotificationChannel(e,n,i){let o=await Z(`${this.context.serverUrl}/v1/notifications/channels/${e}`,{method:"DELETE",headers:{authorization:`Bearer ${n}`},signal:i},"notification_unregistration_failed","Could not unregister push notifications.");if(!o.ok&&o.status!==404){let r=await R(o,"invalid_operation_response","Connect returned an invalid notification response.");throw O(r,"notification_unregistration_failed","Could not unregister push notifications.",o.status)}}};async function It(t,e,n,i,o,r){if(!t.authority)throw d("not_remote_authority","This authorization has no remote authority endpoint.");let a=n===""||n.startsWith("?")?n:`/${n}`,s=`${t.authority.filesUrl}${a}`,c=i===void 0?void 0:JSON.stringify(i),l=await r(t,e,s,c,t.authority.accessToken);return fetch(s,{method:e,redirect:"error",headers:{authorization:`Bearer ${t.authority.accessToken}`,...c===void 0?{}:{"content-type":"application/json"},...l},...c===void 0?{}:{body:c},...o?{signal:o}:{}})}async function to(t,e,n,i,o,r,a){let s=t,c=await It(s,e,n,i,o,a);if(c.status===401&&s.refreshToken){if(s=await r(),!s.authority||!s.fileCapability)throw d("authority_authorization_changed","Reconnect this collection before accessing its files.");c=await It(s,e,n,i,o,a)}let l=await R(c,"invalid_operation_response","The hosted authority returned an invalid file response.");if(!c.ok)throw O(l,"operation_failed","Collection file request failed.",c.status);return l}async function no(t,e,n,i,o,r){let a=t,s=await It(a,"GET",e,void 0,i,r);if(s.status===401&&a.refreshToken){if(a=await o(),!a.authority||!a.fileCapability)throw d("authority_authorization_changed","Reconnect this collection before accessing its files.");s=await It(a,"GET",e,void 0,i,r)}if(!s.ok){let l=await R(s,"invalid_operation_response","The hosted authority returned an invalid file range error response.");throw O(l,"operation_failed","Collection file range request failed.",s.status)}let c=s.headers.get("content-length");if(c===null||!/^(0|[1-9][0-9]*)$/u.test(c)||Number(c)!==n)throw await s.body?.cancel().catch(()=>{}),d("invalid_operation_response","The hosted file response declared an unexpected byte length.");if(!s.body)throw d("invalid_operation_response","The hosted file response did not contain a byte stream.");return s.body}var Aa="mdbase-connect file chunk key v1",Mt=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,ee=class extends Error{constructor(n,i){super(i);this.code=n;this.name="FileTransferCryptoError"}code},ze=class t{constructor(e,n){this.binding=e;this.key=n}binding;key;static async open(e,n,i){io(i);let o=await e.get(n);if(!o||o.agreementPublicKey!==i.encryption.application_agreement_public_key)throw new S("missing_grant_key","The encrypted grant key is unavailable or does not match the file transfer grant.");let r=await Qe(o.agreementPrivateKey,i.encryption.connector_agreement_public_key);return t.fromSharedSecret(r,i)}static async fromSharedSecret(e,n){io(n);let i=await _n(e,n);return new t(n,i)}async encryptChunk(e,n,i){if(this.validateHeader(n),i.byteLength!==n.plaintext_length)throw new ee("plaintext_length_mismatch","File chunk plaintext length does not match its authenticated header.");let o=ct(e,n),r=await crypto.subtle.encrypt({name:"AES-GCM",iv:oo(n.chunk_index),additionalData:xt(o),tagLength:128},this.key,xt(i));return Fn({kind:e,header:n,payload:new Uint8Array(r)})}async decryptChunk(e){let n=lt(e);this.validateHeader(n.header);let i=ct(n.kind,n.header);try{let o=await crypto.subtle.decrypt({name:"AES-GCM",iv:oo(n.header.chunk_index),additionalData:xt(i),tagLength:128},this.key,xt(n.payload));return new Uint8Array(o)}catch{throw new ee("authentication_failed","The encrypted file chunk could not be authenticated.")}}validateHeader(e){let n=this.binding.encryption;if(e.protocol_version!==1||e.protection!=="grant_aead_v1"||e.grant_id!==this.binding.grantId||e.authority_id!==this.binding.authorityId||e.collection_id!==n.collection_id||e.transfer_id!==this.binding.transferId||e.direction!==this.binding.direction||e.scope_epoch!==n.scope_epoch||e.key_id!==n.key_id)throw new ee("header_binding_mismatch","The file frame does not match its transfer encryption binding.")}};async function _n(t,e){let n=new TextEncoder().encode(Oa(e)),i=await crypto.subtle.digest("SHA-256",n),o=await crypto.subtle.importKey("raw",t,"HKDF",!1,["deriveKey"]);return crypto.subtle.deriveKey({name:"HKDF",hash:"SHA-256",salt:i,info:new TextEncoder().encode(Aa)},o,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}function io(t){if(X(t.encryption),!Mt.test(t.grantId)||!Mt.test(t.applicationId)||!Mt.test(t.authorityId)||!Mt.test(t.transferId)||t.direction!=="upload"&&t.direction!=="download")throw new ee("invalid_binding","The file transfer encryption binding is invalid.")}function Oa(t){let e=t.encryption;return["mdbase-connect","file-transfer",1,e.suite,t.grantId,t.applicationId,e.connector_id,t.authorityId,e.collection_id,e.scope_epoch,e.key_id,t.transferId,t.direction].join("|")}function oo(t){if(!Number.isSafeInteger(t)||t<0)throw new ee("invalid_chunk_index","The file chunk index is invalid.");let e=new Uint8Array(new ArrayBuffer(12));return new DataView(e.buffer).setBigUint64(4,BigInt(t),!1),e}function xt(t){return Uint8Array.from(t).buffer}var qt=class{constructor(e){this.options=e}options;async control(e,n,i,o,r){return this.controlAttempt(e,n,i,o,r,!1)}async controlAttempt(e,n,i,o,r,a){Ue(e);let s=Ea(n,i,o),c=await this.encryptControl(e,s),l,u=await this.options.shouldAttemptDirect(e);if(u){try{l=await fetch(`${this.options.loopbackUrl}/v1/files/control`,he({method:"POST",headers:{"content-type":"application/mdbase-connect+json"},body:JSON.stringify(c),signal:r}))}catch(p){if(r?.aborted)throw p;this.options.onDirectUnavailable()}if(l&&!Te(l.status))return l.ok&&this.options.onDirectAvailable(),this.decryptControlResponse(e,n,i,o,r,c,l,a);l&&this.options.onDirectUnavailable()}return u&&n==="GET"&&(e=e.expiresAt>Date.now()+3e4?e:await this.options.refreshAuthorization(r),Dt(e),c=await this.encryptControl(e,s)),l=await this.sendRelayControl(e,c,r),await ka(l,e)&&(e=await this.options.refreshAuthorization(r),Dt(e),c=await this.encryptControl(e,s),l=await this.sendRelayControl(e,c,r)),l.ok&&this.options.onRelayAvailable(),this.decryptControlResponse(e,n,i,o,r,c,l,a)}async decryptControlResponse(e,n,i,o,r,a,s,c){let l=await R(s,"invalid_operation_response","The collection authority returned an invalid file control response.");if(!s.ok){let f=O(l,"operation_failed","Collection file request failed.",s.status);if(f.code==="fresh_request_required"&&n==="GET"&&!c)return this.controlAttempt(e,n,i,o,r,!0);throw f}let u=l?.envelope;if(!u)throw d("invalid_encrypted_response","The connector omitted its encrypted file response.");let p=await Oe(this.options.keyStore,e.keyHandle,bn(e),a,u);return!p.ok&&p.problem.code==="fresh_request_required"&&n==="GET"&&!c?this.controlAttempt(e,n,i,o,r,!0):(p.ok||xa(p.problem),p.result)}async uploadChunk(e,n,i,o){let a=await this.localFileToken(e,"upload",o),s=await ro(this.options.keyStore,a,e,n,i),c;if(await this.options.shouldAttemptDirect(a)){try{c=await fetch(`${this.options.loopbackUrl}/v1/files/upload`,he(ao(s,o)))}catch(l){if(o?.aborted)throw l;this.options.onDirectUnavailable()}if(c&&!Te(c.status))return c.ok&&this.options.onDirectAvailable(),Ta(c,"Encrypted file chunk upload failed.");c&&this.options.onDirectUnavailable()}if(c=await this.sendRelayUpload(a,s,o),c.status===401&&a.refreshToken&&(a=await this.options.refreshAuthorization(o),Dt(a),s=await ro(this.options.keyStore,a,e,n,i),c=await this.sendRelayUpload(a,s,o)),!c.ok){let l=await R(c,"invalid_operation_response","The collection authority returned an invalid file upload response.");throw O(l,"operation_failed","Encrypted file chunk upload failed.",c.status)}this.options.onRelayAvailable()}async downloadChunk(e,n,i){let o=await this.localFileToken(e,"download",i),r;if(await this.options.shouldAttemptDirect(o)){try{r=await fetch(`${this.options.loopbackUrl}/v1/files/download/${encodeURIComponent(o.grantId)}/${encodeURIComponent(e.transfer_id)}/${n}`,he({method:"GET",signal:i}))}catch(a){if(i?.aborted)throw a;this.options.onDirectUnavailable()}if(r&&!Te(r.status))return r.ok&&this.options.onDirectAvailable(),this.decryptDownloadResponse(o,e,n,r);r&&this.options.onDirectUnavailable()}return r=await this.sendRelayDownload(o,e,n,i),r.status===401&&o.refreshToken&&(o=await this.options.refreshAuthorization(i),Dt(o),r=await this.sendRelayDownload(o,e,n,i)),r.ok&&this.options.onRelayAvailable(),this.decryptDownloadResponse(o,e,n,r)}async decryptDownloadResponse(e,n,i,o){if(!o.ok){let s=await R(o,"invalid_operation_response","The collection authority returned an invalid file download response.");throw O(s,"operation_failed","Encrypted file chunk download failed.",o.status)}if(o.headers.get("content-type")?.split(";",1)[0]!=="application/mdbase-connect-file")throw d("invalid_operation_response","The connector returned an invalid file response media type.");let r=new Uint8Array(await o.arrayBuffer()),a;try{Ma(n,i,r),a=await(await co(this.options.keyStore,e,n)).decryptChunk(r)}catch(s){throw s instanceof b?s:d("invalid_operation_response","The connector returned an invalid encrypted file frame.",{cause:s})}if(a.byteLength!==vn(n,i))throw d("invalid_operation_response","The connector returned a truncated file chunk.");return a}encryptControl(e,n){return Ue(e),Q(this.options.keyStore,e.keyHandle,bn(e),"file_control",n)}sendRelayControl(e,n,i){return fetch(`${this.options.serverUrl}/v1/authorities/${encodeURIComponent(e.collectionId)}/files/control`,{method:"POST",headers:{authorization:`Bearer ${e.accessToken}`,"content-type":"application/json"},body:JSON.stringify(n),signal:i})}sendRelayUpload(e,n,i){return fetch(`${this.options.serverUrl}/v1/authorities/${encodeURIComponent(e.collectionId)}/files/upload`,{...ao(n,i),headers:{authorization:`Bearer ${e.accessToken}`,"content-type":"application/mdbase-connect-file"}})}sendRelayDownload(e,n,i,o){return fetch(`${this.options.serverUrl}/v1/authorities/${encodeURIComponent(e.collectionId)}/files/download/${encodeURIComponent(n.transfer_id)}/${i}`,{method:"GET",headers:{authorization:`Bearer ${e.accessToken}`},signal:o})}async localFileToken(e,n,i){let o=await this.options.authorizedToken(i);if(!o||o.authority||!o.fileCapability||!o.encryption||!o.grantId||!o.keyHandle||e.direction!==n||e.protection!=="grant_aead_v1")throw d("not_authorized","This connection cannot use encrypted local file delivery.");return Ft(e),o}};function Dt(t){if(t.authority||!t.fileCapability)throw d("not_authorized","This connection cannot use encrypted local file delivery.");Ue(t)}async function ro(t,e,n,i,o){let r=Ia(e,n,i,o.byteLength);return(await co(t,e,n)).encryptChunk("upload_chunk",r,o)}function ao(t,e){return{method:"POST",headers:{"content-type":"application/mdbase-connect-file"},body:Uint8Array.from(t).buffer,signal:e}}async function Ta(t,e){if(t.ok)return;let n=await R(t,"invalid_operation_response","The collection authority returned an invalid file transfer response.");throw O(n,"operation_failed",e,t.status)}async function ka(t,e){return e.refreshToken?t.status===401?!0:t.status!==409?!1:(await R(t.clone(),"invalid_operation_response","The collection authority returned an invalid file response.").catch(()=>null))?.error?.code==="encryption_binding_stale":!1}function Ue(t){if(!t.encryption||!t.grantId||!t.keyHandle)throw d("missing_grant_key","Reconnect this application to restore encrypted file access.")}function bn(t){return Ue(t),{grantId:t.grantId,applicationId:t.clientId,encryption:t.encryption}}function co(t,e,n){return Ue(e),ze.open(t,e.keyHandle,{...bn(e),authorityId:e.encryption.connector_id,transferId:n.transfer_id,direction:n.direction})}function Ia(t,e,n,i){Ue(t);let o=Ft(e),r=vn(e,n);if(i!==r)throw d("invalid_request","The file chunk has the wrong byte length.");return{protocol_version:1,protection:"grant_aead_v1",grant_id:t.grantId,authority_id:t.encryption.connector_id,collection_id:t.collectionId,transfer_id:e.transfer_id,direction:e.direction,chunk_size:o,chunk_index:n,offset:n*o,plaintext_length:i,total_size:e.total_size,scope_epoch:t.encryption.scope_epoch,key_id:t.encryption.key_id}}function Ma(t,e,n){let i=lt(n),o=vn(t,e),r=Ft(t);if(i.kind!=="download_chunk"||i.header.chunk_index!==e||i.header.chunk_size!==r||i.header.offset!==e*r||i.header.plaintext_length!==o||i.header.total_size!==t.total_size)throw d("invalid_operation_response","The connector returned a file frame for a different chunk.")}function xa(t){throw F(t.code==="unknown"?t.server_code:t.code,t.message,{details:t.details,operationOutcome:t.operation_outcome??"rejected",traceId:t.trace_id})}function Ea(t,e,n){if(t==="GET"&&(e===""||e.startsWith("?"))){let o=new URLSearchParams(e.startsWith("?")?e.slice(1):e),r=o.get("limit");return{protocol_version:1,type:"list_files",...o.get("folder")?{folder:o.get("folder")}:{},...o.get("after")?{after:o.get("after")}:{},...r?{limit:Number(r)}:{}}}let i=e.split("/");if(t==="GET"&&i.length===2&&i[0]==="transfers")return so("get_file_transfer_status",i[1]);if(t==="DELETE"&&i.length===2&&i[0]==="transfers")return so("abort_file_transfer",i[1]);if(t==="POST"&&Da(n)){let o=e==="uploads"?"open_file_upload":e==="downloads"?"open_file_download":i.length===3&&i[0]==="uploads"&&i[2]==="commit"?"commit_file_upload":i.length===2&&i[1]==="move"&&n.file_id===decodeURIComponent(i[0])?"move_file":i.length===2&&i[1]==="delete"&&n.file_id===decodeURIComponent(i[0])?"delete_file":null;if(o&&n.type===o)return{...n}}throw d("invalid_request","The file control request path is invalid.")}function so(t,e){return{protocol_version:1,type:t,transfer_id:decodeURIComponent(e)}}function Ft(t){if(t.strategy.kind!=="framed_chunks"||!Number.isSafeInteger(t.strategy.chunk_size)||t.strategy.chunk_size<=0)throw d("invalid_operation_response","The connector returned an invalid framed transfer strategy.");return t.strategy.chunk_size}function vn(t,e){let n=Ft(t);if(!Number.isSafeInteger(e)||e<0||!Number.isSafeInteger(t.total_size)||t.total_size<0)throw d("invalid_request","The file chunk index is invalid.");let i=e*n;if(!Number.isSafeInteger(i)||i>=t.total_size)throw d("invalid_request","The file chunk index is outside the transfer.");return Math.min(n,t.total_size-i)}function Da(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var zt=class{constructor(e){this.options=e;this.local=new qt(e)}options;local;async control(e,n="",i,o){let r=await this.requireFileToken(o);return r.authority?to(r,e,n,i,o,this.options.refreshAuthorization,this.options.authorityProofHeaders):this.local.control(r,e,n,i,o)}uploadChunk(e,n,i,o){return this.local.uploadChunk(e,n,i,o)}downloadChunk(e,n,i){return this.local.downloadChunk(e,n,i)}async downloadHostedPart(e,n,i,o){let r=await this.requireFileToken(o);if(!r.authority)throw d("not_remote_authority","Hosted file delivery requires a remote authority endpoint.");return no(r,`downloads/${encodeURIComponent(e.transfer_id)}/parts/${n}`,i,o,this.options.refreshAuthorization,this.options.authorityProofHeaders)}async requireFileToken(e){let n=await this.options.authorizedToken(e);if(!n?.fileCapability)throw d("not_authorized","This connection has no file capability.");return n}};async function Ne(t,e,n,i,o,r){if(!e.authority?.proofPublicKey)return{};if(!e.keyHandle)throw d("missing_grant_key","Reconnect this application to restore remote authority request signing.");try{let a=new URL(i);return await vt(t,e.keyHandle,e.authority.proofPublicKey,{method:n,target:`${a.pathname}${a.search}`,body:o,credential:r})}catch(a){throw a instanceof S?F(a.code,a.message):a}}var Ut=class{constructor(e,n){this.storage=e;this.baseKey=n}storage;baseKey;list(e){if(!e)return[];let n=x(this.storage.getItem(this.baseKey));if(lo(n)&&n.collectionId===e){let o=this.key(n.requestId);this.storage.getItem(o)||this.storage.setItem(o,JSON.stringify(n)),this.storage.removeItem(this.baseKey)}let i=[];for(let o=0;o<this.storage.length;o+=1){let r=this.storage.key(o);r?.startsWith(`${this.baseKey}:`)&&i.push(r)}return i.map(o=>x(this.storage.getItem(o))).filter(o=>lo(o)&&o.collectionId===e).sort((o,r)=>o.createdAt-r.createdAt||o.requestId.localeCompare(r.requestId))}find(e,n){return this.list(e).find(i=>i.requestId===n)??null}identifier(e){return e.mutation??ie(e.operation,e.request?.input??(e.operation==="sync"?{action:"mutate"}:{}))??(e.operation==="sync"?"sync:mutate":e.operation)}store(e){this.storage.setItem(this.key(e.requestId),JSON.stringify(e))}take(e){let n=this.key(e),i=x(this.storage.getItem(n));return this.storage.removeItem(n),i}key(e){return`${this.baseKey}:${encodeURIComponent(e)}`}};function lo(t){return!!(t&&typeof t.collectionId=="string"&&typeof t.requestId=="string"&&t.requestId.length>0&&zn(t.operation)&&typeof t.inputFingerprint=="string"&&Number.isFinite(t.createdAt)&&t.createdAt>0&&(t.envelope||t.request)&&(t.operation==="sync"||ie(t.operation,t.request?.input??{})!==null))}function uo({stored:t,collectionId:e,relayEncryption:n,invalidate:i,directCapable:o}){let r=x(t),a=s=>(i(typeof s=="string"?s:void 0),null);if(!r)return t&&a(),null;if(r.version!==1||typeof r.accessToken!="string"||r.accessToken.length===0||typeof r.clientId!="string"||r.clientId.length===0||r.collectionId!==e||typeof r.collectionName!="string"||r.collectionName.length===0||!Array.isArray(r.operations)||r.operations.some(s=>typeof s!="string")||typeof r.expiresAt!="number"||!Number.isFinite(r.expiresAt)||r.refreshToken!==void 0&&(typeof r.refreshToken!="string"||r.refreshToken.length===0)||r.refreshExpiresAt!==void 0&&(typeof r.refreshExpiresAt!="number"||!Number.isFinite(r.refreshExpiresAt))||!St(r.scope)||r.fileCapability&&!wt(r.fileCapability)||r.authority&&!Ai(r.authority,r.collectionId))return a(r.keyHandle);if(n==="required"){if(r.authority){if(!r.keyHandle||!r.authority.proofPublicKey)return a(r.keyHandle)}else if(!r.grantId||!r.keyHandle||!Oi(r.encryption,r.collectionId))return a(r.keyHandle)}return r.expiresAt<=Date.now()&&(!r.refreshToken||(r.refreshExpiresAt??0)<=Date.now())?o(r)?r:(i(r.keyHandle),null):r}async function Cn(t,e,n,i,o,r){if(!e.authority)throw d("not_remote_authority","This authorization has no remote authority endpoint.");let a=`${e.authority.syncUrl}/${i}`,s=o===void 0?void 0:JSON.stringify(o),c=await Ne(t,e,n,a,s,e.authority.accessToken);return fetch(a,{method:n,headers:{authorization:`Bearer ${e.authority.accessToken}`,...o===void 0?{}:{"content-type":"application/json"},...c},...s===void 0?{}:{body:s},signal:r})}async function po(t,e,n,i){if(!e.encryption||!e.grantId||!e.keyHandle)throw d("authorization_binding_incompatible","The refreshed authorization no longer supports encrypted connector operations.",{details:{contract:"grant_encryption",required:[1],supported:e.encryption?[e.encryption.protocol_version]:[],peer:"connector",operation:n}});try{return await Q(t,e.keyHandle,{grantId:e.grantId,applicationId:e.clientId,encryption:e.encryption},n,i)}catch(o){throw o instanceof S?F(o.code,o.message):o}}var Nt=class{serverUrl;storage;keyStore;directAccessMode;loopbackUrl;collectionId;internals;onChange;timeouts;pendingMutationStore;files;refreshPromise=null;directStatus;currentRoute="relay";directFailures=0;directRetryAt=0;constructor(e){this.serverUrl=e.serverUrl,this.storage=e.storage,this.keyStore=e.keyStore,this.directAccessMode=e.directAccessMode,this.loopbackUrl=e.loopbackUrl,this.collectionId=e.collectionId,this.internals=e.internals,this.onChange=e.onChange,this.timeouts=e.timeouts,this.pendingMutationStore=new Ut(this.storage,this.internals.pendingMutationKey(this.collectionId)),this.files=new zt({keyStore:this.keyStore,serverUrl:this.serverUrl,loopbackUrl:this.loopbackUrl,authorizedToken:n=>this.authorizedToken({signal:n,timeoutMs:null}),refreshAuthorization:n=>this.refreshAuthorization(n),shouldAttemptDirect:n=>this.shouldAttemptDirect(n),onDirectAvailable:()=>{this.markDirectAvailable(),this.setRoute("direct")},onDirectUnavailable:()=>this.markDirectUnavailable(),onRelayAvailable:()=>this.setRoute("relay"),authorityProofHeaders:(n,i,o,r,a)=>Ne(this.keyStore,n,i,o,r,a)}),this.directStatus=this.directAccessMode==="disabled"?"disabled":"unavailable"}get directAccess(){return this.currentToken()?.authority?"disabled":this.directStatus}get route(){return this.currentToken()?.authority?"remote":this.currentRoute}notifyStorageChanged(){this.emitConnection()}async checkDirectAccess(e={}){return U(e,this.timeouts.watchStartMs,n=>this.checkDirectAccessWithinBudget(n.signal))}async checkDirectAccessWithinBudget(e){let n=this.currentToken();if(!this.directEligible(n))return this.setDirectStatus("disabled");let i=await Xe();return i==="denied"?this.setDirectStatus("denied"):(i==="prompt"||i===null)&&this.storage.getItem(this.internals.directPreferenceKey())!=="enabled"?this.setDirectStatus("permission_required"):this.probeDirectAccess(e)}async requestDirectAccess(e={}){return U(e,this.timeouts.watchStartMs,n=>this.requestDirectAccessWithinBudget(n.signal))}async requestDirectAccessWithinBudget(e){let n=this.currentToken();return this.directCapable(n)?(this.storage.setItem(this.internals.directPreferenceKey(),"enabled"),this.directRetryAt=0,this.probeDirectAccess(e)):this.setDirectStatus("disabled")}disableDirectAccess(){this.storage.setItem(this.internals.directPreferenceKey(),"disabled"),this.setDirectStatus("disabled"),this.setRoute("relay")}pendingMutations(){return this.storedPendingMutations().map(e=>({requestId:e.requestId,operation:this.pendingMutationStore.identifier(e),fingerprint:e.inputFingerprint,status:"outcome_unknown",createdAt:new Date(e.createdAt).toISOString()}))}pendingMutation(e){let n=this.storedPendingMutation(e);return n?{requestId:n.requestId,operation:this.pendingMutationStore.identifier(n),fingerprint:n.inputFingerprint,status:"outcome_unknown",createdAt:new Date(n.createdAt).toISOString()}:null}async recoverPendingMutation(e,n){let i=this.storedPendingMutation(e);if(!i)throw d("no_pending_mutation","There is no interrupted mutation to resume.");return B(n,this.timeouts.requestMs,o=>this.performOperationWithinBudget(i.operation,i.request?.input??{},{...n,signal:o.signal},i))}async performOperation(e,n,i={}){return B(i,this.timeouts.requestMs,o=>this.performOperationWithinBudget(e,n,{...i,signal:o.signal}))}async performOperationWithinBudget(e,n,i,o,r=!1){ye(i.signal);let a=this.currentToken();if(!a)throw d("not_authorized","Connect this application before accessing a collection.");if(!a.operations.includes(e))throw d("insufficient_access",`This connection does not allow ${e}.`,{details:{required_operations:[e],granted_operations:[...a.operations],missing_operations:[e]}});let s=await this.shouldAttemptDirect(a);if(!s&&(a=await this.authorizedToken({signal:i.signal,timeoutMs:null}),!a))throw d("not_authorized","Reconnect this application to continue.");let c=o?.requestId??(mi(e,n)?crypto.randomUUID():void 0),l;try{l=await this.sendOperation(a,e,n,s,i,c)}catch(y){throw Ct(y,i.signal,c!==void 0&&this.storedPendingMutation(c)!==null?c:void 0,a.authority?"hosted_provider_unavailable":"relay_unavailable")}let u=l.response,p=u.status===409&&(await R(u.clone(),"invalid_operation_response","The collection authority returned an invalid operation response.").catch(()=>null))?.error?.code==="encryption_binding_stale";if((u.status===401||p)&&a.refreshToken){if(l.pendingMutation&&(l.directDeliveryUncertain||l.encryptedRequest&&l.resumingMutation))throw d("operation_outcome_unknown","The direct operation may have completed, but its encrypted grant changed before the response could be recovered. Refresh before making another change.",{operationOutcome:"unknown",details:{request_id:l.requestId}});l.pendingMutation&&this.clearPendingMutation(l.requestId),a=await this.refreshAuthorization(i.signal),s=await this.shouldAttemptDirect(a);try{l=await this.sendOperation(a,e,n,s,i,c)}catch(y){throw Ct(y,i.signal,c!==void 0&&this.storedPendingMutation(c)!==null?c:void 0,a.authority?"hosted_provider_unavailable":"relay_unavailable")}u=l.response}let f;try{f=await R(u,"invalid_operation_response","The collection authority returned a response that is not valid JSON.")}catch(y){throw l.pendingMutation?j(l.requestId,y):d("invalid_operation_response","The collection authority returned a response that is not valid JSON.",{cause:y})}if(!u.ok){let y=O(f,"operation_failed","Collection operation failed.",u.status);if(y.code==="fresh_request_required"&&!l.pendingMutation&&!r)return this.performOperationWithinBudget(e,n,i,void 0,!0);throw l.pendingMutation&&(l.directDeliveryUncertain||l.encryptedRequest&&l.resumingMutation)?j(l.requestId,y):(l.pendingMutation&&!l.directDeliveryUncertain&&this.clearPendingMutation(l.requestId),y.code==="direct_operation_rejected"&&y.status===403&&this.invalidateRejectedAuthorization(a),y)}if(l.encryptedRequest){let y=f?.envelope,m=l.pendingMutationRecord,w=m?.encryption??a.encryption,g=m?.grantId??a.grantId,P=m?.applicationId??a.clientId,T=m?.keyHandle??a.keyHandle;if(!y||!w||!g||!T)throw l.pendingMutation?j(l.requestId,new Error("Encrypted operation response was missing its envelope.")):d("invalid_encrypted_response","The relay did not return an encrypted connector response.");try{let v=await Oe(this.keyStore,T,{grantId:g,applicationId:P,encryption:w},l.encryptedRequest,y);if(!v.ok&&v.problem.code==="fresh_request_required"&&!l.pendingMutation&&!r)return this.performOperationWithinBudget(e,n,i,void 0,!0);if(l.pendingMutation&&this.clearPendingMutation(l.requestId),!v.ok)throw F(v.problem.code==="unknown"?v.problem.server_code:v.problem.code,v.problem.message,{details:v.problem.details,operationOutcome:v.problem.operation_outcome??"rejected",traceId:v.problem.trace_id});return v.result}catch(v){throw v instanceof b?v:v instanceof S?l.pendingMutation?j(l.requestId,v):F(v.code,v.message):v}}let h=l.pendingMutationRecord?.request?.protocol_version??L;if(f?.protocol_version!==h||f?.request_id!==l.requestId)throw l.pendingMutation?j(l.requestId,new Error("Operation response protocol or request ID did not match.")):d("invalid_operation_response","The collection authority returned a response for a different protocol request.");if(f.ok===!1)throw He(f.problem)?(l.pendingMutation&&this.clearPendingMutation(l.requestId),new b(f.problem)):l.pendingMutation?j(l.requestId,new Error("Operation rejection did not contain a canonical problem.")):d("invalid_operation_response","The collection authority returned an invalid operation problem.");if(f.ok!==!0||!("result"in f))throw l.pendingMutation?j(l.requestId,new Error("Successful operation response did not contain a result.")):d("invalid_operation_response","The collection authority returned an incomplete operation response.");return l.pendingMutation&&this.clearPendingMutation(l.requestId),f.result}async performAuthoritySyncRequest(e,n,i,o,r,a={}){return B(a,this.timeouts.syncMs,async s=>{let c=await this.authorizedToken({signal:s.signal,timeoutMs:null});if(!c?.authority||c.collectionId!==e||c.authority.replicaId!==n)throw d("authority_authorization_changed","Reconnect this collection authority before synchronizing.");try{let l=await Cn(this.keyStore,c,i,o,r,s.signal);if(l.status===401&&c.refreshToken){if(c=await this.refreshAuthorization(s.signal),!c.authority||c.collectionId!==e||c.authority.replicaId!==n)throw d("authority_authorization_changed","Reconnect this collection authority before synchronizing.");l=await Cn(this.keyStore,c,i,o,r,s.signal)}let u=await R(l,"invalid_operation_response","The collection authority returned an invalid synchronization response.");if(!l.ok)throw O(u,"sync_failed","Collection synchronization failed.",l.status);return u}catch(l){let u=i==="POST"&&o==="mutations"&&r&&typeof r=="object"&&typeof r.mutation_id=="string"?r.mutation_id:void 0;throw Ct(l,s.signal,u,"hosted_provider_unavailable")}})}async sendOperation(e,n,i,o,r={},a){let s=i??{},c,l=!1,u=!1,p=a??crypto.randomUUID(),f=null,h;if(a!==void 0){if(f=this.storedPendingMutation(a),h=f?.inputFingerprint??await wi(n,i),f){if(f.collectionId!==e.collectionId||f.operation!==n||f.inputFingerprint!==h)throw d("pending_mutation_unresolved","A previous write still has an unknown outcome. Retry that exact write before making another change.");p=f.requestId,u=!0}l=!0}let y=f?.mutation??ie(n,i);if(f?.envelope&&(e.authority||!e.encryption))throw d("pending_mutation_unresolved","The pending write requires its encrypted relay authority. Reconnect that authority before recovery.");if(f?.request&&e.encryption&&!e.authority)throw d("pending_mutation_unresolved","The pending write belongs to a different authority transport. Reconnect that authority before recovery.");if(e.encryption&&!e.authority){if(!e.grantId||!e.keyHandle)throw d("missing_grant_key","Reconnect this application to restore encrypted access.");try{if(l)if(f){if(!f.envelope)throw d("pending_mutation_unresolved","The pending write belongs to a different transport. Reconnect before retrying it.");c=f.envelope}else c=await Q(this.keyStore,e.keyHandle,{grantId:e.grantId,applicationId:e.clientId,encryption:e.encryption},n,i,p),this.pendingMutationStore.store({collectionId:e.collectionId,...e.grantId?{grantId:e.grantId}:{},keyId:e.encryption.key_id,keyHandle:e.keyHandle,applicationId:e.clientId,encryption:e.encryption,operation:n,mutation:y,inputFingerprint:h,requestId:p,envelope:c,createdAt:Date.now()});else c=await Q(this.keyStore,e.keyHandle,{grantId:e.grantId,applicationId:e.clientId,encryption:e.encryption},n,i)}catch(T){throw T instanceof S?F(T.code,T.message):T}p=c.request_id,s=c}else{let T=f?.request??{protocol_version:L,request_id:p,input:s};s=T,l&&!f&&this.pendingMutationStore.store({collectionId:e.collectionId,...e.grantId?{grantId:e.grantId}:{},operation:n,mutation:y,inputFingerprint:h,requestId:p,request:T,createdAt:Date.now()})}if(o&&c&&!e.authority){let T=!1;try{let _=await fetch(`${this.loopbackUrl}/v1/operations`,he({method:"POST",headers:{"content-type":"application/mdbase-connect+json"},body:JSON.stringify(c),signal:r.signal}));if(!Te(_.status))return _.ok&&(this.markDirectAvailable(),this.setRoute("direct")),{response:_,requestId:p,encryptedRequest:c,pendingMutation:l,...l?{pendingMutationRecord:f??this.storedPendingMutation(p)??void 0}:{},resumingMutation:u};T=_.status>=500,this.markDirectUnavailable()}catch(_){if(r.signal?.aborted)throw _;T=!0,await Xe()==="denied"?this.setDirectStatus("denied"):this.markDirectUnavailable()}let v;try{v=e.expiresAt>Date.now()+3e4?e:await this.refreshAuthorization(r.signal)}catch(_){throw l&&(T||u)?j(p,_):_}let N;l||(c=await po(this.keyStore,v,n,i),p=c.request_id);try{N=await fetch(`${this.serverUrl}/v1/authorities/${encodeURIComponent(v.collectionId)}/operations/${n}`,{method:"POST",headers:{authorization:`Bearer ${v.accessToken}`,"content-type":"application/json"},body:JSON.stringify(c),signal:r.signal})}catch(_){throw l&&(T||u)?j(p,_):_}return N.ok&&this.setRoute("relay"),{response:N,requestId:p,encryptedRequest:c,directDeliveryUncertain:T,pendingMutation:l,...l?{pendingMutationRecord:f??this.storedPendingMutation(p)??void 0}:{},resumingMutation:u}}let m=e.authority?`${e.authority.operationsUrl}/${n}`:`${this.serverUrl}/v1/authorities/${encodeURIComponent(e.collectionId)}/operations/${n}`,w=JSON.stringify(s),g=e.authority?await Ne(this.keyStore,e,"POST",m,w,e.authority.accessToken):{},P=await fetch(m,{method:"POST",headers:{authorization:`Bearer ${e.authority?.accessToken??e.accessToken}`,"content-type":"application/json",...g},body:w,signal:r.signal});return P.ok&&this.setRoute(e.authority?"remote":"relay"),{response:P,requestId:p,encryptedRequest:c,pendingMutation:l,...l?{pendingMutationRecord:f??this.storedPendingMutation(p)??void 0}:{},resumingMutation:u}}directCapable(e){return!(!e||e.authority||!e.encryption||!e.grantId||!e.keyHandle||this.directAccessMode==="disabled"||typeof location<"u"&&e.applicationOrigin&&e.applicationOrigin!==location.origin)}hasResumableMutationTransport(){return!!this.currentToken()}directEligible(e){return e!==null&&this.directCapable(e)&&this.storage.getItem(this.internals.directPreferenceKey())!=="disabled"}async shouldAttemptDirect(e){if(!this.directEligible(e))return!1;if(this.directStatus==="available")return!0;if(this.directStatus==="unavailable"&&Date.now()<this.directRetryAt)return!1;let n=await Xe();return n==="denied"?(this.setDirectStatus("denied"),!1):(n==="prompt"||n===null)&&this.storage.getItem(this.internals.directPreferenceKey())!=="enabled"?(this.setDirectStatus("permission_required"),!1):(this.setDirectStatus("checking"),!0)}async probeDirectAccess(e){this.setDirectStatus("checking");try{let n=await fetch(`${this.loopbackUrl}/v1/ready`,he({method:"GET",cache:"no-store",signal:e})),i=await R(n,"invalid_operation_response","The connector returned an invalid readiness response.").catch(()=>null);if(n.ok&&i?.service==="mdbase-connect"&&i?.loopback_protocol_version===1&&i?.operation_transport_protocol_version===L)return this.markDirectAvailable(),"available"}catch{}return await Xe()==="denied"?this.setDirectStatus("denied"):(this.markDirectUnavailable(),"unavailable")}markDirectAvailable(){this.directFailures=0,this.directRetryAt=0,this.setDirectStatus("available")}markDirectUnavailable(){this.directFailures+=1,this.directRetryAt=Date.now()+Math.min(6e4,1e3*2**(this.directFailures-1)),this.setDirectStatus("unavailable")}setDirectStatus(e){return this.directStatus!==e&&(this.directStatus=e,this.emitConnection()),e}setRoute(e){this.currentRoute!==e&&(this.currentRoute=e,this.emitConnection())}emitConnection(){this.onChange()}invalidateRejectedAuthorization(e){let n=x(this.storage.getItem(this.internals.tokenKey(this.collectionId)));!n||!gi(n,e)||(this.internals.removeToken(this.collectionId,n.keyHandle),this.currentRoute="relay",this.directStatus=this.directAccessMode==="disabled"?"disabled":"unavailable",this.emitConnection())}currentToken(){return uo({stored:this.storage.getItem(this.internals.tokenKey(this.collectionId)),collectionId:this.collectionId,relayEncryption:this.internals.relayEncryption,invalidate:e=>this.internals.removeToken(this.collectionId,e,"invalid_stored_grant"),directCapable:e=>this.directCapable(e)})}async authorizedToken(e={}){let n=this.currentToken();if(!n)return null;if(n.expiresAt>Date.now()+3e4)return n;if(!n.refreshToken||(n.refreshExpiresAt??0)<=Date.now()){if(this.directCapable(n))throw d("relay_authorization_expired","Direct access is still available on this computer, but using the relay requires reconnecting this application.");return this.internals.removeToken(this.collectionId,n.keyHandle),null}return this.refreshAuthorization(e.signal)}refreshAuthorization(e){return this.refreshPromise?this.refreshPromise:(this.refreshPromise=this.performRefresh(e).finally(()=>{this.refreshPromise=null}),this.refreshPromise)}async performRefresh(e){let n=this.currentToken();if(!n?.refreshToken)throw d("not_authorized","Reconnect this application to continue.");if((n.refreshExpiresAt??0)<=Date.now())throw d("relay_authorization_expired","Direct access is still available on this computer, but using the relay requires reconnecting this application.");let i=n.refreshToken,o=`${this.serverUrl}/oauth/token`,r=new URLSearchParams({grant_type:"refresh_token",refresh_token:n.refreshToken,client_id:n.clientId}).toString(),a=n.authority?await Ne(this.keyStore,n,"POST",o,r,n.refreshToken):{},s=await fetch(o,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded",...a},body:r,signal:e}),c=await R(s,"invalid_token_response","The authorization service returned an invalid token response.");if(!s.ok){let l=this.currentToken();if(l?.refreshToken&&l.refreshToken!==i)return l;throw this.directCapable(n)||this.internals.removeToken(this.collectionId,n.keyHandle),(et(c)??c?.error?.code)==="invalid_grant"?d("authorization_expired",c?.error_description??c?.error?.message??"Reconnect this application to continue.",{status:s.status}):O(c,"authorization_expired","Reconnect this application to continue.",s.status)}return this.storeTokenResponse(c,n.clientId,n.keyHandle)}storeTokenResponse(e,n,i){if(e.collection_id!==this.collectionId)throw d("collection_mismatch","The refreshed authorization belongs to a different collection.");let o=this.internals.storeTokenResponse(e,n,i);return this.currentRoute=o.authority?"remote":"relay",this.directStatus=o.authority||this.directAccessMode==="disabled"?"disabled":"unavailable",this.emitConnection(),o}storedPendingMutations(){return this.pendingMutationStore.list(this.currentToken()?.collectionId??null)}storedPendingMutation(e){return this.pendingMutationStore.find(this.currentToken()?.collectionId??null,e)}clearPendingMutation(e){let n=this.pendingMutationStore.take(e),i=this.currentToken()?.keyHandle;n?.keyHandle&&n.keyHandle!==i&&this.keyStore.delete(n.keyHandle).catch(()=>{})}};var qa=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),Fa=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),_e=class{state=Fa.slice();block=new Uint8Array(64);words=new Uint32Array(64);blockLength=0;byteLength=0;finished=!1;update(e){if(this.finished)throw new Error("SHA-256 digest is already finalized.");if(this.byteLength+=e.byteLength,!Number.isSafeInteger(this.byteLength))throw new Error("SHA-256 input exceeds the safe browser byte range.");let n=0;if(this.blockLength>0){let i=Math.min(64-this.blockLength,e.byteLength);this.block.set(e.subarray(0,i),this.blockLength),this.blockLength+=i,n+=i,this.blockLength===64&&(this.compress(this.block),this.blockLength=0)}for(;n+64<=e.byteLength;)this.compress(e.subarray(n,n+64)),n+=64;return n<e.byteLength&&(this.block.set(e.subarray(n),0),this.blockLength=e.byteLength-n),this}digestHex(){if(this.finished)throw new Error("SHA-256 digest is already finalized.");this.finished=!0,this.block[this.blockLength]=128,this.block.fill(0,this.blockLength+1),this.blockLength>=56&&(this.compress(this.block),this.block.fill(0));let e=this.byteLength*8,n=Math.floor(e/4294967296),i=e>>>0;return fo(this.block,56,n),fo(this.block,60,i),this.compress(this.block),[...this.state].map(o=>o.toString(16).padStart(8,"0")).join("")}compress(e){let n=this.words;for(let p=0;p<16;p+=1){let f=p*4;n[p]=(e[f]<<24|e[f+1]<<16|e[f+2]<<8|e[f+3])>>>0}for(let p=16;p<64;p+=1){let f=n[p-15],h=n[p-2],y=W(f,7)^W(f,18)^f>>>3,m=W(h,17)^W(h,19)^h>>>10;n[p]=n[p-16]+y+n[p-7]+m>>>0}let i=this.state[0],o=this.state[1],r=this.state[2],a=this.state[3],s=this.state[4],c=this.state[5],l=this.state[6],u=this.state[7];for(let p=0;p<64;p+=1){let f=W(s,6)^W(s,11)^W(s,25),h=s&c^~s&l,y=u+f+h+qa[p]+n[p]>>>0,m=W(i,2)^W(i,13)^W(i,22),w=i&o^i&r^o&r,g=m+w>>>0;u=l,l=c,c=s,s=a+y>>>0,a=r,r=o,o=i,i=y+g>>>0}this.state[0]=this.state[0]+i>>>0,this.state[1]=this.state[1]+o>>>0,this.state[2]=this.state[2]+r>>>0,this.state[3]=this.state[3]+a>>>0,this.state[4]=this.state[4]+s>>>0,this.state[5]=this.state[5]+c>>>0,this.state[6]=this.state[6]+l>>>0,this.state[7]=this.state[7]+u>>>0}};function W(t,e){return t>>>e|t<<32-e}function fo(t,e,n){t[e]=n>>>24,t[e+1]=n>>>16,t[e+2]=n>>>8,t[e+3]=n}var Lt=class{constructor(e,n){this.signal=n;this.iterator=za(e)}signal;iterator;remainder=new Uint8Array;remainderOffset=0;maxSourceChunkBytes=null;iteratorClosing=!1;ended=!1;setMaxSourceChunkBytes(e){this.maxSourceChunkBytes=e}async read(e){let n=new Uint8Array(e),i=0;for(;i<e;){if(this.remainderOffset===this.remainder.byteLength){let r=await this.nextSourceChunk();if(r.done)throw this.ended=!0,d("invalid_request","Streamed file bytes ended before the declared size.");if(!(r.value instanceof Uint8Array))throw d("invalid_request","A streamed file chunk was not a Uint8Array.");if(this.maxSourceChunkBytes===null)throw new Error("Stream source was read before upload negotiation completed.");if(r.value.byteLength>this.maxSourceChunkBytes)throw d("invalid_request",`A streamed file chunk exceeded the negotiated ${this.maxSourceChunkBytes}-byte upload part size.`);if(this.remainder=r.value,this.remainderOffset=0,this.remainder.byteLength===0)continue}let o=Math.min(e-i,this.remainder.byteLength-this.remainderOffset);n.set(this.remainder.subarray(this.remainderOffset,this.remainderOffset+o),i),i+=o,this.remainderOffset+=o}return n}async expectEnd(){if(this.remainderOffset<this.remainder.byteLength)throw d("invalid_request","Streamed file bytes exceed the declared size.");for(;!this.ended;){let e=await this.nextSourceChunk();if(e.done){this.ended=!0;return}if(!(e.value instanceof Uint8Array))throw d("invalid_request","A streamed file chunk was not a Uint8Array.");if(e.value.byteLength>0)throw d("invalid_request","Streamed file bytes exceed the declared size.")}}async close(){this.ended=!0,this.closeIterator()}async nextSourceChunk(){ho(this.signal);let e=this.iterator.next(),n=this.signal;if(!n)return e;let i=()=>{},o=new Promise((r,a)=>{let s=()=>{this.closeIterator(),a(yo(n))};n.addEventListener("abort",s,{once:!0}),i=()=>n.removeEventListener("abort",s),n.aborted&&s()});try{let r=await Promise.race([e,o]);return ho(n),r}finally{i()}}closeIterator(){if(!this.iteratorClosing){this.iteratorClosing=!0;try{this.iterator.return?.()?.catch(()=>{})}catch{}}}};function za(t){if(typeof t.getReader=="function"){let n=t.getReader(),i=!1,o=()=>{i||(i=!0,n.releaseLock())};return{async next(){if(i)return{done:!0,value:void 0};let r=await n.read();return r.done&&o(),r},async return(){if(!i)try{await n.cancel()}finally{o()}return{done:!0,value:void 0}}}}let e=t;if(typeof e[Symbol.asyncIterator]!="function")throw d("invalid_request","Streamed files require a readable byte stream.");return e[Symbol.asyncIterator]()}function ho(t){if(t?.aborted)throw yo(t)}function yo(t){return d("operation_cancelled","The file transfer was cancelled.",{operationOutcome:"not_sent",cause:t?.reason})}var mo=1024*1024,Ua=4,go=8,be=3,wn=64*1024*1024,_o=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu,bo=/^sha256:[0-9a-f]{64}$/u;async function vo(t,e,n){let i=new _e;for(let o=0;o<t.size;o+=mo){se(e);let r=new Uint8Array(await t.slice(o,o+mo).arrayBuffer());i.update(r),n(Math.min(t.size,o+r.byteLength))}return t.size===0&&n(0),i.digestHex()}function Co(t,e){if(t instanceof Blob)return e&&e!==t.type?t.slice(0,t.size,e):t;if(t instanceof ArrayBuffer)return new Blob([t],{type:e});let n=new Uint8Array(t.byteLength);return n.set(new Uint8Array(t.buffer,t.byteOffset,t.byteLength)),new Blob([n.buffer],{type:e})}function wo(t){return t instanceof Blob?t.size:t.byteLength}async function So(t){return t instanceof Blob?new Uint8Array(await t.arrayBuffer()):t}function Sn(t=Ua){if(!Number.isInteger(t)||t<1||t>go)throw d("invalid_request",`File concurrency must be between 1 and ${go}.`);return t}function Ro(t){if(!Number.isInteger(t)||t<1||t>1e3)throw d("invalid_request","File page size must be between 1 and 1000.");return t}function Rn(t,e,n){if(t.protocol_version!==1||t.type!=="file_transfer"||t.transfer_id!==e||t.direction!==n||!Number.isSafeInteger(t.total_size)||t.total_size<0||!Array.isArray(t.received)||!Na(t))throw d("invalid_operation_response","The authority returned an invalid file transfer session.");let i=t.strategy.kind==="framed_chunks"?t.strategy.chunk_size:t.strategy.kind==="object_put"?Math.max(1,t.total_size):t.strategy.part_size,o=t.strategy.kind==="object_put"?1:Math.ceil(t.total_size/i);if(new Set(t.received).size!==t.received.length||t.received.some(a=>!Number.isSafeInteger(a)||a<0||a>=o))throw d("invalid_operation_response","The authority returned invalid transfer progress.");let r=t.uploaded_parts??[];if(!Array.isArray(r)||r.some((a,s)=>!Number.isSafeInteger(a?.part_number)||a.part_number<1||a.part_number>o||typeof a.etag!="string"||a.etag.length===0||a.etag.length>255||s>0&&r[s-1].part_number>=a.part_number)||(t.strategy.kind==="object_multipart"?r.length!==t.received.length||r.some((a,s)=>a.part_number-1!==t.received[s]):r.length!==0))throw d("invalid_operation_response","The authority returned invalid uploaded part receipts.")}function Po(t,e){let n=e.strategy.kind==="framed_chunks"?e.strategy.chunk_size:e.strategy.kind==="object_put"?Math.max(1,e.total_size):e.strategy.part_size,i=e.strategy.kind==="object_put"?1:Math.ceil(e.total_size/n);if(t?.protocol_version!==1||t.type!=="file_transfer_status"||t.transfer_id!==e.transfer_id||!["open","committed","aborted","expired"].includes(t.state)||!Array.isArray(t.received)||new Set(t.received).size!==t.received.length||t.received.some(r=>!Number.isSafeInteger(r)||r<0||r>=i)||!Number.isSafeInteger(t.received_bytes)||t.received_bytes<0||t.received_bytes>e.total_size||t.received.reduce((r,a)=>r+Pn(e.total_size,n,a),0)!==t.received_bytes)throw d("invalid_operation_response","The authority returned invalid transfer status.");let o=t.uploaded_parts;if(!Array.isArray(o)||o.some((r,a)=>!Number.isSafeInteger(r?.part_number)||r.part_number<1||r.part_number>i||typeof r.etag!="string"||r.etag.length===0||r.etag.length>255||a>0&&o[a-1].part_number>=r.part_number)||(e.strategy.kind==="object_multipart"?o.length!==t.received.length||o.some((r,a)=>r.part_number-1!==t.received[a]):o.length!==0))throw d("invalid_operation_response","The authority returned invalid uploaded part status.")}function Na(t){return t.strategy.kind==="framed_chunks"?t.protection==="grant_aead_v1"&&Number.isSafeInteger(t.strategy.chunk_size)&&t.strategy.chunk_size>0:t.protection!=="transport_tls"?!1:t.strategy.kind==="object_put"?!0:Number.isSafeInteger(t.strategy.part_size)&&t.strategy.part_size>0}function Pn(t,e,n){return Math.min(e,Math.max(0,t-n*e))}async function Bt(t,e){for(let n=1;n<=be;n+=1){se(e);try{return await t()}catch(i){if(e?.aborted||n===be)throw i}}throw new Error("Unreachable file chunk retry state.")}function Ao(t,e,n,i,o,r){let a;try{a=new URL(t.url)}catch{throw d("invalid_operation_response","The authority returned an invalid object URL.")}if(t.protocol_version!==1||t.type!=="file_part"||t.transfer_id!==e||t.part_index!==n||t.offset!==i||t.content_length!==o||t.method.toUpperCase()!==r||a.protocol!=="https:"&&!(a.protocol==="http:"&&["localhost","127.0.0.1","[::1]","::1"].includes(a.hostname))||a.username||a.password)throw d("invalid_operation_response","The authority returned an invalid prepared file part.")}function Oo(t){let e=new Headers;for(let[n,i]of Object.entries(t))["host","content-length"].includes(n.toLowerCase())||e.set(n,i);return e}async function To(t,e,n){let i=new Array(t),o=0;return await Promise.all(Array.from({length:Math.min(t,e)},async()=>{for(;o<t;){let r=o;o+=1,i[r]=await n(r)}})),i}function se(t){if(t?.aborted)throw d("operation_cancelled","The file transfer was cancelled.",{operationOutcome:"not_sent",cause:t.reason})}function Le(t){return t instanceof b?t:typeof DOMException<"u"&&t instanceof DOMException&&t.name==="AbortError"?d("operation_cancelled","The file transfer was cancelled.",{operationOutcome:"not_sent",cause:t}):d("temporarily_unavailable","The file transfer could not be completed.",{cause:t})}var Be=class{constructor(e,n,i,o,r=Re()){this.capability=e;this.request=n;this.framed=i;this.hosted=o;this.timeouts=r}capability;request;framed;hosted;timeouts;async*list(e={}){let n=re(e,this.timeouts.requestMs),i=n.signal;try{this.requireAction("list");let o;do{se(i);let r=new URLSearchParams({protocol_version:String(1),...e.folder?{folder:e.folder}:{},...o?{after:o}:{},...e.pageSize?{limit:String(Ro(e.pageSize))}:{}}),a=await this.request("GET",`?${r.toString()}`,void 0,i);if(a.protocol_version!==1||a.type!=="files_page"||!Array.isArray(a.files))throw d("invalid_operation_response","The authority returned an invalid file page.");for(let s of a.files)se(i),yield jt(s);o=a.next}while(o)}finally{n.dispose()}}async upload(e,n,i={}){return B(i,this.timeouts.uploadMs,o=>this.uploadWithinBudget(e,n,{...i,signal:o.signal,timeoutMs:null}))}async uploadWithinBudget(e,n,i){this.requireAction(i.ifRevision?"replace":"add");let o=Co(n,i.mediaType),r=Sn(i.concurrency),a=await vo(o,i.signal,s=>{i.onProgress?.({phase:"hashing",transferredBytes:s,totalBytes:o.size})});return this.uploadKnownSource(e,o.size,`sha256:${a}`,(i.mediaType??o.type)||void 0,i,r,async(s,c,l)=>o.slice(c,c+l))}async uploadStream(e,n,i={}){return B(i,this.timeouts.uploadMs,o=>this.uploadStreamWithinBudget(e,n,{...i,signal:o.signal,timeoutMs:null}))}async uploadStreamWithinBudget(e,n,i){if(this.requireAction(i.ifRevision?"replace":"add"),!Number.isSafeInteger(n.size)||n.size<0)throw d("invalid_request","Streamed file size must be a non-negative safe integer.");if(!bo.test(n.contentDigest))throw d("invalid_request","Streamed files require a lowercase SHA-256 content digest.");let o=new Lt(n.stream,i.signal),r=new _e;return this.uploadKnownSource(e,n.size,n.contentDigest,i.mediaType??n.mediaType,i,1,async(a,s,c)=>{let l=await o.read(c);return r.update(l),l},async()=>{if(await o.expectEnd(),`sha256:${r.digestHex()}`!==n.contentDigest)throw d("invalid_request","Streamed file bytes do not match the declared SHA-256 digest.")},()=>o.close(),a=>o.setMaxSourceChunkBytes(a))}async uploadKnownSource(e,n,i,o,r,a,s,c,l,u){let p=r.transferId??crypto.randomUUID();if(!_o.test(p))throw d("invalid_request","File transfer ID must be a UUID.");let f=!1;try{let h=await this.request("POST","uploads",{protocol_version:1,type:"open_file_upload",transfer_id:p,path:e,size:n,content_digest:i,...o?{media_type:o}:{},...r.ifRevision?{if_revision:r.ifRevision}:{}},r.signal);if(Rn(h,p,"upload"),h.total_size!==n||h.strategy.kind==="object_ranges")throw d("invalid_operation_response","The authority returned an incompatible upload strategy.");let y=h.strategy.kind==="framed_chunks";if(y&&!this.framed)throw d("invalid_operation_response","Encrypted file chunk delivery is unavailable.");let m=h.strategy.kind==="object_put"?Math.max(1,n):h.strategy.kind==="framed_chunks"?h.strategy.chunk_size:h.strategy.part_size,w=h.strategy.kind==="object_put"?1:Math.ceil(n/m),g=await this.request("GET",`transfers/${encodeURIComponent(p)}`,void 0,r.signal);if(Po(g,h),g.state!=="open"&&g.state!=="committed")throw d("invalid_operation_response",`The authority cannot resume a ${g.state} file transfer.`);if(u?.(m),!y&&g.received.length===w){let k=await this.tryReplayUploadCommit(p,h.strategy.kind==="object_multipart"?g.uploaded_parts:void 0,r.signal);if(k)return f=!0,jt(k.file)}let P=new Set(g.received),T=new Map(g.uploaded_parts.map(k=>[k.part_number-1,k])),v=[...P].reduce((k,K)=>k+Pn(n,m,K),0),N=await To(w,a,async k=>{let K=k*m,ce=Math.min(m,Math.max(0,n-K)),le=await s(k,K,ce);if(wo(le)!==ce)throw d("invalid_request","Streamed file bytes ended before the declared size.");if(P.has(k))return T.get(k)??null;let ve=y?await Bt(async()=>this.framed.uploadChunk(h,k,await So(le),r.signal),r.signal).then(()=>null):await this.uploadPart(p,k,K,le,ce,h.strategy.kind==="object_multipart",r.signal);return v+=ce,r.onProgress?.({phase:"uploading",transferredBytes:v,totalBytes:n}),ve});await c?.();let _=await this.commitUpload(p,h.strategy.kind==="object_multipart"?N.filter(k=>k!==null):void 0,r.signal);if(_.protocol_version!==1||_.type!=="file_upload_committed"||_.transfer_id!==p||_.file.path!==e||_.file.size!==n||_.file.content_digest!==i)throw d("invalid_operation_response","The authority returned an invalid file receipt.");return f=!0,jt(_.file)}catch(h){throw Le(h)}finally{await l?.().catch(()=>{}),!f&&r.transferId===void 0&&await this.abort(p)}}async download(e,n={}){if(e.size>wn)throw d("invalid_request",`download() buffers at most ${wn} bytes; use downloadStream() for larger files.`);let i=await this.downloadStream(e,n),o=[],r=i.getReader();for(;;){let a=await r.read();if(a.done)break;o.push(a.value)}return new Blob(o.map(a=>{let s=new Uint8Array(a.byteLength);return s.set(a),s.buffer}),{type:e.mediaType??""})}async downloadStream(e,n={}){return B(n,this.timeouts.requestMs,i=>this.openDownloadStream(e,n,i.signal))}async openDownloadStream(e,n,i){this.requireAction("read");let o=Sn(n.concurrency),r=crypto.randomUUID(),a;try{if(a=await this.request("POST","downloads",{protocol_version:1,type:"open_file_download",transfer_id:r,file_id:e.fileId,revision:e.revision},i),Rn(a,r,"download"),a.total_size!==e.size||a.strategy.kind!=="object_ranges"&&a.strategy.kind!=="framed_chunks")throw d("invalid_operation_response","The authority returned an incompatible download session.");if(a.strategy.kind==="framed_chunks"&&!this.framed)throw d("invalid_operation_response","Encrypted file chunk delivery is unavailable.");if(a.strategy.kind==="object_ranges"&&e.size>0&&!this.hosted)throw d("invalid_operation_response","Authenticated hosted file delivery is unavailable.")}catch(_){throw await this.abort(r),Le(_)}let s=a.strategy.kind==="framed_chunks"?a.strategy.chunk_size:a.strategy.part_size,c=Math.ceil(e.size/s),l=new _e,u=0,p=0,f=null,h=0,y=!1,m=new AbortController,w=n.signal?AbortSignal.any([n.signal,m.signal]):m.signal,g=new Map,P=0,T=()=>{if(a.strategy.kind==="framed_chunks")for(;P<c&&g.size<o;){let _=P;P+=1;let k=Bt(()=>this.framed.downloadChunk(a,_,w),w).then(K=>({ok:!0,chunk:K}),K=>({ok:!1,error:K}));g.set(_,k)}},v=async()=>{y||(y=!0,m.abort(),await f?.cancel().catch(()=>{}),f=null,await Promise.all(g.values()),g.clear(),await this.abort(r))},N=()=>{if(h!==e.size||`sha256:${l.digestHex()}`!==e.contentDigest)throw d("invalid_operation_response","Downloaded file bytes failed integrity verification.")};return new ReadableStream({pull:async _=>{try{if(se(w),a.strategy.kind==="object_ranges")for(;;){if(!f){if(u>=c){N(),_.close(),v();return}let Fo=u*s;p=Math.min(s,e.size-Fo),f=(await Bt(()=>this.hosted.downloadPart(a,u,p,w),w)).getReader()}let ne=await f.read();if(ne.done){if(f.releaseLock(),f=null,p!==0)throw d("invalid_operation_response","A hosted file range ended before its declared byte length.");u+=1;continue}if(!(ne.value instanceof Uint8Array))throw d("invalid_operation_response","A hosted file range returned a non-byte chunk.");if(ne.value.byteLength!==0){if(ne.value.byteLength>p)throw d("invalid_operation_response","A hosted file range exceeded its declared byte length.");p-=ne.value.byteLength,l.update(ne.value),h+=ne.value.byteLength,n.onProgress?.({phase:"downloading",transferredBytes:h,totalBytes:e.size}),_.enqueue(ne.value);return}}if(u>=c){N(),_.close(),v();return}let k=u*s,K=Math.min(s,e.size-k);T();let ce=g.get(u);if(!ce)throw d("invalid_operation_response","A file chunk was not scheduled.");let le=await ce;if(g.delete(u),!le.ok)throw le.error;let ve=le.chunk;if(ve.byteLength!==K)throw d("invalid_operation_response","A file chunk had the wrong byte length.");l.update(ve),h+=ve.byteLength,u+=1,T(),n.onProgress?.({phase:"downloading",transferredBytes:h,totalBytes:e.size}),u===c&&N(),_.enqueue(ve),u===c&&(_.close(),v())}catch(k){await v(),_.error(Le(k))}},cancel:v})}async downloadBytes(e,n={}){return new Uint8Array(await(await this.download(e,n)).arrayBuffer())}async move(e,n,i={}){return B(i,this.timeouts.requestMs,o=>this.moveWithinBudget(e,n,{...i,signal:o.signal,timeoutMs:null}))}async moveWithinBudget(e,n,i){this.requireAction("move");let o=i.mutationId??crypto.randomUUID(),r;try{r=await this.request("POST",`${encodeURIComponent(e.fileId)}/move`,{protocol_version:1,type:"move_file",mutation_id:o,file_id:e.fileId,if_revision:i.ifRevision??e.revision,from_path:e.path,path:n,update_references:!1},i.signal)}catch(a){throw Le(a)}if(r.protocol_version!==1||r.type!=="file_moved"||r.mutation_id!==o||r.file.file_id!==e.fileId||r.file.path!==n)throw d("invalid_operation_response","The authority returned an invalid file move receipt.");return jt(r.file)}async delete(e,n={}){return B(n,this.timeouts.requestMs,i=>this.deleteWithinBudget(e,{...n,signal:i.signal,timeoutMs:null}))}async deleteWithinBudget(e,n){this.requireAction("delete");let i=n.mutationId??crypto.randomUUID(),o;try{o=await this.request("POST",`${encodeURIComponent(e.fileId)}/delete`,{protocol_version:1,type:"delete_file",mutation_id:i,file_id:e.fileId,if_revision:n.ifRevision??e.revision,path:e.path},n.signal)}catch(r){throw Le(r)}if(o.protocol_version!==1||o.type!=="file_deleted"||o.mutation_id!==i||o.file_id!==e.fileId||o.previous_path!==e.path)throw d("invalid_operation_response","The authority returned an invalid file delete receipt.");return{protocolVersion:o.protocol_version,type:o.type,mutationId:o.mutation_id,fileId:o.file_id,previousPath:o.previous_path,revision:o.revision}}async uploadPart(e,n,i,o,r,a,s){for(let c=1;c<=be;c+=1){se(s);try{let l=await this.request("POST",`uploads/${encodeURIComponent(e)}/parts`,{protocol_version:1,type:"prepare_file_upload_part",transfer_id:e,part_number:n+1,content_length:r},s);Ao(l,e,n,i,r,"PUT");let u=await fetch(l.url,{method:l.method,headers:Oo(l.headers),body:o,redirect:"error",signal:s});if(!u.ok)throw new Error(`Object upload failed with HTTP ${u.status}.`);let p=u.headers.get("etag");if(a&&!p)throw new Error("Multipart object upload did not return an ETag.");return{part_number:n+1,etag:p??""}}catch(l){if(s?.aborted||c===be)throw l}}throw new Error("Unreachable upload retry state.")}async tryReplayUploadCommit(e,n,i){try{return await this.commitUpload(e,n,i)}catch(o){if(o instanceof b&&o.code==="file_upload_incomplete")return null;throw o}}async commitUpload(e,n,i){let o;for(let r=1;r<=be;r+=1){se(i);try{return await this.request("POST",`uploads/${encodeURIComponent(e)}/commit`,{protocol_version:1,type:"commit_file_upload",transfer_id:e,...n===void 0?{}:{parts:n}},i)}catch(a){if(o=a,i?.aborted||a instanceof b||r===be)throw a}}throw o}requireAction(e){if(!this.capability()?.actions.includes(e))throw d("not_authorized",`This connection is not authorized to ${e} files.`)}async abort(e){await this.request("DELETE",`transfers/${encodeURIComponent(e)}`).catch(()=>{})}};function jt(t){return{fileId:t.file_id,path:t.path,revision:t.revision,contentDigest:t.content_digest,size:t.size,...t.media_type?{mediaType:t.media_type}:{},mediaClass:t.media_class,modifiedAt:t.modified_at}}var je=class{constructor(e,n){this.internals=e;this.collectionId=n;this.transport=new Nt({serverUrl:e.serverUrl,storage:e.storage,keyStore:e.keyStore,directAccessMode:e.directAccessMode,loopbackUrl:e.loopbackUrl,collectionId:n,internals:e,timeouts:e.timeouts,onChange:()=>this.emitConnection()}),this.files=new Be(()=>this.fileCapability,(i,o,r,a)=>this.transport.files.control(i,o,r,a),{uploadChunk:(i,o,r,a)=>this.transport.files.uploadChunk(i,o,r,a),downloadChunk:(i,o,r)=>this.transport.files.downloadChunk(i,o,r)},{downloadPart:(i,o,r,a)=>this.transport.files.downloadHostedPart(i,o,r,a)},e.timeouts),this.collectionClient=new Fe({operation:(i,o,r)=>this.transport.performOperation(i,o,r)},e.timeouts.requestMs),this.notifications=new kt({serverUrl:e.serverUrl,storage:e.storage,authorizedToken:i=>this.transport.authorizedToken({signal:i,timeoutMs:null}),register:i=>this.internals.register({signal:i,timeoutMs:null}),notificationKey:i=>e.notificationKey(n,i),requestTimeoutMs:e.timeouts.requestMs})}internals;collectionId;collectionClient;notifications;transport;files;connectionListeners=new Set;get displayName(){return this.transport.currentToken()?.collectionName??`Collection ${this.collectionId.slice(0,8)}`}get operations(){return[...this.transport.currentToken()?.operations??[]]}get scope(){return this.transport.currentToken()?.scope??null}get fileCapability(){return this.transport.currentToken()?.fileCapability??null}get directAccess(){return this.transport.directAccess}get route(){return this.transport.route}register(e){return E(()=>this.internals.register(e),fe)}info(){let e=this.transport.currentToken();return e?{collectionId:e.collectionId,displayName:e.collectionName,operations:[...e.operations],scope:e.scope,...e.fileCapability?{fileCapability:e.fileCapability}:{},authority:e.authority?{kind:"hosted",durability:"provider"}:{kind:"connector",durability:"computer"},route:this.transport.route,directAccess:this.transport.directAccess}:null}authorizationCapabilities(e=me){let n=this.operations,i=G(e).filter(o=>!n.includes(o));return{authorized:this.info()!==null,sufficient:this.info()!==null&&i.length===0,collectionId:this.collectionId,grantedOperations:n,missingOperations:i}}hasOperations(e){return this.authorizationCapabilities(e).sufficient}authorize(e={}){return E(()=>this.internals.authorize({...e,target:{kind:"collection",collectionId:this.collectionId}}),Se)}async requestOperations(e,n={}){let i=this.authorizationCapabilities(e);return i.sufficient?M({kind:"unchanged",connection:this}):this.authorize({...n,operations:G([...i.grantedOperations,...i.missingOperations])})}onConnectionChange(e){return this.connectionListeners.add(e),e(this.info()),()=>this.connectionListeners.delete(e)}notifyStorageChanged(){this.transport.notifyStorageChanged()}checkDirectAccess(e){return E(()=>this.transport.checkDirectAccess(e),an)}requestDirectAccess(e){return E(()=>this.transport.requestDirectAccess(e),an)}disableDirectAccess(){this.transport.disableDirectAccess()}sync(){let e=this.transport.currentToken();if(!e)return null;let n=e.collectionId;if(!e.authority){if(!e.grantId||!e.operations.includes("sync"))return null;let o=e.grantId;return{collectionId:n,replicaId:o,transport:{openSession:r=>this.transport.performOperation("sync",{action:"open_session"},Kt(r,this.internals.timeouts.syncMs)),snapshot:(r,a,s)=>this.transport.performOperation("sync",{action:"snapshot",snapshot_id:r,...a?{page:a}:{}},Kt(s,this.internals.timeouts.syncMs)),changes:(r,a=200,s)=>this.transport.performOperation("sync",{action:"changes",after:r,limit:a},Kt(s,this.internals.timeouts.syncMs)),mutate:(r,a)=>this.transport.performOperation("sync",{action:"mutate",mutation:r},Kt(a,this.internals.timeouts.syncMs))}}}let i=e.authority.replicaId;return{collectionId:n,replicaId:i,transport:{openSession:o=>this.transport.performAuthoritySyncRequest(n,i,"POST","sessions",void 0,o),snapshot:(o,r,a)=>{let s=new URLSearchParams({snapshot_id:o});return r&&s.set("page",r),this.transport.performAuthoritySyncRequest(n,i,"GET",`snapshot?${s}`,void 0,a)},changes:(o,r=200,a)=>this.transport.performAuthoritySyncRequest(n,i,"GET",`changes?${new URLSearchParams({after:String(o),limit:String(r)})}`,void 0,a),mutate:(o,r)=>this.transport.performAuthoritySyncRequest(n,i,"POST","mutations",o,r)}}}registerNotifications(e){return E(()=>this.notifications.registerNotifications(e),Ye)}registerNativeNotifications(e){return E(()=>this.notifications.registerNativeNotifications(e),Ye)}unregisterNativeNotifications(e){return E(()=>this.notifications.unregisterNativeNotifications(e),Ye)}unregisterNotifications(e,n){return E(()=>this.notifications.unregisterNotifications(e,n),Ye)}forget(){let e=this.transport.currentToken();this.internals.removeToken(this.collectionId,e?.keyHandle,"not_authorized",!0),this.transport.notifyStorageChanged()}describe(e){return this.collectionClient.describe(e)}changes(e={},n){return this.collectionClient.changes(e,n)}read(e,n){return this.collectionClient.read(e,n)}query(e={},n){return this.collectionClient.query(e,n)}queryPages(e={},n={}){return this.collectionClient.queryPages(e,n)}queryAll(e={},n={}){return this.collectionClient.queryAll(e,n)}listViews(e){return this.collectionClient.listViews(e)}executeView(e,n){return this.collectionClient.executeView(e,n)}readViewSource(e,n){return this.collectionClient.readViewSource(e,n)}createViewSource(e,n){return this.collectionClient.createViewSource(e,n)}updateViewSource(e,n){return this.collectionClient.updateViewSource(e,n)}deleteViewSource(e,n){return this.collectionClient.deleteViewSource(e,n)}create(e,n){return this.collectionClient.create(e,n)}update(e,n){return this.collectionClient.update(e,n)}delete(e,n){return this.collectionClient.delete(e,n)}preflightDelete(e,n){return this.collectionClient.preflightDelete(e,n)}rename(e,n){return this.collectionClient.rename(e,n)}preflightRename(e,n){return this.collectionClient.preflightRename(e,n)}async renameWithProgress(e,n={}){return B(n,this.internals.timeouts.requestMs,async i=>{let o=Date.now(),r=!1,a,s=(c,l,u=0)=>{n.onProgress?.({operation:"rename",state:c,elapsedMs:Date.now()-o,cancellable:l,resumed:r,completedUnits:u,...a?{estimate:a}:{}})};try{ye(i.signal),s("preflighting",!0);let c=n.preflight?M(n.preflight):await this.preflightRename(e,{signal:i.signal,timeoutMs:null});if(!c.ok)return c;let l=c.value;try{_i(e,l)}catch(f){if(f instanceof b)return A(f.problem);throw f}a=vi(e,l),s("ready",!0),ye(i.signal);let u=this.transport.hasResumableMutationTransport();s("applying",u);let p=await this.rename(e,u?{signal:i.signal,timeoutMs:null}:{timeoutMs:ko(i.remainingMs())});return p.ok&&s("completed",!1,a.totalUnits),p}catch(c){if(un(c,i.signal)&&s("cancelled",!1),c instanceof b)return A(c.problem);throw c}})}async deleteWithProgress(e,n={}){return B(n,this.internals.timeouts.requestMs,async i=>{let o=Date.now(),r=!1,a,s=(c,l,u=0)=>{n.onProgress?.({operation:"delete",state:c,elapsedMs:Date.now()-o,cancellable:l,resumed:r,completedUnits:u,...a?{estimate:a}:{}})};try{ye(i.signal),s("preflighting",!0);let c=n.preflight?M(n.preflight):await this.preflightDelete(e,{signal:i.signal,timeoutMs:null});if(!c.ok)return c;let l=c.value;try{bi(e,l)}catch(f){if(f instanceof b)return A(f.problem);throw f}a=Ci(l),s("ready",!0),ye(i.signal);let u=this.transport.hasResumableMutationTransport();s("applying",u);let p=await this.delete(e,u?{signal:i.signal,timeoutMs:null}:{timeoutMs:ko(i.remainingMs())});return p.ok&&s("completed",!1,a.totalUnits),p}catch(c){if(un(c,i.signal)&&s("cancelled",!1),c instanceof b)return A(c.problem);throw c}})}pendingMutations(){return this.transport.pendingMutations().map(e=>({...e,recover:n=>E(()=>this.recoverPendingMutation(e.requestId,n),z)}))}pendingMutation(e){let n=this.transport.pendingMutation(e);return n?{...n,recover:i=>E(()=>this.recoverPendingMutation(e,i),z)}:null}async recoverPendingMutation(e,n){let i=await this.transport.recoverPendingMutation(e,n);if(i&&typeof i=="object"&&"valid"in i){let o=i;if(!o.valid)throw new b(we(o));return o.result}return i}validate(e={},n){return this.collectionClient.validate(e,n)}readType(e,n){return this.collectionClient.readType(e,n)}createType(e,n){return this.collectionClient.createType(e,n)}updateType(e,n){return this.collectionClient.updateType(e,n)}assessTypePack(e,n){return this.collectionClient.assessTypePack(e,n)}applyTypePack(e,n){return this.collectionClient.applyTypePack(e,n)}assessCollectionSetup(e,n){return this.collectionClient.assessCollectionSetup(e,n)}applyCollectionSetup(e,n){return this.collectionClient.applyCollectionSetup(e,n)}listTimers(e,n){return this.collectionClient.listTimers(e,n)}putTimer(e,n){return this.collectionClient.putTimer(e,n)}cancelTimer(e,n){return this.collectionClient.cancelTimer(e,n)}reconcileTimers(e,n){return this.collectionClient.reconcileTimers(e,n)}watch(e={},n={}){return E(()=>U(n,this.internals.timeouts.watchStartMs,async i=>{let o=await this.collectionClient.changes(e.cursor===void 0?{}:{after:e.cursor,limit:200},{signal:i.signal,timeoutMs:null});if(!o.ok)throw new b(o.problem);if(o.value.reset)throw new b(I("change_cursor_reset","The collection change cursor expired. Refresh collection state before subscribing again."));return new An(this.collectionClient,o.value.cursor,e,e.cursor===void 0?[]:o.value.events,this.internals.timeouts.watchStartMs)}),gt)}emitConnection(){let e=this.info();for(let n of this.connectionListeners)n(e)}},An=class{constructor(e,n,i,o,r){this.client=e;this.input=i;this.watchStartTimeoutMs=r;this.pendingChanges=[...o],this.currentStatus={state:"connected",cursor:n,recovered:!1};let a=i.lifetimeSignal;if(a?.aborted)this.close();else if(a){let s=()=>this.close();a.addEventListener("abort",s,{once:!0}),this.removeLifetimeAbort=()=>a.removeEventListener("abort",s)}this.controller.signal.aborted||this.run(n)}client;input;watchStartTimeoutMs;changes=new Set;statuses=new Set;problems=new Set;controller=new AbortController;removeLifetimeAbort;currentStatus;currentProblem=null;pendingChanges;get status(){return this.currentStatus}get problem(){return this.currentProblem}subscribe(e,n,i){this.changes.add(e),n&&(this.statuses.add(n),n(this.currentStatus)),i&&(this.problems.add(i),this.currentProblem&&i(this.currentProblem));for(let o of this.pendingChanges)e(o);return this.pendingChanges=[],()=>{this.changes.delete(e),n&&this.statuses.delete(n),i&&this.problems.delete(i)}}close(){if(this.controller.signal.aborted)return;this.controller.abort(),this.removeLifetimeAbort?.(),this.removeLifetimeAbort=void 0;let e="cursor"in this.currentStatus?this.currentStatus.cursor:void 0;this.publishStatus({state:"closed",...e===void 0?{}:{cursor:e}})}async run(e){let n=!0,i=this.client.watch({cursor:e,pollIntervalMs:this.input.pollIntervalMs,retry:this.input.retry,signal:this.controller.signal,timeoutMs:this.watchStartTimeoutMs,onStatus:o=>{if(n&&o.state==="connecting"){n=!1;return}n=!1,this.publishStatus(o)}});try{for await(let o of i){if(this.controller.signal.aborted)return;if(!o.ok){this.currentProblem=o.problem;for(let r of this.problems)r(o.problem);return}for(let r of this.changes)r(o.value)}}finally{this.controller.signal.aborted||this.close()}}publishStatus(e){this.currentStatus=e;for(let n of this.statuses)n(e)}};function Kt(t,e){return{...t,timeoutMs:t?.timeoutMs===void 0?e:t.timeoutMs}}function ko(t){return t===null?null:Math.max(1,Math.ceil(t))}function On(t){let e="bundle:";if(!t.startsWith(e)||t.length===e.length)throw new Error("The registered application has no valid declaration identity.");return t.slice(e.length)}function Ke(t,e,n){return t.reason instanceof b?t.reason:d("authorization_cancelled",e,{cause:n})}function Tn(t,e,n,i){let o=`${e}:pending-mutation:`,r=new Set;for(let a=0;a<t.length;a+=1){let s=t.key(a);if(!s?.startsWith(o))continue;let c=x(t.getItem(s));if(!c||!n.includes(c.operation)||i&&c.collectionId!==i)continue;let l=c.envelope?.protocol_version??c.request?.protocol_version;l!==void 0&&l!==L&&Ve(l)&&r.add(l)}return[...r].sort((a,s)=>s-a)}function Io(t,e,n){for(let i=0;i<t.length;i+=1){let o=t.key(i);if(o!==e&&!o?.startsWith(`${e}:`))continue;if(x(t.getItem(o))?.keyHandle===n)return!0}return!1}function Mo(t,e,n){let i=[e];for(let o=0;o<t.length;o+=1){let r=t.key(o);r?.startsWith(`${e}:`)&&i.push(r)}for(let o of i){let r=x(t.getItem(o));r?.keyHandle&&n(r.keyHandle),t.removeItem(o)}}function xo({body:t,clientId:e,keyHandle:n,previous:i,defaultApplicationOrigin:o,pinConnectorIdentity:r}){let a=t.collection_id;if(typeof a!="string")throw d("invalid_token_response","Authorization returned no collection ID.");let s=St(t.scope);if(!s)throw d("invalid_token_response","Authorization returned no valid collection scope.");if(t.authority&&!tt(t.authority,a))throw d("invalid_token_response","Authorization returned an invalid remote authority capability.");if(t.authority&&t.encryption)throw d("invalid_token_response","Authorization returned conflicting collection transports.");if(t.file_capability!==null&&t.file_capability!==void 0&&!wt(t.file_capability))throw d("invalid_token_response","Authorization returned an invalid file capability.");if(t.encryption){try{X(t.encryption)}catch{throw d("invalid_token_response","Authorization returned an invalid encrypted relay binding.")}if(r(t.encryption.connector_id,t.encryption.connector_agreement_public_key),t.encryption.collection_id!==a||typeof t.grant_id!="string"||t.grant_id.length===0)throw d("invalid_token_response","Authorization returned an encrypted relay binding for another grant.")}if(i?.encryption&&t.encryption&&i.keyHandle&&i.keyHandle===n&&(i.grantId!==t.grant_id||i.encryption.connector_id!==t.encryption.connector_id||i.encryption.connector_agreement_public_key!==t.encryption.connector_agreement_public_key||i.encryption.application_agreement_public_key!==t.encryption.application_agreement_public_key))throw d("connector_identity_changed","The connector identity changed during authorization renewal. Reauthorize before sending collection data.");return{version:1,accessToken:t.access_token,refreshToken:t.refresh_token,clientId:e,collectionId:a,collectionName:t.collection_name??`Collection ${a.slice(0,8)}`,operations:t.operations,scope:s,expiresAt:Date.now()+t.expires_in*1e3,refreshExpiresAt:t.refresh_expires_in?Date.now()+t.refresh_expires_in*1e3:void 0,grantId:t.grant_id,encryption:t.encryption??void 0,fileCapability:t.file_capability??void 0,applicationOrigin:t.application_origin??o,keyHandle:n,savedAt:Date.now(),authority:t.authority?{operationsUrl:t.authority.operations_url,syncUrl:t.authority.sync_url,filesUrl:t.authority.files_url,replicaId:t.authority.replica_id,accessToken:t.authority.access_token,proofPublicKey:t.authority.proof_public_key}:void 0}}var Ht=class{serverUrl;manifest;manifestSource;redirectUri;storage;relayEncryption;keyStore;identityStore;directAccessMode;loopbackUrl;navigate;timeouts;credentialStorage;application=null;manifestPromise=null;completionPromises=new Map;connectionCache=new Map;listeners=new Set;invalidatedConnections=new Map;constructor(e){this.serverUrl=ki(String(e.serverUrl)),this.manifest=e.manifest instanceof URL?e.manifest.href:e.manifest??Ii(),this.manifestSource=typeof this.manifest=="string"?this.manifest:this.manifest.distribution==="portable"?`bundle:${this.manifest.id}:${Fi(this.manifest)}`:`bundle:${this.manifest.id}`;let n=qi(this.manifest);this.redirectUri=e.redirectUri===void 0?typeof this.manifest!="string"&&this.manifest.distribution==="portable"?"":Mi():String(e.redirectUri),this.storage=e.storage??Di(n),this.relayEncryption=e.relayEncryption??"required",this.keyStore=e.keyStore??(n?new Ae:new Pe),this.identityStore=e.identityStore??(n?new De:new Ee),this.credentialStorage=e.storage||e.keyStore||e.identityStore?"custom":this.storage instanceof ke?"memory":"persistent",this.directAccessMode=e.directAccess??"auto",this.loopbackUrl=Pi(String(e.loopbackUrl??`http://127.0.0.1:${Zn}`)),this.navigate=e.navigate,this.timeouts=Re(e.timeouts),typeof window<"u"&&this.storage===window.localStorage&&window.addEventListener("storage",i=>{i.storageArea!==this.storage||!i.key?.startsWith(this.storagePrefix())||(this.connectionCache.get(Ei(i.key))?.notifyStorageChanged(),this.emitConnections())})}environment(){let e=typeof this.manifest!="string"&&this.manifest.distribution==="portable"?"portable":this.application?.distribution??"web";return{distribution:e,applicationOrigin:e==="portable"?"null":this.defaultApplicationOrigin(),credentialStorage:this.credentialStorage}}register(e={}){return U(e,this.timeouts.requestMs,n=>this.registerWithinBudget(n.signal))}async registerWithinBudget(e){if(this.application)return this.application;let n=await Z(`${this.serverUrl}/v1/apps/register`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({manifest:await this.manifestDeclaration({signal:e,timeoutMs:null})}),signal:e},"temporarily_unavailable","Application registration is temporarily unavailable."),i=await R(n,"invalid_operation_response","Connect returned an invalid application registration response.");if(!n.ok)throw O(i,"discovery_failed","Application discovery failed.",n.status);return this.application=i.application,this.application}manifestDeclaration(e={}){if(this.manifestPromise)return this.manifestPromise;let i=U(e,this.timeouts.requestMs,o=>this.loadManifest(o.signal)).catch(o=>{throw this.manifestPromise===i&&(this.manifestPromise=null),o});return this.manifestPromise=i,this.manifestPromise}async loadManifest(e){if(typeof this.manifest!="string")return this.manifest;let n=this.manifest,i;try{i=await fetch(n,{headers:{accept:"application/json"},signal:e})}catch(o){throw d("manifest_load_failed","The bundled application declaration could not be loaded.",{cause:o})}if(!i.ok)throw d("manifest_load_failed",`The bundled application declaration returned HTTP ${i.status}.`,{status:i.status});try{return await R(i,"invalid_application_manifest","The bundled application declaration is not valid JSON.")}catch(o){throw d("invalid_application_manifest","The bundled application declaration is not valid JSON.",{cause:o,details:{issues:[{path:"/",keyword:"json",message:"must be valid JSON",params:{}}]}})}}async authorize(e={}){return U(e,this.timeouts.requestMs,n=>this.authorizeWithinBudget({...e,signal:n.signal,timeoutMs:null}))}async authorizeWithinBudget(e){if(typeof location>"u"&&!this.navigate&&!e.openVerification)throw d("browser_required","Authorization navigation requires a browser environment.");let i=typeof this.manifest!="string"&&this.manifest.distribution==="portable"&&!e.openVerification&&!this.navigate&&typeof window<"u"?window.open("","mdbase-connect-authorization","popup,width=620,height=760"):null,o;try{o=await this.registerWithinBudget(e.signal)}catch(r){throw i?.close(),r}return o.distribution==="portable"?(e.openVerification&&i?.close(),this.authorizePortable(o,e,e.openVerification?null:i)):(i?.close(),this.authorizeWeb(o,e))}async authorizeWeb(e,n){let{verifier:i,challenge:o}=await Ze(),r=V(24),a=crypto.randomUUID(),s=n.target?.kind==="collection"?n.target.collectionId:void 0,c=`grant:${e.id}:${r}`,l=await this.keyStore.create(c),u;try{u=await this.loadApplicationIdentity(e)}catch(m){throw await this.keyStore.delete(c),m}let p=G(n.operations??me),f=new Date,h=await rt({protocol_version:$,authorization_id:a,application_id:e.id,application_declaration_id:On(e.family_identity),application_manifest_digest:e.manifest_digest,application_installation_id:await qe(u),installation_signing_public_key:u.signingPublicKey,grant_agreement_public_key:l.agreementPublicKey,grant_signing_public_key:l.signingPublicKey,flow:"authorization_code",authorization_nonce:V(32),issued_at:f.toISOString(),expires_at:new Date(f.getTime()+600*1e3).toISOString(),redirect_uri:this.redirectUri,state:r,code_challenge:o,contracts:nn(p,e.requirements?.files,Tn(this.storage,this.storagePrefix(),p,s)),requested_operations:p,...e.requirements?.files?{requested_files:e.requirements.files}:{},...s?{collection_id:s}:{}},u),y={version:1,verifier:i,state:r,clientId:e.id,redirectUri:this.redirectUri,relayEncryption:this.relayEncryption,collectionId:s,returnTo:n.returnTo,keyHandle:c,authorizationId:a,applicationAgreementPublicKey:l.agreementPublicKey,applicationSigningPublicKey:l.signingPublicKey};this.storage.setItem(this.pendingKey(r),JSON.stringify(y));try{let m=await fetch(`${this.serverUrl}/oauth/authorization_request`,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:e.id,redirect_uri:this.redirectUri,code_challenge:o,code_challenge_method:"S256",state:r,operations:p.join(","),...s?{collection_id:s}:{},application_authorization:JSON.stringify(h)}),signal:n.signal}),w=await R(m,"invalid_device_authorization_response","The authorization service returned an invalid authorization response.");if(!m.ok)throw O(w,"device_authorization_failed","Application authorization could not be started.",m.status);if(typeof w.authorization_uri!="string"||w.authorization_id!==a||!Number.isInteger(w.expires_in)||w.expires_in<=0)throw d("invalid_device_authorization_response","The authorization service returned an invalid authorization response.");if(this.navigate)await this.navigate(w.authorization_uri);else if(typeof location<"u")location.assign(w.authorization_uri);else throw d("browser_required","Authorization navigation requires a browser environment.");return{kind:"redirecting"}}catch(m){throw this.storage.removeItem(this.pendingKey(r)),await this.keyStore.delete(c),n.signal?.aborted?Ke(n.signal,"Application authorization was cancelled.",m):m}}async authorizePortable(e,n,i){if(this.relayEncryption!=="required")throw i?.close(),d("encryption_required","Downloaded applications require encrypted relay authorization.");let{verifier:o,challenge:r}=await Ze(),a=`grant:${e.id}:${V(24)}`,s=await this.keyStore.create(a),c;try{c=await this.loadApplicationIdentity(e)}catch(g){throw i?.close(),await this.keyStore.delete(a),g}let l=G(n.operations??me),u=crypto.randomUUID(),p=new Date,f=await rt({protocol_version:$,authorization_id:u,application_id:e.id,application_declaration_id:On(e.family_identity),application_manifest_digest:e.manifest_digest,application_installation_id:await qe(c),installation_signing_public_key:c.signingPublicKey,grant_agreement_public_key:s.agreementPublicKey,grant_signing_public_key:s.signingPublicKey,flow:"device_code",authorization_nonce:V(32),issued_at:p.toISOString(),expires_at:new Date(p.getTime()+600*1e3).toISOString(),code_challenge:r,contracts:nn(l,e.requirements?.files,Tn(this.storage,this.storagePrefix(),l,n.target?.kind==="collection"?n.target.collectionId:void 0)),requested_operations:l,...e.requirements?.files?{requested_files:e.requirements.files}:{},...n.target?.kind==="collection"?{collection_id:n.target.collectionId}:{}},c),h,y;try{h=await fetch(`${this.serverUrl}/oauth/device_authorization`,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:e.id,operations:l.join(","),...n.target?.kind==="collection"?{collection_id:n.target.collectionId}:{},code_challenge:r,code_challenge_method:"S256",application_authorization:JSON.stringify(f)}),signal:n.signal}),y=await R(h,"invalid_device_authorization_response","The authorization service returned an invalid device authorization response.")}catch(g){throw i?.close(),await this.keyStore.delete(a),d("device_authorization_failed","Downloaded application authorization could not be started.",{cause:g})}if(!h.ok)throw i?.close(),await this.keyStore.delete(a),O(y,"device_authorization_failed","Downloaded application authorization could not be started.",h.status);let m;try{m=Ti(y)}catch(g){throw i?.close(),await this.keyStore.delete(a),n.signal?.aborted?Ke(n.signal,"Downloaded application authorization was cancelled.",g):g}if(n.onDeviceCode?.(m),n.openVerification)await n.openVerification(m);else if(i)try{i.location.href=m.verificationUriComplete}catch{}else throw await this.keyStore.delete(a),d("approval_window_blocked","The approval window was blocked. Show the provided verification link and code, then try again.",{details:{user_code:m.userCode,verification_uri:m.verificationUri,verification_uri_complete:m.verificationUriComplete,expires_at:m.expiresAt,interval_seconds:m.intervalSeconds}});let w=m.intervalSeconds;try{for(;Date.now()<m.expiresAt;){if(await ot(w*1e3,n.signal),n.signal?.aborted)throw Ke(n.signal,"Downloaded application authorization was cancelled.");let g;try{g=await fetch(`${this.serverUrl}/oauth/token`,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:y.device_code,client_id:e.id,code_verifier:o}),signal:n.signal})}catch(_){if(n.signal?.aborted)throw Ke(n.signal,"Downloaded application authorization was cancelled.",_);continue}let P=await R(g,"invalid_token_response","The authorization service returned an invalid token response.");if(!g.ok){let _=et(P);if(_==="authorization_pending")continue;if(_==="slow_down"){w+=5;continue}throw O(P,"token_exchange_failed","Downloaded application authorization could not be completed.",g.status)}let T=tt(P.authority,P.collection_id),v=P.encryption&&P.encryption.protocol_version===ht&&P.encryption.suite===Ge&&P.encryption.application_agreement_public_key===s.agreementPublicKey;if(P.application_origin!=="null")throw d("invalid_token_response","Authorization did not bind the portable grant to its opaque application origin.");if(P.authority&&(!T||P.encryption!=null||P.authority.proof_public_key!==s.signingPublicKey))throw d("invalid_token_response","Authorization returned a remote authority capability that is not bound to this portable grant key.");if(!P.authority&&!v)throw d("encryption_required","Authorization did not establish the expected key-bound local portable grant.");let N=this.storeTokenResponse(P,e.id,a);if(n.target?.kind==="collection"&&n.target.collectionId!==N.collectionId)throw this.removeToken(N.collectionId,N.keyHandle),d("collection_mismatch","The approved collection does not match the collection requested by this link.");return i?.close(),{kind:"connected",connection:this.connection(N.collectionId),...n.returnTo?{returnTo:n.returnTo}:{}}}throw d("expired_token","The downloaded application authorization code expired.")}catch(g){throw i?.close(),await this.keyStore.delete(a),n.signal?.aborted?Ke(n.signal,"Downloaded application authorization was cancelled.",g):g}}completeAuthorization(e,n={}){return U(n,this.timeouts.requestMs,i=>this.completeAuthorizationWithinBudget(e,i.signal))}completeAuthorizationWithinBudget(e,n){let i=new URL(e).searchParams.get("state");if(!i)return Promise.reject(d("invalid_callback","Authorization callback is missing its state."));let o=this.completionPromises.get(i);if(o)return o;let a=this.performAuthorizationCompletion(e,i,n).finally(()=>{this.completionPromises.get(i)===a&&this.completionPromises.delete(i)});return this.completionPromises.set(i,a),a}async performAuthorizationCompletion(e,n,i){let o=new URL(e),r=o.searchParams.get("code"),a=this.pendingKey(n),s=x(this.storage.getItem(a));if(!s||s.version!==1||n!==s.state)throw d("invalid_callback","Authorization callback is missing or does not match this browser session.");if(o.searchParams.has("error"))throw s.keyHandle&&await this.keyStore.delete(s.keyHandle),this.storage.removeItem(a),F(o.searchParams.get("error")??"access_denied",o.searchParams.get("error_description")??"Collection access was not approved.",{details:s.returnTo?{return_to:s.returnTo}:void 0});if(!r)throw d("invalid_callback","Authorization callback is missing its code.");let c=await Z(`${this.serverUrl}/oauth/token`,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",code:r,client_id:s.clientId,redirect_uri:s.redirectUri,code_verifier:s.verifier}),signal:i},"temporarily_unavailable","Authorization completion is temporarily unavailable."),l=await R(c,"invalid_token_response","The authorization service returned an invalid token response.");if(!c.ok)throw O(l,"token_exchange_failed","Authorization could not be completed.",c.status);if(s.relayEncryption==="required"&&!l.authority&&(!l.encryption||!s.keyHandle||l.encryption.application_agreement_public_key!==s.applicationAgreementPublicKey))throw s.keyHandle&&await this.keyStore.delete(s.keyHandle),this.storage.removeItem(a),d("encryption_required","Authorization did not establish the required encrypted relay grant.");if(l.authority?.proof_public_key){if(!s.keyHandle||!s.applicationSigningPublicKey||l.authority.proof_public_key!==s.applicationSigningPublicKey)throw s.keyHandle&&await this.keyStore.delete(s.keyHandle),this.storage.removeItem(a),d("invalid_token_response","Authorization returned a remote authority capability bound to another application key.")}else l.authority&&s.keyHandle&&await this.keyStore.delete(s.keyHandle);let u=this.storeTokenResponse(l,s.clientId,l.authority?.proof_public_key?s.keyHandle:l.authority?void 0:s.keyHandle);if(s.collectionId&&s.collectionId!==u.collectionId)throw this.removeToken(u.collectionId,u.keyHandle),this.storage.removeItem(a),d("collection_mismatch","The approved collection does not match the collection requested by this link.");return this.storage.removeItem(a),{connection:this.connection(u.collectionId),...s.returnTo?{returnTo:s.returnTo}:{}}}connections(){let e=[];for(let n of this.connectionIds()){let i=this.connection(n)?.info();i&&e.push(i)}return e.sort((n,i)=>n.displayName.localeCompare(i.displayName)||n.collectionId.localeCompare(i.collectionId))}connection(e){if(!this.storage.getItem(this.tokenKey(e)))return null;let n=this.connectionCache.get(e);return n||(n=new je(this,e),this.connectionCache.set(e,n)),n.info()?n:null}unavailableReason(e){return this.invalidatedConnections.get(e)??null}onConnectionsChange(e){return this.listeners.add(e),e(this.connections()),()=>this.listeners.delete(e)}storeTokenResponse(e,n,i){let o=e.collection_id;if(typeof o!="string")throw d("invalid_token_response","Authorization returned no collection ID.");let r=x(this.storage.getItem(this.tokenKey(o))),a=xo({body:e,clientId:n,keyHandle:i,previous:r,defaultApplicationOrigin:this.defaultApplicationOrigin(),pinConnectorIdentity:(s,c)=>this.pinConnectorIdentity(s,c)});return r?.keyHandle&&r.keyHandle!==i&&this.keyStore.delete(r.keyHandle).catch(()=>{}),this.storage.setItem(this.tokenKey(o),JSON.stringify(a)),this.addConnectionId(o),this.invalidatedConnections.delete(o),this.connectionCache.delete(o),this.emitConnections(),a}forgetConnectorIdentity(e){this.storage.removeItem(this.connectorPinKey(e))}pinConnectorIdentity(e,n){let i=this.connectorPinKey(e),o=x(this.storage.getItem(i));if(o&&(o.version!==1||o.publicKey!==n))throw d("connector_identity_changed","The connector identity changed since this application first connected. Forget the saved connector identity only after verifying the computer, then authorize again.");o||this.storage.setItem(i,JSON.stringify({version:1,publicKey:n}))}connectorPinKey(e){return`mdbase-connect:${this.serverUrl}:connector-pin:${e}`}async loadApplicationIdentity(e){try{return await At(this.identityStore,this.serverUrl,e)}catch(n){throw d("application_identity_unavailable",n instanceof ge?n.message:"The application installation identity is unavailable.",{cause:n})}}removeToken(e,n,i="authorization_lost",o=!1){this.invalidatedConnections.set(e,i),n&&(o||!Io(this.storage,this.pendingMutationKey(e),n))&&this.keyStore.delete(n).catch(()=>{}),this.storage.removeItem(this.tokenKey(e)),o&&Mo(this.storage,this.pendingMutationKey(e),r=>{this.keyStore.delete(r).catch(()=>{})});for(let r of["web_push","fcm"])this.storage.removeItem(this.notificationKey(e,r));this.storage.setItem(this.connectionsKey(),JSON.stringify({version:1,collectionIds:this.connectionIds().filter(r=>r!==e)})),this.connectionCache.delete(e),this.emitConnections()}tokenKey(e){return`${this.storagePrefix()}:token:${e}`}pendingMutationKey(e){return`${this.storagePrefix()}:pending-mutation:${e}`}notificationKey(e,n="web_push"){return`${this.storagePrefix()}:notifications:${e}:${n}`}directPreferenceKey(){return`mdbase-connect:direct:${this.defaultApplicationOrigin()}`}defaultApplicationOrigin(){return xi(this.manifest,this.manifestSource,this.redirectUri,this.application?.distribution==="portable")}pendingKey(e){return`${this.storagePrefix()}:pending:${e}`}storagePrefix(){return`mdbase-connect:${this.serverUrl}:${this.manifestSource}`}connectionsKey(){return`${this.storagePrefix()}:connections`}connectionIds(){let e=x(this.storage.getItem(this.connectionsKey()));return e?.version===1&&Array.isArray(e.collectionIds)&&e.collectionIds.every(n=>typeof n=="string")?e.collectionIds:[]}addConnectionId(e){this.storage.setItem(this.connectionsKey(),JSON.stringify({version:1,collectionIds:[...new Set([...this.connectionIds(),e])]}))}emitConnections(){let e=this.connections();for(let n of this.listeners)n(e)}};var Vt=class{internals;constructor(e){this.internals=new Ht(e)}register(e){return E(()=>this.internals.register(e),fe)}authorize(e={}){return E(()=>this.internals.authorize(e),Se)}application(e){return new Me(this,e,this.internals.timeouts)}manifest(e){return E(()=>this.internals.manifestDeclaration(e),fe)}environment(){return this.internals.environment()}completeAuthorization(e,n){return E(()=>this.internals.completeAuthorization(e===void 0?Rt():String(e),n),Se)}connections(){return this.internals.connections()}connection(e){return this.internals.connection(e)}unavailableReason(e){return this.internals.unavailableReason(e)}onConnectionsChange(e){return this.internals.onConnectionsChange(e)}forgetAll(){for(let e of this.connections())this.connection(e.collectionId)?.forget()}forgetConnectorIdentity(e){this.internals.forgetConnectorIdentity(e)}};function kn(t){if(!t||typeof t!="object")throw d("invalid_push_payload","The push payload is not an object.");let e=t;if(e.type!=="mdbase.notification"||e.version!==1||typeof e.signal_id!="string"||typeof e.criterion_id!="string"||typeof e.cursor!="string"||!e.presentation||typeof e.presentation.title!="string")throw d("invalid_push_payload","The push payload is not an mdbase notification.");return e}function Eo(t){if(!t||typeof t!="object")throw d("invalid_push_payload","The native notification data is not an object.");let e=t;if(e.type!=="mdbase.notification"||e.version!==1&&e.version!=="1"||typeof e.signal_id!="string"||typeof e.criterion_id!="string"||typeof e.cursor!="string")throw d("invalid_push_payload","The native notification data is not an mdbase notification.");return{type:"mdbase.notification",version:1,signal_id:e.signal_id,criterion_id:e.criterion_id,cursor:e.cursor}}function Do(t,e){let n=kn(e);return t.showNotification(n.presentation.title,{...n.presentation.body?{body:n.presentation.body}:{},...n.presentation.tag?{tag:n.presentation.tag}:{},data:{type:n.type,signal_id:n.signal_id,criterion_id:n.criterion_id,cursor:n.cursor}})}function qo(t){return{subscribe:e=>t.subscribe(e),getSnapshot:()=>t.getSnapshot()}}var $t=class{collectionParameter;fallbackPath;listeners=new Set;handlePopState=()=>this.emit();constructor(e={}){this.collectionParameter=e.collectionParameter??"collection",this.fallbackPath=e.fallbackPath??"/"}selectedCollectionId(){return this.currentUrl().searchParams.get(this.collectionParameter)}select(e,n={}){let i=nt(this.currentUrl());e?i.searchParams.set(this.collectionParameter,e):i.searchParams.delete(this.collectionParameter);let o=this.browserHistory();o[n.history==="push"?"pushState":"replaceState"](o.state,"",i),this.emit()}authorizationReturnTo(){let e=nt(this.currentUrl());return`${e.pathname}${e.search}${e.hash}`}authorizationCallback(){let e=this.currentUrl().href;return Pt(e)?e:null}finishAuthorization(e,n){let i=this.safeAppUrl(e??this.fallbackPath);nt(i),i.searchParams.set(this.collectionParameter,n),this.browserHistory().replaceState(null,"",i),this.emit()}clearAuthorizationCallback(e){let n=e?this.safeAppUrl(e):this.currentUrl(),i=this.browserHistory();i.replaceState(i.state,"",nt(n)),this.emit()}subscribe(e){let n=this.listeners.size===0;return this.listeners.add(e),n&&typeof window<"u"&&window.addEventListener("popstate",this.handlePopState),()=>{this.listeners.delete(e),this.listeners.size===0&&typeof window<"u"&&window.removeEventListener("popstate",this.handlePopState)}}emit(){for(let e of this.listeners)e()}safeAppUrl(e){let n=this.currentUrl(),i=new URL(e,n.origin);return i.origin===n.origin?i:new URL(this.fallbackPath,n.origin)}currentUrl(){if(typeof location>"u")throw d("browser_required","Browser selection requires a browser environment.");return new URL(location.href)}browserHistory(){if(typeof history>"u")throw d("browser_required","Browser selection requires a browser environment.");return history}},Gt=class{collectionId=null;listeners=new Set;selectedCollectionId(){return this.collectionId}select(e){if(e!==this.collectionId){this.collectionId=e;for(let n of this.listeners)n()}}authorizationReturnTo(){}authorizationCallback(){return null}finishAuthorization(e,n){this.select(n)}clearAuthorizationCallback(){}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}};return jo(La);})();
|