@dittolive/ditto 4.9.0-rc.2 → 4.9.0
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 +2 -2
- package/node/ditto.cjs.js +1 -1
- package/node/ditto.darwin-arm64.node +0 -0
- package/node/ditto.darwin-x64.node +0 -0
- package/node/ditto.linux-arm.node +0 -0
- package/node/ditto.linux-arm64.node +0 -0
- package/node/ditto.linux-x64.node +0 -0
- package/node/ditto.win32-x64.node +0 -0
- package/package.json +1 -1
- package/react-native/ditto.es6.js +1 -1
- package/web/ditto.es6.js +1 -1
- package/web/ditto.umd.js +1 -1
- package/web/ditto.wasm +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{NativeModules,Platform}from"react-native";import{FinalizationGroup}from"@ungap/weakrefs";import"fastestsmallesttextencoderdecoder";const dittoCore=global,isLoaded="function"==typeof dittoCore.ditto_sdk_transports_init;if(!isLoaded){var _NativeModules$DittoR;if(!(null===(_NativeModules$DittoR=NativeModules.DittoRNSDK)||void 0===_NativeModules$DittoR?void 0:_NativeModules$DittoR.install()))throw new Error("JSI bindings were not installed for: DittoRNSDK Module");setInterval((()=>{dittoCore.ditto_tick()}),50),void 0===global.FinalizationRegistry&&void 0!==FinalizationGroup&&(global.FinalizationRegistry=FinalizationGroup);const e=Platform.select({ios:"Ios",android:"Android",default:"Unknown"});dittoCore.ditto_init_sdk_version(e,"JavaScript","4.9.0-rc.2")}function ditto_sdk_transports_init(e){if("android"===Platform.OS){if(!dittoCore.ditto_sdk_transports_set_android_context())throw new Error("Couldn't manage to set Android context with `ditto_sdk_transports_set_android_context()`")}return dittoCore.ditto_sdk_transports_init(e)}function getMissingAndroidPermissions(){return"android"!==Platform.OS?[]:dittoCore.ditto_sdk_transports_android_missing_permissions()}function boxCBytesIntoBuffer(e){const t=dittoCore.sliceBoxedToUInt8Array(e);return t?new Uint8Array(t):null}function refCBytesIntoBuffer(e){const t=dittoCore.sliceRefToUInt8Array(e);return t?new Uint8Array(t):null}function ditto_identity_config_make_online_playground(...e){return dittoCore.ditto_identity_config_make_online_playground(...e)}function ditto_identity_config_make_offline_playground(...e){return dittoCore.ditto_identity_config_make_offline_playground(...e)}function ditto_identity_config_make_shared_key(...e){return dittoCore.ditto_identity_config_make_shared_key(...e)}function ditto_identity_config_make_online_with_authentication(...e){return dittoCore.ditto_identity_config_make_online_with_authentication(...e)}function ditto_make(...e){return dittoCore.ditto_make(...e)}function ditto_shutdown(...e){return dittoCore.ditto_shutdown(...e)}function ditto_free(...e){return dittoCore.ditto_free(...e)}function refCStringToString(...e){return dittoCore.refCStringToString(...e)}function boxCStringIntoString(...e){return dittoCore.boxCStringIntoString(...e)}function withOutBoxCBytes(...e){return dittoCore.withOutBoxCBytes(...e)}function ditto_auth_client_get_app_id(...e){return dittoCore.ditto_auth_client_get_app_id(...e)}function ditto_auth_client_is_x509_valid(...e){return dittoCore.ditto_auth_client_is_x509_valid(...e)}function ditto_auth_client_is_web_valid(...e){return dittoCore.ditto_auth_client_is_web_valid(...e)}function ditto_auth_client_get_site_id(...e){return dittoCore.ditto_auth_client_get_site_id(...e)}function ditto_auth_client_set_validity_listener(...e){return dittoCore.ditto_auth_client_set_validity_listener(...e)}function ditto_auth_client_make_login_provider(...e){return dittoCore.ditto_auth_client_make_login_provider(...e)}function ditto_auth_set_login_provider(...e){return dittoCore.ditto_auth_set_login_provider(...e)}function ditto_auth_client_login_with_token(...e){return dittoCore.ditto_auth_client_login_with_token(...e)}function ditto_auth_client_login_with_token_and_feedback(...e){return dittoCore.ditto_auth_client_login_with_token_and_feedback(...e)}function ditto_auth_client_login_with_credentials(...e){return dittoCore.ditto_auth_client_login_with_credentials(...e)}function ditto_auth_client_logout(...e){return dittoCore.ditto_auth_client_logout(...e)}function ditto_auth_client_user_id(...e){return dittoCore.ditto_auth_client_user_id(...e)}function dittoffi_try_experimental_register_change_observer_str_detached(...e){return dittoCore.dittoffi_try_experimental_register_change_observer_str_detached(...e)}function dittoffi_try_add_sync_subscription(...e){return dittoCore.dittoffi_try_add_sync_subscription(...e)}function dittoffi_try_remove_sync_subscription(...e){return dittoCore.dittoffi_try_remove_sync_subscription(...e)}function dittoffi_try_exec_statement(...e){return dittoCore.dittoffi_try_exec_statement(...e)}function dittoffi_query_result_item_count(...e){return dittoCore.dittoffi_query_result_item_count(...e)}function dittoffi_query_result_item_at(...e){return dittoCore.dittoffi_query_result_item_at(...e)}function dittoffi_query_result_mutated_document_id_count(...e){return dittoCore.dittoffi_query_result_mutated_document_id_count(...e)}function dittoffi_query_result_mutated_document_id_at(...e){return dittoCore.dittoffi_query_result_mutated_document_id_at(...e)}function dittoffi_query_result_item_cbor(...e){return dittoCore.dittoffi_query_result_item_cbor(...e)}function dittoffi_query_result_item_json(...e){return dittoCore.dittoffi_query_result_item_json(...e)}function ditto_document_id_query_compatible(...e){return dittoCore.ditto_document_id_query_compatible(...e)}function ditto_document_id(...e){return dittoCore.ditto_document_id(...e)}function ditto_document_free(...e){return dittoCore.ditto_document_free(...e)}function ditto_validate_document_id(...e){return dittoCore.ditto_validate_document_id(...e)}function ditto_presence_v3(...e){return dittoCore.ditto_presence_v3(...e)}function ditto_register_presence_v3_callback(...e){return dittoCore.ditto_register_presence_v3_callback(...e)}function ditto_clear_presence_v3_callback(...e){return dittoCore.ditto_clear_presence_v3_callback(...e)}function dittoffi_presence_peer_metadata_json(...e){return dittoCore.dittoffi_presence_peer_metadata_json(...e)}function dittoffi_presence_try_set_peer_metadata_json(...e){return dittoCore.dittoffi_presence_try_set_peer_metadata_json(...e)}function dittoffi_presence_set_connection_request_handler(...e){return dittoCore.dittoffi_presence_set_connection_request_handler(...e)}function ditto_new_attachment_from_file(...e){return dittoCore.ditto_new_attachment_from_file(...e)}function ditto_new_attachment_from_bytes(...e){return dittoCore.ditto_new_attachment_from_bytes(...e)}function ditto_resolve_attachment(...e){return dittoCore.ditto_resolve_attachment(...e)}function ditto_cancel_resolve_attachment(...e){return dittoCore.ditto_cancel_resolve_attachment(...e)}function ditto_free_attachment_handle(...e){return dittoCore.ditto_free_attachment_handle(...e)}function ditto_get_complete_attachment_path(...e){return dittoCore.ditto_get_complete_attachment_path(...e)}function ditto_live_query_start(...e){return dittoCore.ditto_live_query_start(...e)}function ditto_live_query_stop(...e){return dittoCore.ditto_live_query_stop(...e)}function ditto_live_query_signal_available_next(...e){return dittoCore.ditto_live_query_signal_available_next(...e)}function ditto_log(...e){return dittoCore.ditto_log(...e)}function ditto_logger_init(...e){return dittoCore.ditto_logger_init(...e)}function ditto_logger_set_log_file(...e){return dittoCore.ditto_logger_set_log_file(...e)}function ditto_logger_minimum_log_level_get(...e){return dittoCore.ditto_logger_minimum_log_level_get(...e)}function ditto_logger_minimum_log_level(...e){return dittoCore.ditto_logger_minimum_log_level(...e)}function ditto_logger_emoji_headings_enabled_get(...e){return dittoCore.ditto_logger_emoji_headings_enabled_get(...e)}function ditto_logger_emoji_headings_enabled(...e){return dittoCore.ditto_logger_emoji_headings_enabled(...e)}function ditto_logger_enabled_get(...e){return dittoCore.ditto_logger_enabled_get(...e)}function ditto_logger_enabled(...e){return dittoCore.ditto_logger_enabled(...e)}function ditto_small_peer_info_set_transport_config_data(...e){return dittoCore.ditto_small_peer_info_set_transport_config_data(...e)}function ditto_small_peer_info_get_is_enabled(...e){return dittoCore.ditto_small_peer_info_get_is_enabled(...e)}function ditto_small_peer_info_set_enabled(...e){return dittoCore.ditto_small_peer_info_set_enabled(...e)}function ditto_small_peer_info_get_sync_scope(...e){return dittoCore.ditto_small_peer_info_get_sync_scope(...e)}function ditto_small_peer_info_set_sync_scope(...e){return dittoCore.ditto_small_peer_info_set_sync_scope(...e)}function ditto_small_peer_info_get_metadata(...e){return dittoCore.ditto_small_peer_info_get_metadata(...e)}function ditto_small_peer_info_set_metadata(...e){return dittoCore.ditto_small_peer_info_set_metadata(...e)}function ditto_sdk_transports_error_new(...e){return dittoCore.ditto_sdk_transports_error_new(...e)}function ditto_sdk_transports_error_value(...e){return dittoCore.ditto_sdk_transports_error_value(...e)}function ditto_sdk_transports_error_free(...e){return dittoCore.ditto_sdk_transports_error_free(...e)}function ditto_sdk_transports_ble_is_available(...e){return dittoCore.ditto_sdk_transports_ble_is_available(...e)}function ditto_sdk_transports_ble_create(...e){return dittoCore.ditto_sdk_transports_ble_create(...e)}function ditto_sdk_transports_ble_destroy(...e){return dittoCore.ditto_sdk_transports_ble_destroy(...e)}function ditto_sdk_transports_lan_is_available(...e){return dittoCore.ditto_sdk_transports_lan_is_available(...e)}function ditto_sdk_transports_lan_create(...e){return dittoCore.ditto_sdk_transports_lan_create(...e)}function ditto_sdk_transports_lan_destroy(...e){return dittoCore.ditto_sdk_transports_lan_destroy(...e)}function ditto_sdk_transports_awdl_is_available(...e){return dittoCore.ditto_sdk_transports_awdl_is_available(...e)}function ditto_sdk_transports_awdl_create(...e){return dittoCore.ditto_sdk_transports_awdl_create(...e)}function ditto_sdk_transports_awdl_destroy(...e){return dittoCore.ditto_sdk_transports_awdl_destroy(...e)}function ditto_add_multicast_transport(...e){return dittoCore.ditto_add_multicast_transport(...e)}function ditto_remove_multicast_transport(...e){return dittoCore.ditto_remove_multicast_transport(...e)}function dittoffi_connection_request_peer_key_string(...e){return dittoCore.dittoffi_connection_request_peer_key_string(...e)}function dittoffi_connection_request_peer_metadata_json(...e){return dittoCore.dittoffi_connection_request_peer_metadata_json(...e)}function dittoffi_connection_request_authorize(...e){return dittoCore.dittoffi_connection_request_authorize(...e)}function dittoffi_connection_request_free(...e){return dittoCore.dittoffi_connection_request_free(...e)}function dittoffi_connection_request_connection_type(...e){return dittoCore.dittoffi_connection_request_connection_type(...e)}function ditto_set_connect_retry_interval(...e){return dittoCore.ditto_set_connect_retry_interval(...e)}function ditto_set_device_name(...e){return dittoCore.ditto_set_device_name(...e)}function ditto_get_sdk_version(...e){return dittoCore.ditto_get_sdk_version(...e)}function dittoffi_get_sdk_semver(...e){return dittoCore.dittoffi_get_sdk_semver(...e)}function ditto_error_message(...e){return dittoCore.ditto_error_message(...e)}function dittoffi_error_code(...e){return dittoCore.dittoffi_error_code(...e)}function dittoffi_error_description(...e){return dittoCore.dittoffi_error_description(...e)}function dittoffi_error_free(...e){return dittoCore.dittoffi_error_free(...e)}function dittoffi_try_verify_license(...e){return dittoCore.dittoffi_try_verify_license(...e)}function ditto_run_garbage_collection(...e){return dittoCore.ditto_run_garbage_collection(...e)}function ditto_set_static_websocket_clients(...e){return dittoCore.ditto_set_static_websocket_clients(...e)}function ditto_set_sync_group(...e){return dittoCore.ditto_set_sync_group(...e)}function ditto_disable_sync_with_v3(...e){return dittoCore.ditto_disable_sync_with_v3(...e)}function dittoffi_base64_encode(...e){return dittoCore.dittoffi_base64_encode(...e)}function dittoffi_try_base64_decode(...e){return dittoCore.dittoffi_try_base64_decode(...e)}function dittoffi_crypto_generate_secure_random_token(...e){return dittoCore.dittoffi_crypto_generate_secure_random_token(...e)}function readFile$1(...e){return dittoCore.readFile(...e)}function copyFile$1(...e){return dittoCore.copyFile(...e)}function createDirectory$1(...e){return dittoCore.createDirectory(...e)}function defaultDeviceName$1(...e){return dittoCore.defaultDeviceName(...e)}function dittoffi_logger_try_export_to_file_async(...e){return dittoCore.dittoffi_logger_try_export_to_file_async(...e)}function ditto_logger_set_custom_log_cb(...e){return dittoCore.ditto_logger_set_custom_log_cb(...e)}function ditto_add_internal_ble_client_transport(){throw new Error("ditto_add_internal_ble_client_transport is not implemented in React Native.")}function ditto_add_internal_ble_server_transport(){throw new Error("ditto_add_internal_ble_server_transport is not implemented in React Native.")}function ble_client_free_handle(){throw new Error("ble_client_free_handle is not implemented in React Native.")}function ble_server_free_handle(){throw new Error("ble_server_free_handle is not implemented in React Native.")}function ditto_add_internal_mdns_client_transport(){throw new Error("ditto_add_internal_mdns_client_transport is not implemented in React Native.")}function mdns_client_free_handle(){throw new Error("mdns_client_free_handle is not implemented in React Native.")}function ditto_add_internal_mdns_server_transport(){throw new Error("ditto_add_internal_mdns_server_transport is not implemented in React Native.")}function mdns_server_free_handle(){throw new Error("mdns_server_free_handle is not implemented in React Native.")}function ditto_add_subscription(){throw new Error("ditto_add_subscription is not implemented in React Native.")}function ditto_remove_subscription(){throw new Error("ditto_remove_subscription is not implemented in React Native.")}function dittoffi_query_result_free(){throw new Error("dittoffi_query_result_free is not implemented in React Native.")}function dittoffi_query_result_item_free(){throw new Error("dittoffi_query_result_item_free is not implemented in React Native.")}function ditto_live_query_webhook_register_str(){throw new Error("ditto_live_query_webhook_register_str is not implemented in React Native.")}function dittoffi_try_register_store_observer_webhook(){throw new Error("dittoffi_try_register_store_observer_webhook is not implemented in React Native.")}function ditto_register_presence_v1_callback(){throw new Error("Not implemented in React Native.")}function ditto_clear_presence_callback(){throw new Error("Not implemented in React Native.")}function dittoffi_connection_request_identity_service_metadata_json(){throw new Error("Not implemented in React Native.")}function ditto_register_transport_condition_changed_callback(){throw new Error("Not implemented in React Native.")}function ditto_presence_v1(){throw new Error("Not implemented in React Native.")}function ditto_start_tcp_server(){throw new Error("Not implemented in React Native.")}function ditto_stop_tcp_server(){throw new Error("Not implemented in React Native.")}function ditto_start_http_server(){throw new Error("Not implemented in React Native.")}function ditto_stop_http_server(){throw new Error("Not implemented in React Native.")}const isWebBuild=!1,PREFIX_REGEX=new RegExp(/^<.*?>\s*/);class DittoFFIError extends Error{constructor(e,t,r){const n=ffiErrorMessage();super(t||n||r),this.code=e}}function throwOnErrorResult(e,t){if(null!==e){let r,n;try{r=dittoffi_error_code(e),n=boxCStringIntoString(dittoffi_error_description(e)),dittoffi_error_free(e)}catch(e){throw new DittoFFIError(-1,`Failed to retrieve Ditto core error message: ${e.message}`)}throw n=null==n?`${t}() failed with error code: ${r}`:n.replace(PREFIX_REGEX,""),new DittoFFIError(r,n)}}function ffiErrorMessage(){return boxCStringIntoString(ditto_error_message())}const DittoCRDTTypeKey="_ditto_internal_type_jkb12973t4b",DittoCRDTValueKey="_value";var DittoCRDTType;function dittoAddInternalBLEClientTransport(e){return ditto_add_internal_ble_client_transport()}function dittoAddInternalBLEServerTransport(e){return ditto_add_internal_ble_server_transport()}function bleClientFreeHandle(e){return ble_client_free_handle()}function bleServerFreeHandle(e){return ble_server_free_handle()}function dittoAddInternalMdnsTransport(e){return ditto_add_internal_mdns_client_transport()}function mdnsClientFreeHandle(e){return mdns_client_free_handle()}function dittoAddInternalMdnsAdvertiser(e){return ditto_add_internal_mdns_server_transport()}function mdnsServerFreeHandle(e){return mdns_server_free_handle()}function documentID(e){ensureInitialized();return boxCBytesIntoBuffer(ditto_document_id(e))}function documentFree(e){ensureInitialized(),ditto_document_free(e)}function documentIDQueryCompatible(e,t){ensureInitialized();return boxCStringIntoString(ditto_document_id_query_compatible(e,t))}function validateDocumentID(e){ensureInitialized();return boxCBytesIntoBuffer(withOutBoxCBytes((t=>{const r=ditto_validate_document_id(e,t);if(0!==r)throw new Error(errorMessage()||`ditto_validate_document_id() failed with error code: ${r}`);return t})))}async function tryExecStatement(e,t,r,n){ensureInitialized();const i=bytesFromString(r),o=await dittoffi_try_exec_statement(e,t,i,n);return throwOnErrorResult(o.error,"dittoffi_try_exec_statement"),o.success}function addSubscription(e,t,r,n,i,o,s){ensureInitialized(),bytesFromString(t),bytesFromString(r);const a=ditto_add_subscription();if(0!==a)throw new Error(errorMessage()||`ditto_add_subscription() failed with error code: ${a}`)}function removeSubscription(e,t,r,n,i,o,s){ensureInitialized(),bytesFromString(t),bytesFromString(r);const a=ditto_remove_subscription();if(0!==a)throw new Error(errorMessage()||`ditto_remove_subscription() failed with error code: ${a}`)}function tryAddSyncSubscription(e,t,r){ensureInitialized();throwOnErrorResult(dittoffi_try_add_sync_subscription(e,bytesFromString(t),r).error,"dittoffi_try_add_sync_subscription")}function tryRemoveSyncSubscription(e,t,r){ensureInitialized();throwOnErrorResult(dittoffi_try_remove_sync_subscription(e,bytesFromString(t),r).error,"dittoffi_try_remove_sync_subscription")}function queryResultFree(e){ensureInitialized(),dittoffi_query_result_free()}function queryResultItemFree(e){ensureInitialized(),dittoffi_query_result_item_free()}function queryResultItems(e){ensureInitialized();const t=[],r=dittoffi_query_result_item_count(e);for(let n=0;n<r;n++)t.push(dittoffi_query_result_item_at(e,n));return t}function queryResultMutatedDocumentIDs(e){ensureInitialized();const t=[],r=dittoffi_query_result_mutated_document_id_count(e);for(let n=0;n<r;n++){const r=dittoffi_query_result_mutated_document_id_at(e,n);t.push(boxCBytesIntoBuffer(r))}return t}function queryResultItemCBOR(e){ensureInitialized();return boxCBytesIntoBuffer(dittoffi_query_result_item_cbor(e))}function queryResultItemJSON(e){ensureInitialized();return boxCStringIntoString(dittoffi_query_result_item_json(e))}function tryExperimentalRegisterChangeObserver(e,t,r,n){ensureInitialized();const i=wrapBackgroundCbForFFI((e=>log("Error",`The registered store observer callback failed with ${e}`)),n),o=dittoffi_try_experimental_register_change_observer_str_detached(e,bytesFromString(t),r,i);return throwOnErrorResult(o.error,"dittoffi_try_experimental_register_change_observer_str_detached"),o.success}async function liveQueryStart(e,t){ensureInitialized();const r=await ditto_live_query_start(e,t);if(0!==r)throw new Error(errorMessage()||`\`ditto_live_query_start()\` failed with error code: ${r}`)}function liveQueryStop(e,t){ensureInitialized(),ditto_live_query_stop(e,t)}async function liveQuerySignalAvailableNext(e,t){ensureInitialized(),await ditto_live_query_signal_available_next(e,t)}async function liveQueryWebhookRegister(e,t,r,n,i,o,s){ensureInitialized(),bytesFromString(t),bytesFromString(r),bytesFromString(s);const{status_code:a,id:d}=await ditto_live_query_webhook_register_str();if(0!==a)throw new Error(errorMessage()||`\`ditto_live_query_webhook_register_str()\` failed with error code: ${a}`);return boxCBytesIntoBuffer(d)}async function tryRegisterStoreObserverWebhook(e,t,r,n){ensureInitialized(),bytesFromString(t),bytesFromString(n);const i=await dittoffi_try_register_store_observer_webhook();throwOnErrorResult(i.error,"dittoffi_try_register_store_observer_webhook");return boxCBytesIntoBuffer(i.success)}function loggerInit(){ensureInitialized(),ditto_logger_init()}async function loggerSetCustomLogCb(e){if(ensureInitialized(),null===e)await ditto_logger_set_custom_log_cb(null);else{const t=wrapBackgroundCbForFFI(null,((t,r)=>{try{const n=boxCStringIntoString(r);e(t,n)}catch(e){log("Error",`The registered cb in \`ditto_logger_set_custom_log_cb()\` failed with: ${e}`)}}));await ditto_logger_set_custom_log_cb(t)}}function loggerEnabled(e){ensureInitialized(),ditto_logger_enabled(!!e)}function loggerEnabledGet(){return ensureInitialized(),!!ditto_logger_enabled_get()}function loggerEmojiHeadingsEnabled(e){ensureInitialized(),ditto_logger_emoji_headings_enabled(e)}function loggerEmojiHeadingsEnabledGet(){return ensureInitialized(),ditto_logger_emoji_headings_enabled_get()}function loggerMinimumLogLevel(e){ensureInitialized(),ditto_logger_minimum_log_level(e)}function loggerMinimumLogLevelGet(){return ensureInitialized(),ditto_logger_minimum_log_level_get()}function loggerSetLogFile(e){ensureInitialized();if(0!==ditto_logger_set_log_file(e?bytesFromString(e):null)){const e=errorMessage();throw new Error(`Can't set log file, due to error: ${e}`)}}async function loggerTryExportToFileAsync(e){ensureInitialized();const t=bytesFromString(e),r=await new Promise(((e,r)=>{const n=wrapBackgroundCbForFFI(r,e);dittoffi_logger_try_export_to_file_async(t,n)}));return throwOnErrorResult(r.error,"dittoffi_logger_try_export_to_file_async"),r.success}function log(e,t){ensureInitialized();ditto_log(e,bytesFromString(t))}function dittoIdentityConfigMakeOnlinePlayground(e,t,r){ensureInitialized();const n=bytesFromString(e),i=bytesFromString(t),o=bytesFromString(r),{status_code:s,identity_config:a}=ditto_identity_config_make_online_playground(n,i,o);if(0!==s)throw new Error(errorMessage()||`ditto_identity_config_make_online_playground() failed with error code: ${s}`);return a}function dittoIdentityConfigMakeOnlineWithAuthentication(e,t){ensureInitialized();const r=bytesFromString(e),n=bytesFromString(t),{status_code:i,identity_config:o}=ditto_identity_config_make_online_with_authentication(r,n);if(0!==i)throw new Error(errorMessage()||`ditto_identity_config_make_online_with_authentication() failed with error code: ${i}`);return o}function dittoIdentityConfigMakeOfflinePlayground(e,t){ensureInitialized();const r=bytesFromString(e),n=Number(t),{status_code:i,identity_config:o}=ditto_identity_config_make_offline_playground(r,n);if(0!==i)throw new Error(errorMessage()||`ditto_identity_config_make_offline_playground() failed with error code: ${i}`);return o}function dittoIdentityConfigMakeSharedKey(e,t,r){ensureInitialized();const n=bytesFromString(e),i=bytesFromString(t),o=Number(r),{status_code:s,identity_config:a}=ditto_identity_config_make_shared_key(n,i,o);if(0!==s)throw new Error(errorMessage()||`ditto_identity_config_make_shared_key() failed with error code: ${s}`);return a}function dittoAuthClientGetSiteID(e){return ensureInitialized(),ditto_auth_client_get_site_id(e)}function dittoAuthClientGetAppID(e){ensureInitialized();return boxCStringIntoString(ditto_auth_client_get_app_id(e))}function dittoAuthClientUserID(e){ensureInitialized();return boxCStringIntoString(ditto_auth_client_user_id(e))}function dittoAuthClientIsWebValid(e){return ensureInitialized(),0!==ditto_auth_client_is_web_valid(e)}function dittoAuthClientIsX509Valid(e){return ensureInitialized(),0!==ditto_auth_client_is_x509_valid(e)}async function dittoAuthClientLoginWithTokenAndFeedback(e,t,r){ensureInitialized();const n=bytesFromString(t),i=bytesFromString(r),o=await ditto_auth_client_login_with_token_and_feedback(e,n,i);return{error:0===o.status_code?null:new DittoFFIError(o.status_code,void 0,"Ditto failed to authenticate."),clientInfo:o.c_string?boxCStringIntoString(o.c_string):null}}async function dittoAuthClientLoginWithToken(e,t,r){ensureInitialized();const n=bytesFromString(t),i=bytesFromString(r),o=await ditto_auth_client_login_with_token(e,n,i);if(0!==o)throw new Error(errorMessage()||`Ditto failed to authenticate (error code: ${o}).`)}async function dittoAuthClientLoginWithUsernameAndPassword(e,t,r,n){ensureInitialized();const i=bytesFromString(t),o=bytesFromString(r),s=bytesFromString(n),a=await ditto_auth_client_login_with_credentials(e,i,o,s);if(0!==a)throw new Error(errorMessage()||`Ditto failed to authenticate (error code: ${a}).`)}async function dittoAuthClientLogout(e){ensureInitialized();const t=await ditto_auth_client_logout(e);if(0!==t)throw new Error(errorMessage()||`Ditto failed to logout (error code: ${t}).`)}function dittoMake(e,t,r){ensureInitialized();return ditto_make(bytesFromString(e),t,r)}function dittoFree(e){return ensureInitialized(),ditto_free(e)}function cryptoGenerateSecureRandomToken(){ensureInitialized();return boxCStringIntoString(dittoffi_crypto_generate_secure_random_token())}function dittoRegisterPresenceV1Callback(e,t){ensureInitialized(),ditto_register_presence_v1_callback()}async function dittoClearPresenceCallback(e){return ensureInitialized(),ditto_clear_presence_callback()}function dittoRegisterPresenceV3Callback(e,t){ensureInitialized(),ditto_register_presence_v3_callback(e,wrapBackgroundCbForFFI((e=>log("Error",`The registered presence callback v3 errored with ${e}`)),(e=>{const r=refCStringToString(e);t(r)})))}async function dittoClearPresenceV3Callback(e){return ensureInitialized(),ditto_clear_presence_v3_callback(e)}function presencePeerMetadataJSON(e){ensureInitialized();const t=boxCBytesIntoBuffer(dittoffi_presence_peer_metadata_json(e));return(new TextDecoder).decode(t)}async function presenceTrySetPeerMetadataJSON(e,t){ensureInitialized();const r=bytesFromString(t);throwOnErrorResult((await dittoffi_presence_try_set_peer_metadata_json(e,r)).error,"dittoffi_presence_try_set_peer_metadata_json")}function connectionRequestPeerKeyString(e){ensureInitialized();return boxCStringIntoString(dittoffi_connection_request_peer_key_string(e))}function connectionRequestPeerMetadataJSON(e){ensureInitialized();const t=refCBytesIntoBuffer(dittoffi_connection_request_peer_metadata_json(e));return(new TextDecoder).decode(t)}function connectionRequestIdentityServiceMetadataJSON(e){ensureInitialized();const t=refCBytesIntoBuffer(dittoffi_connection_request_identity_service_metadata_json());return(new TextDecoder).decode(t)}function connectionRequestConnectionType(e){return ensureInitialized(),dittoffi_connection_request_connection_type(e)}function connectionRequestAuthorize(e,t){ensureInitialized(),dittoffi_connection_request_authorize(e,t)}function connectionRequestFree(e){ensureInitialized(),dittoffi_connection_request_free(e)}function presenceSetConnectionRequestHandler(e,t,r){if(ensureInitialized(),null==t)dittoffi_presence_set_connection_request_handler(e,null);else{dittoffi_presence_set_connection_request_handler(e,wrapAsyncBackgroundCbForFFI(r,t))}}function dittoSmallPeerInfoGetIsEnabled(e){return ensureInitialized(),ditto_small_peer_info_get_is_enabled(e)}async function dittoSmallPeerInfoSetEnabled(e,t){ensureInitialized(),ditto_small_peer_info_set_enabled(e,t)}async function dittoSmallPeerInfoGetSyncScope(e){return ensureInitialized(),ditto_small_peer_info_get_sync_scope(e)}async function dittoSmallPeerInfoSetSyncScope(e,t){return ensureInitialized(),ditto_small_peer_info_set_sync_scope(e,t)}function dittoSmallPeerInfoGetMetadata(e){ensureInitialized();return boxCStringIntoString(ditto_small_peer_info_get_metadata(e))}function dittoSmallPeerInfoSetMetadata(e,t){ensureInitialized();const r=ditto_small_peer_info_set_metadata(e,bytesFromString(t));switch(r){case 0:return;case-1:throw new Error("Internal inconsistency, the observability subsystem is unavailable.");case 1:throw new Error(`Validation error, size limit exceeded: ${errorMessage()||"metadata is too big"}`);case 2:throw new Error(`Validation error, ${errorMessage()||"depth limit for metadata object exceeded"}`);case 3:throw new Error(`Validation error, ${errorMessage()||`'${t}' is not a valid JSON object`}`);default:throw new Error(errorMessage()||`Internal inconsistency, ditto_small_peer_info_set_metadata() returned an unknown error code: ${r}`)}}function dittoSmallPeerInfoCollectionSetTransportConfigData(e,t){ensureInitialized(),ditto_small_peer_info_set_transport_config_data(e,t)}function dittoRegisterTransportConditionChangedCallback(e,t){ensureInitialized(),ditto_register_transport_condition_changed_callback()}function dittoSetDeviceName(e,t){ensureInitialized();return boxCStringIntoString(ditto_set_device_name(e,bytesFromString(t)))}function dittoSetConnectRetryInterval(e,t){ensureInitialized();return ditto_set_connect_retry_interval(e,Math.min(Math.max(0,t),4294967295))}function dittoSetSyncGroup(e,t){return ensureInitialized(),ditto_set_sync_group(e,t)}function dittoNewAttachmentFromFile(e,t,r){ensureInitialized();const n={},i=ditto_new_attachment_from_file(e,bytesFromString(t),r,n);if(0!==i)throw new DittoFFIError(i,null,`ditto_new_attachment_from_file() failed with error code: ${i}`);return n}async function dittoNewAttachmentFromBytes(e,t){ensureInitialized();const r={},n=await ditto_new_attachment_from_bytes(e,t,r);if(0!==n)throw new DittoFFIError(n,null,`ditto_new_attachment_from_bytes() failed with error code: ${n}`);return r}async function dittoResolveAttachment(e,t,r,n){ensureInitialized();const{onComplete:i,onProgress:o,onDelete:s}=r,a=wrapBackgroundCbForFFI(n,i),d=wrapBackgroundCbForFFI(n,o),c=wrapBackgroundCbForFFI(n,s),{status_code:l,cancel_token:u}=await ditto_resolve_attachment(e,t,a,d,c);if(0!==l)throw new DittoFFIError(l,null,`ditto_resolve_attachment() failed with error code: ${l}`);return u}function dittoCancelResolveAttachment(e,t,r){ensureInitialized();const n=ditto_cancel_resolve_attachment(e,t,r);if(0!==n)throw new Error(errorMessage()||`ditto_cancel_resolve_attachment() failed with error code: ${n}`)}function freeAttachmentHandle(e){ensureInitialized(),ditto_free_attachment_handle(e)}function dittoGetCompleteAttachmentPath(e,t){ensureInitialized();return refCStringToString(ditto_get_complete_attachment_path(e,t))}function dittoGetSDKVersion(e){ensureInitialized();return boxCStringIntoString(ditto_get_sdk_version(e))}function dittoGetSDKSemver(){ensureInitialized();return boxCStringIntoString(dittoffi_get_sdk_semver())}function dittoPresenceV1(e){ensureInitialized();return boxCStringIntoString(ditto_presence_v1())}function dittoPresenceV3(e){ensureInitialized();return boxCStringIntoString(ditto_presence_v3(e))}function dittoStartTCPServer(e,t){return ensureInitialized(),bytesFromString(t),ditto_start_tcp_server()}function dittoStopTCPServer(e){return ensureInitialized(),ditto_stop_tcp_server()}async function dittoShutdown(e){return ensureInitialized(),await ditto_shutdown(e)}function dittoAddMulticastTransport(e){return ensureInitialized(),ditto_add_multicast_transport(e)}function dittoRemoveMulticastTransport(e){return ensureInitialized(),ditto_remove_multicast_transport(e)}function dittoStartHTTPServer(e,t,r,n,i,o){return ensureInitialized(),bytesFromString(t),bytesFromString(r),bytesFromString(i),bytesFromString(o),ditto_start_http_server()}function dittoStopHTTPServer(e){return ensureInitialized(),ditto_stop_http_server()}async function dittoRunGarbageCollection(e){ensureInitialized();const t=await ditto_run_garbage_collection(e);if(0!==t)throw new Error(errorMessage()||`ditto_run_garbage_collection() failed with error code: ${t}`)}async function dittoDisableSyncWithV3(e){ensureInitialized();const t=await ditto_disable_sync_with_v3(e);if(0!==t)throw new Error(errorMessage()||`ditto_disable_sync_with_v3() failed with error code: ${t}`)}function dittoSetStaticTCPClients(e,t){ensureInitialized()}function dittoSetStaticWebsocketClients(e,t,r){ensureInitialized();ditto_set_static_websocket_clients(e,t.map((e=>bytesFromString(e))),r)}function base64encode(e,t){return boxCStringIntoString(dittoffi_base64_encode(e,t))}function tryBase64Decode(e,t){const r=dittoffi_try_base64_decode(bytesFromString(e),t);return throwOnErrorResult(r.error,"dittoffi_try_base64_decode"),boxCBytesIntoBuffer(r.success)}async function dittoAuthSetLoginProvider(e,t){return ensureInitialized(),await ditto_auth_set_login_provider(e,t)}function dittoAuthClientMakeLoginProvider(e,t){return ensureInitialized(),ditto_auth_client_make_login_provider(wrapBackgroundCbForFFI(t,e))}function dittoAuthClientSetValidityListener(e,t,r){ensureInitialized();return ditto_auth_client_set_validity_listener(e,wrapBackgroundCbForFFI(r,(function(e,r){return t(1===e,1===r)})))}function transportsInit(){ensureInitialized();const{output:e,errorType:t}=withTransportsError(ditto_sdk_transports_init);if(!1===e)throw new Error(`Failed to initialize transports (${t} error)`)}function transportsBLEIsAvailable(e){return ensureInitialized(),ditto_sdk_transports_ble_is_available(e)}function transportsBLECreate(e){ensureInitialized();{const{output:t,errorType:r}=withTransportsError(ditto_sdk_transports_ble_create,e);return null!=t?log("Info","Bluetooth transport created."):log("Error",`Can't create bluetooth transport (${r} error).`),t}}function transportsBLEDestroy(e){ensureInitialized();{const{output:t,errorType:r}=withTransportsError(ditto_sdk_transports_ble_destroy,e);return!0===t?log("Info","Bluetooth transport disabled."):log("Error",`Bluetooth transport could not be disabled (${r} error).`),t}}function transportsLANIsAvailable(e){return ensureInitialized(),ditto_sdk_transports_lan_is_available(e)}function transportsLANCreate(e){ensureInitialized();{const{output:t,errorType:r}=withTransportsError(ditto_sdk_transports_lan_create,e);return null!=t?log("Info","LAN transport created."):log("Error",`Can't create LAN transport (${r} error).`),t}}function transportsLANDestroy(e){ensureInitialized();{const{output:t,errorType:r}=withTransportsError(ditto_sdk_transports_lan_destroy,e);return!0===t?log("Info","LAN transport disabled."):log("Error",`LAN transport could not be disabled (${r} error).`),t}}function transportsAWDLIsAvailable(e){return ensureInitialized(),ditto_sdk_transports_awdl_is_available(e)}function transportsAWDLCreate(e){ensureInitialized();{const{output:t,errorType:r}=withTransportsError(ditto_sdk_transports_awdl_create,e);return null!=t?log("Info","AWDL transport created."):log("Error",`Can't create AWDL transport (${r} error).`),t}}function transportsAWDLDestroy(e){ensureInitialized();{const{output:t,errorType:r}=withTransportsError(ditto_sdk_transports_awdl_destroy,e);return!0===t?log("Info","AWDL transport disabled."):log("Error",`AWDL transport could not be disabled (${r} error).`),t}}function withTransportsError(e,...t){const r=ditto_sdk_transports_error_new(),n=e(...t,r),i=ditto_sdk_transports_error_value(r);return ditto_sdk_transports_error_free(r),{output:n,errorType:i}}!function(e){e[e.counter=0]="counter",e[e.register=1]="register",e[e.attachment=2]="attachment",e[e.rga=3]="rga",e[e.rwMap=4]="rwMap"}(DittoCRDTType||(DittoCRDTType={}));let isInitialized=!1;function tryVerifyLicense(e){ensureInitialized();throwOnErrorResult(dittoffi_try_verify_license(bytesFromString(e)).error,"dittoffi_try_verify_license")}function defaultDeviceName(){return defaultDeviceName$1()}function createDirectory(e){return createDirectory$1(e)}function readFile(e){return readFile$1(e)}function copyFile(e,t,r){return copyFile$1(e,t,r)}function wrapBackgroundCbForFFI(e,t){return t}function wrapAsyncBackgroundCbForFFI(e,t){return t}function bytesFromString(e){if(void 0===e)return;if(null===e)return null;if("string"!=typeof e)throw new Error(`Can't convert string to Uint8Array, not a string: ${e}`);return(new TextEncoder).encode(`${e}\0`)}function errorMessage(){ensureInitialized();return boxCStringIntoString(ditto_error_message())}function ensureInitialized(){if(!isInitialized)throw new Error("Ditto needs to be initialized before using any of its API, please make sure to call `await init()` first.")}isInitialized=!0;const ERROR_CODES={internal:"An unexpected internal error occurred. Please get in touch with Ditto customer service to report this incident.","internal/unknown-error":"An unexpected internal error occurred. Please get in touch with Ditto customer service to report this incident.","sdk/unsupported":"The feature is not supported by the current environment.","authentication/failed-to-authenticate":"Ditto failed to authenticate.","io/already-exists":"A file or directory already exists.","io/not-found":"A file or directory could not be found.","io/permission-denied":"The operation failed due to insufficient permissions.","io/operation-failed":"The operation failed.","query/arguments-invalid":"The query arguments were invalid.","query/execution":"The query could not be executed.","query/invalid":"The query was invalid.","query/unsupported":"The query contains unsupported features.","query/parameter":"The query to update system parameters failed.","store/backend":"An error occurred with the storage backend.","store/crdt":"An error occurred processing a CRDT.","store/document-not-found":"The document with the provided ID could not be found.","store/attachment-file-permission-denied":"Permission has been denied for a file operation when working with attachments.","store/attachment-file-not-found":"The source file for the attachment does not exist.","store/attachment-not-found":"The attachment could not be found.","store/attachment-token-invalid":"The attachment token is invalid.","store/failed-to-create-attachment":"The attachment could not be created.","store/failed-to-fetch-attachment":"The attachment could not be fetched.","activation/license-token-verification-failed":"Please provide a valid license token.","activation/license-token-expired":"The license token expired. Please renew it.","activation/license-token-unsupported-future-version":"The provided license token is in an unsupported future format.","activation/not-activated":"The operation failed because the Ditto instance has not yet been activated.","validation/depth-limit-exceeded":"The maximum depth limit has been exceeded.","validation/invalid-cbor":"The value provided is not valid CBOR.","validation/invalid-json":"The value provided is not valid JSON.","validation/not-an-object":"The value provided is not of type object.","validation/not-json-compatible":"Value is not serializable as JSON.","validation/size-limit-exceeded":"The size limit has been exceeded."},DEFAULT_STATUS_CODE_MAPPING={ActivationLicenseTokenExpired:["activation/license-token-expired"],ActivationLicenseTokenInvalid:["activation/license-token-verification-failed"],ActivationLicenseUnsupportedFutureVersion:["activation/license-token-unsupported-future-version"],ActivationNotActivated:["activation/not-activated"],IoAlreadyExists:["io/already-exists"],IoNotFound:["io/not-found"],IoPermissionDenied:["io/permission-denied"],IoOperationFailed:["io/operation-failed"],JsFloatingStoreOperation:["internal","Internal inconsistency, an outstanding store operation was not awaited."],DqlQueryCompilation:["query/invalid"],DqlInvalidQueryArgs:["query/arguments-invalid"],DqlUnsupported:["query/unsupported"],StoreQuery:["query/execution"],ParameterQuery:["query/parameter"],StoreDocumentNotFound:["store/document-not-found"],StoreDatabase:["store/backend"],Crdt:["store/crdt"],Base64Invalid:["internal","Invalid base64 encoding."],ValidationDepthLimitExceeded:["validation/depth-limit-exceeded"],ValidationInvalidCbor:["validation/invalid-cbor"],ValidationInvalidJson:["validation/invalid-json"],ValidationNotAMap:["validation/not-an-object"],ValidationSizeLimitExceeded:["validation/size-limit-exceeded"],Unsupported:["sdk/unsupported"],Unknown:["internal/unknown-error"],default:["internal/unknown-error"]};class DittoError extends Error{constructor(e,t,r={}){if(null==ERROR_CODES[e])throw new DittoError("internal",`Invalid error code: ${e}`);super(t||ERROR_CODES[e]),this.code="internal",this.code=e,this.context=Object.freeze({...r})}static fromFFIError(e,t,r,n){const i=r||e.message,o={coreError:e.code,coreErrorMessage:e.message,...n},s=new DittoError(t,i,o);return null!=e.stack&&(s.stack=e.stack),s}}function mapFFIErrors(e,t,r){try{return e()}catch(e){if(e instanceof DittoFFIError)throw translateFFIError(e,t,r);throw e}}async function mapFFIErrorsAsync(e,t,r){try{return await e()}catch(e){if(e instanceof DittoFFIError)throw translateFFIError(e,t,r);throw e}}const translateFFIError=(e,t,r)=>{var n;const i=e.code.toString();let o,s;return null!=t&&null!=t[i]?[o,s]=t[i]:[o,s]=null!==(n=DEFAULT_STATUS_CODE_MAPPING[i])&&void 0!==n?n:DEFAULT_STATUS_CODE_MAPPING.default,DittoError.fromFFIError(e,o,s,r)};class AttachmentToken{constructor(e){let t,r,n;null!=e[DittoCRDTTypeKey]?({id:t,len:r,meta:n}=AttachmentToken.validateTypedInput(e)):({id:t,len:r,meta:n}=AttachmentToken.validateUntypedInput(e)),this.id=mapFFIErrors((()=>base64encode(t,"Unpadded"))),this.idBytes=t,this.len=r,this.metadata=n}static validateTypedInput(e){if(e[DittoCRDTTypeKey]!==DittoCRDTType.attachment)throw new Error("Invalid attachment token");const t=e._id;if(!(t instanceof Uint8Array))throw new Error("Invalid attachment token id");const r=e._len;if("number"!=typeof r&&"bigint"!=typeof r||r<0)throw new Error("Invalid attachment token length, must be a non-negative number or bigint");const n=e._meta;if("object"!=typeof n)throw new Error("Invalid attachment token meta");return{id:t,len:r,meta:n}}static validateUntypedInput(e){const t=e.id;if("string"!=typeof t)throw new Error("Invalid attachment token id");const r=mapFFIErrors((()=>tryBase64Decode(t,"Unpadded")),{Base64Invalid:["store/attachment-token-invalid","Failed to decode attachment token id from base64 input"]},{attachmentTokenID:t}),n=e.len;if("number"!=typeof n&&"bigint"!=typeof n||n<0)throw new Error("Invalid attachment token length, must be a non-negative number or bigint");const i=e.metadata;if("object"!=typeof i)throw new Error("Invalid attachment token meta");return{id:r,len:n,meta:i}}}class Logger{static get logFile(){return this._logFile}static setLogFile(e){e?(loggerSetLogFile(e),this._logFile=e):(loggerSetLogFile(void 0),delete this._logFile)}static setLogFileURL(e){var t;this.setLogFile(null!==(t=null==e?void 0:e.pathname)&&void 0!==t?t:null)}static get enabled(){return loggerEnabledGet()}static set enabled(e){loggerEnabled(e)}static get emojiLogLevelHeadingsEnabled(){return loggerEmojiHeadingsEnabledGet()}static set emojiLogLevelHeadingsEnabled(e){loggerEmojiHeadingsEnabled(e)}static get minimumLogLevel(){return loggerMinimumLogLevelGet()}static set minimumLogLevel(e){loggerMinimumLogLevel(e)}static get customLogCallback(){return this._customLogCallback}static async setCustomLogCallback(e){if(null!=e&&"function"!=typeof e)throw new TypeError(`Expected parameter 'callback' to be a function or undefined, but got ${typeof e}.`);null!=e?(await loggerSetCustomLogCb(e),this._customLogCallback=e):(await loggerSetCustomLogCb(null),delete this._customLogCallback)}static async exportToFile(e){if("string"!=typeof e)throw new TypeError(`Expected parameter 'path' to be a string, but got ${typeof e}.`);let t=e;return mapFFIErrorsAsync((()=>loggerTryExportToFileAsync(t)))}static log(e,t){log(e,t)}static error(e){this.log("Error",e)}static warning(e){this.log("Warning",e)}static info(e){this.log("Info",e)}static debug(e){this.log("Debug",e)}static verbose(e){this.log("Verbose",e)}constructor(){throw new Error("Logger can't be instantiated, use its static properties & methods directly instead.")}}var _a;const DEBUG_TYPE_NAMES=[],DEBUG_ALL_TYPES=!1;class Handle{constructor(e,t,r){this.isClosed=!1,this.isFinalized=!1,this.isUnregistered=!1,this.bridge=e,this.objectWeakRef=new WeakRef(t),this.pointer=r}get type(){return this.bridge.type}deref(){if(this.isClosed)throw new Error("Bridging error: can't get pointer for an object that has been closed.");if(this.isFinalized)throw new Error("Bridging error: can't get pointer for an object that has been finalized.");if(this.isUnregistered)throw new Error("Bridging error: can't get pointer for an object that has been unregistered.");return this.pointer}derefOrNull(){var e;return this.isClosed||this.isFinalized||this.isUnregistered?null:null!==(e=this.pointer)&&void 0!==e?e:null}object(){const e=this.objectWeakRef.deref();if(null==e)throw new Error(`Bridging error: ${this.bridge.type.name} object has been garbage collected.`);if(this.isClosed)throw new Error(`Bridging error: ${this.bridge.type.name} object has been closed.`);if(this.isUnregistered)throw new Error(`Bridging error: ${this.bridge.type.name} object has been unregistered.`);return e}objectOrNull(){var e;return null!==(e=this.objectWeakRef.deref())&&void 0!==e?e:null}toString(){const e=this.derefOrNull();return`{ Handle | type: ${this.bridge.type}, object: ${this.objectWeakRef.deref()}, FFI address: ${null==e?void 0:e.addr}, FFI type: ${null==e?void 0:e.type} }`}bridgeWillClose(){this.isClosed=!0}bridgeDidClose(){this.pointer=null}bridgeWillFinalize(){this.isFinalized=!0}bridgeDidFinalize(){this.pointer=null}bridgeWillUnregister(){this.isUnregistered=!0}bridgeDidUnregister(){this.pointer=null}}class Handles{constructor(e,t){this.handles=t.map((t=>e.handleFor(t)))}deref(){return this.handles.map((e=>e.deref()))}}class Bridge{constructor(e){this.internalType=null,this.release=e,this.handlesByAddress={},this.handlesByObject=new WeakMap,this.finalizationRegistry=new FinalizationRegistry(this.finalize.bind(this)),_a.all.push(new WeakRef(this))}get type(){if(null==this.internalType)throw new Error("Bridge type has not been registered yet.");return this.internalType}registerType(e){if(this.internalType!==e){if(this.internalType)throw new Error(`Can't register bridged type '${e.name}', another type was already registered: ${this.internalType}`);this.internalType=e}}handleFor(e){const t=this.handlesByObject.get(e);if(null==t)throw new Error(`Bridging error: ${this.type.name} object is not currently registered in this bridge.`);return t}handlesFor(e){return new Handles(this,e)}objectFor(e){const t=this.handlesByAddress[e.addr];if(t){if(t.type!==this.type)throw new Error(`Can't return object for pointer, pointer is associated with an object of type ${t.type} but this bridge is configured for ${this.type}`);return t.object()}}bridge(e,t){const r=this.objectFor(e);if(r)return r;let n;if(t||(t=()=>Reflect.construct(this.type,[])),"function"==typeof t){if(n=t(),!(n instanceof this.type))throw new Error(`Can't bridge, expected passed in create function to return a ${this.type.name} object but got: ${n}`)}else n=t;return this.register(n,e),n}register(e,t){const r=e.constructor;if(r!==this.type)throw new Error(`Can't register, bridge is configured for type ${this.type.name} but passed in object is of type ${r.name}`);const n=this.handlesByObject.get(e),i=n?n.pointer:null;if(null!=i&&null!=n)throw new Error(`Can't register, an object for the passed in pointer has previously been registered: ${n.object()}`);if(null!=i&&null==n)throw new Error(`Internal inconsistency, trying to register an object which has an associated pointer but no handle entry: ${r.name} at ${i.type} ${i.addr}`);if(null==i&&null!=n)throw new Error(`Internal inconsistency, trying to register an object which has a handle entry but no associated pointer: ${r.name} ${e}`);const o=new Handle(this,e,t);this.handlesByAddress[t.addr]=o,this.handlesByObject.set(e,o),this.finalizationRegistry.register(e,o,e),DEBUG_TYPE_NAMES.includes(this.type.name)&&Logger.debug(`[VERBOSE] Bridge REGISTERED a new instance of ${this.type.name}, current count: ${Object.keys(this.handlesByAddress).length}`)}unregister(e){const t=e.constructor,r=this.type;if(t!==r)throw new Error(`Can't unregister, bridge is configured for type ${r.name} but passed in object is of type ${t.name}`);const n=this.handlesByObject.get(e);if(null==n)throw new Error(`Can't unregister, object has not been registered before: ${e}`);if(n.type!==r)throw new Error(`Internal inconsistency, trying to unregister an object that has a handle with a different type than that of the bridge: ${n}`);if(n.objectOrNull()!==e)throw new Error(`Internal inconsistency, trying to unregister an object whose associated handle holds a different object: ${n}`);if(n.isClosed)throw new Error(`Can't unregister, object has been closed before: ${e}`);if(n.isFinalized)throw new Error(`Can't unregister, object has been finalized before: ${e}`);if(n.isUnregistered)throw new Error(`Can't unregister, object has been unregistered already: ${e}`);n.bridgeWillUnregister(),this.finalizationRegistry.unregister(e),delete this.handlesByAddress[n.pointer.addr],this.handlesByObject.delete(e),n.bridgeDidUnregister(),DEBUG_TYPE_NAMES.includes(this.type.name)&&Logger.debug(`[VERBOSE] Bridge UNREGISTERED an instance of ${this.type.name}, current count: ${Object.keys(this.handlesByAddress).length}`)}unregisterAll(){DEBUG_TYPE_NAMES.includes(this.type.name)&&Logger.debug(`[VERBOSE] Unregistering ALL bridged instances of type ${this.type.name}.`);for(const e of Object.values(this.handlesByAddress)){const t=e.object();t&&this.unregister(t)}}async close(e){const t=e.constructor,r=this.type;if(t!==r)throw new Error(`Can't close, bridge is configured for type ${r.name} but passed in object is of type ${t.name}`);const n=this.handlesByObject.get(e);if(null==n)throw new Error(`Can't close an object that has not been registered before: ${e}`);if(n.type!==r)throw new Error(`Internal inconsistency, trying to close an object that has a handle with a different type than that of the bridge: ${n}`);if(n.isUnregistered)throw new Error("Can't close object, object has been unregistered.");if(n.isFinalized)throw new Error("Internal inconsistency, trying to close an object that has already been finalized.");if(n.isClosed)return;const i=n.pointer;if(!i)throw new Error("Internal inconsistency, trying to close an object whose pointer is null.");n.bridgeWillClose(),delete this.handlesByAddress[i.addr],await this.release(i),n.bridgeDidClose(),DEBUG_TYPE_NAMES.includes(this.type.name)&&Logger.debug(`[VERBOSE] Bridge CLOSED an instance of ${this.type.name}, current count: ${Object.keys(this.handlesByAddress).length}`)}get count(){return Object.keys(this.handlesByAddress).length}async finalize(e){if(e.isFinalized)throw new Error("Internal inconsistency, trying to finalize an object that has already been finalized.");if(e.isUnregistered)throw new Error("Internal inconsistency, trying to finalize an object that has been unregistered before.");if(e.bridgeWillFinalize(),!e.isClosed){const t=e.pointer;if(!t)throw new Error("Internal inconsistency, trying to finalize an object whose pointer is null.");delete this.handlesByAddress[t.addr],await this.release(t)}e.bridgeDidFinalize(),DEBUG_TYPE_NAMES.includes(this.type.name)&&Logger.debug(`[VERBOSE] Bridge FINALIZED an instance of ${this.type.name}, current count: ${Object.keys(this.handlesByAddress).length}`)}}_a=Bridge,Bridge.all=[],Bridge.attachment=new _a(freeAttachmentHandle),Bridge.connectionRequest=new _a(connectionRequestFree),Bridge.document=new _a(documentFree),Bridge.mutableDocument=new _a(documentFree),Bridge.queryResult=new _a(queryResultFree),Bridge.queryResultItem=new _a(queryResultItemFree),Bridge.ditto=new _a((async e=>{await dittoClearPresenceCallback(),await dittoShutdown(e),dittoFree(e)}));class Attachment{get id(){return this.token.id}get len(){return this.token.len}get metadata(){return this.token.metadata}data(){return this.ditto.deferCloseAsync((async e=>{{const t=Bridge.attachment.handleFor(this),r=dittoGetCompleteAttachmentPath(e.deref(),t.deref());return await readFile(r)}}))}getData(){return this.data()}copyToPath(e){return this.ditto.deferCloseAsync((async t=>{{const r=Bridge.attachment.handleFor(this);copyFile(dittoGetCompleteAttachmentPath(t.deref(),r.deref()),e,this.ditto.persistenceDirectory)}}))}constructor(e,t){this.ditto=e,this.token=t}}function validateAttachmentMetadata(e){if("object"!=typeof e)throw new DittoError("store/failed-to-create-attachment",`Invalid attachment metadata: expected a value of type object but got ${typeof e}.`);for(const t in e)if("string"!=typeof e[t])throw new DittoError("store/failed-to-create-attachment",`Invalid attachment metadata: metadata values must be strings but key '${t}' has a value of type ${typeof e[t]}.`)}const defaultDittoCloudDomain="cloud.ditto.live";function defaultAuthURL(e){return`https://${e}.${defaultDittoCloudDomain}`}function defaultDittoCloudURL(e){return`wss://${e}.${defaultDittoCloudDomain}`}function validateQuery(e,t={}){var r;const n=null!==(r=t.errorMessagePrefix)&&void 0!==r?r:"Query validation failed,";if("string"!=typeof e)throw new Error(`${n} query is not a string: ${e}`);if(""===e)throw new Error(`${n} query is an empty string.`);const i=e.trim();if(""===i)throw new Error(`${n} query contains only whitespace characters.`);return i}function customInspectRepresentation(e,t){return void 0===t?`${e.constructor.name} ${JSON.stringify({value:e.value},null,2)}`:`${e.constructor.name} ${t({value:e.value})}`}function sleep(e){return new Promise(((t,r)=>{setTimeout(t,e)}))}async function step(e){return await sleep(0),e()}const performAsyncToWorkaroundNonAsyncFFIAPI=step;class AttachmentFetcher{stop(){if(null==this.manager){this.isStopped||(this.rejectPendingFetch(),this.rejectPendingFetch=null),this.ditto.store.removeAttachmentFetcher(this);const e=Bridge.ditto.handleFor(this.ditto);this.ditto.deferCloseAsync((async()=>{const t=await this.cancelTokenPromise;t&&dittoCancelResolveAttachment(e.deref(),this.token.idBytes,t)}))}else step((async()=>{await this.manager.stopAttachmentFetcher(this),null!=this.rejectPendingFetch&&(this.rejectPendingFetch(),this.rejectPendingFetch=null)}))}then(e,t){return this.attachment.then(e,t)}constructor(e,t,r,n){this.cancelTokenPromise=null,this.rejectPendingFetch=null,this.ditto=e,this.token=t,this.manager=r,this.id=cryptoGenerateSecureRandomToken();const i=n||function(){},o=Bridge.ditto.handleFor(e);this.attachment=new Promise(((e,r)=>{const onComplete=t=>{const r=new Attachment(this.ditto,this.token);Bridge.attachment.bridge(t,(()=>r)),i({type:"Completed",attachment:r}),this.rejectPendingFetch=null,e(r)},onProgress=(e,t)=>{i({type:"Progress",totalBytes:t,downloadedBytes:e})},onDelete=()=>{i({type:"Deleted"}),null!=this.manager?(this.rejectPendingFetch=null,e(null)):(this.rejectPendingFetch=null,r(new DittoError("store/attachment-not-found","The attachment was deleted while being fetched.")))},onError=()=>{};this.rejectPendingFetch=()=>{const e=null!=this.manager?new Error("Attachment fetch was canceled"):new DittoError("store/failed-to-fetch-attachment","Attachment fetch was canceled");r(e)};const n=new WeakRef(this);this.cancelTokenPromise=(async()=>{try{return await mapFFIErrorsAsync((async()=>dittoResolveAttachment(o.deref(),t.idBytes,{onComplete:onComplete,onProgress:onProgress,onDelete:onDelete},onError)),{1:["store/failed-to-fetch-attachment","Failed to fetch the attachment."],2:["store/attachment-token-invalid","The attachment token was invalid."],3:["store/attachment-not-found","The attachment was not found."]})}catch(t){let o=!1;t instanceof DittoError&&"store/attachment-not-found"===t.code&&(o=!0,i({type:"Deleted"})),Logger.error(t.message);const s=n.deref();return null==s||(null!=s.manager&&t instanceof DittoError&&(t=new Error(t.message)),s.rejectPendingFetch=null,null!=s.manager&&o?e(null):r(t)),null}})()})),null==r&&this.attachment.then((()=>{this.rejectPendingFetch=null,this.ditto.store.removeAttachmentFetcher(this)})).catch((()=>{this.rejectPendingFetch=null,this.ditto.store.removeAttachmentFetcher(this)}))}get isStopped(){return null==this.rejectPendingFetch}}async function init(e={}){}const CBOR_OPTIONS=Object.freeze({dictionary:"object",mode:"strict"}),EMPTY_KEY=Symbol("EMPTY_KEY"),OMIT_VALUE=Symbol("OMIT_VALUE"),POW_2_24=5.960464477539063e-8,POW_2_32=4294967296,POW_2_53=9007199254740992,MAX_SAFE_INTEGER=18446744073709551616n,DECODE_CHUNK_SIZE=8192,kCborTag=6,kCborTagUint8=64,kCborTagUint16=69,kCborTagUint32=70,kCborTagInt8=72,kCborTagInt16=77,kCborTagInt32=78,kCborTagFloat32=85,kCborTagFloat64=86;function objectIs(e,t){return"function"==typeof Object.is?Object.is(e,t):e===t?0!==e||1/e==1/t:e!=e&&t!=t}function options(e){const t={...CBOR_OPTIONS};return"object"==typeof e&&(t.dictionary=function isDictionary(e){return"string"==typeof e&&["object","map"].includes(e)}(e.dictionary)?e.dictionary:CBOR_OPTIONS.dictionary,t.mode=function isMode(e){return"string"==typeof e&&["loose","strict","sequence"].includes(e)}(e.mode)?e.mode:CBOR_OPTIONS.mode),Object.freeze(t)}function lexicographicalCompare(e,t){const r=Math.min(e.byteLength,t.byteLength);for(let n=0;n<r;n++){const r=e[n]-t[n];if(0!==r)return r}return e.byteLength-t.byteLength}var _Sequence_instances,_Sequence_toInspectString,__classPrivateFieldGet=function(e,t,r,n){if("a"===r&&!n)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===r?n:"a"===r?n.call(e):n?n.value:t.get(e)};class Sequence{static from(e){return new Sequence(Array.from(e))}constructor(e){_Sequence_instances.add(this),Object.defineProperty(this,"_data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this._data=e||[]}add(e){return this._data.push(e)-1}remove(e){return this._data.splice(e,1)[0]}get(e){return this._data[e]}clone(){return new Sequence(this.data)}get data(){return Array.from(this._data)}get size(){return this._data.length}[(_Sequence_instances=new WeakSet,Symbol.toStringTag)](){return"Sequence"}[(_Sequence_toInspectString=function _Sequence_toInspectString(e){return`${this[Symbol.toStringTag]()}(${this.size}) ${e(this._data)}`},Symbol.for("Deno.customInspect"))](e){return __classPrivateFieldGet(this,_Sequence_instances,"m",_Sequence_toInspectString).call(this,e)}[Symbol.for("nodejs.util.inspect.custom")](e,t,r){return __classPrivateFieldGet(this,_Sequence_instances,"m",_Sequence_toInspectString).call(this,r)}}class SimpleValue{static create(e){if(void 0===e)return new SimpleValue(23);if(null===e)return new SimpleValue(22);if(!0===e)return new SimpleValue(21);if(!1===e)return new SimpleValue(20);if("number"==typeof e&&e>=0&&e<=255)return new SimpleValue(e);throw new Error("CBORError: Value out of range or not a simple value.")}constructor(e){switch(Object.defineProperty(this,"semantic",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"value",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),!0){case 20===e:this.semantic="false";break;case 21===e:this.semantic="true";break;case 22===e:this.semantic="null";break;case 23===e:this.semantic="undefined";break;case e>23&&e<32:this.semantic="reserved";break;default:this.semantic="unassigned"}this.value=e}toPrimitive(){switch(this.semantic){case"false":return!1;case"true":return!0;case"null":return null;default:return}}}class TaggedValue{constructor(e,t){Object.defineProperty(this,"value",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"tag",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.value=e,this.tag=t}}function decode(e,t,r={}){const{dictionary:n,mode:i}=options(r),o="sequence"===i||"strict"===i,s=new DataView(e),a=new Uint8Array(e);let d=0,reviverFunction=function(e,t){return t};function commitRead(e,t){return d+=e,t}function readArrayBuffer(t){return commitRead(t,new Uint8Array(e,d,t))}function readUint8(){return commitRead(1,a[d])}function readUint16(){return commitRead(2,s.getUint16(d))}function readBreak(){return 255===a[d]&&(d+=1,!0)}function readLength(e){if(e<24)return e;if(24===e)return readUint8();if(25===e)return readUint16();if(26===e)return function readUint32(){return commitRead(4,s.getUint32(d))}();if(27===e){const e=function readUint64(){return commitRead(8,s.getBigUint64(d))}();return e<POW_2_53?Number(e):e}if(31===e)return-1;throw new Error("CBORError: Invalid length encoding")}function readIndefiniteStringLength(e){const t=readUint8();if(255===t)return-1;const r=readLength(31&t);if(r<0||t>>5!==e)throw new Error("CBORError: Invalid indefinite length element");return Number(r)}function appendUtf16Data(e,t){for(let r=0;r<t;++r){let r=readUint8();128&r&&(r<224?(r=(31&r)<<6|63&readUint8(),t-=1):r<240?(r=(15&r)<<12|(63&readUint8())<<6|63&readUint8(),t-=2):(r=(15&r)<<18|(63&readUint8())<<12|(63&readUint8())<<6|63&readUint8(),t-=3)),r<65536?e.push(r):(r-=65536,e.push(55296|r>>10),e.push(56320|1023&r))}}function decodeItem(){const e=readUint8(),t=e>>5,r=31&e;let i,a;if(7===t)switch(r){case 25:return function readFloat16(){const e=new ArrayBuffer(4),t=new DataView(e),r=readUint16(),n=32768&r;let i=31744&r;const o=1023&r;if(31744===i)i=261120;else if(0!==i)i+=114688;else if(0!==o)return(n?-1:1)*o*POW_2_24;return t.setUint32(0,n<<16|i<<13|o<<13),t.getFloat32(0)}();case 26:return function readFloat32(){return commitRead(4,s.getFloat32(d))}();case 27:return function readFloat64(){return commitRead(8,s.getFloat64(d))}()}if(a=readLength(r),a<0&&(t<2||6<t))throw new Error("CBORError: Invalid length");switch(t){case 0:return reviverFunction(EMPTY_KEY,a);case 1:return reviverFunction(EMPTY_KEY,"number"==typeof a?-1-a:-1n-a);case 2:if(a<0){const e=[];let r=0;for(;(a=readIndefiniteStringLength(t))>=0;)r+=a,e.push(readArrayBuffer(a));const n=new Uint8Array(r);let o=0;for(i=0;i<e.length;++i)n.set(e[i],o),o+=e[i].length;return reviverFunction(EMPTY_KEY,n)}return reviverFunction(EMPTY_KEY,readArrayBuffer(a));case 3:{const e=[];if(a<0)for(;(a=readIndefiniteStringLength(t))>=0;)appendUtf16Data(e,a);else appendUtf16Data(e,a);let r="";for(i=0;i<e.length;i+=DECODE_CHUNK_SIZE)r+=String.fromCharCode.apply(null,e.slice(i,i+DECODE_CHUNK_SIZE));return reviverFunction(EMPTY_KEY,r)}case 4:{let e;if(a<0){e=[];let t=0;for(;!readBreak();)e.push(reviverFunction(t++,decodeItem()))}else for(e=new Array(a),i=0;i<a;++i)e[i]=reviverFunction(i,decodeItem());return reviverFunction(EMPTY_KEY,e)}case 5:{if("map"===n){const e=new Map;for(i=0;i<a||a<0&&!readBreak();++i){const t=decodeItem();if(o&&e.has(t))throw new Error("CBORError: Duplicate key encountered");e.set(t,reviverFunction(t,decodeItem()))}return reviverFunction(EMPTY_KEY,e)}const e={};for(i=0;i<a||a<0&&!readBreak();++i){const t=decodeItem();if(o&&Object.prototype.hasOwnProperty.call(e,t))throw new Error("CBORError: Duplicate key encountered");e[t]=reviverFunction(t,decodeItem())}return reviverFunction(EMPTY_KEY,e)}case 6:{const e=decodeItem(),t=a;if(e instanceof Uint8Array){const r=e.buffer.slice(e.byteOffset,e.byteLength+e.byteOffset);switch(t){case kCborTagUint8:return reviverFunction(EMPTY_KEY,new Uint8Array(r));case kCborTagInt8:return reviverFunction(EMPTY_KEY,new Int8Array(r));case kCborTagUint16:return reviverFunction(EMPTY_KEY,new Uint16Array(r));case kCborTagInt16:return reviverFunction(EMPTY_KEY,new Int16Array(r));case kCborTagUint32:return reviverFunction(EMPTY_KEY,new Uint32Array(r));case kCborTagInt32:return reviverFunction(EMPTY_KEY,new Int32Array(r));case kCborTagFloat32:return reviverFunction(EMPTY_KEY,new Float32Array(r));case kCborTagFloat64:return reviverFunction(EMPTY_KEY,new Float64Array(r))}}return reviverFunction(EMPTY_KEY,new TaggedValue(e,t))}case 7:switch(a){case 20:return reviverFunction(EMPTY_KEY,!1);case 21:return reviverFunction(EMPTY_KEY,!0);case 22:return reviverFunction(EMPTY_KEY,null);case 23:return reviverFunction(EMPTY_KEY,void 0);default:return reviverFunction(EMPTY_KEY,new SimpleValue(a))}}}"function"==typeof t&&(reviverFunction=t);const c=decodeItem();if(d!==e.byteLength){if("sequence"!==i)throw new Error("CBORError: Remaining bytes");const t=new Sequence([c]);for(;d<e.byteLength;)t.add(reviverFunction(EMPTY_KEY,decodeItem()));return t}return"sequence"===i?new Sequence([c]):c}function parse(e,t,r){return decode(e,t,r)}function encode(e,t){let r,n=new ArrayBuffer(256),i=new DataView(n),o=new Uint8Array(n),s=0,replacerFunction=(e,t)=>t;if("function"==typeof t&&(replacerFunction=t),Array.isArray(t)){const e=t.slice();replacerFunction=(t,r)=>t===EMPTY_KEY||e.includes(t)?r:OMIT_VALUE}function prepareWrite(e){let t=n.byteLength;const a=s+e;for(;t<a;)t<<=1;if(t!==n.byteLength){const e=i;n=new ArrayBuffer(t),i=new DataView(n),o=new Uint8Array(n);const r=s+3>>2;for(let t=0;t<r;++t)i.setUint32(t<<2,e.getUint32(t<<2))}return r=e,i}function commitWrite(...e){s+=r}function writeUint8(e){commitWrite(prepareWrite(1).setUint8(s,e))}function writeUint8Array(e){prepareWrite(e.length),o.set(e,s),commitWrite()}function writeUint16(e){commitWrite(prepareWrite(2).setUint16(s,e))}function writeUint32(e){commitWrite(prepareWrite(4).setUint32(s,e))}function writeUint64(e){const t=e%POW_2_32,r=(e-t)/POW_2_32,n=prepareWrite(8);n.setUint32(s,r),n.setUint32(s+4,t),commitWrite()}function writeBigUint64(e){commitWrite(prepareWrite(8).setBigUint64(s,e))}function writeVarUint(e,t){e<=255?e<24?writeUint8(Number(e)|t):(writeUint8(24|t),writeUint8(Number(e))):e<=65535?(writeUint8(25|t),writeUint16(Number(e))):e<=4294967295?(writeUint8(26|t),writeUint32(Number(e))):(writeUint8(27|t),"number"==typeof e?writeUint64(e):writeBigUint64(e))}function writeTypeAndLength(e,t){t<24?writeUint8(e<<5|t):t<256?(writeUint8(e<<5|24),writeUint8(t)):t<65536?(writeUint8(e<<5|25),writeUint16(t)):t<4294967296?(writeUint8(e<<5|26),writeUint32(t)):(writeUint8(e<<5|27),writeUint64(t))}function encodeItem(e){if(e!==OMIT_VALUE){if(!1===e)return writeUint8(244);if(!0===e)return writeUint8(245);if(null===e)return writeUint8(246);if(void 0===e)return writeUint8(247);if(objectIs(e,-0))return writeUint8Array([249,128,0]);switch(typeof e){case"bigint":return function writeBigInteger(e){let t=0;if(0<=e&&e<=MAX_SAFE_INTEGER)t=0;else{if(!(-MAX_SAFE_INTEGER<=e&&e<0))throw new Error("CBORError: Encountered unsafe integer outside of valid CBOR range.");t=1,e=-(e+1n)}if(e<0x100000000n)return writeTypeAndLength(t,Number(e));writeUint8(t<<5|27),writeBigUint64(e)}(e);case"number":if(Math.floor(e)===e){if(0<=e&&e<=POW_2_53)return writeTypeAndLength(0,e);if(-POW_2_53<=e&&e<0)return writeTypeAndLength(1,-(e+1))}return writeUint8(251),function writeFloat64(e){commitWrite(prepareWrite(8).setFloat64(s,e))}(e);case"string":{const t=[],r=e.length;for(let n=0;n<r;++n){let r=e.charCodeAt(n);r<128?t.push(r):r<2048?(t.push(192|r>>6),t.push(128|63&r)):r<55296||r>=57344?(t.push(224|r>>12),t.push(128|r>>6&63),t.push(128|63&r)):(r=(1023&r)<<10,r|=1023&e.charCodeAt(++n),r+=65536,t.push(240|r>>18),t.push(128|r>>12&63),t.push(128|r>>6&63),t.push(128|63&r))}return writeTypeAndLength(3,t.length),writeUint8Array(t)}default:{let t;if(Array.isArray(e))!function writeArray(e){const t=s,r=e.length;let n=0;writeTypeAndLength(4,r);const i=s;for(let t=0;t<r;t+=1){const r=replacerFunction(t,e[t]);r!==OMIT_VALUE&&(encodeItem(r),n+=1)}if(r>n){const e=o.slice(i,s);s=t,writeTypeAndLength(4,n),writeUint8Array(e)}}(e);else if(e instanceof Uint8Array)writeVarUint(kCborTagUint8,kCborTag<<5),writeTypeAndLength(2,e.length),writeUint8Array(e);else if(e instanceof Int8Array)writeVarUint(kCborTagInt8,kCborTag<<5),writeTypeAndLength(2,e.byteLength),writeUint8Array(new Uint8Array(e.buffer));else if(e instanceof Uint16Array)writeVarUint(kCborTagUint16,kCborTag<<5),writeTypeAndLength(2,e.byteLength),writeUint8Array(new Uint8Array(e.buffer));else if(e instanceof Int16Array)writeVarUint(kCborTagInt16,kCborTag<<5),writeTypeAndLength(2,e.byteLength),writeUint8Array(new Uint8Array(e.buffer));else if(e instanceof Uint32Array)writeVarUint(kCborTagUint32,kCborTag<<5),writeTypeAndLength(2,e.byteLength),writeUint8Array(new Uint8Array(e.buffer));else if(e instanceof Int32Array)writeVarUint(kCborTagInt32,kCborTag<<5),writeTypeAndLength(2,e.byteLength),writeUint8Array(new Uint8Array(e.buffer));else if(e instanceof Float32Array)writeVarUint(kCborTagFloat32,kCborTag<<5),writeTypeAndLength(2,e.byteLength),writeUint8Array(new Uint8Array(e.buffer));else if(e instanceof Float64Array)writeVarUint(kCborTagFloat64,kCborTag<<5),writeTypeAndLength(2,e.byteLength),writeUint8Array(new Uint8Array(e.buffer));else if(ArrayBuffer.isView(e))t=new Uint8Array(e.buffer),writeTypeAndLength(2,t.length),writeUint8Array(t);else if(e instanceof ArrayBuffer||"function"==typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer)t=new Uint8Array(e),writeTypeAndLength(2,t.length),writeUint8Array(t);else if(e instanceof TaggedValue)writeVarUint(e.tag,192),encodeItem(e.value);else if(e instanceof SimpleValue)writeTypeAndLength(7,e.value);else if(e instanceof Sequence){if(0!==s)throw new Error("CBORError: A CBOR Sequence may not be nested.");const t=e.size;for(let r=0;r<t;r+=1)encodeItem(e.get(r))}else!function writeDictionary(e){const t=[],r=s;let n=s,i=0,a=0;if(e instanceof Map){i=e.size,writeTypeAndLength(5,i),n=s;for(const[r,n]of e.entries()){const e=replacerFunction(r,n);if(e===OMIT_VALUE)continue;let i=s;encodeItem(r);const d=o.slice(i,s);i=s,encodeItem(e);const c=o.slice(i,s);a+=1,t.push([d,c])}}else{const r=Object.keys(e);i=r.length,writeTypeAndLength(5,i),n=s;for(let n=0;n<i;n+=1){const i=r[n],d=replacerFunction(i,e[i]);if(d===OMIT_VALUE)continue;let c=s;encodeItem(i);const l=o.slice(c,s);c=s,encodeItem(d);const u=o.slice(c,s);a+=1,t.push([l,u])}}function sortEncodedKeys(e){s=r,writeTypeAndLength(5,a),t.sort((([e],[t])=>lexicographicalCompare(e,t)));for(let r=0;r<e;r+=1){const[e,n]=t[r];writeUint8Array(e),writeUint8Array(n)}}if(i>a){const e=t.length;if(e>1)sortEncodedKeys(e);else{const e=o.slice(n,s);s=r,writeTypeAndLength(5,a),writeUint8Array(e)}}else{const e=t.length;e>1&&sortEncodedKeys(e)}}(e)}}}}if(encodeItem(replacerFunction(EMPTY_KEY,e)),"slice"in n)return n.slice(0,s);const a=new ArrayBuffer(s),d=new DataView(a);for(let e=0;e<s;++e)d.setUint8(e,i.getUint8(e));return a}function binarify(e,t){return encode(e,t)}const CBOR$1={binarify:binarify,decode:decode,encode:encode,parse:parse};class CBOR{static encode(e){const t=CBOR$1.encode(e);return new Uint8Array(t)}static decode(e,t){const r=e.buffer;return CBOR$1.decode(r,t)}}class DocumentID{get value(){let e=this["@ditto.value"];return void 0===e&&(e=CBOR.decode(this["@ditto.cbor"]),this["@ditto.value"]=e),e}constructor(e,t=!1,r=!1){const n=t?e:CBOR.encode(e),i=r?n:validateDocumentIDCBOR(n);if(!i)throw new Error(`Can't create DocumentID, passed in value is not valid: ${e}`);this.isValidated=!r,this["@ditto.cbor"]=i}equals(e){const t=this["@ditto.cbor"],r=e["@ditto.cbor"];if(t===r)return!0;if(!(t instanceof Uint8Array))return!1;if(!(r instanceof Uint8Array))return!1;if(t.length!==r.length)return!1;for(let e=0;e<t.length;e+=1)if(t[e]!==r[e])return!1;return!0}toString(){return documentIDQueryCompatible(this["@ditto.cbor"],"WithoutQuotes")}toBase64String(){return mapFFIErrors((()=>base64encode(this["@ditto.cbor"],"Padded")))}toQueryCompatibleString(){return documentIDQueryCompatible(this["@ditto.cbor"],"WithQuotes")}toCBOR(){return this["@ditto.cbor"]}}function validateDocumentIDValue(e){if(void 0===e)throw new Error(`Invalid document ID: ${e}`);return e}function validateDocumentIDCBOR(e){const t=validateDocumentID(e);return null!=t?t:e}class Observer{get token(){return this._token}constructor(e,t,r={}){this.observerManager=e,this._token=t,this.options=r,r.stopsWhenFinalized&&Observer.finalizationRegistry.register(this,{observerManager:e,token:t},this)}get isStopped(){return void 0!==this.token&&this.observerManager.hasObserver(this.token)}stop(){const e=this.token;e&&(delete this._token,Observer.finalizationRegistry.unregister(this),this.observerManager.removeObserver(e))}static finalize(e){const{observerManager:t,token:r}=e;t.removeObserver(r)}}Observer.finalizationRegistry=new FinalizationRegistry(Observer.finalize);class ObserverManager{constructor(e,t={}){var r,n,i,o;const s=null!==(r=t.keepAlive)&&void 0!==r?r:null,a=null!==(n=t.register)&&void 0!==n?n:null,d=null!==(i=t.unregister)&&void 0!==i?i:null,c=null!==(o=t.process)&&void 0!==o?o:null;this.id=e,this.keepAlive=s,this.isClosed=!1,this.isRegistered=!1,this.callbacksByToken={},null!==a&&(this.register=a),null!==d&&(this.unregister=d),null!==c&&(this.process=c)}addObserver(e){var t;if(this.isClosed)throw new Error(`Internal inconsistency, can't add '${this.id}' observer, observer mananger close()-ed.`);this.registerIfNeeded();const r=cryptoGenerateSecureRandomToken();return this.callbacksByToken[r]=e,null===(t=this.keepAlive)||void 0===t||t.retain(`${this.id}.${r}`),r}removeObserver(e){var t;const r=this.callbacksByToken[e];if(void 0===r)throw new Error(`Can't remove '${this.id}' observer, token '${e}' has never been registered before.`);null!==r&&(this.callbacksByToken[e]=null,null===(t=this.keepAlive)||void 0===t||t.release(`${this.id}.${e}`),this.unregisterIfNeeded())}hasObserver(e){return void 0!==this.callbacksByToken[e]}notify(...e){if(this.isClosed)return;const t=this.process(...e);for(const e in this.callbacksByToken){const r=this.callbacksByToken[e];r&&r(...t)}}close(){this.isClosed=!0;for(const e in this.callbacksByToken)this.removeObserver(e)}register(e){}unregister(){}process(...e){return e}hasObservers(){return Object.keys(this.callbacksByToken).length>0}registerIfNeeded(){if(!this.isRegistered){const e=new WeakRef(this);this.isRegistered=!0,this.register((function(...t){const r=e.deref();r&&r.notify(...t)}))}}unregisterIfNeeded(){!this.hasObservers()&&this.isRegistered&&(this.isRegistered=!1,this.unregister())}}class Authenticator{get status(){return this._status}async login(e,t){throw new Error("Authenticator.login() is abstract and must be implemented by subclasses.")}loginWithToken(e,t){throw new Error("Authenticator.loginWithToken() is abstract and must be implemented by subclasses.")}loginWithUsernameAndPassword(e,t,r){throw new Error("Authenticator.loginWithUsernameAndPassword() is abstract and must be implemented by subclasses.")}logout(e){throw new Error("Authenticator.logout() is abstract and must be implemented by subclasses.")}observeStatus(e){const t=this.observerManager.addObserver(e);return new Observer(this.observerManager,t,{stopsWhenFinalized:!0})}constructor(e){this.keepAlive=e,this._status={isAuthenticated:!1,userID:null},this.loginSupported=!1,this.observerManager=new ObserverManager("AuthenticationStatusObservation",{keepAlive:e})}"@ditto.authenticationExpiring"(e){throw new Error("Authenticator['@ditto.authenticationExpiring']() is abstract and must be implemented by subclasses.")}"@ditto.authClientValidityChanged"(e,t){throw new Error("Authenticator['@ditto.authClientValidityChanged']() is abstract and must be implemented by subclasses.")}close(){this.observerManager.close()}}class OnlineAuthenticator extends Authenticator{async login(e,t){const r=this.ditto.deref();if(!r||r.isClosed)throw new DittoError("authentication/failed-to-authenticate","Ditto instance is closed");return r.deferCloseAsync((async r=>{const{clientInfo:n,error:i}=await dittoAuthClientLoginWithTokenAndFeedback(r.deref(),e,t);return{clientInfo:n,error:null!=i?DittoError.fromFFIError(i,"authentication/failed-to-authenticate"):null}}))}async loginWithToken(e,t){const r=this.ditto.deref();if(r&&!r.isClosed)return r.deferCloseAsync((async r=>{await dittoAuthClientLoginWithToken(r.deref(),e,t)}))}async loginWithUsernameAndPassword(e,t,r){const n=this.ditto.deref();if(n&&!n.isClosed)return n.deferCloseAsync((async n=>{await dittoAuthClientLoginWithUsernameAndPassword(n.deref(),e,t,r)}))}async logout(e){const t=this.ditto.deref();if(t&&!t.isClosed)return t.deferCloseAsync((async r=>{await dittoAuthClientLogout(r.deref()),t.stopSync(),null==e||e(t)}))}constructor(e,t,r){super(e),this.loginSupported=!0,this._status={isAuthenticated:!1,userID:null},this.ditto=new WeakRef(t),this.authenticationHandler=r,this.updateAndNotify(!1)}"@ditto.authenticationExpiring"(e){const t=this.authenticationHandler;e>0?t.authenticationExpiringSoon(this,e):t.authenticationRequired(this)}"@ditto.authClientValidityChanged"(e,t){this.updateAndNotify(!0)}updateAndNotify(e){var t;const r=this.ditto.deref();if(!r)return void Logger.debug("Unable to update auth status and notify, related Ditto object does not exist anymore.");const n=Bridge.ditto.handleFor(r).derefOrNull();if(!n)return void Logger.debug("Unable to update auth status and notify, related Ditto object does not exist anymore.");const i=this.status.isAuthenticated,o=this.status.userID,s=dittoAuthClientIsWebValid(n),a=dittoAuthClientUserID(n),d={isAuthenticated:s,userID:a};if(this._status=d,e){!!i==!!s&&o===a||(null===(t=this.authenticationHandler.authenticationStatusDidChange)||void 0===t||t.call(this.authenticationHandler,this),this.observerManager.notify(d))}}}class NotAvailableAuthenticator extends Authenticator{async login(e,t){throw new Error("Can't login, authentication is not supported for the identity in use, please use an onlineWithAuthentication identity.")}async loginWithToken(e,t){throw new Error("Can't login, authentication is not supported for the identity in use, please use an onlineWithAuthentication identity.")}async loginWithUsernameAndPassword(e,t,r){throw new Error("Can't login, authentication is not supported for the identity in use, please use an onlineWithAuthentication identity.")}logout(e){throw new Error("Can't logout, authentication is not supported for the identity in use, please use an onlineWithAuthentication identity.")}"@ditto.authenticationExpiring"(e){throw new Error(`Internal inconsistency, authentication is not available, yet the @ditto.authenticationExpiring() was called on authenticator: ${this}`)}"@ditto.authClientValidityChanged"(e,t){throw new Error(`Internal inconsistency, authentication is not available, yet the @ditto.authClientValidityChanged() was called on authenticator: ${this}`)}}const IdentityTypesRequiringOfflineLicenseToken=["manual","sharedKey","offlinePlayground"];function transportConfigFromDeserializable(e){const t=e.peer_to_peer,r=t.bluetooth_le.enabled,n=t.awdl.enabled,i=t.lan,o=i.enabled,s=i.mdns_enabled,a=i.multicast_enabled,d=e.connect,c=d.tcp_servers,l=d.websocket_urls,u=d.retry_interval,h=e.listen,f=h.tcp,_=f.enabled,p=f.interface_ip,g=f.port,y=h.http,b=y.enabled,m=y.interface_ip,w=y.port,v=y.static_content_path,C=y.websocket_sync,I=y.tls_key_path,E=y.tls_certificate_path,T=e.global,S=T.sync_group,A=T.routing_hint,k=new TransportConfig;return k.peerToPeer.bluetoothLE.isEnabled=r,k.peerToPeer.awdl.isEnabled=n,k.peerToPeer.lan.isEnabled=o,k.peerToPeer.lan.isMdnsEnabled=s,k.peerToPeer.lan.isMulticastEnabled=a,k.connect.tcpServers=c,k.connect.websocketURLs=l,k.connect.retryInterval=u,k.listen.tcp.isEnabled=_,k.listen.tcp.interfaceIP=p,k.listen.tcp.port=g,k.listen.http.isEnabled=b,k.listen.http.interfaceIP=m,k.listen.http.port=w,k.listen.http.staticContentPath=v,k.listen.http.websocketSync=C,k.listen.http.tlsKeyPath=I,k.listen.http.tlsCertificatePath=E,k.global.syncGroup=S,k.global.routingHint=A,k}function transportConfigToSerializable(e){const t=e.peerToPeer,r=e.connect,n=e.listen,i=e.global,o={peer_to_peer:{bluetooth_le:{enabled:t.bluetoothLE.isEnabled},awdl:{enabled:t.awdl.isEnabled},lan:{enabled:t.lan.isEnabled,mdns_enabled:t.lan.isMdnsEnabled,multicast_enabled:t.lan.isMulticastEnabled}},connect:{tcp_servers:r.tcpServers,websocket_urls:r.websocketURLs,retry_interval:r.retryInterval},listen:{tcp:{enabled:n.tcp.isEnabled,interface_ip:n.tcp.interfaceIP,port:n.tcp.port},http:{enabled:n.http.isEnabled,interface_ip:n.http.interfaceIP,port:n.http.port,websocket_sync:n.http.websocketSync}},global:{sync_group:i.syncGroup,routing_hint:i.routingHint}};return n.http.staticContentPath&&(o.listen.http.static_content_path=n.http.staticContentPath),n.http.tlsKeyPath&&(o.listen.http.tls_key_path=n.http.tlsKeyPath),n.http.tlsCertificatePath&&(o.listen.http.tls_certificate_path=n.http.tlsCertificatePath),o}const NO_PREFERRED_ROUTE_HINT=0;class TransportConfig{constructor(){this._isFrozen=!1,this.peerToPeer={bluetoothLE:{isEnabled:!1},awdl:{isEnabled:!1},lan:{isEnabled:!1,isMdnsEnabled:!0,isMulticastEnabled:!0}},this.connect={tcpServers:[],websocketURLs:[],retryInterval:5e3},this.listen={tcp:{isEnabled:!1,interfaceIP:"[::]",port:4040},http:{isEnabled:!1,interfaceIP:"[::]",port:80,websocketSync:!0}},this.global={syncGroup:0,routingHint:0}}setAllPeerToPeerEnabled(e){this.peerToPeer.bluetoothLE.isEnabled=e,this.peerToPeer.lan.isEnabled=e,this.peerToPeer.awdl.isEnabled=e}get isFrozen(){return this._isFrozen}freeze(){return this.isFrozen||(this._isFrozen=!0,Object.freeze(this.peerToPeer.bluetoothLE),Object.freeze(this.peerToPeer.awdl),Object.freeze(this.peerToPeer.lan),Object.freeze(this.peerToPeer),Object.freeze(this.connect.tcpServers),Object.freeze(this.connect.websocketURLs),Object.freeze(this.connect),Object.freeze(this.listen.tcp),Object.freeze(this.listen.http),Object.freeze(this.listen),Object.freeze(this.global)),this}copy(){const e=new TransportConfig;return e.peerToPeer.bluetoothLE.isEnabled=this.peerToPeer.bluetoothLE.isEnabled,e.peerToPeer.awdl.isEnabled=this.peerToPeer.awdl.isEnabled,e.peerToPeer.lan.isEnabled=this.peerToPeer.lan.isEnabled,e.peerToPeer.lan.isMdnsEnabled=this.peerToPeer.lan.isMdnsEnabled,e.peerToPeer.lan.isMulticastEnabled=this.peerToPeer.lan.isMulticastEnabled,e.connect.tcpServers=this.connect.tcpServers.slice(),e.connect.websocketURLs=this.connect.websocketURLs.slice(),e.connect.retryInterval=this.connect.retryInterval,e.listen.tcp={...this.listen.tcp},e.listen.http={...this.listen.http},e.global.syncGroup=this.global.syncGroup,e.global.routingHint=this.global.routingHint,e}static areListenTCPsEqual(e,t){return e.isEnabled===t.isEnabled&&e.interfaceIP===t.interfaceIP&&e.port===t.port}static areListenHTTPsEqual(e,t){return e.isEnabled===t.isEnabled&&e.interfaceIP===t.interfaceIP&&e.port===t.port&&e.staticContentPath===t.staticContentPath&&e.websocketSync===t.websocketSync&&e.tlsKeyPath===t.tlsKeyPath&&e.tlsCertificatePath===t.tlsCertificatePath}}const privateToken$1=Symbol("privateConstructorToken");class Counter{get value(){return this._value}constructor(){this._value=0}static"@ditto.create"(e,t,r){const n=e?new MutableCounter(privateToken$1):new Counter;return n.mutDoc=e,n.path=t,n._value=r,n}}class MutableCounter extends Counter{increment(e){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}constructor(){if(arguments[0]!==privateToken$1)throw new Error("MutableCounter constructor is for internal use only.");super()}}const privateToken="@ditto.ff82dae89821c5ab822a8b539056bce4";class Register{get value(){return this["@ditto.value"]}constructor(e){this["@ditto.value"]=e}static"@ditto.create"(e,t,r){const n=e?new MutableRegister(r,privateToken):new Register(r);return n["@ditto.mutableDocument"]=e,n["@ditto.path"]=t,n["@ditto.value"]=r,n}}class MutableRegister extends Register{get value(){return super.value}set value(e){this.set(e)}set(e){const t=this["@ditto.mutableDocument"],r=this["@ditto.path"];t.at(r)["@ditto.set"](e),this["@ditto.value"]=e}constructor(e){if(arguments[1]!==privateToken)throw new Error("MutableRegister constructor is for internal use only.");super(e)}}function desugarJSObject(e){if(e&&"object"==typeof e){if(Array.isArray(e))return e.map(((e,t)=>desugarJSObject(e)));if(e instanceof DocumentID)return e.value;if(e instanceof Counter){const t={};return t[DittoCRDTTypeKey]=DittoCRDTType.counter,t._value=e.value,t}if(e instanceof Register){const t={};return t[DittoCRDTTypeKey]=DittoCRDTType.register,t._value=e.value,t}if(e instanceof Attachment){const t={_id:e.token.idBytes,_len:e.token.len,_meta:e.token.metadata};return t[DittoCRDTTypeKey]=DittoCRDTType.attachment,t}{const t={};for(const[r,n]of Object.entries(e))t[r]=desugarJSObject(n);return t}}return checkForUnsupportedValues(e),e}function checkForUnsupportedValues(e){if(Number.isNaN(e)||e===1/0||e===-1/0)throw new Error("Non-finite float values are not supported")}const CUSTOM_INSPECT_SYMBOL$1=Symbol.for("nodejs.util.inspect.custom");class Document{static hash(e){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}static hashMnemonic(e){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}get id(){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}get path(){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}get value(){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}at(e){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}constructor(){}static idCBOR(e){return documentID(Bridge.document.handleFor(e).deref())}static canonicalizedIDCBOR(e){return validateDocumentIDCBOR(e)}static isIDCBORCanonical(e){return e===this.canonicalizedIDCBOR(e)}toString(){return`${this.constructor.name}(${this.id})`}[CUSTOM_INSPECT_SYMBOL$1](e,t,r){return customInspectRepresentation(this,r)}}class MutableDocument{get id(){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}get path(){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}get value(){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}at(e){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}constructor(){this["@ditto.updateResults"]=[]}static idCBOR(e){return documentID(Bridge.mutableDocument.handleFor(e).deref())}toString(){return`${this.constructor.name}(${this.id})`}[CUSTOM_INSPECT_SYMBOL$1](e,t,r){return customInspectRepresentation(this,r)}}MutableDocument.canonicalizedIDCBOR=Document.canonicalizedIDCBOR,MutableDocument.isIDCBORCanonical=Document.isIDCBORCanonical;class QueryResult{mutatedDocumentIDs(){return queryResultMutatedDocumentIDs(Bridge.queryResult.handleFor(this).deref()).map((e=>new DocumentID(e,!0)))}constructor(e){if(null==e)throw new Error("Internal inconsistency, failed to initialize query result without a response pointer");const t=queryResultItems(e);this.items=t.map((e=>Bridge.queryResultItem.bridge(e)))}}class StoreObserver{get isCancelled(){return this._isCancelled}cancel(){this._isCancelled||(this._isCancelled=!0,this.ditto.store.unregisterObserver(this))}constructor(e,t,r,n){this._isCancelled=!1,this.queryString=t,this.queryArguments=r?Object.freeze({...r}):void 0,this.ditto=e;let i,o=null;if(null!=r)try{const e=desugarJSObject(r);o=CBOR.encode(e)}catch(e){throw new DittoError("query/arguments-invalid")}if(this.ditto.deferClose((e=>{const r=new WeakRef(this);function wrappedObservationHandler(e){const t=r.deref();if(null==t)return void Logger.debug(`Ignoring change event received by store observer ${i} after it was cancelled`);const o=Bridge.queryResult.bridge(e.query_result,(()=>new QueryResult(e.query_result)));Logger.debug(`Invoking user event handler with new event for store observer ${i}`),n(o,(()=>t.signalNext()))}mapFFIErrors((()=>{i=tryExperimentalRegisterChangeObserver(e.deref(),t,o,wrappedObservationHandler)}))})),null==i)throw new DittoError("internal","Internal inconsistency, store observer ID is undefined after registering");this.liveQueryID=i}async signalNext(){const e=this.ditto;if(e&&!e.isClosed){if(null==this.liveQueryID)throw new Error("live query ID is null while signaling ready for next event");return e.deferCloseAsync((async e=>{Logger.debug(`Signaling availability for live query ${this.liveQueryID}`),await liveQuerySignalAvailableNext(e.deref(),this.liveQueryID)}))}}}class Store{registerObserver(e,t,r){return this.registerObserverWithSignalNext(e,((e,r)=>{try{t(e)}finally{r()}}),r)}registerObserverWithSignalNext(e,t,r){if("string"!=typeof e)throw new DittoError("query/invalid","Expected parameter 'query' to be of type 'string', found: "+typeof e);const n=new StoreObserver(this.ditto,e,null!=r?r:null,t);return this.observers=Object.freeze([...this.observers,n]),this.ditto.deferCloseAsync((async e=>new Promise((t=>{step((async()=>{try{await mapFFIErrorsAsync((async()=>await liveQueryStart(e.deref(),n.liveQueryID)))}catch(e){Logger.error(`Failed to start live query: ${e.message}`)}t()}))})))),n}collection(e){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}collections(){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}collectionNames(){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}async execute(e,t){if("string"!=typeof e)throw new DittoError("query/invalid","Expected parameter 'query' to be of type 'string', found: "+typeof e);return this.ditto.deferCloseAsync((async r=>{let n=null;if(null!=t)try{const e=desugarJSObject(t);n=CBOR.encode(e)}catch(e){throw new DittoError("query/arguments-invalid",`Unable to encode query arguments: ${e.message}`)}const i=await mapFFIErrorsAsync((async()=>await performAsyncToWorkaroundNonAsyncFFIAPI((()=>tryExecStatement(r.deref(),null,e,n)))));return Bridge.queryResult.bridge(i,(()=>new QueryResult(i)))}))}async write(e){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}async newAttachment(e,t){return null!=t&&validateAttachmentMetadata(t),this.ditto.deferCloseAsync((async r=>{const{id:n,len:i,handle:o}=await(async()=>{if("string"==typeof e)return mapFFIErrors((()=>dittoNewAttachmentFromFile(r.deref(),e,"Copy")),{1:["store/failed-to-create-attachment"],2:["store/attachment-file-not-found"],3:["store/attachment-file-permission-denied"]});if(e instanceof Uint8Array)return mapFFIErrorsAsync((async()=>await dittoNewAttachmentFromBytes(r.deref(),e)),{1:["store/failed-to-create-attachment"]});throw new Error(`Can't create new attachment, only file path as string or raw data as Uint8Array are supported, but got: ${typeof e}, ${e}`)})(),s={_id:n,_len:i,_meta:{...t},[DittoCRDTTypeKey]:DittoCRDTType.attachment},a=new AttachmentToken(s),d=new Attachment(this.ditto,a);return Bridge.attachment.bridge(o,(()=>d))}))}fetchAttachment(e,t){if(null==e)throw new Error("Missing required parameter 'token'");let r;return r=e instanceof AttachmentToken?e:new AttachmentToken(e),this.ditto.deferClose((()=>{const e=new AttachmentFetcher(this.ditto,r,null,t);return this.attachmentFetchers=Object.freeze([...this.attachmentFetchers,e]),e}))}constructor(e){this.observers=Object.freeze([]),this.attachmentFetchers=Object.freeze([]),this.ditto=e}async registerObserverWebhook(e,t,r){let n=null;if(null!=r)try{const e=desugarJSObject(r);n=CBOR.encode(e)}catch(e){throw new DittoError("query/arguments-invalid",`Invalid query arguments: ${e.message}`)}return this.ditto.deferCloseAsync((async r=>{const i=await mapFFIErrorsAsync((async()=>await tryRegisterStoreObserverWebhook(r.deref(),e,n,t)));return new DocumentID(i,!0)}))}unregisterObserver(e){if(e.ditto!==this.ditto)throw new DittoError("internal","Internal inconsistency, can't remove store observer that does not belong to this store");if(!e.isCancelled)throw new DittoError("internal","Internal inconsistency, can't remove store observer that has not been cancelled");const t=this.observers.findIndex((t=>t===e));if(-1===t)return!1;const r=[...this.observers];r.splice(t,1),this.observers=Object.freeze(r);const n=Bridge.ditto.handleFor(this.ditto);return this.ditto.deferClose((()=>{mapFFIErrors((()=>liveQueryStop(n.deref(),e.liveQueryID)))})),!0}removeAttachmentFetcher(e){if(e.ditto!==this.ditto)throw new DittoError("internal","Internal inconsistency, can't finalize attachment fetcher that does not belong to this store");if(null!=e.manager)throw new DittoError("internal","Internal inconsistency, store can't remove attachment fetcher that is owned by the attachment fetcher manager");if(!e.isStopped)throw new DittoError("internal","Internal inconsistency, can't remove attachment fetcher that has not stopped");const t=this.attachmentFetchers.findIndex((t=>t===e));if(-1===t)return!1;const r=[...this.attachmentFetchers];return r.splice(t,1),this.attachmentFetchers=Object.freeze(r),!0}close(){for(const e of this.observers)e.cancel();for(const e of this.attachmentFetchers)e.stop()}async registerLiveQueryWebhook(e,t,r){return this.ditto.deferCloseAsync((async n=>{const i=validateQuery(t),o=await liveQueryWebhookRegister(n.deref(),e,i,[],0,0,r);return new DocumentID(o,!0)}))}}class KeepAlive{get isActive(){return null!==this.intervalID}constructor(){this.countsByID={},this.intervalID=null}retain(e){if(void 0===this.countsByID[e]&&(this.countsByID[e]=0),this.countsByID[e]+=1,null===this.intervalID){const e=2147483647;this.intervalID=setInterval((()=>{}),e),KeepAlive.finalizationRegistry.register(this,this.intervalID,this)}}release(e){if(void 0===this.countsByID[e])throw new Error(`Internal inconsistency, trying to release a keep-alive ID that hasn't been retained before or isn't tracked anymore: ${e}`);this.countsByID[e]-=1,0===this.countsByID[e]&&delete this.countsByID[e],0===Object.keys(this.countsByID).length&&(KeepAlive.finalizationRegistry.unregister(this),clearInterval(this.intervalID),this.intervalID=null)}currentIDs(){return Object.keys(this.countsByID)}countForID(e){var t;return null!==(t=this.countsByID[e])&&void 0!==t?t:null}}function addressToString(e){return`${e.siteId}-${e.pubkey}`}KeepAlive.finalizationRegistry=new FinalizationRegistry(clearInterval);class Presence{get connectionRequestHandler(){return this._connectionRequestHandler}set connectionRequestHandler(e){let t=null;if(null!=e){if("function"!=typeof e)throw new TypeError(`Expected parameter 'handler' to be a function but got ${typeof e} instead`);t=async t=>{const r=Bridge.connectionRequest.bridge(t),n=await e(r);if("allow"!==n&&"deny"!==n)return Logger.error(`The connection request handler must return "allow" or "deny" but returned "${n}" instead. The connection request will be denied.`),"Deny";connectionRequestAuthorize(t,"allow"===n?"Allow":"Deny")}}this._connectionRequestHandler=e;const handleError=e=>{Logger.error(`The connection request handler threw an error while handling a connection request, the connection request will be denied. ${e}`)},r=Bridge.ditto.handleFor(this.ditto);this.ditto.deferClose((()=>{presenceSetConnectionRequestHandler(r.deref(),t,handleError)}))}get graph(){return this.ditto.deferClose((e=>{const t=dittoPresenceV3(e.deref());return JSON.parse(t)}))}get peerMetadataJSONString(){return this.ditto.deferClose((e=>mapFFIErrors((()=>presencePeerMetadataJSON(e.deref())))))}async setPeerMetadataJSONString(e){await this.ditto.deferCloseAsync((async t=>mapFFIErrorsAsync((async()=>presenceTrySetPeerMetadataJSON(t.deref(),e)))))}get peerMetadata(){return JSON.parse(this.peerMetadataJSONString)}async setPeerMetadata(e){let t;try{t=JSON.stringify(e)}catch(e){throw new DittoError("validation/not-json-compatible",`Failed encoding peer metadata to JSON. ${e}`)}await this.setPeerMetadataJSONString(t)}observe(e){const t=this.observerManager.addObserver(e),r=new Observer(this.observerManager,t,{stopsWhenFinalized:!0});return e(this.graph),r}constructor(e){this._connectionRequestHandler=null,this.ditto=e,this.observerManager=new ObserverManager("PresenceObservation",{keepAlive:e.keepAlive,register:e=>{this.ditto.deferClose((t=>{dittoRegisterPresenceV3Callback(t.deref(),e)}))},unregister:()=>{e.deferCloseAsync((async e=>dittoClearPresenceV3Callback(e.deref())))},process:e=>[JSON.parse(e)]})}close(){this.observerManager.close()}}class LiveQueryManager{constructor(e,t){this.finalizationRegistry=new FinalizationRegistry(this.finalize),this.ditto=e,this.keepAlive=t,this.liveQueriesByID={}}startLiveQuery(e){this.ditto.deferCloseAsync((async t=>{const r=e.liveQueryID;if(!r)throw new Error("Internal inconsistency, tried to add a live query that doesn't have a live query ID (probably stopped).");if(this.liveQueriesByID[r])throw new Error("Internal inconsistency, tried to add a live query with an ID that has already been added.");const n=new WeakRef(e);return this.liveQueriesByID[r]=n,this.finalizationRegistry.register(e,r,this.finalize),e.liveQueryManager=this,this.ditto.keepAlive.retain(`LiveQuery.${r}`),new Promise(((e,n)=>{step((async()=>{await liveQueryStart(t.deref(),r),e()}))}))}))}stopLiveQuery(e){this.finalizationRegistry.unregister(e);const t=e.liveQueryID;if(!t)throw new Error("Internal inconsistency, tried to remove a live query that doesn't have a live query ID (probably stopped).");e.liveQueryManager=null,this.stopLiveQueryWithID(t)}close(){for(const e in this.liveQueriesByID){const t=this.liveQueriesByID[e].deref();t&&this.stopLiveQuery(t)}}stopLiveQueryWithID(e){this.ditto.deferClose((t=>{liveQueryStop(t.deref(),e),this.keepAlive.release(`LiveQuery.${e}`),delete this.liveQueriesByID[e]}))}finalize(e){this.stopLiveQueryWithID(e)}}class PresenceManager{constructor(e){this.ditto=e,this.isClosed=!1,this.isRegistered=!1,this.currentRemotePeers=[],this.callbacksByPresenceToken={}}addObserver(e){if(this.isClosed)throw new Error("Internal inconsistency, can't add presence observer, observer mananger close()-ed.");this.registerIfNeeded();const t=cryptoGenerateSecureRandomToken();return this.callbacksByPresenceToken[t]=e,this.ditto.keepAlive.retain(`PresenceObservation.${t}`),e(this.currentRemotePeers),t}async removeObserver(e){const t=this.callbacksByPresenceToken[e];if(void 0===t)throw new Error(`Can't remove presence observer, token '${e}' has never been registered before.`);if(null!==t)return void 0!==this.callbacksByPresenceToken[e]?(this.ditto.keepAlive.release(`PresenceObservation.${e}`),this.callbacksByPresenceToken[e]=null,this.unregisterIfNeeded()):void 0}hasObserver(e){return void 0!==this.callbacksByPresenceToken[e]}async close(){this.isClosed=!0;const e=Object.keys(this.callbacksByPresenceToken);return Promise.all(e.map((e=>this.removeObserver(e))))}hasObservers(){return Object.keys(this.callbacksByPresenceToken).length>0}registerIfNeeded(){this.ditto.deferClose((e=>{if(!this.isRegistered){this.isRegistered=!0;const t=dittoPresenceV1(e.deref());this.currentRemotePeers=this.decode(t).sort(this.compareRemotePeers),dittoRegisterPresenceV1Callback(e.deref(),this.handlePresenceV1Callback.bind(this))}}))}unregisterIfNeeded(){return this.ditto.deferCloseAsync((async e=>{!this.hasObservers()&&this.isRegistered&&(this.isRegistered=!1,await dittoClearPresenceCallback(e.deref()),this.currentRemotePeers=[])}))}handlePresenceV1Callback(e){const t=this.decode(e).sort(this.compareRemotePeers);this.currentRemotePeers=t,this.notify()}notify(){if(!this.isClosed)for(const e in this.callbacksByPresenceToken){const t=this.callbacksByPresenceToken[e];t&&t(this.currentRemotePeers)}}decode(e){return JSON.parse(e).map((e=>{var t,r;return{networkID:e.network_id,deviceName:e.device_name,rssi:null!==(t=e.rssi)&&void 0!==t?t:void 0,approximateDistanceInMeters:null!==(r=e.approximate_distance_in_meters)&&void 0!==r?r:void 0,connections:e.connections}}))}compareRemotePeers(e,t){return 0===e.connections.length&&t.connections.length>0?1:e.connections.length>0&&0===t.connections.length||e.deviceName<t.deviceName?-1:e.deviceName>t.deviceName?1:0}}class TransportConditionsManager extends ObserverManager{constructor(e){super("TransportConditionsObservation",{keepAlive:e.keepAlive}),this.ditto=e}register(e){return this.ditto.deferClose((t=>dittoRegisterTransportConditionChangedCallback(t.deref(),e)))}unregister(){return this.ditto.deferClose((e=>dittoRegisterTransportConditionChangedCallback(e.deref(),null)))}process(e,t){let r,n;switch(e){case"Bluetooth":r="BLE";break;case"Tcp":r="TCP";break;case"Awdl":r="AWDL";break;case"Mdns":r="MDNS"}switch(t){case"Unknown":n="Unknown";break;case"Ok":n="OK";break;case"GenericFailure":n="GenericFailure";break;case"AppInBackground":n="AppInBackground";break;case"MdnsFailure":n="MDNSFailure";break;case"TcpListenFailure":n="TCPListenFailure";break;case"NoBleCentralPermission":n="NoBLECentralPermission";break;case"NoBlePeripheralPermission":n="NoBLEPeripheralPermission";break;case"CannotEstablishConnection":n="CannotEstablishConnection";break;case"BleDisabled":n="BLEDisabled";break;case"NoBleHardware":n="NoBLEHardware";break;case"WifiDisabled":n="WiFiDisabled";break;case"TemporarilyUnavailable":n="TemporarilyUnavailable"}return[n,r]}}class SyncSubscription{get isCancelled(){return this._isCancelled}cancel(){this._isCancelled||(this._isCancelled=!0,this.ditto.sync.unregisterSubscription(this))}constructor(e,t,r,n){if(this._isCancelled=!1,null==r!=(null==n))throw new DittoError("internal","Internal inconsistency, query arguments and query arguments CBOR must be both null or both non-null",{queryArguments:r,queryArgumentsCBOR:n});this.ditto=e,this.queryString=t,this.queryArguments=r?Object.freeze({...r}):void 0,this.queryArgumentsCBOR=n}}class Sync{registerSubscription(e,t){if("string"!=typeof e)throw new DittoError("query/invalid","Expected parameter 'query' to be of type 'string', found: "+typeof e);let r=null;if(null!=t)try{const e=desugarJSObject(t);r=CBOR.encode(e)}catch(e){throw new DittoError("query/arguments-invalid",`Unable to encode query arguments: ${e.message}`)}this.ditto.deferClose((t=>{mapFFIErrors((()=>tryAddSyncSubscription(t.deref(),e,r)))}));const n=new SyncSubscription(this.ditto,e,t||null,r);return this.subscriptions=Object.freeze([...this.subscriptions,n]),n}get parameters(){return this.state.underlyingSyncParameters}constructor(e){this.subscriptions=Object.freeze([]),this.bluetoothLETransportPointer=null,this.awdlTransportPointer=null,this.lanTransportPointer=null,this.mdnsClientTransportPointer=null,this.mdnsServerAdvertiserPointer=null;const t={identity:e.identity,transportConfig:new TransportConfig,ditto:e,isWebValid:!1,isX509Valid:!1,isSyncActive:!1};this.ditto=e,this.state=stateFrom(t),transportsInit()}unregisterSubscription(e){if(e.ditto!==this.ditto)throw new DittoError("internal","Can't remove replication subscription that does not belong to this store");if(!e.isCancelled)throw new DittoError("internal","Internal inconsistency, can't remove replication subscription that has not been cancelled");const t=this.subscriptions.findIndex((t=>t===e));if(-1===t)return!1;const r=[...this.subscriptions];return r.splice(t,1),this.subscriptions=Object.freeze(r),this.ditto.deferClose((t=>{mapFFIErrors((()=>tryRemoveSyncSubscription(t.deref(),e.queryString,e.queryArgumentsCBOR)))})),!0}update(e){const t=this.state,r=stateFrom(e);this.updatePeerToPeerBluetoothLE(t,r),this.updatePeerToPeerAWDL(t,r),this.updatePeerToPeerLAN(t,r),this.updateListenTCP(t,r),this.updateListenHTTP(t,r),this.updateConnectTCPServers(t,r),this.updateConnectWebsocketURLs(t,r),this.updateGlobal(t,r),this.updateConnectRetryInterval(t,r),this.state=r}close(){if(this.parameters.isSyncActive)throw new Error("Internal inconsistency, can't close sync object while sync is active, please 'stopSync()' first.");for(const e of this.subscriptions)e.cancel()}updatePeerToPeerBluetoothLE(e,t){this.ditto.deferClose((r=>{const n=e.effectiveTransportConfig.peerToPeer.bluetoothLE,i=t.effectiveTransportConfig.peerToPeer.bluetoothLE,o=!n.isEnabled&&i.isEnabled,s=n.isEnabled&&!i.isEnabled;if(o&&this.bluetoothLETransportPointer)throw new Error("Internal inconsistency, when starting BLE transport, no BLE transport pointer should exist.");if(s&&!this.bluetoothLETransportPointer)throw new Error("Internal inconsistency, when stopping BLE transport, a BLE transport pointer should exist.");if("linux"!==process.platform&&"win32"!==process.platform)o&&(this.bluetoothLETransportPointer=transportsBLECreate(r.deref())),s&&(transportsBLEDestroy(this.bluetoothLETransportPointer),this.bluetoothLETransportPointer=null);else{if(o){const e={clientTransport:dittoAddInternalBLEClientTransport(r.deref()),serverTransport:dittoAddInternalBLEServerTransport(r.deref())};this.bluetoothLETransportPointer=e}s&&(this.bluetoothLETransportPointer,bleServerFreeHandle(),bleClientFreeHandle(),this.bluetoothLETransportPointer=null)}}))}updatePeerToPeerAWDL(e,t){this.ditto.deferClose((r=>{const n=e.effectiveTransportConfig.peerToPeer.awdl,i=t.effectiveTransportConfig.peerToPeer.awdl,o=!n.isEnabled&&i.isEnabled,s=n.isEnabled&&!i.isEnabled;if(o&&this.awdlTransportPointer)throw new Error("Internal inconsistency, when starting AWDL transport, no AWDL transport pointer should exist.");if(s&&!this.awdlTransportPointer)throw new Error("Internal inconsistency, when stopping AWDL transport, an AWDL transport pointer should exist.");o&&(this.awdlTransportPointer=transportsAWDLCreate(r.deref())),s&&(transportsAWDLDestroy(this.awdlTransportPointer),this.awdlTransportPointer=null)}))}updatePeerToPeerLAN(e,t){this.ditto.deferClose((r=>{const n=e.effectiveTransportConfig.peerToPeer.lan,i=t.effectiveTransportConfig.peerToPeer.lan;if("win32"!==process.platform&&"linux"!==process.platform){if(n.isEnabled){if(n.isMdnsEnabled){if(null==this.lanTransportPointer)throw new Error("Internal inconsistency, when stopping LAN transport, a LAN transport pointer should exist.");transportsLANDestroy(this.lanTransportPointer),this.lanTransportPointer=null}n.isMulticastEnabled&&dittoRemoveMulticastTransport(r.deref())}if(i.isEnabled){if(i.isMdnsEnabled){if(null!=this.lanTransportPointer)throw new Error("Internal inconsistency, when starting LAN transport, no LAN transport pointer should exist.");this.lanTransportPointer=transportsLANCreate(r.deref())}i.isMulticastEnabled&&dittoAddMulticastTransport(r.deref())}}else{if(n.isEnabled){if(n.isMdnsEnabled){if(null==this.mdnsClientTransportPointer)throw new Error("Internal inconsistency, when stopping LAN transport, a LAN transport pointer should exist.");if(mdnsClientFreeHandle(this.mdnsClientTransportPointer),this.mdnsClientTransportPointer=null,null==this.mdnsServerAdvertiserPointer)throw new Error("Internal inconsistency, when stopping LAN transport, a LAN transport pointer should exist.");mdnsServerFreeHandle(this.mdnsServerAdvertiserPointer),this.mdnsServerAdvertiserPointer=null}n.isMulticastEnabled&&dittoRemoveMulticastTransport(r.deref())}i.isEnabled&&(i.isMdnsEnabled&&(this.mdnsClientTransportPointer=dittoAddInternalMdnsTransport(r.deref()),this.mdnsServerAdvertiserPointer=dittoAddInternalMdnsAdvertiser(r.deref())),i.isMulticastEnabled&&dittoAddMulticastTransport(r.deref()))}}))}updateListenTCP(e,t){this.ditto.deferClose((r=>{const n=e.effectiveTransportConfig.listen.tcp,i=t.effectiveTransportConfig.listen.tcp;TransportConfig.areListenTCPsEqual(i,n)||(n.isEnabled&&dittoStopTCPServer(r.deref()),i.isEnabled&&dittoStartTCPServer(r.deref(),`${i.interfaceIP}:${i.port}`))}))}updateListenHTTP(e,t){this.ditto.deferClose((r=>{const n=e.effectiveTransportConfig.listen.http,i=t.effectiveTransportConfig.listen.http;TransportConfig.areListenHTTPsEqual(n,i)||(n.isEnabled&&dittoStopHTTPServer(r.deref()),i.isEnabled&&dittoStartHTTPServer(r.deref(),`${i.interfaceIP}:${i.port}`,i.staticContentPath||null,i.websocketSync?"Enabled":"Disabled",i.tlsCertificatePath||null,i.tlsKeyPath||null))}))}updateConnectTCPServers(e,t){this.ditto.deferClose((e=>{t.effectiveTransportConfig.connect.tcpServers,dittoSetStaticTCPClients(e.deref())}))}updateConnectWebsocketURLs(e,t){this.ditto.deferClose((e=>{const r=t.effectiveTransportConfig.connect.websocketURLs,n=t.effectiveTransportConfig.global.routingHint;dittoSetStaticWebsocketClients(e.deref(),r,n)}))}updateGlobal(e,t){this.ditto.deferClose((r=>{e.effectiveTransportConfig.global.syncGroup!==t.effectiveTransportConfig.global.syncGroup&&dittoSetSyncGroup(r.deref(),t.effectiveTransportConfig.global.syncGroup)}))}updateConnectRetryInterval(e,t){this.ditto.deferClose((e=>{dittoSetConnectRetryInterval(e.deref(),t.effectiveTransportConfig.connect.retryInterval)}))}}function stateFrom(e){var t,r;const n=e.identity,i=e.isSyncActive,o=e.isX509Valid,s=e.isWebValid;let a,d,c=!1;"onlinePlayground"!==n.type&&"onlineWithAuthentication"!==n.type||(a=n.appID,d=null!==(t=n.customDittoCloudURL)&&void 0!==t?t:null,c=null===(r=n.enableDittoCloudSync)||void 0===r||r),validateEnabledTransportsAvailable(e.ditto,e.transportConfig);const l=e.transportConfig.copy();if(i&&o||(l.peerToPeer.bluetoothLE.isEnabled=!1,l.peerToPeer.awdl.isEnabled=!1,l.peerToPeer.lan.isEnabled=!1,l.listen.tcp.isEnabled=!1,l.connect.tcpServers=[]),i&&s||(l.connect.websocketURLs=[]),i||(l.listen.http.isEnabled=!1),i&&s&&c){const e=null!=d?d:defaultDittoCloudURL(a);l.connect.websocketURLs.push(e)}return{underlyingSyncParameters:e,effectiveTransportConfig:l.freeze()}}function validateEnabledTransportsAvailable(e,t){return e.deferClose((e=>{const r=[],n=transportsBLEIsAvailable(e.deref()),i=transportsAWDLIsAvailable(e.deref()),o=transportsLANIsAvailable(e.deref());if(t.peerToPeer.bluetoothLE.isEnabled&&!n&&r.push("BluetoothLE"),t.peerToPeer.awdl.isEnabled&&!i&&r.push("AWDL"),t.peerToPeer.lan.isEnabled&&!o&&r.push("LAN"),r.length>0)throw new Error(`The following P2P transports are enabled in the transport config but are not supported in the current environment: ${r.join(", ")}`);if(t.connect.tcpServers.length>0&&isWebBuild)throw new Error("The transport config contains TCP servers, but this transport is not supported in web environments");if(t.listen.http.isEnabled&&isWebBuild)throw new Error("The transport config contains an HTTP listener, which is not supported in web environments");if(t.listen.tcp.isEnabled&&isWebBuild)throw new Error("The transport config contains a TCP listener, which is not supported in web environments")}))}class SubscriptionManager{constructor(e){this.ditto=e,this.subscriptions={},this.finalizationRegistry=new FinalizationRegistry(this.removeWithContextInfo.bind(this))}add(e){const t=e.contextInfo;this.ditto.deferClose((r=>{this.subscriptions[t.id]=new WeakRef(e),this.finalizationRegistry.register(e,e.contextInfo,e),addSubscription(r.deref(),t.collectionName,t.query,t.queryArgsCBOR,t.orderBys,t.limit,t.offset)}))}remove(e){if(null==this.subscriptions[e.contextInfo.id])throw new Error(`Internal inconsistency, tried to remove a subscription that is not tracked: ${e.contextInfo.id}`);this.finalizationRegistry.unregister(e),this.removeWithContextInfo(e.contextInfo)}close(){this.ditto.deferClose((()=>{for(const e in this.subscriptions){const t=this.subscriptions[e].deref();null==t||t.cancel()}}))}removeWithContextInfo(e){this.ditto.deferClose((t=>{delete this.subscriptions[e.id],removeSubscription(t.deref(),e.collectionName,e.query,e.queryArgsCBOR,e.orderBys,e.limit,e.offset)}))}}class AttachmentFetcherManager{constructor(e){this.contextInfoByID={},this.finalizationRegistry=new FinalizationRegistry(this.stopWithContextInfo.bind(this)),this.ditto=e}startAttachmentFetcher(e,t){return this.ditto.deferClose((()=>{const r=new AttachmentFetcher(this.ditto,e,this,t),n={id:r.id,attachmentTokenID:e.idBytes,cancelTokenPromise:r.cancelTokenPromise,attachmentFetcher:new WeakRef(r)};this.finalizationRegistry.register(r,n,r),this.contextInfoByID[r.id]=n;const resetCancelToken=()=>{null!=this.contextInfoByID[r.id]&&(this.contextInfoByID[r.id].cancelTokenPromise=null)};return r.attachment.then((e=>(resetCancelToken(),e)),(e=>(resetCancelToken(),e))),this.ditto.keepAlive.retain(`AttachmentFetcher.${r.id})`),r}))}async stopAttachmentFetcher(e){this.finalizationRegistry.unregister(e);const t=this.contextInfoByID[e.id];if(null==t)throw new Error(`Internal inconsistency: cannot stop attachment fetcher ${e.id}, which is not registered.`);await this.stopWithContextInfo(t)}close(){this.ditto.deferCloseAsync((async()=>{const e=Object.values(this.contextInfoByID).map((async e=>{const t=e.attachmentFetcher.deref();null!=t&&await this.stopAttachmentFetcher(t)}));await Promise.all(e)}))}stopWithContextInfo(e){return this.ditto.deferCloseAsync((async t=>{if(null==this.contextInfoByID[e.id])throw new Error(`Internal inconsistency: attachment fetcher ${e.id} not found in active attachment fetchers.`);delete this.contextInfoByID[e.id],this.ditto.keepAlive.release(`AttachmentFetcher.${e.id})`);const r=await e.cancelTokenPromise;r&&dittoCancelResolveAttachment(t.deref(),e.attachmentTokenID,r)}))}}class SmallPeerInfo{get isEnabled(){return this.ditto.deferClose((e=>dittoSmallPeerInfoGetIsEnabled(e.deref())))}set isEnabled(e){if("boolean"!=typeof e)throw new TypeError("Expected boolean, got "+typeof e);this.ditto.deferCloseAsync((async t=>dittoSmallPeerInfoSetEnabled(t.deref(),e)))}get metadata(){return JSON.parse(this.metadataJSONString)}set metadata(e){this.metadataJSONString=JSON.stringify(e)}get metadataJSONString(){return this.ditto.deferClose((e=>dittoSmallPeerInfoGetMetadata(e.deref())))}set metadataJSONString(e){if("string"!=typeof e)throw new TypeError("Expected string, got "+typeof e);this.ditto.deferClose((t=>{dittoSmallPeerInfoSetMetadata(t.deref(),e)}))}async getSyncScope(){return this.ditto.deferCloseAsync((async e=>dittoSmallPeerInfoGetSyncScope(e.deref())))}async setSyncScope(e){return this.ditto.deferCloseAsync((async t=>dittoSmallPeerInfoSetSyncScope(t.deref(),e)))}constructor(e){this.ditto=e}}const DEFAULT_PERSISTENCE_DIRECTORY="ditto";class Ditto{static get VERSION(){return dittoGetSDKSemver()}get deviceName(){return this._deviceName}set deviceName(e){this.isSyncActive&&Logger.warning("Changes to the device name take effect when sync is restarted."),this._deviceName=e}get sdkVersion(){return this.deferClose((e=>dittoGetSDKVersion(e.deref())))}get path(){return Logger.warning("⚠️ Deprecation Warning: The 'Ditto.path' property is deprecated. Please update your code to use the new 'Ditto.persistenceDirectory' property instead."),this.persistenceDirectory}get isActivated(){var e;return null!==(e=this._isActivated)&&void 0!==e&&e}get isClosed(){var e;return null!==(e=this._isClosed)&&void 0!==e&&e}get isSyncActive(){var e;return null!==(e=this._isSyncActive)&&void 0!==e&&e}constructor(e,t){if(this.deferCloseAllowed=!0,this.isWebValid=!1,this.isX509Valid=!1,this._isSyncActive=!1,this._isClosed=!1,this.pendingOperations=new Set,!Ditto.isEnvironmentSupported())throw new Error("Ditto does not support this JavaScript environment. Please consult the Ditto JavaScript documentation for a list of supported environments and browsers. You can use `Ditto.isEnvironmentSupported()` to run this check anytime.");loggerInit(),this.persistenceDirectory=Ditto.initPersistenceDirectory(t);const r=null!=e?e:{type:"offlinePlayground",appID:""},n=Object.freeze(this.validateIdentity(r));this.identity=Object.freeze(n),this._deviceName=defaultDeviceName(),this.keepAlive=new KeepAlive;let i=null;const o=new WeakRef(this),s=(()=>{var e,t,r;if("offlinePlayground"===n.type)return dittoIdentityConfigMakeOfflinePlayground(n.appID,null!==(e=n.siteID)&&void 0!==e?e:0);if("manual"===n.type)throw new Error("Manual Identify is currently not implemented for React Native.");if("sharedKey"===n.type)return dittoIdentityConfigMakeSharedKey(n.appID,n.sharedKey,n.siteID);if("onlinePlayground"===n.type){const e=null!==(t=n.customAuthURL)&&void 0!==t?t:defaultAuthURL(n.appID);return dittoIdentityConfigMakeOnlinePlayground(n.appID,n.token,e)}if("onlineWithAuthentication"===n.type){const e=null!==(r=n.customAuthURL)&&void 0!==r?r:defaultAuthURL(n.appID);return dittoIdentityConfigMakeOnlineWithAuthentication(n.appID,e)}throw new Error(`Can't create Ditto, unsupported identity type: ${n}`)})(),a=dittoMake(this.persistenceDirectory,s,"Disabled");dittoAuthClientSetValidityListener(a,(function(...e){const t=o.deref();null==t||t.isClosed?Logger.info("Ditto is closed, ignoring auth client validity change"):t.authClientValidityChanged(...e)}));const d=dittoAuthClientIsWebValid(a),c=dittoAuthClientIsX509Valid(a),l=dittoAuthClientGetAppID(a),u=dittoAuthClientGetSiteID(a);if(Bridge.ditto.bridge(a,this),this.deferCloseAsync((async e=>{await dittoDisableSyncWithV3(e.deref())})).catch((e=>{Logger.error(`Failed to disable sync with V3: ${null==e?void 0:e.message}`)})),"onlineWithAuthentication"===n.type){this.auth=new OnlineAuthenticator(this.keepAlive,this,n.authHandler);dittoAuthSetLoginProvider(a,dittoAuthClientMakeLoginProvider((function(e){const t=o.deref();t?t.auth?t.auth["@ditto.authenticationExpiring"](e):i=e:Logger.warning("Internal inconsistency, LoginProvider callback fired after the corresponding Ditto instance has been deallocated.")})))}else"onlinePlayground"===n.type?this.auth=new OnlineAuthenticator(this.keepAlive,this,{authenticationRequired:function(e){},authenticationExpiringSoon:function(e,t){}}):this.auth=new NotAvailableAuthenticator(this.keepAlive);const h=this.makeDefaultTransportConfig().freeze();this.appID=l,this.siteID=u,this.isX509Valid=c,this.isWebValid=d,this.sync=new Sync(this),this.sync.update({isSyncActive:!1,isX509Valid:c,isWebValid:d,identity:n,ditto:this,transportConfig:h}),this._isActivated=!IdentityTypesRequiringOfflineLicenseToken.includes(n.type),this.store=new Store(this),this.smallPeerInfo=new SmallPeerInfo(this),this.presence=new Presence(this),this.presenceManager=new PresenceManager(this),this.liveQueryManager=new LiveQueryManager(this,this.keepAlive),this.attachmentFetcherManager=new AttachmentFetcherManager(this),this.transportConditionsManager=new TransportConditionsManager(this),this.subscriptionManager=new SubscriptionManager(this),null!=i&&this.auth["@ditto.authenticationExpiring"](i)}static disableDeadlockDetection(){}static hasDeadlockDetection(){return!1}static isEnvironmentSupported(){let e,t=!1;"undefined"!=typeof window&&window.navigator&&window.navigator.userAgent&&window.navigator.appVersion&&(t=-1!==window.navigator.userAgent.indexOf("MSIE")||window.navigator.appVersion.indexOf("Trident/")>-1);try{e=checkAPIs()}catch(e){throw new Error(`Error checking environment support: ${e}`)}return!t&&e}static initPersistenceDirectory(e){let t;if(null==e)t="ditto";else{if(0===e.trim().length)throw new Error(`Invalid argument for path parameter: '${e}'`);t=e}return t=createDirectory(t),t}setOfflineOnlyLicenseToken(e){IdentityTypesRequiringOfflineLicenseToken.includes(this.identity.type)?(this._isActivated=!1,mapFFIErrors((()=>tryVerifyLicense(e))),this._isActivated=!0):Logger.error(`The identity type '${this.identity.type}' does not require an offline license token.`)}get transportConfig(){return this.sync.parameters.transportConfig}setTransportConfig(e){const t=e.copy().freeze(),r=this.identity,n=this.isWebValid,i=this.isX509Valid;this.sync.update({transportConfig:t,identity:r,isWebValid:n,isX509Valid:i,isSyncActive:this.isSyncActive,ditto:this});const o=transportConfigToSerializable(t),s=CBOR.encode(o);this.deferClose((e=>{dittoSmallPeerInfoCollectionSetTransportConfigData(e.deref(),s)}))}updateTransportConfig(e){const t=this.transportConfig.copy();return e(t),this.setTransportConfig(t),this}startSync(){this.setSyncActive(!0)}stopSync(){this.setSyncActive(!1)}observePeers(e){Logger.warning("`ditto.observePeers()` is deprecated, please use `ditto.presence.observe()` instead.");const t=this.presenceManager.addObserver(e);return new Observer(this.presenceManager,t,{stopsWhenFinalized:!0})}observeTransportConditions(e){const t=this.transportConditionsManager.addObserver(e);return new Observer(this.transportConditionsManager,t,{stopsWhenFinalized:!0})}async runGarbageCollection(){return this.deferCloseAsync((async e=>dittoRunGarbageCollection(e.deref())))}async disableSyncWithV3(){throw new Error("This API is not available in React Native environments.")}async close(){if(!this.isClosed){if(this._isClosed=!0,this.stopSync(),this.store.close(),this.presence.close(),this.auth.close(),this.sync.close(),await this.presenceManager.close(),this.liveQueryManager.close(),this.attachmentFetcherManager.close(),this.transportConditionsManager.close(),this.subscriptionManager.close(),this.keepAlive.isActive)throw new Error("Internal inconsistency, still kept alive after the Ditto object has been close()-ed. ");do{await Promise.allSettled(this.pendingOperations)}while(this.pendingOperations.size>0);this.deferCloseAllowed=!1,await Bridge.ditto.close(this)}}get numPendingOperations(){return this.pendingOperations.size}deferClose(e){if(!this.deferCloseAllowed)throw new Error("Can't perform operation using a Ditto instance that has been closed.");return e(Bridge.ditto.handleFor(this))}async deferCloseAsync(e){if(!this.deferCloseAllowed)throw new Error("Can't perform operation using a Ditto instance that has been closed.");const t=e(Bridge.ditto.handleFor(this));let r;this.pendingOperations.add(t);try{r=await t}finally{this.pendingOperations.delete(t)}return r}authClientValidityChanged(e,t){const r=this.transportConfig,n=this.identity,i=this.isSyncActive;this.isX509Valid,this.isWebValid,this.isX509Valid=t,this.isWebValid=e,this.auth["@ditto.authClientValidityChanged"](e,t),this.sync.update({transportConfig:r,identity:n,isWebValid:e,isX509Valid:t,isSyncActive:i,ditto:this})}validateIdentity(e){const t={...e},r=e.appID;if(!["offlinePlayground","sharedKey","manual","onlinePlayground","onlineWithAuthentication"].includes(e.type))throw new Error(`Can't create Ditto instance, unknown identity type: ${e.type}`);if(("offlinePlayground"===e.type||"sharedKey"===e.type||"onlinePlayground"===e.type||"onlineWithAuthentication"===e.type)&&void 0===r)throw new Error("Property .appID must be given for identity, but isn't.");if(void 0!==r&&"string"!=typeof r)throw new Error(`Property .appID must be be of type string, but is of type '${typeof r}': ${r}`);if(("offlinePlayground"===e.type||"sharedKey"===e.type)&&void 0!==e.siteID){const t=e.siteID;if(!("number"==typeof t||"bigint"==typeof t))throw new Error("Can't create Ditto instance, siteID must be a number or BigInt");if(t<0)throw new Error("Can't create Ditto instance, siteID must be >= 0");if(t>BigInt("0xffffffffffffffff"))throw new Error("Can't create Ditto instance, siteID must be < 2^64")}if(e.type,e.type,"onlinePlayground"===e.type){const t=e.token;if(void 0===t)throw new Error("Property .token must be given for identity but isn't. You can find the corresponding token on the Ditto Portal.");if(void 0!==t&&"string"!=typeof t)throw new Error(`Property .token of identity must be be of type string, but is of type '${typeof t}': ${t}`)}return e.type,t}setSyncActive(e){this.deferClose((t=>{if(e&&IdentityTypesRequiringOfflineLicenseToken.includes(this.identity.type)&&!this.isActivated)throw new Error("Sync could not be started because Ditto has not yet been activated. This can be achieved with a successful call to `setOfflineOnlyLicenseToken`. If you need to obtain a license token then please visit https://portal.ditto.live.");!this.isSyncActive&&e&&this.keepAlive.retain("sync"),this.isSyncActive&&!e&&this.keepAlive.release("sync"),this._isSyncActive=e;const r=this.isWebValid,n=this.isX509Valid,i=this.identity,o=this.transportConfig;this._deviceName=dittoSetDeviceName(t.deref(),this.deviceName),this.sync.update({identity:i,transportConfig:o,isWebValid:r,isX509Valid:n,isSyncActive:!!e,ditto:this})}))}makeDefaultTransportConfig(){return this.deferClose((e=>{const t=new TransportConfig;return transportsBLEIsAvailable(e.deref())&&(t.peerToPeer.bluetoothLE.isEnabled=!0),transportsAWDLIsAvailable(e.deref())&&(t.peerToPeer.awdl.isEnabled=!0),transportsLANIsAvailable(e.deref())&&(t.peerToPeer.lan.isEnabled=!0),t.freeze()}))}}const checkAPIs=e=>{const t=e||globalThis||global||window;return["BigInt","WeakRef","FinalizationRegistry"].every((e=>!!t[e]))},disableDeadlockTimeoutWhenDebugging=()=>{},CUSTOM_INSPECT_SYMBOL=Symbol.for("nodejs.util.inspect.custom");class QueryResultItem{get value(){if(this.materialize(),void 0===this.materializedValue)throw new Error("Internal Error: Materialized value is undefined");return this.materializedValue}get isMaterialized(){return void 0!==this.materializedValue}materialize(){if(!this.isMaterialized){const e=this.cborData();let t;try{t=CBOR.decode(e)}catch(e){throw new Error(`Internal inconsistency: CBOR decoding error while materializing result item: ${e.message}`)}if(void 0===t)throw new Error("Internal inconsistency: Materialized value is undefined");this.materializedValue=t}}dematerialize(){this.materializedValue=void 0}cborData(){return queryResultItemCBOR(Bridge.queryResultItem.handleFor(this).deref())}jsonString(){return queryResultItemJSON(Bridge.queryResultItem.handleFor(this).deref())}[CUSTOM_INSPECT_SYMBOL](e,t,r){return customInspectRepresentation(this,r)}constructor(){}}class ConnectionRequest{get peerKeyString(){return connectionRequestPeerKeyString(this.deref())}get peerMetadata(){return JSON.parse(this.peerMetadataJSONString)}get peerMetadataJSONString(){return connectionRequestPeerMetadataJSON(this.deref())}get identityServiceMetadata(){return JSON.parse(this.identityServiceMetadataJSONString)}get identityServiceMetadataJSONString(){return connectionRequestIdentityServiceMetadataJSON(this.deref())}get connectionType(){return connectionRequestConnectionType(this.deref())}toString(){return`ConnectionRequest(${this.peerKeyString} via ${this.connectionType})`}[Symbol.for("nodejs.util.inspect.custom")](e,t,r){return this.toString()}deref(){return Bridge.connectionRequest.handleFor(this).deref()}}Bridge.attachment.registerType(Attachment),Bridge.connectionRequest.registerType(ConnectionRequest),Bridge.document.registerType(Document),Bridge.queryResultItem.registerType(QueryResultItem),Bridge.queryResult.registerType(QueryResult),Bridge.mutableDocument.registerType(MutableDocument),Bridge.ditto.registerType(Ditto);export{Attachment,AttachmentFetcher,AttachmentToken,Authenticator,ConnectionRequest,Ditto,DittoError,DocumentID,ERROR_CODES,IdentityTypesRequiringOfflineLicenseToken,Logger,NotAvailableAuthenticator,Observer,OnlineAuthenticator,Presence,QueryResult,QueryResultItem,SmallPeerInfo,Store,StoreObserver,Sync,SyncSubscription,TransportConfig,addressToString,checkAPIs,disableDeadlockTimeoutWhenDebugging,getMissingAndroidPermissions,init,mapFFIErrors,mapFFIErrorsAsync,transportConfigFromDeserializable,transportConfigToSerializable,validateAttachmentMetadata,validateDocumentIDCBOR,validateDocumentIDValue};
|
|
1
|
+
import{NativeModules,Platform}from"react-native";import{FinalizationGroup}from"@ungap/weakrefs";import"fastestsmallesttextencoderdecoder";const dittoCore=global,isLoaded="function"==typeof dittoCore.ditto_sdk_transports_init;if(!isLoaded){var _NativeModules$DittoR;if(!(null===(_NativeModules$DittoR=NativeModules.DittoRNSDK)||void 0===_NativeModules$DittoR?void 0:_NativeModules$DittoR.install()))throw new Error("JSI bindings were not installed for: DittoRNSDK Module");setInterval((()=>{dittoCore.ditto_tick()}),50),void 0===global.FinalizationRegistry&&void 0!==FinalizationGroup&&(global.FinalizationRegistry=FinalizationGroup);const e=Platform.select({ios:"Ios",android:"Android",default:"Unknown"});dittoCore.ditto_init_sdk_version(e,"JavaScript","4.9.0")}function ditto_sdk_transports_init(e){if("android"===Platform.OS){if(!dittoCore.ditto_sdk_transports_set_android_context())throw new Error("Couldn't manage to set Android context with `ditto_sdk_transports_set_android_context()`")}return dittoCore.ditto_sdk_transports_init(e)}function getMissingAndroidPermissions(){return"android"!==Platform.OS?[]:dittoCore.ditto_sdk_transports_android_missing_permissions()}function boxCBytesIntoBuffer(e){const t=dittoCore.sliceBoxedToUInt8Array(e);return t?new Uint8Array(t):null}function refCBytesIntoBuffer(e){const t=dittoCore.sliceRefToUInt8Array(e);return t?new Uint8Array(t):null}function ditto_identity_config_make_online_playground(...e){return dittoCore.ditto_identity_config_make_online_playground(...e)}function ditto_identity_config_make_offline_playground(...e){return dittoCore.ditto_identity_config_make_offline_playground(...e)}function ditto_identity_config_make_shared_key(...e){return dittoCore.ditto_identity_config_make_shared_key(...e)}function ditto_identity_config_make_online_with_authentication(...e){return dittoCore.ditto_identity_config_make_online_with_authentication(...e)}function ditto_make(...e){return dittoCore.ditto_make(...e)}function ditto_shutdown(...e){return dittoCore.ditto_shutdown(...e)}function ditto_free(...e){return dittoCore.ditto_free(...e)}function refCStringToString(...e){return dittoCore.refCStringToString(...e)}function boxCStringIntoString(...e){return dittoCore.boxCStringIntoString(...e)}function withOutBoxCBytes(...e){return dittoCore.withOutBoxCBytes(...e)}function ditto_auth_client_get_app_id(...e){return dittoCore.ditto_auth_client_get_app_id(...e)}function ditto_auth_client_is_x509_valid(...e){return dittoCore.ditto_auth_client_is_x509_valid(...e)}function ditto_auth_client_is_web_valid(...e){return dittoCore.ditto_auth_client_is_web_valid(...e)}function ditto_auth_client_get_site_id(...e){return dittoCore.ditto_auth_client_get_site_id(...e)}function ditto_auth_client_set_validity_listener(...e){return dittoCore.ditto_auth_client_set_validity_listener(...e)}function ditto_auth_client_make_login_provider(...e){return dittoCore.ditto_auth_client_make_login_provider(...e)}function ditto_auth_set_login_provider(...e){return dittoCore.ditto_auth_set_login_provider(...e)}function ditto_auth_client_login_with_token(...e){return dittoCore.ditto_auth_client_login_with_token(...e)}function ditto_auth_client_login_with_token_and_feedback(...e){return dittoCore.ditto_auth_client_login_with_token_and_feedback(...e)}function ditto_auth_client_login_with_credentials(...e){return dittoCore.ditto_auth_client_login_with_credentials(...e)}function ditto_auth_client_logout(...e){return dittoCore.ditto_auth_client_logout(...e)}function ditto_auth_client_user_id(...e){return dittoCore.ditto_auth_client_user_id(...e)}function dittoffi_try_experimental_register_change_observer_str_detached(...e){return dittoCore.dittoffi_try_experimental_register_change_observer_str_detached(...e)}function dittoffi_try_add_sync_subscription(...e){return dittoCore.dittoffi_try_add_sync_subscription(...e)}function dittoffi_try_remove_sync_subscription(...e){return dittoCore.dittoffi_try_remove_sync_subscription(...e)}function dittoffi_try_exec_statement(...e){return dittoCore.dittoffi_try_exec_statement(...e)}function dittoffi_query_result_item_count(...e){return dittoCore.dittoffi_query_result_item_count(...e)}function dittoffi_query_result_item_at(...e){return dittoCore.dittoffi_query_result_item_at(...e)}function dittoffi_query_result_mutated_document_id_count(...e){return dittoCore.dittoffi_query_result_mutated_document_id_count(...e)}function dittoffi_query_result_mutated_document_id_at(...e){return dittoCore.dittoffi_query_result_mutated_document_id_at(...e)}function dittoffi_query_result_item_cbor(...e){return dittoCore.dittoffi_query_result_item_cbor(...e)}function dittoffi_query_result_item_json(...e){return dittoCore.dittoffi_query_result_item_json(...e)}function ditto_document_id_query_compatible(...e){return dittoCore.ditto_document_id_query_compatible(...e)}function ditto_document_id(...e){return dittoCore.ditto_document_id(...e)}function ditto_document_free(...e){return dittoCore.ditto_document_free(...e)}function ditto_validate_document_id(...e){return dittoCore.ditto_validate_document_id(...e)}function ditto_presence_v3(...e){return dittoCore.ditto_presence_v3(...e)}function ditto_register_presence_v3_callback(...e){return dittoCore.ditto_register_presence_v3_callback(...e)}function ditto_clear_presence_v3_callback(...e){return dittoCore.ditto_clear_presence_v3_callback(...e)}function dittoffi_presence_peer_metadata_json(...e){return dittoCore.dittoffi_presence_peer_metadata_json(...e)}function dittoffi_presence_try_set_peer_metadata_json(...e){return dittoCore.dittoffi_presence_try_set_peer_metadata_json(...e)}function dittoffi_presence_set_connection_request_handler(...e){return dittoCore.dittoffi_presence_set_connection_request_handler(...e)}function ditto_new_attachment_from_file(...e){return dittoCore.ditto_new_attachment_from_file(...e)}function ditto_new_attachment_from_bytes(...e){return dittoCore.ditto_new_attachment_from_bytes(...e)}function ditto_resolve_attachment(...e){return dittoCore.ditto_resolve_attachment(...e)}function ditto_cancel_resolve_attachment(...e){return dittoCore.ditto_cancel_resolve_attachment(...e)}function ditto_free_attachment_handle(...e){return dittoCore.ditto_free_attachment_handle(...e)}function ditto_get_complete_attachment_path(...e){return dittoCore.ditto_get_complete_attachment_path(...e)}function ditto_live_query_start(...e){return dittoCore.ditto_live_query_start(...e)}function ditto_live_query_stop(...e){return dittoCore.ditto_live_query_stop(...e)}function ditto_live_query_signal_available_next(...e){return dittoCore.ditto_live_query_signal_available_next(...e)}function ditto_log(...e){return dittoCore.ditto_log(...e)}function ditto_logger_init(...e){return dittoCore.ditto_logger_init(...e)}function ditto_logger_set_log_file(...e){return dittoCore.ditto_logger_set_log_file(...e)}function ditto_logger_minimum_log_level_get(...e){return dittoCore.ditto_logger_minimum_log_level_get(...e)}function ditto_logger_minimum_log_level(...e){return dittoCore.ditto_logger_minimum_log_level(...e)}function ditto_logger_emoji_headings_enabled_get(...e){return dittoCore.ditto_logger_emoji_headings_enabled_get(...e)}function ditto_logger_emoji_headings_enabled(...e){return dittoCore.ditto_logger_emoji_headings_enabled(...e)}function ditto_logger_enabled_get(...e){return dittoCore.ditto_logger_enabled_get(...e)}function ditto_logger_enabled(...e){return dittoCore.ditto_logger_enabled(...e)}function ditto_small_peer_info_set_transport_config_data(...e){return dittoCore.ditto_small_peer_info_set_transport_config_data(...e)}function ditto_small_peer_info_get_is_enabled(...e){return dittoCore.ditto_small_peer_info_get_is_enabled(...e)}function ditto_small_peer_info_set_enabled(...e){return dittoCore.ditto_small_peer_info_set_enabled(...e)}function ditto_small_peer_info_get_sync_scope(...e){return dittoCore.ditto_small_peer_info_get_sync_scope(...e)}function ditto_small_peer_info_set_sync_scope(...e){return dittoCore.ditto_small_peer_info_set_sync_scope(...e)}function ditto_small_peer_info_get_metadata(...e){return dittoCore.ditto_small_peer_info_get_metadata(...e)}function ditto_small_peer_info_set_metadata(...e){return dittoCore.ditto_small_peer_info_set_metadata(...e)}function ditto_sdk_transports_error_new(...e){return dittoCore.ditto_sdk_transports_error_new(...e)}function ditto_sdk_transports_error_value(...e){return dittoCore.ditto_sdk_transports_error_value(...e)}function ditto_sdk_transports_error_free(...e){return dittoCore.ditto_sdk_transports_error_free(...e)}function ditto_sdk_transports_ble_is_available(...e){return dittoCore.ditto_sdk_transports_ble_is_available(...e)}function ditto_sdk_transports_ble_create(...e){return dittoCore.ditto_sdk_transports_ble_create(...e)}function ditto_sdk_transports_ble_destroy(...e){return dittoCore.ditto_sdk_transports_ble_destroy(...e)}function ditto_sdk_transports_lan_is_available(...e){return dittoCore.ditto_sdk_transports_lan_is_available(...e)}function ditto_sdk_transports_lan_create(...e){return dittoCore.ditto_sdk_transports_lan_create(...e)}function ditto_sdk_transports_lan_destroy(...e){return dittoCore.ditto_sdk_transports_lan_destroy(...e)}function ditto_sdk_transports_awdl_is_available(...e){return dittoCore.ditto_sdk_transports_awdl_is_available(...e)}function ditto_sdk_transports_awdl_create(...e){return dittoCore.ditto_sdk_transports_awdl_create(...e)}function ditto_sdk_transports_awdl_destroy(...e){return dittoCore.ditto_sdk_transports_awdl_destroy(...e)}function ditto_add_multicast_transport(...e){return dittoCore.ditto_add_multicast_transport(...e)}function ditto_remove_multicast_transport(...e){return dittoCore.ditto_remove_multicast_transport(...e)}function dittoffi_connection_request_peer_key_string(...e){return dittoCore.dittoffi_connection_request_peer_key_string(...e)}function dittoffi_connection_request_peer_metadata_json(...e){return dittoCore.dittoffi_connection_request_peer_metadata_json(...e)}function dittoffi_connection_request_authorize(...e){return dittoCore.dittoffi_connection_request_authorize(...e)}function dittoffi_connection_request_free(...e){return dittoCore.dittoffi_connection_request_free(...e)}function dittoffi_connection_request_connection_type(...e){return dittoCore.dittoffi_connection_request_connection_type(...e)}function ditto_set_connect_retry_interval(...e){return dittoCore.ditto_set_connect_retry_interval(...e)}function ditto_set_device_name(...e){return dittoCore.ditto_set_device_name(...e)}function ditto_get_sdk_version(...e){return dittoCore.ditto_get_sdk_version(...e)}function dittoffi_get_sdk_semver(...e){return dittoCore.dittoffi_get_sdk_semver(...e)}function ditto_error_message(...e){return dittoCore.ditto_error_message(...e)}function dittoffi_error_code(...e){return dittoCore.dittoffi_error_code(...e)}function dittoffi_error_description(...e){return dittoCore.dittoffi_error_description(...e)}function dittoffi_error_free(...e){return dittoCore.dittoffi_error_free(...e)}function dittoffi_try_verify_license(...e){return dittoCore.dittoffi_try_verify_license(...e)}function ditto_run_garbage_collection(...e){return dittoCore.ditto_run_garbage_collection(...e)}function ditto_set_static_websocket_clients(...e){return dittoCore.ditto_set_static_websocket_clients(...e)}function ditto_set_sync_group(...e){return dittoCore.ditto_set_sync_group(...e)}function ditto_disable_sync_with_v3(...e){return dittoCore.ditto_disable_sync_with_v3(...e)}function dittoffi_base64_encode(...e){return dittoCore.dittoffi_base64_encode(...e)}function dittoffi_try_base64_decode(...e){return dittoCore.dittoffi_try_base64_decode(...e)}function dittoffi_crypto_generate_secure_random_token(...e){return dittoCore.dittoffi_crypto_generate_secure_random_token(...e)}function readFile$1(...e){return dittoCore.readFile(...e)}function copyFile$1(...e){return dittoCore.copyFile(...e)}function createDirectory$1(...e){return dittoCore.createDirectory(...e)}function defaultDeviceName$1(...e){return dittoCore.defaultDeviceName(...e)}function dittoffi_logger_try_export_to_file_async(...e){return dittoCore.dittoffi_logger_try_export_to_file_async(...e)}function ditto_logger_set_custom_log_cb(...e){return dittoCore.ditto_logger_set_custom_log_cb(...e)}function ditto_add_internal_ble_client_transport(){throw new Error("ditto_add_internal_ble_client_transport is not implemented in React Native.")}function ditto_add_internal_ble_server_transport(){throw new Error("ditto_add_internal_ble_server_transport is not implemented in React Native.")}function ble_client_free_handle(){throw new Error("ble_client_free_handle is not implemented in React Native.")}function ble_server_free_handle(){throw new Error("ble_server_free_handle is not implemented in React Native.")}function ditto_add_internal_mdns_client_transport(){throw new Error("ditto_add_internal_mdns_client_transport is not implemented in React Native.")}function mdns_client_free_handle(){throw new Error("mdns_client_free_handle is not implemented in React Native.")}function ditto_add_internal_mdns_server_transport(){throw new Error("ditto_add_internal_mdns_server_transport is not implemented in React Native.")}function mdns_server_free_handle(){throw new Error("mdns_server_free_handle is not implemented in React Native.")}function ditto_add_subscription(){throw new Error("ditto_add_subscription is not implemented in React Native.")}function ditto_remove_subscription(){throw new Error("ditto_remove_subscription is not implemented in React Native.")}function dittoffi_query_result_free(){throw new Error("dittoffi_query_result_free is not implemented in React Native.")}function dittoffi_query_result_item_free(){throw new Error("dittoffi_query_result_item_free is not implemented in React Native.")}function ditto_live_query_webhook_register_str(){throw new Error("ditto_live_query_webhook_register_str is not implemented in React Native.")}function dittoffi_try_register_store_observer_webhook(){throw new Error("dittoffi_try_register_store_observer_webhook is not implemented in React Native.")}function ditto_register_presence_v1_callback(){throw new Error("Not implemented in React Native.")}function ditto_clear_presence_callback(){throw new Error("Not implemented in React Native.")}function dittoffi_connection_request_identity_service_metadata_json(){throw new Error("Not implemented in React Native.")}function ditto_register_transport_condition_changed_callback(){throw new Error("Not implemented in React Native.")}function ditto_presence_v1(){throw new Error("Not implemented in React Native.")}function ditto_start_tcp_server(){throw new Error("Not implemented in React Native.")}function ditto_stop_tcp_server(){throw new Error("Not implemented in React Native.")}function ditto_start_http_server(){throw new Error("Not implemented in React Native.")}function ditto_stop_http_server(){throw new Error("Not implemented in React Native.")}const isWebBuild=!1,PREFIX_REGEX=new RegExp(/^<.*?>\s*/);class DittoFFIError extends Error{constructor(e,t,r){const n=ffiErrorMessage();super(t||n||r),this.code=e}}function throwOnErrorResult(e,t){if(null!==e){let r,n;try{r=dittoffi_error_code(e),n=boxCStringIntoString(dittoffi_error_description(e)),dittoffi_error_free(e)}catch(e){throw new DittoFFIError(-1,`Failed to retrieve Ditto core error message: ${e.message}`)}throw n=null==n?`${t}() failed with error code: ${r}`:n.replace(PREFIX_REGEX,""),new DittoFFIError(r,n)}}function ffiErrorMessage(){return boxCStringIntoString(ditto_error_message())}const DittoCRDTTypeKey="_ditto_internal_type_jkb12973t4b",DittoCRDTValueKey="_value";var DittoCRDTType;function dittoAddInternalBLEClientTransport(e){return ditto_add_internal_ble_client_transport()}function dittoAddInternalBLEServerTransport(e){return ditto_add_internal_ble_server_transport()}function bleClientFreeHandle(e){return ble_client_free_handle()}function bleServerFreeHandle(e){return ble_server_free_handle()}function dittoAddInternalMdnsTransport(e){return ditto_add_internal_mdns_client_transport()}function mdnsClientFreeHandle(e){return mdns_client_free_handle()}function dittoAddInternalMdnsAdvertiser(e){return ditto_add_internal_mdns_server_transport()}function mdnsServerFreeHandle(e){return mdns_server_free_handle()}function documentID(e){ensureInitialized();return boxCBytesIntoBuffer(ditto_document_id(e))}function documentFree(e){ensureInitialized(),ditto_document_free(e)}function documentIDQueryCompatible(e,t){ensureInitialized();return boxCStringIntoString(ditto_document_id_query_compatible(e,t))}function validateDocumentID(e){ensureInitialized();return boxCBytesIntoBuffer(withOutBoxCBytes((t=>{const r=ditto_validate_document_id(e,t);if(0!==r)throw new Error(errorMessage()||`ditto_validate_document_id() failed with error code: ${r}`);return t})))}async function tryExecStatement(e,t,r,n){ensureInitialized();const i=bytesFromString(r),o=await dittoffi_try_exec_statement(e,t,i,n);return throwOnErrorResult(o.error,"dittoffi_try_exec_statement"),o.success}function addSubscription(e,t,r,n,i,o,s){ensureInitialized(),bytesFromString(t),bytesFromString(r);const a=ditto_add_subscription();if(0!==a)throw new Error(errorMessage()||`ditto_add_subscription() failed with error code: ${a}`)}function removeSubscription(e,t,r,n,i,o,s){ensureInitialized(),bytesFromString(t),bytesFromString(r);const a=ditto_remove_subscription();if(0!==a)throw new Error(errorMessage()||`ditto_remove_subscription() failed with error code: ${a}`)}function tryAddSyncSubscription(e,t,r){ensureInitialized();throwOnErrorResult(dittoffi_try_add_sync_subscription(e,bytesFromString(t),r).error,"dittoffi_try_add_sync_subscription")}function tryRemoveSyncSubscription(e,t,r){ensureInitialized();throwOnErrorResult(dittoffi_try_remove_sync_subscription(e,bytesFromString(t),r).error,"dittoffi_try_remove_sync_subscription")}function queryResultFree(e){ensureInitialized(),dittoffi_query_result_free()}function queryResultItemFree(e){ensureInitialized(),dittoffi_query_result_item_free()}function queryResultItems(e){ensureInitialized();const t=[],r=dittoffi_query_result_item_count(e);for(let n=0;n<r;n++)t.push(dittoffi_query_result_item_at(e,n));return t}function queryResultMutatedDocumentIDs(e){ensureInitialized();const t=[],r=dittoffi_query_result_mutated_document_id_count(e);for(let n=0;n<r;n++){const r=dittoffi_query_result_mutated_document_id_at(e,n);t.push(boxCBytesIntoBuffer(r))}return t}function queryResultItemCBOR(e){ensureInitialized();return boxCBytesIntoBuffer(dittoffi_query_result_item_cbor(e))}function queryResultItemJSON(e){ensureInitialized();return boxCStringIntoString(dittoffi_query_result_item_json(e))}function tryExperimentalRegisterChangeObserver(e,t,r,n){ensureInitialized();const i=wrapBackgroundCbForFFI((e=>log("Error",`The registered store observer callback failed with ${e}`)),n),o=dittoffi_try_experimental_register_change_observer_str_detached(e,bytesFromString(t),r,i);return throwOnErrorResult(o.error,"dittoffi_try_experimental_register_change_observer_str_detached"),o.success}async function liveQueryStart(e,t){ensureInitialized();const r=await ditto_live_query_start(e,t);if(0!==r)throw new Error(errorMessage()||`\`ditto_live_query_start()\` failed with error code: ${r}`)}function liveQueryStop(e,t){ensureInitialized(),ditto_live_query_stop(e,t)}async function liveQuerySignalAvailableNext(e,t){ensureInitialized(),await ditto_live_query_signal_available_next(e,t)}async function liveQueryWebhookRegister(e,t,r,n,i,o,s){ensureInitialized(),bytesFromString(t),bytesFromString(r),bytesFromString(s);const{status_code:a,id:d}=await ditto_live_query_webhook_register_str();if(0!==a)throw new Error(errorMessage()||`\`ditto_live_query_webhook_register_str()\` failed with error code: ${a}`);return boxCBytesIntoBuffer(d)}async function tryRegisterStoreObserverWebhook(e,t,r,n){ensureInitialized(),bytesFromString(t),bytesFromString(n);const i=await dittoffi_try_register_store_observer_webhook();throwOnErrorResult(i.error,"dittoffi_try_register_store_observer_webhook");return boxCBytesIntoBuffer(i.success)}function loggerInit(){ensureInitialized(),ditto_logger_init()}async function loggerSetCustomLogCb(e){if(ensureInitialized(),null===e)await ditto_logger_set_custom_log_cb(null);else{const t=wrapBackgroundCbForFFI(null,((t,r)=>{try{const n=boxCStringIntoString(r);e(t,n)}catch(e){log("Error",`The registered cb in \`ditto_logger_set_custom_log_cb()\` failed with: ${e}`)}}));await ditto_logger_set_custom_log_cb(t)}}function loggerEnabled(e){ensureInitialized(),ditto_logger_enabled(!!e)}function loggerEnabledGet(){return ensureInitialized(),!!ditto_logger_enabled_get()}function loggerEmojiHeadingsEnabled(e){ensureInitialized(),ditto_logger_emoji_headings_enabled(e)}function loggerEmojiHeadingsEnabledGet(){return ensureInitialized(),ditto_logger_emoji_headings_enabled_get()}function loggerMinimumLogLevel(e){ensureInitialized(),ditto_logger_minimum_log_level(e)}function loggerMinimumLogLevelGet(){return ensureInitialized(),ditto_logger_minimum_log_level_get()}function loggerSetLogFile(e){ensureInitialized();if(0!==ditto_logger_set_log_file(e?bytesFromString(e):null)){const e=errorMessage();throw new Error(`Can't set log file, due to error: ${e}`)}}async function loggerTryExportToFileAsync(e){ensureInitialized();const t=bytesFromString(e),r=await new Promise(((e,r)=>{const n=wrapBackgroundCbForFFI(r,e);dittoffi_logger_try_export_to_file_async(t,n)}));return throwOnErrorResult(r.error,"dittoffi_logger_try_export_to_file_async"),r.success}function log(e,t){ensureInitialized();ditto_log(e,bytesFromString(t))}function dittoIdentityConfigMakeOnlinePlayground(e,t,r){ensureInitialized();const n=bytesFromString(e),i=bytesFromString(t),o=bytesFromString(r),{status_code:s,identity_config:a}=ditto_identity_config_make_online_playground(n,i,o);if(0!==s)throw new Error(errorMessage()||`ditto_identity_config_make_online_playground() failed with error code: ${s}`);return a}function dittoIdentityConfigMakeOnlineWithAuthentication(e,t){ensureInitialized();const r=bytesFromString(e),n=bytesFromString(t),{status_code:i,identity_config:o}=ditto_identity_config_make_online_with_authentication(r,n);if(0!==i)throw new Error(errorMessage()||`ditto_identity_config_make_online_with_authentication() failed with error code: ${i}`);return o}function dittoIdentityConfigMakeOfflinePlayground(e,t){ensureInitialized();const r=bytesFromString(e),n=Number(t),{status_code:i,identity_config:o}=ditto_identity_config_make_offline_playground(r,n);if(0!==i)throw new Error(errorMessage()||`ditto_identity_config_make_offline_playground() failed with error code: ${i}`);return o}function dittoIdentityConfigMakeSharedKey(e,t,r){ensureInitialized();const n=bytesFromString(e),i=bytesFromString(t),o=Number(r),{status_code:s,identity_config:a}=ditto_identity_config_make_shared_key(n,i,o);if(0!==s)throw new Error(errorMessage()||`ditto_identity_config_make_shared_key() failed with error code: ${s}`);return a}function dittoAuthClientGetSiteID(e){return ensureInitialized(),ditto_auth_client_get_site_id(e)}function dittoAuthClientGetAppID(e){ensureInitialized();return boxCStringIntoString(ditto_auth_client_get_app_id(e))}function dittoAuthClientUserID(e){ensureInitialized();return boxCStringIntoString(ditto_auth_client_user_id(e))}function dittoAuthClientIsWebValid(e){return ensureInitialized(),0!==ditto_auth_client_is_web_valid(e)}function dittoAuthClientIsX509Valid(e){return ensureInitialized(),0!==ditto_auth_client_is_x509_valid(e)}async function dittoAuthClientLoginWithTokenAndFeedback(e,t,r){ensureInitialized();const n=bytesFromString(t),i=bytesFromString(r),o=await ditto_auth_client_login_with_token_and_feedback(e,n,i);return{error:0===o.status_code?null:new DittoFFIError(o.status_code,void 0,"Ditto failed to authenticate."),clientInfo:o.c_string?boxCStringIntoString(o.c_string):null}}async function dittoAuthClientLoginWithToken(e,t,r){ensureInitialized();const n=bytesFromString(t),i=bytesFromString(r),o=await ditto_auth_client_login_with_token(e,n,i);if(0!==o)throw new Error(errorMessage()||`Ditto failed to authenticate (error code: ${o}).`)}async function dittoAuthClientLoginWithUsernameAndPassword(e,t,r,n){ensureInitialized();const i=bytesFromString(t),o=bytesFromString(r),s=bytesFromString(n),a=await ditto_auth_client_login_with_credentials(e,i,o,s);if(0!==a)throw new Error(errorMessage()||`Ditto failed to authenticate (error code: ${a}).`)}async function dittoAuthClientLogout(e){ensureInitialized();const t=await ditto_auth_client_logout(e);if(0!==t)throw new Error(errorMessage()||`Ditto failed to logout (error code: ${t}).`)}function dittoMake(e,t,r){ensureInitialized();return ditto_make(bytesFromString(e),t,r)}function dittoFree(e){return ensureInitialized(),ditto_free(e)}function cryptoGenerateSecureRandomToken(){ensureInitialized();return boxCStringIntoString(dittoffi_crypto_generate_secure_random_token())}function dittoRegisterPresenceV1Callback(e,t){ensureInitialized(),ditto_register_presence_v1_callback()}async function dittoClearPresenceCallback(e){return ensureInitialized(),ditto_clear_presence_callback()}function dittoRegisterPresenceV3Callback(e,t){ensureInitialized(),ditto_register_presence_v3_callback(e,wrapBackgroundCbForFFI((e=>log("Error",`The registered presence callback v3 errored with ${e}`)),(e=>{const r=refCStringToString(e);t(r)})))}async function dittoClearPresenceV3Callback(e){return ensureInitialized(),ditto_clear_presence_v3_callback(e)}function presencePeerMetadataJSON(e){ensureInitialized();const t=boxCBytesIntoBuffer(dittoffi_presence_peer_metadata_json(e));return(new TextDecoder).decode(t)}async function presenceTrySetPeerMetadataJSON(e,t){ensureInitialized();const r=bytesFromString(t);throwOnErrorResult((await dittoffi_presence_try_set_peer_metadata_json(e,r)).error,"dittoffi_presence_try_set_peer_metadata_json")}function connectionRequestPeerKeyString(e){ensureInitialized();return boxCStringIntoString(dittoffi_connection_request_peer_key_string(e))}function connectionRequestPeerMetadataJSON(e){ensureInitialized();const t=refCBytesIntoBuffer(dittoffi_connection_request_peer_metadata_json(e));return(new TextDecoder).decode(t)}function connectionRequestIdentityServiceMetadataJSON(e){ensureInitialized();const t=refCBytesIntoBuffer(dittoffi_connection_request_identity_service_metadata_json());return(new TextDecoder).decode(t)}function connectionRequestConnectionType(e){return ensureInitialized(),dittoffi_connection_request_connection_type(e)}function connectionRequestAuthorize(e,t){ensureInitialized(),dittoffi_connection_request_authorize(e,t)}function connectionRequestFree(e){ensureInitialized(),dittoffi_connection_request_free(e)}function presenceSetConnectionRequestHandler(e,t,r){if(ensureInitialized(),null==t)dittoffi_presence_set_connection_request_handler(e,null);else{dittoffi_presence_set_connection_request_handler(e,wrapAsyncBackgroundCbForFFI(r,t))}}function dittoSmallPeerInfoGetIsEnabled(e){return ensureInitialized(),ditto_small_peer_info_get_is_enabled(e)}async function dittoSmallPeerInfoSetEnabled(e,t){ensureInitialized(),ditto_small_peer_info_set_enabled(e,t)}async function dittoSmallPeerInfoGetSyncScope(e){return ensureInitialized(),ditto_small_peer_info_get_sync_scope(e)}async function dittoSmallPeerInfoSetSyncScope(e,t){return ensureInitialized(),ditto_small_peer_info_set_sync_scope(e,t)}function dittoSmallPeerInfoGetMetadata(e){ensureInitialized();return boxCStringIntoString(ditto_small_peer_info_get_metadata(e))}function dittoSmallPeerInfoSetMetadata(e,t){ensureInitialized();const r=ditto_small_peer_info_set_metadata(e,bytesFromString(t));switch(r){case 0:return;case-1:throw new Error("Internal inconsistency, the observability subsystem is unavailable.");case 1:throw new Error(`Validation error, size limit exceeded: ${errorMessage()||"metadata is too big"}`);case 2:throw new Error(`Validation error, ${errorMessage()||"depth limit for metadata object exceeded"}`);case 3:throw new Error(`Validation error, ${errorMessage()||`'${t}' is not a valid JSON object`}`);default:throw new Error(errorMessage()||`Internal inconsistency, ditto_small_peer_info_set_metadata() returned an unknown error code: ${r}`)}}function dittoSmallPeerInfoCollectionSetTransportConfigData(e,t){ensureInitialized(),ditto_small_peer_info_set_transport_config_data(e,t)}function dittoRegisterTransportConditionChangedCallback(e,t){ensureInitialized(),ditto_register_transport_condition_changed_callback()}function dittoSetDeviceName(e,t){ensureInitialized();return boxCStringIntoString(ditto_set_device_name(e,bytesFromString(t)))}function dittoSetConnectRetryInterval(e,t){ensureInitialized();return ditto_set_connect_retry_interval(e,Math.min(Math.max(0,t),4294967295))}function dittoSetSyncGroup(e,t){return ensureInitialized(),ditto_set_sync_group(e,t)}function dittoNewAttachmentFromFile(e,t,r){ensureInitialized();const n={},i=ditto_new_attachment_from_file(e,bytesFromString(t),r,n);if(0!==i)throw new DittoFFIError(i,null,`ditto_new_attachment_from_file() failed with error code: ${i}`);return n}async function dittoNewAttachmentFromBytes(e,t){ensureInitialized();const r={},n=await ditto_new_attachment_from_bytes(e,t,r);if(0!==n)throw new DittoFFIError(n,null,`ditto_new_attachment_from_bytes() failed with error code: ${n}`);return r}async function dittoResolveAttachment(e,t,r,n){ensureInitialized();const{onComplete:i,onProgress:o,onDelete:s}=r,a=wrapBackgroundCbForFFI(n,i),d=wrapBackgroundCbForFFI(n,o),c=wrapBackgroundCbForFFI(n,s),{status_code:l,cancel_token:u}=await ditto_resolve_attachment(e,t,a,d,c);if(0!==l)throw new DittoFFIError(l,null,`ditto_resolve_attachment() failed with error code: ${l}`);return u}function dittoCancelResolveAttachment(e,t,r){ensureInitialized();const n=ditto_cancel_resolve_attachment(e,t,r);if(0!==n)throw new Error(errorMessage()||`ditto_cancel_resolve_attachment() failed with error code: ${n}`)}function freeAttachmentHandle(e){ensureInitialized(),ditto_free_attachment_handle(e)}function dittoGetCompleteAttachmentPath(e,t){ensureInitialized();return refCStringToString(ditto_get_complete_attachment_path(e,t))}function dittoGetSDKVersion(e){ensureInitialized();return boxCStringIntoString(ditto_get_sdk_version(e))}function dittoGetSDKSemver(){ensureInitialized();return boxCStringIntoString(dittoffi_get_sdk_semver())}function dittoPresenceV1(e){ensureInitialized();return boxCStringIntoString(ditto_presence_v1())}function dittoPresenceV3(e){ensureInitialized();return boxCStringIntoString(ditto_presence_v3(e))}function dittoStartTCPServer(e,t){return ensureInitialized(),bytesFromString(t),ditto_start_tcp_server()}function dittoStopTCPServer(e){return ensureInitialized(),ditto_stop_tcp_server()}async function dittoShutdown(e){return ensureInitialized(),await ditto_shutdown(e)}function dittoAddMulticastTransport(e){return ensureInitialized(),ditto_add_multicast_transport(e)}function dittoRemoveMulticastTransport(e){return ensureInitialized(),ditto_remove_multicast_transport(e)}function dittoStartHTTPServer(e,t,r,n,i,o){return ensureInitialized(),bytesFromString(t),bytesFromString(r),bytesFromString(i),bytesFromString(o),ditto_start_http_server()}function dittoStopHTTPServer(e){return ensureInitialized(),ditto_stop_http_server()}async function dittoRunGarbageCollection(e){ensureInitialized();const t=await ditto_run_garbage_collection(e);if(0!==t)throw new Error(errorMessage()||`ditto_run_garbage_collection() failed with error code: ${t}`)}async function dittoDisableSyncWithV3(e){ensureInitialized();const t=await ditto_disable_sync_with_v3(e);if(0!==t)throw new Error(errorMessage()||`ditto_disable_sync_with_v3() failed with error code: ${t}`)}function dittoSetStaticTCPClients(e,t){ensureInitialized()}function dittoSetStaticWebsocketClients(e,t,r){ensureInitialized();ditto_set_static_websocket_clients(e,t.map((e=>bytesFromString(e))),r)}function base64encode(e,t){return boxCStringIntoString(dittoffi_base64_encode(e,t))}function tryBase64Decode(e,t){const r=dittoffi_try_base64_decode(bytesFromString(e),t);return throwOnErrorResult(r.error,"dittoffi_try_base64_decode"),boxCBytesIntoBuffer(r.success)}async function dittoAuthSetLoginProvider(e,t){return ensureInitialized(),await ditto_auth_set_login_provider(e,t)}function dittoAuthClientMakeLoginProvider(e,t){return ensureInitialized(),ditto_auth_client_make_login_provider(wrapBackgroundCbForFFI(t,e))}function dittoAuthClientSetValidityListener(e,t,r){ensureInitialized();return ditto_auth_client_set_validity_listener(e,wrapBackgroundCbForFFI(r,(function(e,r){return t(1===e,1===r)})))}function transportsInit(){ensureInitialized();const{output:e,errorType:t}=withTransportsError(ditto_sdk_transports_init);if(!1===e)throw new Error(`Failed to initialize transports (${t} error)`)}function transportsBLEIsAvailable(e){return ensureInitialized(),ditto_sdk_transports_ble_is_available(e)}function transportsBLECreate(e){ensureInitialized();{const{output:t,errorType:r}=withTransportsError(ditto_sdk_transports_ble_create,e);return null!=t?log("Info","Bluetooth transport created."):log("Error",`Can't create bluetooth transport (${r} error).`),t}}function transportsBLEDestroy(e){ensureInitialized();{const{output:t,errorType:r}=withTransportsError(ditto_sdk_transports_ble_destroy,e);return!0===t?log("Info","Bluetooth transport disabled."):log("Error",`Bluetooth transport could not be disabled (${r} error).`),t}}function transportsLANIsAvailable(e){return ensureInitialized(),ditto_sdk_transports_lan_is_available(e)}function transportsLANCreate(e){ensureInitialized();{const{output:t,errorType:r}=withTransportsError(ditto_sdk_transports_lan_create,e);return null!=t?log("Info","LAN transport created."):log("Error",`Can't create LAN transport (${r} error).`),t}}function transportsLANDestroy(e){ensureInitialized();{const{output:t,errorType:r}=withTransportsError(ditto_sdk_transports_lan_destroy,e);return!0===t?log("Info","LAN transport disabled."):log("Error",`LAN transport could not be disabled (${r} error).`),t}}function transportsAWDLIsAvailable(e){return ensureInitialized(),ditto_sdk_transports_awdl_is_available(e)}function transportsAWDLCreate(e){ensureInitialized();{const{output:t,errorType:r}=withTransportsError(ditto_sdk_transports_awdl_create,e);return null!=t?log("Info","AWDL transport created."):log("Error",`Can't create AWDL transport (${r} error).`),t}}function transportsAWDLDestroy(e){ensureInitialized();{const{output:t,errorType:r}=withTransportsError(ditto_sdk_transports_awdl_destroy,e);return!0===t?log("Info","AWDL transport disabled."):log("Error",`AWDL transport could not be disabled (${r} error).`),t}}function withTransportsError(e,...t){const r=ditto_sdk_transports_error_new(),n=e(...t,r),i=ditto_sdk_transports_error_value(r);return ditto_sdk_transports_error_free(r),{output:n,errorType:i}}!function(e){e[e.counter=0]="counter",e[e.register=1]="register",e[e.attachment=2]="attachment",e[e.rga=3]="rga",e[e.rwMap=4]="rwMap"}(DittoCRDTType||(DittoCRDTType={}));let isInitialized=!1;function tryVerifyLicense(e){ensureInitialized();throwOnErrorResult(dittoffi_try_verify_license(bytesFromString(e)).error,"dittoffi_try_verify_license")}function defaultDeviceName(){return defaultDeviceName$1()}function createDirectory(e){return createDirectory$1(e)}function readFile(e){return readFile$1(e)}function copyFile(e,t,r){return copyFile$1(e,t,r)}function wrapBackgroundCbForFFI(e,t){return t}function wrapAsyncBackgroundCbForFFI(e,t){return t}function bytesFromString(e){if(void 0===e)return;if(null===e)return null;if("string"!=typeof e)throw new Error(`Can't convert string to Uint8Array, not a string: ${e}`);return(new TextEncoder).encode(`${e}\0`)}function errorMessage(){ensureInitialized();return boxCStringIntoString(ditto_error_message())}function ensureInitialized(){if(!isInitialized)throw new Error("Ditto needs to be initialized before using any of its API, please make sure to call `await init()` first.")}isInitialized=!0;const ERROR_CODES={internal:"An unexpected internal error occurred. Please get in touch with Ditto customer service to report this incident.","internal/unknown-error":"An unexpected internal error occurred. Please get in touch with Ditto customer service to report this incident.","sdk/unsupported":"The feature is not supported by the current environment.","authentication/failed-to-authenticate":"Ditto failed to authenticate.","io/already-exists":"A file or directory already exists.","io/not-found":"A file or directory could not be found.","io/permission-denied":"The operation failed due to insufficient permissions.","io/operation-failed":"The operation failed.","query/arguments-invalid":"The query arguments were invalid.","query/execution":"The query could not be executed.","query/invalid":"The query was invalid.","query/unsupported":"The query contains unsupported features.","query/parameter":"The query to update system parameters failed.","store/backend":"An error occurred with the storage backend.","store/crdt":"An error occurred processing a CRDT.","store/document-not-found":"The document with the provided ID could not be found.","store/attachment-file-permission-denied":"Permission has been denied for a file operation when working with attachments.","store/attachment-file-not-found":"The source file for the attachment does not exist.","store/attachment-not-found":"The attachment could not be found.","store/attachment-token-invalid":"The attachment token is invalid.","store/failed-to-create-attachment":"The attachment could not be created.","store/failed-to-fetch-attachment":"The attachment could not be fetched.","activation/license-token-verification-failed":"Please provide a valid license token.","activation/license-token-expired":"The license token expired. Please renew it.","activation/license-token-unsupported-future-version":"The provided license token is in an unsupported future format.","activation/not-activated":"The operation failed because the Ditto instance has not yet been activated.","validation/depth-limit-exceeded":"The maximum depth limit has been exceeded.","validation/invalid-cbor":"The value provided is not valid CBOR.","validation/invalid-json":"The value provided is not valid JSON.","validation/not-an-object":"The value provided is not of type object.","validation/not-json-compatible":"Value is not serializable as JSON.","validation/size-limit-exceeded":"The size limit has been exceeded."},DEFAULT_STATUS_CODE_MAPPING={ActivationLicenseTokenExpired:["activation/license-token-expired"],ActivationLicenseTokenInvalid:["activation/license-token-verification-failed"],ActivationLicenseUnsupportedFutureVersion:["activation/license-token-unsupported-future-version"],ActivationNotActivated:["activation/not-activated"],IoAlreadyExists:["io/already-exists"],IoNotFound:["io/not-found"],IoPermissionDenied:["io/permission-denied"],IoOperationFailed:["io/operation-failed"],JsFloatingStoreOperation:["internal","Internal inconsistency, an outstanding store operation was not awaited."],DqlQueryCompilation:["query/invalid"],DqlInvalidQueryArgs:["query/arguments-invalid"],DqlUnsupported:["query/unsupported"],StoreQuery:["query/execution"],ParameterQuery:["query/parameter"],StoreDocumentNotFound:["store/document-not-found"],StoreDatabase:["store/backend"],Crdt:["store/crdt"],Base64Invalid:["internal","Invalid base64 encoding."],ValidationDepthLimitExceeded:["validation/depth-limit-exceeded"],ValidationInvalidCbor:["validation/invalid-cbor"],ValidationInvalidJson:["validation/invalid-json"],ValidationNotAMap:["validation/not-an-object"],ValidationSizeLimitExceeded:["validation/size-limit-exceeded"],Unsupported:["sdk/unsupported"],Unknown:["internal/unknown-error"],default:["internal/unknown-error"]};class DittoError extends Error{constructor(e,t,r={}){if(null==ERROR_CODES[e])throw new DittoError("internal",`Invalid error code: ${e}`);super(t||ERROR_CODES[e]),this.code="internal",this.code=e,this.context=Object.freeze({...r})}static fromFFIError(e,t,r,n){const i=r||e.message,o={coreError:e.code,coreErrorMessage:e.message,...n},s=new DittoError(t,i,o);return null!=e.stack&&(s.stack=e.stack),s}}function mapFFIErrors(e,t,r){try{return e()}catch(e){if(e instanceof DittoFFIError)throw translateFFIError(e,t,r);throw e}}async function mapFFIErrorsAsync(e,t,r){try{return await e()}catch(e){if(e instanceof DittoFFIError)throw translateFFIError(e,t,r);throw e}}const translateFFIError=(e,t,r)=>{var n;const i=e.code.toString();let o,s;return null!=t&&null!=t[i]?[o,s]=t[i]:[o,s]=null!==(n=DEFAULT_STATUS_CODE_MAPPING[i])&&void 0!==n?n:DEFAULT_STATUS_CODE_MAPPING.default,DittoError.fromFFIError(e,o,s,r)};class AttachmentToken{constructor(e){let t,r,n;null!=e[DittoCRDTTypeKey]?({id:t,len:r,meta:n}=AttachmentToken.validateTypedInput(e)):({id:t,len:r,meta:n}=AttachmentToken.validateUntypedInput(e)),this.id=mapFFIErrors((()=>base64encode(t,"Unpadded"))),this.idBytes=t,this.len=r,this.metadata=n}static validateTypedInput(e){if(e[DittoCRDTTypeKey]!==DittoCRDTType.attachment)throw new Error("Invalid attachment token");const t=e._id;if(!(t instanceof Uint8Array))throw new Error("Invalid attachment token id");const r=e._len;if("number"!=typeof r&&"bigint"!=typeof r||r<0)throw new Error("Invalid attachment token length, must be a non-negative number or bigint");const n=e._meta;if("object"!=typeof n)throw new Error("Invalid attachment token meta");return{id:t,len:r,meta:n}}static validateUntypedInput(e){const t=e.id;if("string"!=typeof t)throw new Error("Invalid attachment token id");const r=mapFFIErrors((()=>tryBase64Decode(t,"Unpadded")),{Base64Invalid:["store/attachment-token-invalid","Failed to decode attachment token id from base64 input"]},{attachmentTokenID:t}),n=e.len;if("number"!=typeof n&&"bigint"!=typeof n||n<0)throw new Error("Invalid attachment token length, must be a non-negative number or bigint");const i=e.metadata;if("object"!=typeof i)throw new Error("Invalid attachment token meta");return{id:r,len:n,meta:i}}}class Logger{static get logFile(){return this._logFile}static setLogFile(e){e?(loggerSetLogFile(e),this._logFile=e):(loggerSetLogFile(void 0),delete this._logFile)}static setLogFileURL(e){var t;this.setLogFile(null!==(t=null==e?void 0:e.pathname)&&void 0!==t?t:null)}static get enabled(){return loggerEnabledGet()}static set enabled(e){loggerEnabled(e)}static get emojiLogLevelHeadingsEnabled(){return loggerEmojiHeadingsEnabledGet()}static set emojiLogLevelHeadingsEnabled(e){loggerEmojiHeadingsEnabled(e)}static get minimumLogLevel(){return loggerMinimumLogLevelGet()}static set minimumLogLevel(e){loggerMinimumLogLevel(e)}static get customLogCallback(){return this._customLogCallback}static async setCustomLogCallback(e){if(null!=e&&"function"!=typeof e)throw new TypeError(`Expected parameter 'callback' to be a function or undefined, but got ${typeof e}.`);null!=e?(await loggerSetCustomLogCb(e),this._customLogCallback=e):(await loggerSetCustomLogCb(null),delete this._customLogCallback)}static async exportToFile(e){if("string"!=typeof e)throw new TypeError(`Expected parameter 'path' to be a string, but got ${typeof e}.`);let t=e;return mapFFIErrorsAsync((()=>loggerTryExportToFileAsync(t)))}static log(e,t){log(e,t)}static error(e){this.log("Error",e)}static warning(e){this.log("Warning",e)}static info(e){this.log("Info",e)}static debug(e){this.log("Debug",e)}static verbose(e){this.log("Verbose",e)}constructor(){throw new Error("Logger can't be instantiated, use its static properties & methods directly instead.")}}var _a;const DEBUG_TYPE_NAMES=[],DEBUG_ALL_TYPES=!1;class Handle{constructor(e,t,r){this.isClosed=!1,this.isFinalized=!1,this.isUnregistered=!1,this.bridge=e,this.objectWeakRef=new WeakRef(t),this.pointer=r}get type(){return this.bridge.type}deref(){if(this.isClosed)throw new Error("Bridging error: can't get pointer for an object that has been closed.");if(this.isFinalized)throw new Error("Bridging error: can't get pointer for an object that has been finalized.");if(this.isUnregistered)throw new Error("Bridging error: can't get pointer for an object that has been unregistered.");return this.pointer}derefOrNull(){var e;return this.isClosed||this.isFinalized||this.isUnregistered?null:null!==(e=this.pointer)&&void 0!==e?e:null}object(){const e=this.objectWeakRef.deref();if(null==e)throw new Error(`Bridging error: ${this.bridge.type.name} object has been garbage collected.`);if(this.isClosed)throw new Error(`Bridging error: ${this.bridge.type.name} object has been closed.`);if(this.isUnregistered)throw new Error(`Bridging error: ${this.bridge.type.name} object has been unregistered.`);return e}objectOrNull(){var e;return null!==(e=this.objectWeakRef.deref())&&void 0!==e?e:null}toString(){const e=this.derefOrNull();return`{ Handle | type: ${this.bridge.type}, object: ${this.objectWeakRef.deref()}, FFI address: ${null==e?void 0:e.addr}, FFI type: ${null==e?void 0:e.type} }`}bridgeWillClose(){this.isClosed=!0}bridgeDidClose(){this.pointer=null}bridgeWillFinalize(){this.isFinalized=!0}bridgeDidFinalize(){this.pointer=null}bridgeWillUnregister(){this.isUnregistered=!0}bridgeDidUnregister(){this.pointer=null}}class Handles{constructor(e,t){this.handles=t.map((t=>e.handleFor(t)))}deref(){return this.handles.map((e=>e.deref()))}}class Bridge{constructor(e){this.internalType=null,this.release=e,this.handlesByAddress={},this.handlesByObject=new WeakMap,this.finalizationRegistry=new FinalizationRegistry(this.finalize.bind(this)),_a.all.push(new WeakRef(this))}get type(){if(null==this.internalType)throw new Error("Bridge type has not been registered yet.");return this.internalType}registerType(e){if(this.internalType!==e){if(this.internalType)throw new Error(`Can't register bridged type '${e.name}', another type was already registered: ${this.internalType}`);this.internalType=e}}handleFor(e){const t=this.handlesByObject.get(e);if(null==t)throw new Error(`Bridging error: ${this.type.name} object is not currently registered in this bridge.`);return t}handlesFor(e){return new Handles(this,e)}objectFor(e){const t=this.handlesByAddress[e.addr];if(t){if(t.type!==this.type)throw new Error(`Can't return object for pointer, pointer is associated with an object of type ${t.type} but this bridge is configured for ${this.type}`);return t.object()}}bridge(e,t){const r=this.objectFor(e);if(r)return r;let n;if(t||(t=()=>Reflect.construct(this.type,[])),"function"==typeof t){if(n=t(),!(n instanceof this.type))throw new Error(`Can't bridge, expected passed in create function to return a ${this.type.name} object but got: ${n}`)}else n=t;return this.register(n,e),n}register(e,t){const r=e.constructor;if(r!==this.type)throw new Error(`Can't register, bridge is configured for type ${this.type.name} but passed in object is of type ${r.name}`);const n=this.handlesByObject.get(e),i=n?n.pointer:null;if(null!=i&&null!=n)throw new Error(`Can't register, an object for the passed in pointer has previously been registered: ${n.object()}`);if(null!=i&&null==n)throw new Error(`Internal inconsistency, trying to register an object which has an associated pointer but no handle entry: ${r.name} at ${i.type} ${i.addr}`);if(null==i&&null!=n)throw new Error(`Internal inconsistency, trying to register an object which has a handle entry but no associated pointer: ${r.name} ${e}`);const o=new Handle(this,e,t);this.handlesByAddress[t.addr]=o,this.handlesByObject.set(e,o),this.finalizationRegistry.register(e,o,e),DEBUG_TYPE_NAMES.includes(this.type.name)&&Logger.debug(`[VERBOSE] Bridge REGISTERED a new instance of ${this.type.name}, current count: ${Object.keys(this.handlesByAddress).length}`)}unregister(e){const t=e.constructor,r=this.type;if(t!==r)throw new Error(`Can't unregister, bridge is configured for type ${r.name} but passed in object is of type ${t.name}`);const n=this.handlesByObject.get(e);if(null==n)throw new Error(`Can't unregister, object has not been registered before: ${e}`);if(n.type!==r)throw new Error(`Internal inconsistency, trying to unregister an object that has a handle with a different type than that of the bridge: ${n}`);if(n.objectOrNull()!==e)throw new Error(`Internal inconsistency, trying to unregister an object whose associated handle holds a different object: ${n}`);if(n.isClosed)throw new Error(`Can't unregister, object has been closed before: ${e}`);if(n.isFinalized)throw new Error(`Can't unregister, object has been finalized before: ${e}`);if(n.isUnregistered)throw new Error(`Can't unregister, object has been unregistered already: ${e}`);n.bridgeWillUnregister(),this.finalizationRegistry.unregister(e),delete this.handlesByAddress[n.pointer.addr],this.handlesByObject.delete(e),n.bridgeDidUnregister(),DEBUG_TYPE_NAMES.includes(this.type.name)&&Logger.debug(`[VERBOSE] Bridge UNREGISTERED an instance of ${this.type.name}, current count: ${Object.keys(this.handlesByAddress).length}`)}unregisterAll(){DEBUG_TYPE_NAMES.includes(this.type.name)&&Logger.debug(`[VERBOSE] Unregistering ALL bridged instances of type ${this.type.name}.`);for(const e of Object.values(this.handlesByAddress)){const t=e.object();t&&this.unregister(t)}}async close(e){const t=e.constructor,r=this.type;if(t!==r)throw new Error(`Can't close, bridge is configured for type ${r.name} but passed in object is of type ${t.name}`);const n=this.handlesByObject.get(e);if(null==n)throw new Error(`Can't close an object that has not been registered before: ${e}`);if(n.type!==r)throw new Error(`Internal inconsistency, trying to close an object that has a handle with a different type than that of the bridge: ${n}`);if(n.isUnregistered)throw new Error("Can't close object, object has been unregistered.");if(n.isFinalized)throw new Error("Internal inconsistency, trying to close an object that has already been finalized.");if(n.isClosed)return;const i=n.pointer;if(!i)throw new Error("Internal inconsistency, trying to close an object whose pointer is null.");n.bridgeWillClose(),delete this.handlesByAddress[i.addr],await this.release(i),n.bridgeDidClose(),DEBUG_TYPE_NAMES.includes(this.type.name)&&Logger.debug(`[VERBOSE] Bridge CLOSED an instance of ${this.type.name}, current count: ${Object.keys(this.handlesByAddress).length}`)}get count(){return Object.keys(this.handlesByAddress).length}async finalize(e){if(e.isFinalized)throw new Error("Internal inconsistency, trying to finalize an object that has already been finalized.");if(e.isUnregistered)throw new Error("Internal inconsistency, trying to finalize an object that has been unregistered before.");if(e.bridgeWillFinalize(),!e.isClosed){const t=e.pointer;if(!t)throw new Error("Internal inconsistency, trying to finalize an object whose pointer is null.");delete this.handlesByAddress[t.addr],await this.release(t)}e.bridgeDidFinalize(),DEBUG_TYPE_NAMES.includes(this.type.name)&&Logger.debug(`[VERBOSE] Bridge FINALIZED an instance of ${this.type.name}, current count: ${Object.keys(this.handlesByAddress).length}`)}}_a=Bridge,Bridge.all=[],Bridge.attachment=new _a(freeAttachmentHandle),Bridge.connectionRequest=new _a(connectionRequestFree),Bridge.document=new _a(documentFree),Bridge.mutableDocument=new _a(documentFree),Bridge.queryResult=new _a(queryResultFree),Bridge.queryResultItem=new _a(queryResultItemFree),Bridge.ditto=new _a((async e=>{await dittoClearPresenceCallback(),await dittoShutdown(e),dittoFree(e)}));class Attachment{get id(){return this.token.id}get len(){return this.token.len}get metadata(){return this.token.metadata}data(){return this.ditto.deferCloseAsync((async e=>{{const t=Bridge.attachment.handleFor(this),r=dittoGetCompleteAttachmentPath(e.deref(),t.deref());return await readFile(r)}}))}getData(){return this.data()}copyToPath(e){return this.ditto.deferCloseAsync((async t=>{{const r=Bridge.attachment.handleFor(this);copyFile(dittoGetCompleteAttachmentPath(t.deref(),r.deref()),e,this.ditto.persistenceDirectory)}}))}constructor(e,t){this.ditto=e,this.token=t}}function validateAttachmentMetadata(e){if("object"!=typeof e)throw new DittoError("store/failed-to-create-attachment",`Invalid attachment metadata: expected a value of type object but got ${typeof e}.`);for(const t in e)if("string"!=typeof e[t])throw new DittoError("store/failed-to-create-attachment",`Invalid attachment metadata: metadata values must be strings but key '${t}' has a value of type ${typeof e[t]}.`)}const defaultDittoCloudDomain="cloud.ditto.live";function defaultAuthURL(e){return`https://${e}.${defaultDittoCloudDomain}`}function defaultDittoCloudURL(e){return`wss://${e}.${defaultDittoCloudDomain}`}function validateQuery(e,t={}){var r;const n=null!==(r=t.errorMessagePrefix)&&void 0!==r?r:"Query validation failed,";if("string"!=typeof e)throw new Error(`${n} query is not a string: ${e}`);if(""===e)throw new Error(`${n} query is an empty string.`);const i=e.trim();if(""===i)throw new Error(`${n} query contains only whitespace characters.`);return i}function customInspectRepresentation(e,t){return void 0===t?`${e.constructor.name} ${JSON.stringify({value:e.value},null,2)}`:`${e.constructor.name} ${t({value:e.value})}`}function sleep(e){return new Promise(((t,r)=>{setTimeout(t,e)}))}async function step(e){return await sleep(0),e()}const performAsyncToWorkaroundNonAsyncFFIAPI=step;class AttachmentFetcher{stop(){if(null==this.manager){this.isStopped||(this.rejectPendingFetch(),this.rejectPendingFetch=null),this.ditto.store.removeAttachmentFetcher(this);const e=Bridge.ditto.handleFor(this.ditto);this.ditto.deferCloseAsync((async()=>{const t=await this.cancelTokenPromise;t&&dittoCancelResolveAttachment(e.deref(),this.token.idBytes,t)}))}else step((async()=>{await this.manager.stopAttachmentFetcher(this),null!=this.rejectPendingFetch&&(this.rejectPendingFetch(),this.rejectPendingFetch=null)}))}then(e,t){return this.attachment.then(e,t)}constructor(e,t,r,n){this.cancelTokenPromise=null,this.rejectPendingFetch=null,this.ditto=e,this.token=t,this.manager=r,this.id=cryptoGenerateSecureRandomToken();const i=n||function(){},o=Bridge.ditto.handleFor(e);this.attachment=new Promise(((e,r)=>{const onComplete=t=>{const r=new Attachment(this.ditto,this.token);Bridge.attachment.bridge(t,(()=>r)),i({type:"Completed",attachment:r}),this.rejectPendingFetch=null,e(r)},onProgress=(e,t)=>{i({type:"Progress",totalBytes:t,downloadedBytes:e})},onDelete=()=>{i({type:"Deleted"}),null!=this.manager?(this.rejectPendingFetch=null,e(null)):(this.rejectPendingFetch=null,r(new DittoError("store/attachment-not-found","The attachment was deleted while being fetched.")))},onError=()=>{};this.rejectPendingFetch=()=>{const e=null!=this.manager?new Error("Attachment fetch was canceled"):new DittoError("store/failed-to-fetch-attachment","Attachment fetch was canceled");r(e)};const n=new WeakRef(this);this.cancelTokenPromise=(async()=>{try{return await mapFFIErrorsAsync((async()=>dittoResolveAttachment(o.deref(),t.idBytes,{onComplete:onComplete,onProgress:onProgress,onDelete:onDelete},onError)),{1:["store/failed-to-fetch-attachment","Failed to fetch the attachment."],2:["store/attachment-token-invalid","The attachment token was invalid."],3:["store/attachment-not-found","The attachment was not found."]})}catch(t){let o=!1;t instanceof DittoError&&"store/attachment-not-found"===t.code&&(o=!0,i({type:"Deleted"})),Logger.error(t.message);const s=n.deref();return null==s||(null!=s.manager&&t instanceof DittoError&&(t=new Error(t.message)),s.rejectPendingFetch=null,null!=s.manager&&o?e(null):r(t)),null}})()})),null==r&&this.attachment.then((()=>{this.rejectPendingFetch=null,this.ditto.store.removeAttachmentFetcher(this)})).catch((()=>{this.rejectPendingFetch=null,this.ditto.store.removeAttachmentFetcher(this)}))}get isStopped(){return null==this.rejectPendingFetch}}async function init(e={}){}const CBOR_OPTIONS=Object.freeze({dictionary:"object",mode:"strict"}),EMPTY_KEY=Symbol("EMPTY_KEY"),OMIT_VALUE=Symbol("OMIT_VALUE"),POW_2_24=5.960464477539063e-8,POW_2_32=4294967296,POW_2_53=9007199254740992,MAX_SAFE_INTEGER=18446744073709551616n,DECODE_CHUNK_SIZE=8192,kCborTag=6,kCborTagUint8=64,kCborTagUint16=69,kCborTagUint32=70,kCborTagInt8=72,kCborTagInt16=77,kCborTagInt32=78,kCborTagFloat32=85,kCborTagFloat64=86;function objectIs(e,t){return"function"==typeof Object.is?Object.is(e,t):e===t?0!==e||1/e==1/t:e!=e&&t!=t}function options(e){const t={...CBOR_OPTIONS};return"object"==typeof e&&(t.dictionary=function isDictionary(e){return"string"==typeof e&&["object","map"].includes(e)}(e.dictionary)?e.dictionary:CBOR_OPTIONS.dictionary,t.mode=function isMode(e){return"string"==typeof e&&["loose","strict","sequence"].includes(e)}(e.mode)?e.mode:CBOR_OPTIONS.mode),Object.freeze(t)}function lexicographicalCompare(e,t){const r=Math.min(e.byteLength,t.byteLength);for(let n=0;n<r;n++){const r=e[n]-t[n];if(0!==r)return r}return e.byteLength-t.byteLength}var _Sequence_instances,_Sequence_toInspectString,__classPrivateFieldGet=function(e,t,r,n){if("a"===r&&!n)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===r?n:"a"===r?n.call(e):n?n.value:t.get(e)};class Sequence{static from(e){return new Sequence(Array.from(e))}constructor(e){_Sequence_instances.add(this),Object.defineProperty(this,"_data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this._data=e||[]}add(e){return this._data.push(e)-1}remove(e){return this._data.splice(e,1)[0]}get(e){return this._data[e]}clone(){return new Sequence(this.data)}get data(){return Array.from(this._data)}get size(){return this._data.length}[(_Sequence_instances=new WeakSet,Symbol.toStringTag)](){return"Sequence"}[(_Sequence_toInspectString=function _Sequence_toInspectString(e){return`${this[Symbol.toStringTag]()}(${this.size}) ${e(this._data)}`},Symbol.for("Deno.customInspect"))](e){return __classPrivateFieldGet(this,_Sequence_instances,"m",_Sequence_toInspectString).call(this,e)}[Symbol.for("nodejs.util.inspect.custom")](e,t,r){return __classPrivateFieldGet(this,_Sequence_instances,"m",_Sequence_toInspectString).call(this,r)}}class SimpleValue{static create(e){if(void 0===e)return new SimpleValue(23);if(null===e)return new SimpleValue(22);if(!0===e)return new SimpleValue(21);if(!1===e)return new SimpleValue(20);if("number"==typeof e&&e>=0&&e<=255)return new SimpleValue(e);throw new Error("CBORError: Value out of range or not a simple value.")}constructor(e){switch(Object.defineProperty(this,"semantic",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"value",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),!0){case 20===e:this.semantic="false";break;case 21===e:this.semantic="true";break;case 22===e:this.semantic="null";break;case 23===e:this.semantic="undefined";break;case e>23&&e<32:this.semantic="reserved";break;default:this.semantic="unassigned"}this.value=e}toPrimitive(){switch(this.semantic){case"false":return!1;case"true":return!0;case"null":return null;default:return}}}class TaggedValue{constructor(e,t){Object.defineProperty(this,"value",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"tag",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.value=e,this.tag=t}}function decode(e,t,r={}){const{dictionary:n,mode:i}=options(r),o="sequence"===i||"strict"===i,s=new DataView(e),a=new Uint8Array(e);let d=0,reviverFunction=function(e,t){return t};function commitRead(e,t){return d+=e,t}function readArrayBuffer(t){return commitRead(t,new Uint8Array(e,d,t))}function readUint8(){return commitRead(1,a[d])}function readUint16(){return commitRead(2,s.getUint16(d))}function readBreak(){return 255===a[d]&&(d+=1,!0)}function readLength(e){if(e<24)return e;if(24===e)return readUint8();if(25===e)return readUint16();if(26===e)return function readUint32(){return commitRead(4,s.getUint32(d))}();if(27===e){const e=function readUint64(){return commitRead(8,s.getBigUint64(d))}();return e<POW_2_53?Number(e):e}if(31===e)return-1;throw new Error("CBORError: Invalid length encoding")}function readIndefiniteStringLength(e){const t=readUint8();if(255===t)return-1;const r=readLength(31&t);if(r<0||t>>5!==e)throw new Error("CBORError: Invalid indefinite length element");return Number(r)}function appendUtf16Data(e,t){for(let r=0;r<t;++r){let r=readUint8();128&r&&(r<224?(r=(31&r)<<6|63&readUint8(),t-=1):r<240?(r=(15&r)<<12|(63&readUint8())<<6|63&readUint8(),t-=2):(r=(15&r)<<18|(63&readUint8())<<12|(63&readUint8())<<6|63&readUint8(),t-=3)),r<65536?e.push(r):(r-=65536,e.push(55296|r>>10),e.push(56320|1023&r))}}function decodeItem(){const e=readUint8(),t=e>>5,r=31&e;let i,a;if(7===t)switch(r){case 25:return function readFloat16(){const e=new ArrayBuffer(4),t=new DataView(e),r=readUint16(),n=32768&r;let i=31744&r;const o=1023&r;if(31744===i)i=261120;else if(0!==i)i+=114688;else if(0!==o)return(n?-1:1)*o*POW_2_24;return t.setUint32(0,n<<16|i<<13|o<<13),t.getFloat32(0)}();case 26:return function readFloat32(){return commitRead(4,s.getFloat32(d))}();case 27:return function readFloat64(){return commitRead(8,s.getFloat64(d))}()}if(a=readLength(r),a<0&&(t<2||6<t))throw new Error("CBORError: Invalid length");switch(t){case 0:return reviverFunction(EMPTY_KEY,a);case 1:return reviverFunction(EMPTY_KEY,"number"==typeof a?-1-a:-1n-a);case 2:if(a<0){const e=[];let r=0;for(;(a=readIndefiniteStringLength(t))>=0;)r+=a,e.push(readArrayBuffer(a));const n=new Uint8Array(r);let o=0;for(i=0;i<e.length;++i)n.set(e[i],o),o+=e[i].length;return reviverFunction(EMPTY_KEY,n)}return reviverFunction(EMPTY_KEY,readArrayBuffer(a));case 3:{const e=[];if(a<0)for(;(a=readIndefiniteStringLength(t))>=0;)appendUtf16Data(e,a);else appendUtf16Data(e,a);let r="";for(i=0;i<e.length;i+=DECODE_CHUNK_SIZE)r+=String.fromCharCode.apply(null,e.slice(i,i+DECODE_CHUNK_SIZE));return reviverFunction(EMPTY_KEY,r)}case 4:{let e;if(a<0){e=[];let t=0;for(;!readBreak();)e.push(reviverFunction(t++,decodeItem()))}else for(e=new Array(a),i=0;i<a;++i)e[i]=reviverFunction(i,decodeItem());return reviverFunction(EMPTY_KEY,e)}case 5:{if("map"===n){const e=new Map;for(i=0;i<a||a<0&&!readBreak();++i){const t=decodeItem();if(o&&e.has(t))throw new Error("CBORError: Duplicate key encountered");e.set(t,reviverFunction(t,decodeItem()))}return reviverFunction(EMPTY_KEY,e)}const e={};for(i=0;i<a||a<0&&!readBreak();++i){const t=decodeItem();if(o&&Object.prototype.hasOwnProperty.call(e,t))throw new Error("CBORError: Duplicate key encountered");e[t]=reviverFunction(t,decodeItem())}return reviverFunction(EMPTY_KEY,e)}case 6:{const e=decodeItem(),t=a;if(e instanceof Uint8Array){const r=e.buffer.slice(e.byteOffset,e.byteLength+e.byteOffset);switch(t){case kCborTagUint8:return reviverFunction(EMPTY_KEY,new Uint8Array(r));case kCborTagInt8:return reviverFunction(EMPTY_KEY,new Int8Array(r));case kCborTagUint16:return reviverFunction(EMPTY_KEY,new Uint16Array(r));case kCborTagInt16:return reviverFunction(EMPTY_KEY,new Int16Array(r));case kCborTagUint32:return reviverFunction(EMPTY_KEY,new Uint32Array(r));case kCborTagInt32:return reviverFunction(EMPTY_KEY,new Int32Array(r));case kCborTagFloat32:return reviverFunction(EMPTY_KEY,new Float32Array(r));case kCborTagFloat64:return reviverFunction(EMPTY_KEY,new Float64Array(r))}}return reviverFunction(EMPTY_KEY,new TaggedValue(e,t))}case 7:switch(a){case 20:return reviverFunction(EMPTY_KEY,!1);case 21:return reviverFunction(EMPTY_KEY,!0);case 22:return reviverFunction(EMPTY_KEY,null);case 23:return reviverFunction(EMPTY_KEY,void 0);default:return reviverFunction(EMPTY_KEY,new SimpleValue(a))}}}"function"==typeof t&&(reviverFunction=t);const c=decodeItem();if(d!==e.byteLength){if("sequence"!==i)throw new Error("CBORError: Remaining bytes");const t=new Sequence([c]);for(;d<e.byteLength;)t.add(reviverFunction(EMPTY_KEY,decodeItem()));return t}return"sequence"===i?new Sequence([c]):c}function parse(e,t,r){return decode(e,t,r)}function encode(e,t){let r,n=new ArrayBuffer(256),i=new DataView(n),o=new Uint8Array(n),s=0,replacerFunction=(e,t)=>t;if("function"==typeof t&&(replacerFunction=t),Array.isArray(t)){const e=t.slice();replacerFunction=(t,r)=>t===EMPTY_KEY||e.includes(t)?r:OMIT_VALUE}function prepareWrite(e){let t=n.byteLength;const a=s+e;for(;t<a;)t<<=1;if(t!==n.byteLength){const e=i;n=new ArrayBuffer(t),i=new DataView(n),o=new Uint8Array(n);const r=s+3>>2;for(let t=0;t<r;++t)i.setUint32(t<<2,e.getUint32(t<<2))}return r=e,i}function commitWrite(...e){s+=r}function writeUint8(e){commitWrite(prepareWrite(1).setUint8(s,e))}function writeUint8Array(e){prepareWrite(e.length),o.set(e,s),commitWrite()}function writeUint16(e){commitWrite(prepareWrite(2).setUint16(s,e))}function writeUint32(e){commitWrite(prepareWrite(4).setUint32(s,e))}function writeUint64(e){const t=e%POW_2_32,r=(e-t)/POW_2_32,n=prepareWrite(8);n.setUint32(s,r),n.setUint32(s+4,t),commitWrite()}function writeBigUint64(e){commitWrite(prepareWrite(8).setBigUint64(s,e))}function writeVarUint(e,t){e<=255?e<24?writeUint8(Number(e)|t):(writeUint8(24|t),writeUint8(Number(e))):e<=65535?(writeUint8(25|t),writeUint16(Number(e))):e<=4294967295?(writeUint8(26|t),writeUint32(Number(e))):(writeUint8(27|t),"number"==typeof e?writeUint64(e):writeBigUint64(e))}function writeTypeAndLength(e,t){t<24?writeUint8(e<<5|t):t<256?(writeUint8(e<<5|24),writeUint8(t)):t<65536?(writeUint8(e<<5|25),writeUint16(t)):t<4294967296?(writeUint8(e<<5|26),writeUint32(t)):(writeUint8(e<<5|27),writeUint64(t))}function encodeItem(e){if(e!==OMIT_VALUE){if(!1===e)return writeUint8(244);if(!0===e)return writeUint8(245);if(null===e)return writeUint8(246);if(void 0===e)return writeUint8(247);if(objectIs(e,-0))return writeUint8Array([249,128,0]);switch(typeof e){case"bigint":return function writeBigInteger(e){let t=0;if(0<=e&&e<=MAX_SAFE_INTEGER)t=0;else{if(!(-MAX_SAFE_INTEGER<=e&&e<0))throw new Error("CBORError: Encountered unsafe integer outside of valid CBOR range.");t=1,e=-(e+1n)}if(e<0x100000000n)return writeTypeAndLength(t,Number(e));writeUint8(t<<5|27),writeBigUint64(e)}(e);case"number":if(Math.floor(e)===e){if(0<=e&&e<=POW_2_53)return writeTypeAndLength(0,e);if(-POW_2_53<=e&&e<0)return writeTypeAndLength(1,-(e+1))}return writeUint8(251),function writeFloat64(e){commitWrite(prepareWrite(8).setFloat64(s,e))}(e);case"string":{const t=[],r=e.length;for(let n=0;n<r;++n){let r=e.charCodeAt(n);r<128?t.push(r):r<2048?(t.push(192|r>>6),t.push(128|63&r)):r<55296||r>=57344?(t.push(224|r>>12),t.push(128|r>>6&63),t.push(128|63&r)):(r=(1023&r)<<10,r|=1023&e.charCodeAt(++n),r+=65536,t.push(240|r>>18),t.push(128|r>>12&63),t.push(128|r>>6&63),t.push(128|63&r))}return writeTypeAndLength(3,t.length),writeUint8Array(t)}default:{let t;if(Array.isArray(e))!function writeArray(e){const t=s,r=e.length;let n=0;writeTypeAndLength(4,r);const i=s;for(let t=0;t<r;t+=1){const r=replacerFunction(t,e[t]);r!==OMIT_VALUE&&(encodeItem(r),n+=1)}if(r>n){const e=o.slice(i,s);s=t,writeTypeAndLength(4,n),writeUint8Array(e)}}(e);else if(e instanceof Uint8Array)writeVarUint(kCborTagUint8,kCborTag<<5),writeTypeAndLength(2,e.length),writeUint8Array(e);else if(e instanceof Int8Array)writeVarUint(kCborTagInt8,kCborTag<<5),writeTypeAndLength(2,e.byteLength),writeUint8Array(new Uint8Array(e.buffer));else if(e instanceof Uint16Array)writeVarUint(kCborTagUint16,kCborTag<<5),writeTypeAndLength(2,e.byteLength),writeUint8Array(new Uint8Array(e.buffer));else if(e instanceof Int16Array)writeVarUint(kCborTagInt16,kCborTag<<5),writeTypeAndLength(2,e.byteLength),writeUint8Array(new Uint8Array(e.buffer));else if(e instanceof Uint32Array)writeVarUint(kCborTagUint32,kCborTag<<5),writeTypeAndLength(2,e.byteLength),writeUint8Array(new Uint8Array(e.buffer));else if(e instanceof Int32Array)writeVarUint(kCborTagInt32,kCborTag<<5),writeTypeAndLength(2,e.byteLength),writeUint8Array(new Uint8Array(e.buffer));else if(e instanceof Float32Array)writeVarUint(kCborTagFloat32,kCborTag<<5),writeTypeAndLength(2,e.byteLength),writeUint8Array(new Uint8Array(e.buffer));else if(e instanceof Float64Array)writeVarUint(kCborTagFloat64,kCborTag<<5),writeTypeAndLength(2,e.byteLength),writeUint8Array(new Uint8Array(e.buffer));else if(ArrayBuffer.isView(e))t=new Uint8Array(e.buffer),writeTypeAndLength(2,t.length),writeUint8Array(t);else if(e instanceof ArrayBuffer||"function"==typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer)t=new Uint8Array(e),writeTypeAndLength(2,t.length),writeUint8Array(t);else if(e instanceof TaggedValue)writeVarUint(e.tag,192),encodeItem(e.value);else if(e instanceof SimpleValue)writeTypeAndLength(7,e.value);else if(e instanceof Sequence){if(0!==s)throw new Error("CBORError: A CBOR Sequence may not be nested.");const t=e.size;for(let r=0;r<t;r+=1)encodeItem(e.get(r))}else!function writeDictionary(e){const t=[],r=s;let n=s,i=0,a=0;if(e instanceof Map){i=e.size,writeTypeAndLength(5,i),n=s;for(const[r,n]of e.entries()){const e=replacerFunction(r,n);if(e===OMIT_VALUE)continue;let i=s;encodeItem(r);const d=o.slice(i,s);i=s,encodeItem(e);const c=o.slice(i,s);a+=1,t.push([d,c])}}else{const r=Object.keys(e);i=r.length,writeTypeAndLength(5,i),n=s;for(let n=0;n<i;n+=1){const i=r[n],d=replacerFunction(i,e[i]);if(d===OMIT_VALUE)continue;let c=s;encodeItem(i);const l=o.slice(c,s);c=s,encodeItem(d);const u=o.slice(c,s);a+=1,t.push([l,u])}}function sortEncodedKeys(e){s=r,writeTypeAndLength(5,a),t.sort((([e],[t])=>lexicographicalCompare(e,t)));for(let r=0;r<e;r+=1){const[e,n]=t[r];writeUint8Array(e),writeUint8Array(n)}}if(i>a){const e=t.length;if(e>1)sortEncodedKeys(e);else{const e=o.slice(n,s);s=r,writeTypeAndLength(5,a),writeUint8Array(e)}}else{const e=t.length;e>1&&sortEncodedKeys(e)}}(e)}}}}if(encodeItem(replacerFunction(EMPTY_KEY,e)),"slice"in n)return n.slice(0,s);const a=new ArrayBuffer(s),d=new DataView(a);for(let e=0;e<s;++e)d.setUint8(e,i.getUint8(e));return a}function binarify(e,t){return encode(e,t)}const CBOR$1={binarify:binarify,decode:decode,encode:encode,parse:parse};class CBOR{static encode(e){const t=CBOR$1.encode(e);return new Uint8Array(t)}static decode(e,t){const r=e.buffer;return CBOR$1.decode(r,t)}}class DocumentID{get value(){let e=this["@ditto.value"];return void 0===e&&(e=CBOR.decode(this["@ditto.cbor"]),this["@ditto.value"]=e),e}constructor(e,t=!1,r=!1){const n=t?e:CBOR.encode(e),i=r?n:validateDocumentIDCBOR(n);if(!i)throw new Error(`Can't create DocumentID, passed in value is not valid: ${e}`);this.isValidated=!r,this["@ditto.cbor"]=i}equals(e){const t=this["@ditto.cbor"],r=e["@ditto.cbor"];if(t===r)return!0;if(!(t instanceof Uint8Array))return!1;if(!(r instanceof Uint8Array))return!1;if(t.length!==r.length)return!1;for(let e=0;e<t.length;e+=1)if(t[e]!==r[e])return!1;return!0}toString(){return documentIDQueryCompatible(this["@ditto.cbor"],"WithoutQuotes")}toBase64String(){return mapFFIErrors((()=>base64encode(this["@ditto.cbor"],"Padded")))}toQueryCompatibleString(){return documentIDQueryCompatible(this["@ditto.cbor"],"WithQuotes")}toCBOR(){return this["@ditto.cbor"]}}function validateDocumentIDValue(e){if(void 0===e)throw new Error(`Invalid document ID: ${e}`);return e}function validateDocumentIDCBOR(e){const t=validateDocumentID(e);return null!=t?t:e}class Observer{get token(){return this._token}constructor(e,t,r={}){this.observerManager=e,this._token=t,this.options=r,r.stopsWhenFinalized&&Observer.finalizationRegistry.register(this,{observerManager:e,token:t},this)}get isStopped(){return void 0!==this.token&&this.observerManager.hasObserver(this.token)}stop(){const e=this.token;e&&(delete this._token,Observer.finalizationRegistry.unregister(this),this.observerManager.removeObserver(e))}static finalize(e){const{observerManager:t,token:r}=e;t.removeObserver(r)}}Observer.finalizationRegistry=new FinalizationRegistry(Observer.finalize);class ObserverManager{constructor(e,t={}){var r,n,i,o;const s=null!==(r=t.keepAlive)&&void 0!==r?r:null,a=null!==(n=t.register)&&void 0!==n?n:null,d=null!==(i=t.unregister)&&void 0!==i?i:null,c=null!==(o=t.process)&&void 0!==o?o:null;this.id=e,this.keepAlive=s,this.isClosed=!1,this.isRegistered=!1,this.callbacksByToken={},null!==a&&(this.register=a),null!==d&&(this.unregister=d),null!==c&&(this.process=c)}addObserver(e){var t;if(this.isClosed)throw new Error(`Internal inconsistency, can't add '${this.id}' observer, observer mananger close()-ed.`);this.registerIfNeeded();const r=cryptoGenerateSecureRandomToken();return this.callbacksByToken[r]=e,null===(t=this.keepAlive)||void 0===t||t.retain(`${this.id}.${r}`),r}removeObserver(e){var t;const r=this.callbacksByToken[e];if(void 0===r)throw new Error(`Can't remove '${this.id}' observer, token '${e}' has never been registered before.`);null!==r&&(this.callbacksByToken[e]=null,null===(t=this.keepAlive)||void 0===t||t.release(`${this.id}.${e}`),this.unregisterIfNeeded())}hasObserver(e){return void 0!==this.callbacksByToken[e]}notify(...e){if(this.isClosed)return;const t=this.process(...e);for(const e in this.callbacksByToken){const r=this.callbacksByToken[e];r&&r(...t)}}close(){this.isClosed=!0;for(const e in this.callbacksByToken)this.removeObserver(e)}register(e){}unregister(){}process(...e){return e}hasObservers(){return Object.keys(this.callbacksByToken).length>0}registerIfNeeded(){if(!this.isRegistered){const e=new WeakRef(this);this.isRegistered=!0,this.register((function(...t){const r=e.deref();r&&r.notify(...t)}))}}unregisterIfNeeded(){!this.hasObservers()&&this.isRegistered&&(this.isRegistered=!1,this.unregister())}}class Authenticator{get status(){return this._status}async login(e,t){throw new Error("Authenticator.login() is abstract and must be implemented by subclasses.")}loginWithToken(e,t){throw new Error("Authenticator.loginWithToken() is abstract and must be implemented by subclasses.")}loginWithUsernameAndPassword(e,t,r){throw new Error("Authenticator.loginWithUsernameAndPassword() is abstract and must be implemented by subclasses.")}logout(e){throw new Error("Authenticator.logout() is abstract and must be implemented by subclasses.")}observeStatus(e){const t=this.observerManager.addObserver(e);return new Observer(this.observerManager,t,{stopsWhenFinalized:!0})}constructor(e){this.keepAlive=e,this._status={isAuthenticated:!1,userID:null},this.loginSupported=!1,this.observerManager=new ObserverManager("AuthenticationStatusObservation",{keepAlive:e})}"@ditto.authenticationExpiring"(e){throw new Error("Authenticator['@ditto.authenticationExpiring']() is abstract and must be implemented by subclasses.")}"@ditto.authClientValidityChanged"(e,t){throw new Error("Authenticator['@ditto.authClientValidityChanged']() is abstract and must be implemented by subclasses.")}close(){this.observerManager.close()}}class OnlineAuthenticator extends Authenticator{async login(e,t){const r=this.ditto.deref();if(!r||r.isClosed)throw new DittoError("authentication/failed-to-authenticate","Ditto instance is closed");return r.deferCloseAsync((async r=>{const{clientInfo:n,error:i}=await dittoAuthClientLoginWithTokenAndFeedback(r.deref(),e,t);return{clientInfo:n,error:null!=i?DittoError.fromFFIError(i,"authentication/failed-to-authenticate"):null}}))}async loginWithToken(e,t){const r=this.ditto.deref();if(r&&!r.isClosed)return r.deferCloseAsync((async r=>{await dittoAuthClientLoginWithToken(r.deref(),e,t)}))}async loginWithUsernameAndPassword(e,t,r){const n=this.ditto.deref();if(n&&!n.isClosed)return n.deferCloseAsync((async n=>{await dittoAuthClientLoginWithUsernameAndPassword(n.deref(),e,t,r)}))}async logout(e){const t=this.ditto.deref();if(t&&!t.isClosed)return t.deferCloseAsync((async r=>{await dittoAuthClientLogout(r.deref()),t.stopSync(),null==e||e(t)}))}constructor(e,t,r){super(e),this.loginSupported=!0,this._status={isAuthenticated:!1,userID:null},this.ditto=new WeakRef(t),this.authenticationHandler=r,this.updateAndNotify(!1)}"@ditto.authenticationExpiring"(e){const t=this.authenticationHandler;e>0?t.authenticationExpiringSoon(this,e):t.authenticationRequired(this)}"@ditto.authClientValidityChanged"(e,t){this.updateAndNotify(!0)}updateAndNotify(e){var t;const r=this.ditto.deref();if(!r)return void Logger.debug("Unable to update auth status and notify, related Ditto object does not exist anymore.");const n=Bridge.ditto.handleFor(r).derefOrNull();if(!n)return void Logger.debug("Unable to update auth status and notify, related Ditto object does not exist anymore.");const i=this.status.isAuthenticated,o=this.status.userID,s=dittoAuthClientIsWebValid(n),a=dittoAuthClientUserID(n),d={isAuthenticated:s,userID:a};if(this._status=d,e){!!i==!!s&&o===a||(null===(t=this.authenticationHandler.authenticationStatusDidChange)||void 0===t||t.call(this.authenticationHandler,this),this.observerManager.notify(d))}}}class NotAvailableAuthenticator extends Authenticator{async login(e,t){throw new Error("Can't login, authentication is not supported for the identity in use, please use an onlineWithAuthentication identity.")}async loginWithToken(e,t){throw new Error("Can't login, authentication is not supported for the identity in use, please use an onlineWithAuthentication identity.")}async loginWithUsernameAndPassword(e,t,r){throw new Error("Can't login, authentication is not supported for the identity in use, please use an onlineWithAuthentication identity.")}logout(e){throw new Error("Can't logout, authentication is not supported for the identity in use, please use an onlineWithAuthentication identity.")}"@ditto.authenticationExpiring"(e){throw new Error(`Internal inconsistency, authentication is not available, yet the @ditto.authenticationExpiring() was called on authenticator: ${this}`)}"@ditto.authClientValidityChanged"(e,t){throw new Error(`Internal inconsistency, authentication is not available, yet the @ditto.authClientValidityChanged() was called on authenticator: ${this}`)}}const IdentityTypesRequiringOfflineLicenseToken=["manual","sharedKey","offlinePlayground"];function transportConfigFromDeserializable(e){const t=e.peer_to_peer,r=t.bluetooth_le.enabled,n=t.awdl.enabled,i=t.lan,o=i.enabled,s=i.mdns_enabled,a=i.multicast_enabled,d=e.connect,c=d.tcp_servers,l=d.websocket_urls,u=d.retry_interval,h=e.listen,f=h.tcp,_=f.enabled,p=f.interface_ip,g=f.port,y=h.http,b=y.enabled,m=y.interface_ip,w=y.port,v=y.static_content_path,C=y.websocket_sync,I=y.tls_key_path,E=y.tls_certificate_path,T=e.global,S=T.sync_group,A=T.routing_hint,k=new TransportConfig;return k.peerToPeer.bluetoothLE.isEnabled=r,k.peerToPeer.awdl.isEnabled=n,k.peerToPeer.lan.isEnabled=o,k.peerToPeer.lan.isMdnsEnabled=s,k.peerToPeer.lan.isMulticastEnabled=a,k.connect.tcpServers=c,k.connect.websocketURLs=l,k.connect.retryInterval=u,k.listen.tcp.isEnabled=_,k.listen.tcp.interfaceIP=p,k.listen.tcp.port=g,k.listen.http.isEnabled=b,k.listen.http.interfaceIP=m,k.listen.http.port=w,k.listen.http.staticContentPath=v,k.listen.http.websocketSync=C,k.listen.http.tlsKeyPath=I,k.listen.http.tlsCertificatePath=E,k.global.syncGroup=S,k.global.routingHint=A,k}function transportConfigToSerializable(e){const t=e.peerToPeer,r=e.connect,n=e.listen,i=e.global,o={peer_to_peer:{bluetooth_le:{enabled:t.bluetoothLE.isEnabled},awdl:{enabled:t.awdl.isEnabled},lan:{enabled:t.lan.isEnabled,mdns_enabled:t.lan.isMdnsEnabled,multicast_enabled:t.lan.isMulticastEnabled}},connect:{tcp_servers:r.tcpServers,websocket_urls:r.websocketURLs,retry_interval:r.retryInterval},listen:{tcp:{enabled:n.tcp.isEnabled,interface_ip:n.tcp.interfaceIP,port:n.tcp.port},http:{enabled:n.http.isEnabled,interface_ip:n.http.interfaceIP,port:n.http.port,websocket_sync:n.http.websocketSync}},global:{sync_group:i.syncGroup,routing_hint:i.routingHint}};return n.http.staticContentPath&&(o.listen.http.static_content_path=n.http.staticContentPath),n.http.tlsKeyPath&&(o.listen.http.tls_key_path=n.http.tlsKeyPath),n.http.tlsCertificatePath&&(o.listen.http.tls_certificate_path=n.http.tlsCertificatePath),o}const NO_PREFERRED_ROUTE_HINT=0;class TransportConfig{constructor(){this._isFrozen=!1,this.peerToPeer={bluetoothLE:{isEnabled:!1},awdl:{isEnabled:!1},lan:{isEnabled:!1,isMdnsEnabled:!0,isMulticastEnabled:!0}},this.connect={tcpServers:[],websocketURLs:[],retryInterval:5e3},this.listen={tcp:{isEnabled:!1,interfaceIP:"[::]",port:4040},http:{isEnabled:!1,interfaceIP:"[::]",port:80,websocketSync:!0}},this.global={syncGroup:0,routingHint:0}}setAllPeerToPeerEnabled(e){this.peerToPeer.bluetoothLE.isEnabled=e,this.peerToPeer.lan.isEnabled=e,this.peerToPeer.awdl.isEnabled=e}get isFrozen(){return this._isFrozen}freeze(){return this.isFrozen||(this._isFrozen=!0,Object.freeze(this.peerToPeer.bluetoothLE),Object.freeze(this.peerToPeer.awdl),Object.freeze(this.peerToPeer.lan),Object.freeze(this.peerToPeer),Object.freeze(this.connect.tcpServers),Object.freeze(this.connect.websocketURLs),Object.freeze(this.connect),Object.freeze(this.listen.tcp),Object.freeze(this.listen.http),Object.freeze(this.listen),Object.freeze(this.global)),this}copy(){const e=new TransportConfig;return e.peerToPeer.bluetoothLE.isEnabled=this.peerToPeer.bluetoothLE.isEnabled,e.peerToPeer.awdl.isEnabled=this.peerToPeer.awdl.isEnabled,e.peerToPeer.lan.isEnabled=this.peerToPeer.lan.isEnabled,e.peerToPeer.lan.isMdnsEnabled=this.peerToPeer.lan.isMdnsEnabled,e.peerToPeer.lan.isMulticastEnabled=this.peerToPeer.lan.isMulticastEnabled,e.connect.tcpServers=this.connect.tcpServers.slice(),e.connect.websocketURLs=this.connect.websocketURLs.slice(),e.connect.retryInterval=this.connect.retryInterval,e.listen.tcp={...this.listen.tcp},e.listen.http={...this.listen.http},e.global.syncGroup=this.global.syncGroup,e.global.routingHint=this.global.routingHint,e}static areListenTCPsEqual(e,t){return e.isEnabled===t.isEnabled&&e.interfaceIP===t.interfaceIP&&e.port===t.port}static areListenHTTPsEqual(e,t){return e.isEnabled===t.isEnabled&&e.interfaceIP===t.interfaceIP&&e.port===t.port&&e.staticContentPath===t.staticContentPath&&e.websocketSync===t.websocketSync&&e.tlsKeyPath===t.tlsKeyPath&&e.tlsCertificatePath===t.tlsCertificatePath}}const privateToken$1=Symbol("privateConstructorToken");class Counter{get value(){return this._value}constructor(){this._value=0}static"@ditto.create"(e,t,r){const n=e?new MutableCounter(privateToken$1):new Counter;return n.mutDoc=e,n.path=t,n._value=r,n}}class MutableCounter extends Counter{increment(e){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}constructor(){if(arguments[0]!==privateToken$1)throw new Error("MutableCounter constructor is for internal use only.");super()}}const privateToken="@ditto.ff82dae89821c5ab822a8b539056bce4";class Register{get value(){return this["@ditto.value"]}constructor(e){this["@ditto.value"]=e}static"@ditto.create"(e,t,r){const n=e?new MutableRegister(r,privateToken):new Register(r);return n["@ditto.mutableDocument"]=e,n["@ditto.path"]=t,n["@ditto.value"]=r,n}}class MutableRegister extends Register{get value(){return super.value}set value(e){this.set(e)}set(e){const t=this["@ditto.mutableDocument"],r=this["@ditto.path"];t.at(r)["@ditto.set"](e),this["@ditto.value"]=e}constructor(e){if(arguments[1]!==privateToken)throw new Error("MutableRegister constructor is for internal use only.");super(e)}}function desugarJSObject(e){if(e&&"object"==typeof e){if(Array.isArray(e))return e.map(((e,t)=>desugarJSObject(e)));if(e instanceof DocumentID)return e.value;if(e instanceof Counter){const t={};return t[DittoCRDTTypeKey]=DittoCRDTType.counter,t._value=e.value,t}if(e instanceof Register){const t={};return t[DittoCRDTTypeKey]=DittoCRDTType.register,t._value=e.value,t}if(e instanceof Attachment){const t={_id:e.token.idBytes,_len:e.token.len,_meta:e.token.metadata};return t[DittoCRDTTypeKey]=DittoCRDTType.attachment,t}{const t={};for(const[r,n]of Object.entries(e))t[r]=desugarJSObject(n);return t}}return checkForUnsupportedValues(e),e}function checkForUnsupportedValues(e){if(Number.isNaN(e)||e===1/0||e===-1/0)throw new Error("Non-finite float values are not supported")}const CUSTOM_INSPECT_SYMBOL$1=Symbol.for("nodejs.util.inspect.custom");class Document{static hash(e){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}static hashMnemonic(e){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}get id(){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}get path(){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}get value(){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}at(e){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}constructor(){}static idCBOR(e){return documentID(Bridge.document.handleFor(e).deref())}static canonicalizedIDCBOR(e){return validateDocumentIDCBOR(e)}static isIDCBORCanonical(e){return e===this.canonicalizedIDCBOR(e)}toString(){return`${this.constructor.name}(${this.id})`}[CUSTOM_INSPECT_SYMBOL$1](e,t,r){return customInspectRepresentation(this,r)}}class MutableDocument{get id(){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}get path(){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}get value(){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}at(e){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}constructor(){this["@ditto.updateResults"]=[]}static idCBOR(e){return documentID(Bridge.mutableDocument.handleFor(e).deref())}toString(){return`${this.constructor.name}(${this.id})`}[CUSTOM_INSPECT_SYMBOL$1](e,t,r){return customInspectRepresentation(this,r)}}MutableDocument.canonicalizedIDCBOR=Document.canonicalizedIDCBOR,MutableDocument.isIDCBORCanonical=Document.isIDCBORCanonical;class QueryResult{mutatedDocumentIDs(){return queryResultMutatedDocumentIDs(Bridge.queryResult.handleFor(this).deref()).map((e=>new DocumentID(e,!0)))}constructor(e){if(null==e)throw new Error("Internal inconsistency, failed to initialize query result without a response pointer");const t=queryResultItems(e);this.items=t.map((e=>Bridge.queryResultItem.bridge(e)))}}class StoreObserver{get isCancelled(){return this._isCancelled}cancel(){this._isCancelled||(this._isCancelled=!0,this.ditto.store.unregisterObserver(this))}constructor(e,t,r,n){this._isCancelled=!1,this.queryString=t,this.queryArguments=r?Object.freeze({...r}):void 0,this.ditto=e;let i,o=null;if(null!=r)try{const e=desugarJSObject(r);o=CBOR.encode(e)}catch(e){throw new DittoError("query/arguments-invalid")}if(this.ditto.deferClose((e=>{const r=new WeakRef(this);function wrappedObservationHandler(e){const t=r.deref();if(null==t)return void Logger.debug(`Ignoring change event received by store observer ${i} after it was cancelled`);const o=Bridge.queryResult.bridge(e.query_result,(()=>new QueryResult(e.query_result)));Logger.debug(`Invoking user event handler with new event for store observer ${i}`),n(o,(()=>t.signalNext()))}mapFFIErrors((()=>{i=tryExperimentalRegisterChangeObserver(e.deref(),t,o,wrappedObservationHandler)}))})),null==i)throw new DittoError("internal","Internal inconsistency, store observer ID is undefined after registering");this.liveQueryID=i}async signalNext(){const e=this.ditto;if(e&&!e.isClosed){if(null==this.liveQueryID)throw new Error("live query ID is null while signaling ready for next event");return e.deferCloseAsync((async e=>{Logger.debug(`Signaling availability for live query ${this.liveQueryID}`),await liveQuerySignalAvailableNext(e.deref(),this.liveQueryID)}))}}}class Store{registerObserver(e,t,r){return this.registerObserverWithSignalNext(e,((e,r)=>{try{t(e)}finally{r()}}),r)}registerObserverWithSignalNext(e,t,r){if("string"!=typeof e)throw new DittoError("query/invalid","Expected parameter 'query' to be of type 'string', found: "+typeof e);const n=new StoreObserver(this.ditto,e,null!=r?r:null,t);return this.observers=Object.freeze([...this.observers,n]),this.ditto.deferCloseAsync((async e=>new Promise((t=>{step((async()=>{try{await mapFFIErrorsAsync((async()=>await liveQueryStart(e.deref(),n.liveQueryID)))}catch(e){Logger.error(`Failed to start live query: ${e.message}`)}t()}))})))),n}collection(e){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}collections(){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}collectionNames(){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}async execute(e,t){if("string"!=typeof e)throw new DittoError("query/invalid","Expected parameter 'query' to be of type 'string', found: "+typeof e);return this.ditto.deferCloseAsync((async r=>{let n=null;if(null!=t)try{const e=desugarJSObject(t);n=CBOR.encode(e)}catch(e){throw new DittoError("query/arguments-invalid",`Unable to encode query arguments: ${e.message}`)}const i=await mapFFIErrorsAsync((async()=>await performAsyncToWorkaroundNonAsyncFFIAPI((()=>tryExecStatement(r.deref(),null,e,n)))));return Bridge.queryResult.bridge(i,(()=>new QueryResult(i)))}))}async write(e){throw new Error("This API is not available in React Native environments. Please use 'ditto.store.registerObserver(…)' instead. For more details and guidance, visit: https://docs.ditto.live/dql.")}async newAttachment(e,t){return null!=t&&validateAttachmentMetadata(t),this.ditto.deferCloseAsync((async r=>{const{id:n,len:i,handle:o}=await(async()=>{if("string"==typeof e)return mapFFIErrors((()=>dittoNewAttachmentFromFile(r.deref(),e,"Copy")),{1:["store/failed-to-create-attachment"],2:["store/attachment-file-not-found"],3:["store/attachment-file-permission-denied"]});if(e instanceof Uint8Array)return mapFFIErrorsAsync((async()=>await dittoNewAttachmentFromBytes(r.deref(),e)),{1:["store/failed-to-create-attachment"]});throw new Error(`Can't create new attachment, only file path as string or raw data as Uint8Array are supported, but got: ${typeof e}, ${e}`)})(),s={_id:n,_len:i,_meta:{...t},[DittoCRDTTypeKey]:DittoCRDTType.attachment},a=new AttachmentToken(s),d=new Attachment(this.ditto,a);return Bridge.attachment.bridge(o,(()=>d))}))}fetchAttachment(e,t){if(null==e)throw new Error("Missing required parameter 'token'");let r;return r=e instanceof AttachmentToken?e:new AttachmentToken(e),this.ditto.deferClose((()=>{const e=new AttachmentFetcher(this.ditto,r,null,t);return this.attachmentFetchers=Object.freeze([...this.attachmentFetchers,e]),e}))}constructor(e){this.observers=Object.freeze([]),this.attachmentFetchers=Object.freeze([]),this.ditto=e}async registerObserverWebhook(e,t,r){let n=null;if(null!=r)try{const e=desugarJSObject(r);n=CBOR.encode(e)}catch(e){throw new DittoError("query/arguments-invalid",`Invalid query arguments: ${e.message}`)}return this.ditto.deferCloseAsync((async r=>{const i=await mapFFIErrorsAsync((async()=>await tryRegisterStoreObserverWebhook(r.deref(),e,n,t)));return new DocumentID(i,!0)}))}unregisterObserver(e){if(e.ditto!==this.ditto)throw new DittoError("internal","Internal inconsistency, can't remove store observer that does not belong to this store");if(!e.isCancelled)throw new DittoError("internal","Internal inconsistency, can't remove store observer that has not been cancelled");const t=this.observers.findIndex((t=>t===e));if(-1===t)return!1;const r=[...this.observers];r.splice(t,1),this.observers=Object.freeze(r);const n=Bridge.ditto.handleFor(this.ditto);return this.ditto.deferClose((()=>{mapFFIErrors((()=>liveQueryStop(n.deref(),e.liveQueryID)))})),!0}removeAttachmentFetcher(e){if(e.ditto!==this.ditto)throw new DittoError("internal","Internal inconsistency, can't finalize attachment fetcher that does not belong to this store");if(null!=e.manager)throw new DittoError("internal","Internal inconsistency, store can't remove attachment fetcher that is owned by the attachment fetcher manager");if(!e.isStopped)throw new DittoError("internal","Internal inconsistency, can't remove attachment fetcher that has not stopped");const t=this.attachmentFetchers.findIndex((t=>t===e));if(-1===t)return!1;const r=[...this.attachmentFetchers];return r.splice(t,1),this.attachmentFetchers=Object.freeze(r),!0}close(){for(const e of this.observers)e.cancel();for(const e of this.attachmentFetchers)e.stop()}async registerLiveQueryWebhook(e,t,r){return this.ditto.deferCloseAsync((async n=>{const i=validateQuery(t),o=await liveQueryWebhookRegister(n.deref(),e,i,[],0,0,r);return new DocumentID(o,!0)}))}}class KeepAlive{get isActive(){return null!==this.intervalID}constructor(){this.countsByID={},this.intervalID=null}retain(e){if(void 0===this.countsByID[e]&&(this.countsByID[e]=0),this.countsByID[e]+=1,null===this.intervalID){const e=2147483647;this.intervalID=setInterval((()=>{}),e),KeepAlive.finalizationRegistry.register(this,this.intervalID,this)}}release(e){if(void 0===this.countsByID[e])throw new Error(`Internal inconsistency, trying to release a keep-alive ID that hasn't been retained before or isn't tracked anymore: ${e}`);this.countsByID[e]-=1,0===this.countsByID[e]&&delete this.countsByID[e],0===Object.keys(this.countsByID).length&&(KeepAlive.finalizationRegistry.unregister(this),clearInterval(this.intervalID),this.intervalID=null)}currentIDs(){return Object.keys(this.countsByID)}countForID(e){var t;return null!==(t=this.countsByID[e])&&void 0!==t?t:null}}function addressToString(e){return`${e.siteId}-${e.pubkey}`}KeepAlive.finalizationRegistry=new FinalizationRegistry(clearInterval);class Presence{get connectionRequestHandler(){return this._connectionRequestHandler}set connectionRequestHandler(e){let t=null;if(null!=e){if("function"!=typeof e)throw new TypeError(`Expected parameter 'handler' to be a function but got ${typeof e} instead`);t=async t=>{const r=Bridge.connectionRequest.bridge(t),n=await e(r);if("allow"!==n&&"deny"!==n)return Logger.error(`The connection request handler must return "allow" or "deny" but returned "${n}" instead. The connection request will be denied.`),"Deny";connectionRequestAuthorize(t,"allow"===n?"Allow":"Deny")}}this._connectionRequestHandler=e;const handleError=e=>{Logger.error(`The connection request handler threw an error while handling a connection request, the connection request will be denied. ${e}`)},r=Bridge.ditto.handleFor(this.ditto);this.ditto.deferClose((()=>{presenceSetConnectionRequestHandler(r.deref(),t,handleError)}))}get graph(){return this.ditto.deferClose((e=>{const t=dittoPresenceV3(e.deref());return JSON.parse(t)}))}get peerMetadataJSONString(){return this.ditto.deferClose((e=>mapFFIErrors((()=>presencePeerMetadataJSON(e.deref())))))}async setPeerMetadataJSONString(e){await this.ditto.deferCloseAsync((async t=>mapFFIErrorsAsync((async()=>presenceTrySetPeerMetadataJSON(t.deref(),e)))))}get peerMetadata(){return JSON.parse(this.peerMetadataJSONString)}async setPeerMetadata(e){let t;try{t=JSON.stringify(e)}catch(e){throw new DittoError("validation/not-json-compatible",`Failed encoding peer metadata to JSON. ${e}`)}await this.setPeerMetadataJSONString(t)}observe(e){const t=this.observerManager.addObserver(e),r=new Observer(this.observerManager,t,{stopsWhenFinalized:!0});return e(this.graph),r}constructor(e){this._connectionRequestHandler=null,this.ditto=e,this.observerManager=new ObserverManager("PresenceObservation",{keepAlive:e.keepAlive,register:e=>{this.ditto.deferClose((t=>{dittoRegisterPresenceV3Callback(t.deref(),e)}))},unregister:()=>{e.deferCloseAsync((async e=>dittoClearPresenceV3Callback(e.deref())))},process:e=>[JSON.parse(e)]})}close(){this.observerManager.close()}}class LiveQueryManager{constructor(e,t){this.finalizationRegistry=new FinalizationRegistry(this.finalize),this.ditto=e,this.keepAlive=t,this.liveQueriesByID={}}startLiveQuery(e){this.ditto.deferCloseAsync((async t=>{const r=e.liveQueryID;if(!r)throw new Error("Internal inconsistency, tried to add a live query that doesn't have a live query ID (probably stopped).");if(this.liveQueriesByID[r])throw new Error("Internal inconsistency, tried to add a live query with an ID that has already been added.");const n=new WeakRef(e);return this.liveQueriesByID[r]=n,this.finalizationRegistry.register(e,r,this.finalize),e.liveQueryManager=this,this.ditto.keepAlive.retain(`LiveQuery.${r}`),new Promise(((e,n)=>{step((async()=>{await liveQueryStart(t.deref(),r),e()}))}))}))}stopLiveQuery(e){this.finalizationRegistry.unregister(e);const t=e.liveQueryID;if(!t)throw new Error("Internal inconsistency, tried to remove a live query that doesn't have a live query ID (probably stopped).");e.liveQueryManager=null,this.stopLiveQueryWithID(t)}close(){for(const e in this.liveQueriesByID){const t=this.liveQueriesByID[e].deref();t&&this.stopLiveQuery(t)}}stopLiveQueryWithID(e){this.ditto.deferClose((t=>{liveQueryStop(t.deref(),e),this.keepAlive.release(`LiveQuery.${e}`),delete this.liveQueriesByID[e]}))}finalize(e){this.stopLiveQueryWithID(e)}}class PresenceManager{constructor(e){this.ditto=e,this.isClosed=!1,this.isRegistered=!1,this.currentRemotePeers=[],this.callbacksByPresenceToken={}}addObserver(e){if(this.isClosed)throw new Error("Internal inconsistency, can't add presence observer, observer mananger close()-ed.");this.registerIfNeeded();const t=cryptoGenerateSecureRandomToken();return this.callbacksByPresenceToken[t]=e,this.ditto.keepAlive.retain(`PresenceObservation.${t}`),e(this.currentRemotePeers),t}async removeObserver(e){const t=this.callbacksByPresenceToken[e];if(void 0===t)throw new Error(`Can't remove presence observer, token '${e}' has never been registered before.`);if(null!==t)return void 0!==this.callbacksByPresenceToken[e]?(this.ditto.keepAlive.release(`PresenceObservation.${e}`),this.callbacksByPresenceToken[e]=null,this.unregisterIfNeeded()):void 0}hasObserver(e){return void 0!==this.callbacksByPresenceToken[e]}async close(){this.isClosed=!0;const e=Object.keys(this.callbacksByPresenceToken);return Promise.all(e.map((e=>this.removeObserver(e))))}hasObservers(){return Object.keys(this.callbacksByPresenceToken).length>0}registerIfNeeded(){this.ditto.deferClose((e=>{if(!this.isRegistered){this.isRegistered=!0;const t=dittoPresenceV1(e.deref());this.currentRemotePeers=this.decode(t).sort(this.compareRemotePeers),dittoRegisterPresenceV1Callback(e.deref(),this.handlePresenceV1Callback.bind(this))}}))}unregisterIfNeeded(){return this.ditto.deferCloseAsync((async e=>{!this.hasObservers()&&this.isRegistered&&(this.isRegistered=!1,await dittoClearPresenceCallback(e.deref()),this.currentRemotePeers=[])}))}handlePresenceV1Callback(e){const t=this.decode(e).sort(this.compareRemotePeers);this.currentRemotePeers=t,this.notify()}notify(){if(!this.isClosed)for(const e in this.callbacksByPresenceToken){const t=this.callbacksByPresenceToken[e];t&&t(this.currentRemotePeers)}}decode(e){return JSON.parse(e).map((e=>{var t,r;return{networkID:e.network_id,deviceName:e.device_name,rssi:null!==(t=e.rssi)&&void 0!==t?t:void 0,approximateDistanceInMeters:null!==(r=e.approximate_distance_in_meters)&&void 0!==r?r:void 0,connections:e.connections}}))}compareRemotePeers(e,t){return 0===e.connections.length&&t.connections.length>0?1:e.connections.length>0&&0===t.connections.length||e.deviceName<t.deviceName?-1:e.deviceName>t.deviceName?1:0}}class TransportConditionsManager extends ObserverManager{constructor(e){super("TransportConditionsObservation",{keepAlive:e.keepAlive}),this.ditto=e}register(e){return this.ditto.deferClose((t=>dittoRegisterTransportConditionChangedCallback(t.deref(),e)))}unregister(){return this.ditto.deferClose((e=>dittoRegisterTransportConditionChangedCallback(e.deref(),null)))}process(e,t){let r,n;switch(e){case"Bluetooth":r="BLE";break;case"Tcp":r="TCP";break;case"Awdl":r="AWDL";break;case"Mdns":r="MDNS"}switch(t){case"Unknown":n="Unknown";break;case"Ok":n="OK";break;case"GenericFailure":n="GenericFailure";break;case"AppInBackground":n="AppInBackground";break;case"MdnsFailure":n="MDNSFailure";break;case"TcpListenFailure":n="TCPListenFailure";break;case"NoBleCentralPermission":n="NoBLECentralPermission";break;case"NoBlePeripheralPermission":n="NoBLEPeripheralPermission";break;case"CannotEstablishConnection":n="CannotEstablishConnection";break;case"BleDisabled":n="BLEDisabled";break;case"NoBleHardware":n="NoBLEHardware";break;case"WifiDisabled":n="WiFiDisabled";break;case"TemporarilyUnavailable":n="TemporarilyUnavailable"}return[n,r]}}class SyncSubscription{get isCancelled(){return this._isCancelled}cancel(){this._isCancelled||(this._isCancelled=!0,this.ditto.sync.unregisterSubscription(this))}constructor(e,t,r,n){if(this._isCancelled=!1,null==r!=(null==n))throw new DittoError("internal","Internal inconsistency, query arguments and query arguments CBOR must be both null or both non-null",{queryArguments:r,queryArgumentsCBOR:n});this.ditto=e,this.queryString=t,this.queryArguments=r?Object.freeze({...r}):void 0,this.queryArgumentsCBOR=n}}class Sync{registerSubscription(e,t){if("string"!=typeof e)throw new DittoError("query/invalid","Expected parameter 'query' to be of type 'string', found: "+typeof e);let r=null;if(null!=t)try{const e=desugarJSObject(t);r=CBOR.encode(e)}catch(e){throw new DittoError("query/arguments-invalid",`Unable to encode query arguments: ${e.message}`)}this.ditto.deferClose((t=>{mapFFIErrors((()=>tryAddSyncSubscription(t.deref(),e,r)))}));const n=new SyncSubscription(this.ditto,e,t||null,r);return this.subscriptions=Object.freeze([...this.subscriptions,n]),n}get parameters(){return this.state.underlyingSyncParameters}constructor(e){this.subscriptions=Object.freeze([]),this.bluetoothLETransportPointer=null,this.awdlTransportPointer=null,this.lanTransportPointer=null,this.mdnsClientTransportPointer=null,this.mdnsServerAdvertiserPointer=null;const t={identity:e.identity,transportConfig:new TransportConfig,ditto:e,isWebValid:!1,isX509Valid:!1,isSyncActive:!1};this.ditto=e,this.state=stateFrom(t),transportsInit()}unregisterSubscription(e){if(e.ditto!==this.ditto)throw new DittoError("internal","Can't remove replication subscription that does not belong to this store");if(!e.isCancelled)throw new DittoError("internal","Internal inconsistency, can't remove replication subscription that has not been cancelled");const t=this.subscriptions.findIndex((t=>t===e));if(-1===t)return!1;const r=[...this.subscriptions];return r.splice(t,1),this.subscriptions=Object.freeze(r),this.ditto.deferClose((t=>{mapFFIErrors((()=>tryRemoveSyncSubscription(t.deref(),e.queryString,e.queryArgumentsCBOR)))})),!0}update(e){const t=this.state,r=stateFrom(e);this.updatePeerToPeerBluetoothLE(t,r),this.updatePeerToPeerAWDL(t,r),this.updatePeerToPeerLAN(t,r),this.updateListenTCP(t,r),this.updateListenHTTP(t,r),this.updateConnectTCPServers(t,r),this.updateConnectWebsocketURLs(t,r),this.updateGlobal(t,r),this.updateConnectRetryInterval(t,r),this.state=r}close(){if(this.parameters.isSyncActive)throw new Error("Internal inconsistency, can't close sync object while sync is active, please 'stopSync()' first.");for(const e of this.subscriptions)e.cancel()}updatePeerToPeerBluetoothLE(e,t){this.ditto.deferClose((r=>{const n=e.effectiveTransportConfig.peerToPeer.bluetoothLE,i=t.effectiveTransportConfig.peerToPeer.bluetoothLE,o=!n.isEnabled&&i.isEnabled,s=n.isEnabled&&!i.isEnabled;if(o&&this.bluetoothLETransportPointer)throw new Error("Internal inconsistency, when starting BLE transport, no BLE transport pointer should exist.");if(s&&!this.bluetoothLETransportPointer)throw new Error("Internal inconsistency, when stopping BLE transport, a BLE transport pointer should exist.");if("linux"!==process.platform&&"win32"!==process.platform)o&&(this.bluetoothLETransportPointer=transportsBLECreate(r.deref())),s&&(transportsBLEDestroy(this.bluetoothLETransportPointer),this.bluetoothLETransportPointer=null);else{if(o){const e={clientTransport:dittoAddInternalBLEClientTransport(r.deref()),serverTransport:dittoAddInternalBLEServerTransport(r.deref())};this.bluetoothLETransportPointer=e}s&&(this.bluetoothLETransportPointer,bleServerFreeHandle(),bleClientFreeHandle(),this.bluetoothLETransportPointer=null)}}))}updatePeerToPeerAWDL(e,t){this.ditto.deferClose((r=>{const n=e.effectiveTransportConfig.peerToPeer.awdl,i=t.effectiveTransportConfig.peerToPeer.awdl,o=!n.isEnabled&&i.isEnabled,s=n.isEnabled&&!i.isEnabled;if(o&&this.awdlTransportPointer)throw new Error("Internal inconsistency, when starting AWDL transport, no AWDL transport pointer should exist.");if(s&&!this.awdlTransportPointer)throw new Error("Internal inconsistency, when stopping AWDL transport, an AWDL transport pointer should exist.");o&&(this.awdlTransportPointer=transportsAWDLCreate(r.deref())),s&&(transportsAWDLDestroy(this.awdlTransportPointer),this.awdlTransportPointer=null)}))}updatePeerToPeerLAN(e,t){this.ditto.deferClose((r=>{const n=e.effectiveTransportConfig.peerToPeer.lan,i=t.effectiveTransportConfig.peerToPeer.lan;if("win32"!==process.platform&&"linux"!==process.platform){if(n.isEnabled){if(n.isMdnsEnabled){if(null==this.lanTransportPointer)throw new Error("Internal inconsistency, when stopping LAN transport, a LAN transport pointer should exist.");transportsLANDestroy(this.lanTransportPointer),this.lanTransportPointer=null}n.isMulticastEnabled&&dittoRemoveMulticastTransport(r.deref())}if(i.isEnabled){if(i.isMdnsEnabled){if(null!=this.lanTransportPointer)throw new Error("Internal inconsistency, when starting LAN transport, no LAN transport pointer should exist.");this.lanTransportPointer=transportsLANCreate(r.deref())}i.isMulticastEnabled&&dittoAddMulticastTransport(r.deref())}}else{if(n.isEnabled){if(n.isMdnsEnabled){if(null==this.mdnsClientTransportPointer)throw new Error("Internal inconsistency, when stopping LAN transport, a LAN transport pointer should exist.");if(mdnsClientFreeHandle(this.mdnsClientTransportPointer),this.mdnsClientTransportPointer=null,null==this.mdnsServerAdvertiserPointer)throw new Error("Internal inconsistency, when stopping LAN transport, a LAN transport pointer should exist.");mdnsServerFreeHandle(this.mdnsServerAdvertiserPointer),this.mdnsServerAdvertiserPointer=null}n.isMulticastEnabled&&dittoRemoveMulticastTransport(r.deref())}i.isEnabled&&(i.isMdnsEnabled&&(this.mdnsClientTransportPointer=dittoAddInternalMdnsTransport(r.deref()),this.mdnsServerAdvertiserPointer=dittoAddInternalMdnsAdvertiser(r.deref())),i.isMulticastEnabled&&dittoAddMulticastTransport(r.deref()))}}))}updateListenTCP(e,t){this.ditto.deferClose((r=>{const n=e.effectiveTransportConfig.listen.tcp,i=t.effectiveTransportConfig.listen.tcp;TransportConfig.areListenTCPsEqual(i,n)||(n.isEnabled&&dittoStopTCPServer(r.deref()),i.isEnabled&&dittoStartTCPServer(r.deref(),`${i.interfaceIP}:${i.port}`))}))}updateListenHTTP(e,t){this.ditto.deferClose((r=>{const n=e.effectiveTransportConfig.listen.http,i=t.effectiveTransportConfig.listen.http;TransportConfig.areListenHTTPsEqual(n,i)||(n.isEnabled&&dittoStopHTTPServer(r.deref()),i.isEnabled&&dittoStartHTTPServer(r.deref(),`${i.interfaceIP}:${i.port}`,i.staticContentPath||null,i.websocketSync?"Enabled":"Disabled",i.tlsCertificatePath||null,i.tlsKeyPath||null))}))}updateConnectTCPServers(e,t){this.ditto.deferClose((e=>{t.effectiveTransportConfig.connect.tcpServers,dittoSetStaticTCPClients(e.deref())}))}updateConnectWebsocketURLs(e,t){this.ditto.deferClose((e=>{const r=t.effectiveTransportConfig.connect.websocketURLs,n=t.effectiveTransportConfig.global.routingHint;dittoSetStaticWebsocketClients(e.deref(),r,n)}))}updateGlobal(e,t){this.ditto.deferClose((r=>{e.effectiveTransportConfig.global.syncGroup!==t.effectiveTransportConfig.global.syncGroup&&dittoSetSyncGroup(r.deref(),t.effectiveTransportConfig.global.syncGroup)}))}updateConnectRetryInterval(e,t){this.ditto.deferClose((e=>{dittoSetConnectRetryInterval(e.deref(),t.effectiveTransportConfig.connect.retryInterval)}))}}function stateFrom(e){var t,r;const n=e.identity,i=e.isSyncActive,o=e.isX509Valid,s=e.isWebValid;let a,d,c=!1;"onlinePlayground"!==n.type&&"onlineWithAuthentication"!==n.type||(a=n.appID,d=null!==(t=n.customDittoCloudURL)&&void 0!==t?t:null,c=null===(r=n.enableDittoCloudSync)||void 0===r||r),validateEnabledTransportsAvailable(e.ditto,e.transportConfig);const l=e.transportConfig.copy();if(i&&o||(l.peerToPeer.bluetoothLE.isEnabled=!1,l.peerToPeer.awdl.isEnabled=!1,l.peerToPeer.lan.isEnabled=!1,l.listen.tcp.isEnabled=!1,l.connect.tcpServers=[]),i&&s||(l.connect.websocketURLs=[]),i||(l.listen.http.isEnabled=!1),i&&s&&c){const e=null!=d?d:defaultDittoCloudURL(a);l.connect.websocketURLs.push(e)}return{underlyingSyncParameters:e,effectiveTransportConfig:l.freeze()}}function validateEnabledTransportsAvailable(e,t){return e.deferClose((e=>{const r=[],n=transportsBLEIsAvailable(e.deref()),i=transportsAWDLIsAvailable(e.deref()),o=transportsLANIsAvailable(e.deref());if(t.peerToPeer.bluetoothLE.isEnabled&&!n&&r.push("BluetoothLE"),t.peerToPeer.awdl.isEnabled&&!i&&r.push("AWDL"),t.peerToPeer.lan.isEnabled&&!o&&r.push("LAN"),r.length>0)throw new Error(`The following P2P transports are enabled in the transport config but are not supported in the current environment: ${r.join(", ")}`);if(t.connect.tcpServers.length>0&&isWebBuild)throw new Error("The transport config contains TCP servers, but this transport is not supported in web environments");if(t.listen.http.isEnabled&&isWebBuild)throw new Error("The transport config contains an HTTP listener, which is not supported in web environments");if(t.listen.tcp.isEnabled&&isWebBuild)throw new Error("The transport config contains a TCP listener, which is not supported in web environments")}))}class SubscriptionManager{constructor(e){this.ditto=e,this.subscriptions={},this.finalizationRegistry=new FinalizationRegistry(this.removeWithContextInfo.bind(this))}add(e){const t=e.contextInfo;this.ditto.deferClose((r=>{this.subscriptions[t.id]=new WeakRef(e),this.finalizationRegistry.register(e,e.contextInfo,e),addSubscription(r.deref(),t.collectionName,t.query,t.queryArgsCBOR,t.orderBys,t.limit,t.offset)}))}remove(e){if(null==this.subscriptions[e.contextInfo.id])throw new Error(`Internal inconsistency, tried to remove a subscription that is not tracked: ${e.contextInfo.id}`);this.finalizationRegistry.unregister(e),this.removeWithContextInfo(e.contextInfo)}close(){this.ditto.deferClose((()=>{for(const e in this.subscriptions){const t=this.subscriptions[e].deref();null==t||t.cancel()}}))}removeWithContextInfo(e){this.ditto.deferClose((t=>{delete this.subscriptions[e.id],removeSubscription(t.deref(),e.collectionName,e.query,e.queryArgsCBOR,e.orderBys,e.limit,e.offset)}))}}class AttachmentFetcherManager{constructor(e){this.contextInfoByID={},this.finalizationRegistry=new FinalizationRegistry(this.stopWithContextInfo.bind(this)),this.ditto=e}startAttachmentFetcher(e,t){return this.ditto.deferClose((()=>{const r=new AttachmentFetcher(this.ditto,e,this,t),n={id:r.id,attachmentTokenID:e.idBytes,cancelTokenPromise:r.cancelTokenPromise,attachmentFetcher:new WeakRef(r)};this.finalizationRegistry.register(r,n,r),this.contextInfoByID[r.id]=n;const resetCancelToken=()=>{null!=this.contextInfoByID[r.id]&&(this.contextInfoByID[r.id].cancelTokenPromise=null)};return r.attachment.then((e=>(resetCancelToken(),e)),(e=>(resetCancelToken(),e))),this.ditto.keepAlive.retain(`AttachmentFetcher.${r.id})`),r}))}async stopAttachmentFetcher(e){this.finalizationRegistry.unregister(e);const t=this.contextInfoByID[e.id];if(null==t)throw new Error(`Internal inconsistency: cannot stop attachment fetcher ${e.id}, which is not registered.`);await this.stopWithContextInfo(t)}close(){this.ditto.deferCloseAsync((async()=>{const e=Object.values(this.contextInfoByID).map((async e=>{const t=e.attachmentFetcher.deref();null!=t&&await this.stopAttachmentFetcher(t)}));await Promise.all(e)}))}stopWithContextInfo(e){return this.ditto.deferCloseAsync((async t=>{if(null==this.contextInfoByID[e.id])throw new Error(`Internal inconsistency: attachment fetcher ${e.id} not found in active attachment fetchers.`);delete this.contextInfoByID[e.id],this.ditto.keepAlive.release(`AttachmentFetcher.${e.id})`);const r=await e.cancelTokenPromise;r&&dittoCancelResolveAttachment(t.deref(),e.attachmentTokenID,r)}))}}class SmallPeerInfo{get isEnabled(){return this.ditto.deferClose((e=>dittoSmallPeerInfoGetIsEnabled(e.deref())))}set isEnabled(e){if("boolean"!=typeof e)throw new TypeError("Expected boolean, got "+typeof e);this.ditto.deferCloseAsync((async t=>dittoSmallPeerInfoSetEnabled(t.deref(),e)))}get metadata(){return JSON.parse(this.metadataJSONString)}set metadata(e){this.metadataJSONString=JSON.stringify(e)}get metadataJSONString(){return this.ditto.deferClose((e=>dittoSmallPeerInfoGetMetadata(e.deref())))}set metadataJSONString(e){if("string"!=typeof e)throw new TypeError("Expected string, got "+typeof e);this.ditto.deferClose((t=>{dittoSmallPeerInfoSetMetadata(t.deref(),e)}))}async getSyncScope(){return this.ditto.deferCloseAsync((async e=>dittoSmallPeerInfoGetSyncScope(e.deref())))}async setSyncScope(e){return this.ditto.deferCloseAsync((async t=>dittoSmallPeerInfoSetSyncScope(t.deref(),e)))}constructor(e){this.ditto=e}}const DEFAULT_PERSISTENCE_DIRECTORY="ditto";class Ditto{static get VERSION(){return dittoGetSDKSemver()}get deviceName(){return this._deviceName}set deviceName(e){this.isSyncActive&&Logger.warning("Changes to the device name take effect when sync is restarted."),this._deviceName=e}get sdkVersion(){return this.deferClose((e=>dittoGetSDKVersion(e.deref())))}get path(){return Logger.warning("⚠️ Deprecation Warning: The 'Ditto.path' property is deprecated. Please update your code to use the new 'Ditto.persistenceDirectory' property instead."),this.persistenceDirectory}get isActivated(){var e;return null!==(e=this._isActivated)&&void 0!==e&&e}get isClosed(){var e;return null!==(e=this._isClosed)&&void 0!==e&&e}get isSyncActive(){var e;return null!==(e=this._isSyncActive)&&void 0!==e&&e}constructor(e,t){if(this.deferCloseAllowed=!0,this.isWebValid=!1,this.isX509Valid=!1,this._isSyncActive=!1,this._isClosed=!1,this.pendingOperations=new Set,!Ditto.isEnvironmentSupported())throw new Error("Ditto does not support this JavaScript environment. Please consult the Ditto JavaScript documentation for a list of supported environments and browsers. You can use `Ditto.isEnvironmentSupported()` to run this check anytime.");loggerInit(),this.persistenceDirectory=Ditto.initPersistenceDirectory(t);const r=null!=e?e:{type:"offlinePlayground",appID:""},n=Object.freeze(this.validateIdentity(r));this.identity=Object.freeze(n),this._deviceName=defaultDeviceName(),this.keepAlive=new KeepAlive;let i=null;const o=new WeakRef(this),s=(()=>{var e,t,r;if("offlinePlayground"===n.type)return dittoIdentityConfigMakeOfflinePlayground(n.appID,null!==(e=n.siteID)&&void 0!==e?e:0);if("manual"===n.type)throw new Error("Manual Identify is currently not implemented for React Native.");if("sharedKey"===n.type)return dittoIdentityConfigMakeSharedKey(n.appID,n.sharedKey,n.siteID);if("onlinePlayground"===n.type){const e=null!==(t=n.customAuthURL)&&void 0!==t?t:defaultAuthURL(n.appID);return dittoIdentityConfigMakeOnlinePlayground(n.appID,n.token,e)}if("onlineWithAuthentication"===n.type){const e=null!==(r=n.customAuthURL)&&void 0!==r?r:defaultAuthURL(n.appID);return dittoIdentityConfigMakeOnlineWithAuthentication(n.appID,e)}throw new Error(`Can't create Ditto, unsupported identity type: ${n}`)})(),a=dittoMake(this.persistenceDirectory,s,"Disabled");dittoAuthClientSetValidityListener(a,(function(...e){const t=o.deref();null==t||t.isClosed?Logger.info("Ditto is closed, ignoring auth client validity change"):t.authClientValidityChanged(...e)}));const d=dittoAuthClientIsWebValid(a),c=dittoAuthClientIsX509Valid(a),l=dittoAuthClientGetAppID(a),u=dittoAuthClientGetSiteID(a);if(Bridge.ditto.bridge(a,this),this.deferCloseAsync((async e=>{await dittoDisableSyncWithV3(e.deref())})).catch((e=>{Logger.error(`Failed to disable sync with V3: ${null==e?void 0:e.message}`)})),"onlineWithAuthentication"===n.type){this.auth=new OnlineAuthenticator(this.keepAlive,this,n.authHandler);dittoAuthSetLoginProvider(a,dittoAuthClientMakeLoginProvider((function(e){const t=o.deref();t?t.auth?t.auth["@ditto.authenticationExpiring"](e):i=e:Logger.warning("Internal inconsistency, LoginProvider callback fired after the corresponding Ditto instance has been deallocated.")})))}else"onlinePlayground"===n.type?this.auth=new OnlineAuthenticator(this.keepAlive,this,{authenticationRequired:function(e){},authenticationExpiringSoon:function(e,t){}}):this.auth=new NotAvailableAuthenticator(this.keepAlive);const h=this.makeDefaultTransportConfig().freeze();this.appID=l,this.siteID=u,this.isX509Valid=c,this.isWebValid=d,this.sync=new Sync(this),this.sync.update({isSyncActive:!1,isX509Valid:c,isWebValid:d,identity:n,ditto:this,transportConfig:h}),this._isActivated=!IdentityTypesRequiringOfflineLicenseToken.includes(n.type),this.store=new Store(this),this.smallPeerInfo=new SmallPeerInfo(this),this.presence=new Presence(this),this.presenceManager=new PresenceManager(this),this.liveQueryManager=new LiveQueryManager(this,this.keepAlive),this.attachmentFetcherManager=new AttachmentFetcherManager(this),this.transportConditionsManager=new TransportConditionsManager(this),this.subscriptionManager=new SubscriptionManager(this),null!=i&&this.auth["@ditto.authenticationExpiring"](i)}static disableDeadlockDetection(){}static hasDeadlockDetection(){return!1}static isEnvironmentSupported(){let e,t=!1;"undefined"!=typeof window&&window.navigator&&window.navigator.userAgent&&window.navigator.appVersion&&(t=-1!==window.navigator.userAgent.indexOf("MSIE")||window.navigator.appVersion.indexOf("Trident/")>-1);try{e=checkAPIs()}catch(e){throw new Error(`Error checking environment support: ${e}`)}return!t&&e}static initPersistenceDirectory(e){let t;if(null==e)t="ditto";else{if(0===e.trim().length)throw new Error(`Invalid argument for path parameter: '${e}'`);t=e}return t=createDirectory(t),t}setOfflineOnlyLicenseToken(e){IdentityTypesRequiringOfflineLicenseToken.includes(this.identity.type)?(this._isActivated=!1,mapFFIErrors((()=>tryVerifyLicense(e))),this._isActivated=!0):Logger.error(`The identity type '${this.identity.type}' does not require an offline license token.`)}get transportConfig(){return this.sync.parameters.transportConfig}setTransportConfig(e){const t=e.copy().freeze(),r=this.identity,n=this.isWebValid,i=this.isX509Valid;this.sync.update({transportConfig:t,identity:r,isWebValid:n,isX509Valid:i,isSyncActive:this.isSyncActive,ditto:this});const o=transportConfigToSerializable(t),s=CBOR.encode(o);this.deferClose((e=>{dittoSmallPeerInfoCollectionSetTransportConfigData(e.deref(),s)}))}updateTransportConfig(e){const t=this.transportConfig.copy();return e(t),this.setTransportConfig(t),this}startSync(){this.setSyncActive(!0)}stopSync(){this.setSyncActive(!1)}observePeers(e){Logger.warning("`ditto.observePeers()` is deprecated, please use `ditto.presence.observe()` instead.");const t=this.presenceManager.addObserver(e);return new Observer(this.presenceManager,t,{stopsWhenFinalized:!0})}observeTransportConditions(e){const t=this.transportConditionsManager.addObserver(e);return new Observer(this.transportConditionsManager,t,{stopsWhenFinalized:!0})}async runGarbageCollection(){return this.deferCloseAsync((async e=>dittoRunGarbageCollection(e.deref())))}async disableSyncWithV3(){throw new Error("This API is not available in React Native environments.")}async close(){if(!this.isClosed){if(this._isClosed=!0,this.stopSync(),this.store.close(),this.presence.close(),this.auth.close(),this.sync.close(),await this.presenceManager.close(),this.liveQueryManager.close(),this.attachmentFetcherManager.close(),this.transportConditionsManager.close(),this.subscriptionManager.close(),this.keepAlive.isActive)throw new Error("Internal inconsistency, still kept alive after the Ditto object has been close()-ed. ");do{await Promise.allSettled(this.pendingOperations)}while(this.pendingOperations.size>0);this.deferCloseAllowed=!1,await Bridge.ditto.close(this)}}get numPendingOperations(){return this.pendingOperations.size}deferClose(e){if(!this.deferCloseAllowed)throw new Error("Can't perform operation using a Ditto instance that has been closed.");return e(Bridge.ditto.handleFor(this))}async deferCloseAsync(e){if(!this.deferCloseAllowed)throw new Error("Can't perform operation using a Ditto instance that has been closed.");const t=e(Bridge.ditto.handleFor(this));let r;this.pendingOperations.add(t);try{r=await t}finally{this.pendingOperations.delete(t)}return r}authClientValidityChanged(e,t){const r=this.transportConfig,n=this.identity,i=this.isSyncActive;this.isX509Valid,this.isWebValid,this.isX509Valid=t,this.isWebValid=e,this.auth["@ditto.authClientValidityChanged"](e,t),this.sync.update({transportConfig:r,identity:n,isWebValid:e,isX509Valid:t,isSyncActive:i,ditto:this})}validateIdentity(e){const t={...e},r=e.appID;if(!["offlinePlayground","sharedKey","manual","onlinePlayground","onlineWithAuthentication"].includes(e.type))throw new Error(`Can't create Ditto instance, unknown identity type: ${e.type}`);if(("offlinePlayground"===e.type||"sharedKey"===e.type||"onlinePlayground"===e.type||"onlineWithAuthentication"===e.type)&&void 0===r)throw new Error("Property .appID must be given for identity, but isn't.");if(void 0!==r&&"string"!=typeof r)throw new Error(`Property .appID must be be of type string, but is of type '${typeof r}': ${r}`);if(("offlinePlayground"===e.type||"sharedKey"===e.type)&&void 0!==e.siteID){const t=e.siteID;if(!("number"==typeof t||"bigint"==typeof t))throw new Error("Can't create Ditto instance, siteID must be a number or BigInt");if(t<0)throw new Error("Can't create Ditto instance, siteID must be >= 0");if(t>BigInt("0xffffffffffffffff"))throw new Error("Can't create Ditto instance, siteID must be < 2^64")}if(e.type,e.type,"onlinePlayground"===e.type){const t=e.token;if(void 0===t)throw new Error("Property .token must be given for identity but isn't. You can find the corresponding token on the Ditto Portal.");if(void 0!==t&&"string"!=typeof t)throw new Error(`Property .token of identity must be be of type string, but is of type '${typeof t}': ${t}`)}return e.type,t}setSyncActive(e){this.deferClose((t=>{if(e&&IdentityTypesRequiringOfflineLicenseToken.includes(this.identity.type)&&!this.isActivated)throw new Error("Sync could not be started because Ditto has not yet been activated. This can be achieved with a successful call to `setOfflineOnlyLicenseToken`. If you need to obtain a license token then please visit https://portal.ditto.live.");!this.isSyncActive&&e&&this.keepAlive.retain("sync"),this.isSyncActive&&!e&&this.keepAlive.release("sync"),this._isSyncActive=e;const r=this.isWebValid,n=this.isX509Valid,i=this.identity,o=this.transportConfig;this._deviceName=dittoSetDeviceName(t.deref(),this.deviceName),this.sync.update({identity:i,transportConfig:o,isWebValid:r,isX509Valid:n,isSyncActive:!!e,ditto:this})}))}makeDefaultTransportConfig(){return this.deferClose((e=>{const t=new TransportConfig;return transportsBLEIsAvailable(e.deref())&&(t.peerToPeer.bluetoothLE.isEnabled=!0),transportsAWDLIsAvailable(e.deref())&&(t.peerToPeer.awdl.isEnabled=!0),transportsLANIsAvailable(e.deref())&&(t.peerToPeer.lan.isEnabled=!0),t.freeze()}))}}const checkAPIs=e=>{const t=e||globalThis||global||window;return["BigInt","WeakRef","FinalizationRegistry"].every((e=>!!t[e]))},disableDeadlockTimeoutWhenDebugging=()=>{},CUSTOM_INSPECT_SYMBOL=Symbol.for("nodejs.util.inspect.custom");class QueryResultItem{get value(){if(this.materialize(),void 0===this.materializedValue)throw new Error("Internal Error: Materialized value is undefined");return this.materializedValue}get isMaterialized(){return void 0!==this.materializedValue}materialize(){if(!this.isMaterialized){const e=this.cborData();let t;try{t=CBOR.decode(e)}catch(e){throw new Error(`Internal inconsistency: CBOR decoding error while materializing result item: ${e.message}`)}if(void 0===t)throw new Error("Internal inconsistency: Materialized value is undefined");this.materializedValue=t}}dematerialize(){this.materializedValue=void 0}cborData(){return queryResultItemCBOR(Bridge.queryResultItem.handleFor(this).deref())}jsonString(){return queryResultItemJSON(Bridge.queryResultItem.handleFor(this).deref())}[CUSTOM_INSPECT_SYMBOL](e,t,r){return customInspectRepresentation(this,r)}constructor(){}}class ConnectionRequest{get peerKeyString(){return connectionRequestPeerKeyString(this.deref())}get peerMetadata(){return JSON.parse(this.peerMetadataJSONString)}get peerMetadataJSONString(){return connectionRequestPeerMetadataJSON(this.deref())}get identityServiceMetadata(){return JSON.parse(this.identityServiceMetadataJSONString)}get identityServiceMetadataJSONString(){return connectionRequestIdentityServiceMetadataJSON(this.deref())}get connectionType(){return connectionRequestConnectionType(this.deref())}toString(){return`ConnectionRequest(${this.peerKeyString} via ${this.connectionType})`}[Symbol.for("nodejs.util.inspect.custom")](e,t,r){return this.toString()}deref(){return Bridge.connectionRequest.handleFor(this).deref()}}Bridge.attachment.registerType(Attachment),Bridge.connectionRequest.registerType(ConnectionRequest),Bridge.document.registerType(Document),Bridge.queryResultItem.registerType(QueryResultItem),Bridge.queryResult.registerType(QueryResult),Bridge.mutableDocument.registerType(MutableDocument),Bridge.ditto.registerType(Ditto);export{Attachment,AttachmentFetcher,AttachmentToken,Authenticator,ConnectionRequest,Ditto,DittoError,DocumentID,ERROR_CODES,IdentityTypesRequiringOfflineLicenseToken,Logger,NotAvailableAuthenticator,Observer,OnlineAuthenticator,Presence,QueryResult,QueryResultItem,SmallPeerInfo,Store,StoreObserver,Sync,SyncSubscription,TransportConfig,addressToString,checkAPIs,disableDeadlockTimeoutWhenDebugging,getMissingAndroidPermissions,init,mapFFIErrors,mapFFIErrorsAsync,transportConfigFromDeserializable,transportConfigToSerializable,validateAttachmentMetadata,validateDocumentIDCBOR,validateDocumentIDValue};
|
|
2
2
|
//# sourceMappingURL=ditto.es6.js.map
|