@dittolive/ditto 4.4.4 → 4.5.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/DittoReactNative.podspec +27 -0
- package/README.md +68 -51
- package/node/ditto.cjs.js +1639 -851
- 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-x64.node +0 -0
- package/node/ditto.win32-x64.node +0 -0
- package/node/transports.darwin-arm64.node +0 -0
- package/node/transports.darwin-x64.node +0 -0
- package/package.json +34 -38
- package/react-native/android/CMakeLists.txt +37 -0
- package/react-native/android/build.gradle +203 -0
- package/react-native/android/cpp-adapter.cpp +254 -0
- package/react-native/android/gradle.properties +5 -0
- package/react-native/android/src/main/AndroidManifest.xml +4 -0
- package/react-native/android/src/main/java/com/dittolive/rnsdk/DittoRNSDKModule.java +85 -0
- package/react-native/android/src/main/java/com/dittolive/rnsdk/DittoRNSDKPackage.java +28 -0
- package/react-native/boost/boost/assert.hpp +85 -0
- package/react-native/boost/boost/config/abi/borland_prefix.hpp +27 -0
- package/react-native/boost/boost/config/abi/borland_suffix.hpp +12 -0
- package/react-native/boost/boost/config/abi/msvc_prefix.hpp +22 -0
- package/react-native/boost/boost/config/abi/msvc_suffix.hpp +8 -0
- package/react-native/boost/boost/config/abi_prefix.hpp +25 -0
- package/react-native/boost/boost/config/abi_suffix.hpp +25 -0
- package/react-native/boost/boost/config/assert_cxx03.hpp +211 -0
- package/react-native/boost/boost/config/assert_cxx11.hpp +209 -0
- package/react-native/boost/boost/config/assert_cxx14.hpp +47 -0
- package/react-native/boost/boost/config/assert_cxx17.hpp +62 -0
- package/react-native/boost/boost/config/assert_cxx20.hpp +59 -0
- package/react-native/boost/boost/config/assert_cxx98.hpp +23 -0
- package/react-native/boost/boost/config/auto_link.hpp +525 -0
- package/react-native/boost/boost/config/compiler/borland.hpp +339 -0
- package/react-native/boost/boost/config/compiler/clang.hpp +366 -0
- package/react-native/boost/boost/config/compiler/clang_version.hpp +83 -0
- package/react-native/boost/boost/config/compiler/codegear.hpp +385 -0
- package/react-native/boost/boost/config/compiler/comeau.hpp +59 -0
- package/react-native/boost/boost/config/compiler/common_edg.hpp +183 -0
- package/react-native/boost/boost/config/compiler/compaq_cxx.hpp +19 -0
- package/react-native/boost/boost/config/compiler/cray.hpp +446 -0
- package/react-native/boost/boost/config/compiler/diab.hpp +26 -0
- package/react-native/boost/boost/config/compiler/digitalmars.hpp +143 -0
- package/react-native/boost/boost/config/compiler/gcc.hpp +383 -0
- package/react-native/boost/boost/config/compiler/gcc_xml.hpp +114 -0
- package/react-native/boost/boost/config/compiler/greenhills.hpp +28 -0
- package/react-native/boost/boost/config/compiler/hp_acc.hpp +149 -0
- package/react-native/boost/boost/config/compiler/intel.hpp +577 -0
- package/react-native/boost/boost/config/compiler/kai.hpp +33 -0
- package/react-native/boost/boost/config/compiler/metrowerks.hpp +198 -0
- package/react-native/boost/boost/config/compiler/mpw.hpp +140 -0
- package/react-native/boost/boost/config/compiler/nvcc.hpp +61 -0
- package/react-native/boost/boost/config/compiler/pathscale.hpp +138 -0
- package/react-native/boost/boost/config/compiler/pgi.hpp +23 -0
- package/react-native/boost/boost/config/compiler/sgi_mipspro.hpp +29 -0
- package/react-native/boost/boost/config/compiler/sunpro_cc.hpp +222 -0
- package/react-native/boost/boost/config/compiler/vacpp.hpp +186 -0
- package/react-native/boost/boost/config/compiler/visualc.hpp +391 -0
- package/react-native/boost/boost/config/compiler/xlcpp.hpp +299 -0
- package/react-native/boost/boost/config/compiler/xlcpp_zos.hpp +173 -0
- package/react-native/boost/boost/config/detail/cxx_composite.hpp +203 -0
- package/react-native/boost/boost/config/detail/posix_features.hpp +95 -0
- package/react-native/boost/boost/config/detail/select_compiler_config.hpp +157 -0
- package/react-native/boost/boost/config/detail/select_platform_config.hpp +147 -0
- package/react-native/boost/boost/config/detail/select_stdlib_config.hpp +121 -0
- package/react-native/boost/boost/config/detail/suffix.hpp +1294 -0
- package/react-native/boost/boost/config/header_deprecated.hpp +26 -0
- package/react-native/boost/boost/config/helper_macros.hpp +37 -0
- package/react-native/boost/boost/config/no_tr1/cmath.hpp +28 -0
- package/react-native/boost/boost/config/no_tr1/complex.hpp +28 -0
- package/react-native/boost/boost/config/no_tr1/functional.hpp +28 -0
- package/react-native/boost/boost/config/no_tr1/memory.hpp +28 -0
- package/react-native/boost/boost/config/no_tr1/utility.hpp +28 -0
- package/react-native/boost/boost/config/platform/aix.hpp +33 -0
- package/react-native/boost/boost/config/platform/amigaos.hpp +15 -0
- package/react-native/boost/boost/config/platform/beos.hpp +26 -0
- package/react-native/boost/boost/config/platform/bsd.hpp +83 -0
- package/react-native/boost/boost/config/platform/cloudabi.hpp +18 -0
- package/react-native/boost/boost/config/platform/cray.hpp +18 -0
- package/react-native/boost/boost/config/platform/cygwin.hpp +71 -0
- package/react-native/boost/boost/config/platform/haiku.hpp +31 -0
- package/react-native/boost/boost/config/platform/hpux.hpp +87 -0
- package/react-native/boost/boost/config/platform/irix.hpp +31 -0
- package/react-native/boost/boost/config/platform/linux.hpp +106 -0
- package/react-native/boost/boost/config/platform/macos.hpp +87 -0
- package/react-native/boost/boost/config/platform/qnxnto.hpp +31 -0
- package/react-native/boost/boost/config/platform/solaris.hpp +31 -0
- package/react-native/boost/boost/config/platform/symbian.hpp +97 -0
- package/react-native/boost/boost/config/platform/vms.hpp +25 -0
- package/react-native/boost/boost/config/platform/vxworks.hpp +422 -0
- package/react-native/boost/boost/config/platform/wasm.hpp +23 -0
- package/react-native/boost/boost/config/platform/win32.hpp +90 -0
- package/react-native/boost/boost/config/platform/zos.hpp +32 -0
- package/react-native/boost/boost/config/pragma_message.hpp +31 -0
- package/react-native/boost/boost/config/requires_threads.hpp +92 -0
- package/react-native/boost/boost/config/stdlib/dinkumware.hpp +324 -0
- package/react-native/boost/boost/config/stdlib/libcomo.hpp +93 -0
- package/react-native/boost/boost/config/stdlib/libcpp.hpp +180 -0
- package/react-native/boost/boost/config/stdlib/libstdcpp3.hpp +482 -0
- package/react-native/boost/boost/config/stdlib/modena.hpp +79 -0
- package/react-native/boost/boost/config/stdlib/msl.hpp +98 -0
- package/react-native/boost/boost/config/stdlib/roguewave.hpp +208 -0
- package/react-native/boost/boost/config/stdlib/sgi.hpp +168 -0
- package/react-native/boost/boost/config/stdlib/stlport.hpp +258 -0
- package/react-native/boost/boost/config/stdlib/vacpp.hpp +74 -0
- package/react-native/boost/boost/config/stdlib/xlcpp_zos.hpp +61 -0
- package/react-native/boost/boost/config/user.hpp +133 -0
- package/react-native/boost/boost/config/warning_disable.hpp +47 -0
- package/react-native/boost/boost/config/workaround.hpp +305 -0
- package/react-native/boost/boost/config.hpp +67 -0
- package/react-native/boost/boost/cstdint.hpp +556 -0
- package/react-native/boost/boost/intrusive_ptr.hpp +18 -0
- package/react-native/boost/boost/smart_ptr/detail/atomic_count.hpp +103 -0
- package/react-native/boost/boost/smart_ptr/detail/atomic_count_gcc.hpp +79 -0
- package/react-native/boost/boost/smart_ptr/detail/atomic_count_gcc_atomic.hpp +63 -0
- package/react-native/boost/boost/smart_ptr/detail/atomic_count_gcc_x86.hpp +88 -0
- package/react-native/boost/boost/smart_ptr/detail/atomic_count_nt.hpp +66 -0
- package/react-native/boost/boost/smart_ptr/detail/atomic_count_pt.hpp +104 -0
- package/react-native/boost/boost/smart_ptr/detail/atomic_count_spin.hpp +69 -0
- package/react-native/boost/boost/smart_ptr/detail/atomic_count_std_atomic.hpp +67 -0
- package/react-native/boost/boost/smart_ptr/detail/atomic_count_sync.hpp +72 -0
- package/react-native/boost/boost/smart_ptr/detail/atomic_count_win32.hpp +70 -0
- package/react-native/boost/boost/smart_ptr/detail/local_counted_base.hpp +148 -0
- package/react-native/boost/boost/smart_ptr/detail/local_sp_deleter.hpp +91 -0
- package/react-native/boost/boost/smart_ptr/detail/operator_bool.hpp +64 -0
- package/react-native/boost/boost/smart_ptr/detail/requires_cxx11.hpp +23 -0
- package/react-native/boost/boost/smart_ptr/detail/shared_count.hpp +707 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_convertible.hpp +92 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base.hpp +92 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +163 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_aix.hpp +152 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +185 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_gcc_atomic.hpp +148 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +170 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +200 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +194 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +179 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +186 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_nt.hpp +119 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_pt.hpp +147 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +174 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_spin.hpp +141 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_std_atomic.hpp +147 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_sync.hpp +165 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +163 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_base_w32.hpp +140 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_counted_impl.hpp +309 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_disable_deprecated.hpp +40 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_forward.hpp +52 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp +27 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_has_sync_intrinsics.hpp +69 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_interlocked.hpp +173 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_noexcept.hpp +48 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_nullptr_t.hpp +45 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_obsolete.hpp +32 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_thread_pause.hpp +51 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_thread_sleep.hpp +104 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_thread_yield.hpp +100 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_typeinfo_.hpp +58 -0
- package/react-native/boost/boost/smart_ptr/detail/sp_win32_sleep.hpp +49 -0
- package/react-native/boost/boost/smart_ptr/intrusive_ptr.hpp +409 -0
- package/react-native/boost/boost/smart_ptr/intrusive_ref_counter.hpp +188 -0
- package/react-native/cpp/include/Attachment.h +16 -0
- package/react-native/cpp/include/Authentication.h +23 -0
- package/react-native/cpp/include/Collection.h +13 -0
- package/react-native/cpp/include/DQL.h +21 -0
- package/react-native/cpp/include/Document.h +17 -0
- package/react-native/cpp/include/Identity.h +17 -0
- package/react-native/cpp/include/Lifecycle.h +16 -0
- package/react-native/cpp/include/LiveQuery.h +17 -0
- package/react-native/cpp/include/Logger.h +22 -0
- package/react-native/cpp/include/Misc.h +26 -0
- package/react-native/cpp/include/Presence.h +14 -0
- package/react-native/cpp/include/RetainableState.h +24 -0
- package/react-native/cpp/include/SmallPeerInfo.h +17 -0
- package/react-native/cpp/include/Transports.h +25 -0
- package/react-native/cpp/include/TypedArray.hpp +167 -0
- package/react-native/cpp/include/Utils.h +61 -0
- package/react-native/cpp/include/main.h +10 -0
- package/react-native/cpp/src/Attachment.cpp +86 -0
- package/react-native/cpp/src/Authentication.cpp +224 -0
- package/react-native/cpp/src/Collection.cpp +54 -0
- package/react-native/cpp/src/DQL.cpp +254 -0
- package/react-native/cpp/src/Document.cpp +146 -0
- package/react-native/cpp/src/Identity.cpp +123 -0
- package/react-native/cpp/src/Lifecycle.cpp +75 -0
- package/react-native/cpp/src/LiveQuery.cpp +64 -0
- package/react-native/cpp/src/Logger.cpp +200 -0
- package/react-native/cpp/src/Misc.cpp +271 -0
- package/react-native/cpp/src/Presence.cpp +77 -0
- package/react-native/cpp/src/RetainableState.cpp +15 -0
- package/react-native/cpp/src/SmallPeerInfo.cpp +108 -0
- package/react-native/cpp/src/Transports.cpp +270 -0
- package/react-native/cpp/src/TypedArray.cpp +303 -0
- package/react-native/cpp/src/Utils.cpp +138 -0
- package/react-native/cpp/src/main.cpp +149 -0
- package/react-native/dittoffi/dittoffi.h +4698 -0
- package/react-native/dittoffi/ifaddrs.cpp +385 -0
- package/react-native/dittoffi/ifaddrs.h +206 -0
- package/react-native/ios/DittoRNSDK.h +7 -0
- package/react-native/ios/DittoRNSDK.mm +107 -0
- package/react-native/ios/YeetJSIUtils.h +60 -0
- package/react-native/ios/YeetJSIUtils.mm +196 -0
- package/react-native/lib/commonjs/ditto.rn.js +93 -0
- package/react-native/lib/commonjs/ditto.rn.js.map +1 -0
- package/react-native/lib/commonjs/index.js +14 -0
- package/react-native/lib/commonjs/index.js.map +1 -0
- package/react-native/lib/module/ditto.rn.js +83 -0
- package/react-native/lib/module/ditto.rn.js.map +1 -0
- package/react-native/lib/module/index.js +13 -0
- package/react-native/lib/module/index.js.map +1 -0
- package/react-native/lib/typescript/ditto.rn.d.ts +15 -0
- package/react-native/lib/typescript/ditto.rn.d.ts.map +1 -0
- package/react-native/lib/typescript/index.d.ts +1 -0
- package/react-native/lib/typescript/index.d.ts.map +1 -0
- package/react-native/scripts/ruby/include_local_boost.rb +78 -0
- package/react-native/src/ditto.rn.ts +91 -0
- package/react-native/src/environment/environment.fallback.ts +4 -0
- package/react-native/src/index.ts +26 -0
- package/react-native/src/sources/@cbor-redux.ts +2 -0
- package/react-native/src/sources/@ditto.core.ts +1 -0
- package/react-native/src/sources/@environment.ts +2 -0
- package/react-native/src/sources/attachment-fetch-event.ts +54 -0
- package/react-native/src/sources/attachment-fetcher-manager.ts +129 -0
- package/react-native/src/sources/attachment-fetcher.ts +124 -0
- package/react-native/src/sources/attachment-token.ts +48 -0
- package/react-native/src/sources/attachment.ts +59 -0
- package/react-native/src/sources/augment.ts +89 -0
- package/react-native/src/sources/authenticator.ts +314 -0
- package/react-native/src/sources/base-pending-cursor-operation.ts +237 -0
- package/react-native/src/sources/base-pending-id-specific-operation.ts +109 -0
- package/react-native/src/sources/bridge.ts +549 -0
- package/react-native/src/sources/build-time-constants.ts +4 -0
- package/react-native/src/sources/cbor.ts +35 -0
- package/react-native/src/sources/collection-interface.ts +67 -0
- package/react-native/src/sources/collection.ts +212 -0
- package/react-native/src/sources/collections-event.ts +99 -0
- package/react-native/src/sources/counter.ts +77 -0
- package/react-native/src/sources/ditto.ts +945 -0
- package/react-native/src/sources/document-id.ts +159 -0
- package/react-native/src/sources/document-path.ts +303 -0
- package/react-native/src/sources/document.ts +192 -0
- package/react-native/src/sources/epilogue.ts +24 -0
- package/react-native/src/sources/error-codes.ts +52 -0
- package/react-native/src/sources/error.ts +203 -0
- package/react-native/src/sources/essentials.ts +53 -0
- package/react-native/src/sources/ffi-error.ts +117 -0
- package/react-native/src/sources/ffi.ts +1972 -0
- package/react-native/src/sources/identity.ts +163 -0
- package/react-native/src/sources/init.ts +70 -0
- package/react-native/src/sources/internal.ts +113 -0
- package/react-native/src/sources/keep-alive.ts +69 -0
- package/react-native/src/sources/key-path.ts +195 -0
- package/react-native/src/sources/live-query-event.ts +208 -0
- package/react-native/src/sources/live-query-manager.ts +101 -0
- package/react-native/src/sources/live-query.ts +164 -0
- package/react-native/src/sources/logger.ts +196 -0
- package/react-native/src/sources/observer-manager.ts +175 -0
- package/react-native/src/sources/observer.ts +77 -0
- package/react-native/src/sources/pending-collections-operation.ts +232 -0
- package/react-native/src/sources/pending-cursor-operation.ts +218 -0
- package/react-native/src/sources/pending-id-specific-operation.ts +216 -0
- package/react-native/src/sources/presence-manager.ts +160 -0
- package/react-native/src/sources/presence.ts +238 -0
- package/react-native/src/sources/query-result-item.ts +116 -0
- package/react-native/src/sources/query-result.ts +55 -0
- package/react-native/src/sources/register.ts +92 -0
- package/react-native/src/sources/small-peer-info.ts +176 -0
- package/react-native/src/sources/static-tcp-client.ts +6 -0
- package/react-native/src/sources/store-observer.ts +176 -0
- package/react-native/src/sources/store.ts +365 -0
- package/react-native/src/sources/subscription-manager.ts +98 -0
- package/react-native/src/sources/subscription.ts +88 -0
- package/react-native/src/sources/sync-subscription.ts +90 -0
- package/react-native/src/sources/sync.ts +495 -0
- package/react-native/src/sources/test-helpers.ts +24 -0
- package/react-native/src/sources/transport-conditions-manager.ts +104 -0
- package/react-native/src/sources/transport-config.ts +428 -0
- package/react-native/src/sources/update-result.ts +66 -0
- package/react-native/src/sources/update-results-map.ts +57 -0
- package/react-native/src/sources/websocket-client.ts +6 -0
- package/react-native/src/sources/write-transaction-collection.ts +122 -0
- package/react-native/src/sources/write-transaction-pending-cursor-operation.ts +101 -0
- package/react-native/src/sources/write-transaction-pending-id-specific-operation.ts +72 -0
- package/react-native/src/sources/write-transaction.ts +119 -0
- package/react-native.config.js +9 -0
- package/types/ditto.d.ts +1230 -798
- package/web/ditto.es6.js +1 -1
- package/web/ditto.umd.js +1 -1
- package/web/ditto.wasm +0 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# By default, Cocoapods bundle development pod source files under one single
|
|
2
|
+
# folder. This forces us to change all the relative paths in the boost folder
|
|
3
|
+
# (which is used by multiple people).
|
|
4
|
+
#
|
|
5
|
+
# In order not to do that, we will create a subspec for each folder in the
|
|
6
|
+
# relative path. In the end, we will be able to call boost files like this
|
|
7
|
+
# again:
|
|
8
|
+
#
|
|
9
|
+
# # main.cpp
|
|
10
|
+
#
|
|
11
|
+
# #include <boost/smart_ptr/intrusive_ref_counter.hpp>
|
|
12
|
+
#
|
|
13
|
+
# # instead of:
|
|
14
|
+
#
|
|
15
|
+
# #include "intrusive_ref_counter.hpp"
|
|
16
|
+
#
|
|
17
|
+
# Related: https://github.com/CocoaPods/CocoaPods/issues/8873
|
|
18
|
+
def include_local_boost(s)
|
|
19
|
+
s.subspec 'boost' do |boost|
|
|
20
|
+
boost.source_files = "react-native/boost/boost/**/*.{h,cpp,hpp}"
|
|
21
|
+
boost.public_header_files = 'react-native/boost/boost/**/*.hpp'
|
|
22
|
+
boost.header_dir = 'boost'
|
|
23
|
+
|
|
24
|
+
boost.subspec 'smart_ptr' do |smart_ptr|
|
|
25
|
+
smart_ptr.source_files = "react-native/boost/boost/smart_ptr/**/*.{h,cpp,hpp}"
|
|
26
|
+
smart_ptr.public_header_files = 'react-native/boost/boost/smart_ptr/**/*.hpp'
|
|
27
|
+
smart_ptr.header_dir = 'boost/smart_ptr'
|
|
28
|
+
|
|
29
|
+
smart_ptr.subspec 'detail' do |detail|
|
|
30
|
+
detail.source_files = "react-native/boost/boost/smart_ptr/detail/**/*.{h,cpp,hpp}"
|
|
31
|
+
detail.public_header_files = 'react-native/boost/boost/smart_ptr/detail/**/*.hpp'
|
|
32
|
+
detail.header_dir = 'boost/smart_ptr/detail'
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
boost.subspec 'config' do |config|
|
|
37
|
+
config.source_files = "react-native/boost/boost/config/**/*.{h,cpp,hpp}"
|
|
38
|
+
config.public_header_files = 'react-native/boost/boost/config/**/*.hpp'
|
|
39
|
+
config.header_dir = 'boost/config'
|
|
40
|
+
|
|
41
|
+
config.subspec 'abi' do |abi|
|
|
42
|
+
abi.source_files = "react-native/boost/boost/config/abi/**/*.{h,cpp,hpp}"
|
|
43
|
+
abi.public_header_files = 'react-native/boost/boost/config/abi/**/*.hpp'
|
|
44
|
+
abi.header_dir = 'boost/config/abi'
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
config.subspec 'compiler' do |compiler|
|
|
48
|
+
compiler.source_files = "react-native/boost/boost/config/compiler/**/*.{h,cpp,hpp}"
|
|
49
|
+
compiler.public_header_files = 'react-native/boost/boost/config/compiler/**/*.hpp'
|
|
50
|
+
compiler.header_dir = 'boost/config/compiler'
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
config.subspec 'detail' do |detail|
|
|
54
|
+
detail.source_files = "react-native/boost/boost/config/detail/**/*.{h,cpp,hpp}"
|
|
55
|
+
detail.public_header_files = 'react-native/boost/boost/config/detail/**/*.hpp'
|
|
56
|
+
detail.header_dir = 'boost/config/detail'
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
config.subspec 'no_tr1' do |no_tr1|
|
|
60
|
+
no_tr1.source_files = "react-native/boost/boost/config/no_tr1/**/*.{h,cpp,hpp}"
|
|
61
|
+
no_tr1.public_header_files = 'react-native/boost/boost/config/no_tr1/**/*.hpp'
|
|
62
|
+
no_tr1.header_dir = 'boost/config/no_tr1'
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
config.subspec 'platform' do |platform|
|
|
66
|
+
platform.source_files = "react-native/boost/boost/config/platform/**/*.{h,cpp,hpp}"
|
|
67
|
+
platform.public_header_files = 'react-native/boost/boost/config/platform/**/*.hpp'
|
|
68
|
+
platform.header_dir = 'boost/config/platform'
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
config.subspec 'stdlib' do |stdlib|
|
|
72
|
+
stdlib.source_files = "react-native/boost/boost/config/stdlib/**/*.{h,cpp,hpp}"
|
|
73
|
+
stdlib.public_header_files = 'react-native/boost/boost/config/stdlib/**/*.hpp'
|
|
74
|
+
stdlib.header_dir = 'boost/config/stdlib'
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { NativeModules, Platform, type Permission } from 'react-native';
|
|
2
|
+
import { FinalizationGroup } from '@ungap/weakrefs';
|
|
3
|
+
import 'fastestsmallesttextencoderdecoder';
|
|
4
|
+
|
|
5
|
+
interface JSSDKAPI {
|
|
6
|
+
ditto_sdk_transports_init(transportsErrorPointer: any): boolean;
|
|
7
|
+
}
|
|
8
|
+
interface PlatformSpecificAPI {
|
|
9
|
+
getRandomValues<T extends ArrayBufferView>(array: T): T;
|
|
10
|
+
ditto_tick(): void;
|
|
11
|
+
createDirectory(path: string): string;
|
|
12
|
+
checkDirectoryExists(path: string): string;
|
|
13
|
+
getDeviceName(): string;
|
|
14
|
+
|
|
15
|
+
ditto_sdk_transports_set_android_context(): boolean;
|
|
16
|
+
ditto_sdk_transports_android_missing_permissions(): string[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
type DittoCoreType = JSSDKAPI & PlatformSpecificAPI;
|
|
20
|
+
|
|
21
|
+
const dittoCore = global as unknown as DittoCoreType;
|
|
22
|
+
const isLoaded = typeof dittoCore.getDeviceName === 'function';
|
|
23
|
+
if (!isLoaded) {
|
|
24
|
+
const result = NativeModules.DittoRNSDK?.install();
|
|
25
|
+
|
|
26
|
+
if (!result) {
|
|
27
|
+
throw new Error('JSI bindings were not installed for: DittoRNSDK Module');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
setInterval(() => {
|
|
31
|
+
dittoCore.ditto_tick();
|
|
32
|
+
}, 50);
|
|
33
|
+
|
|
34
|
+
if (
|
|
35
|
+
typeof global.FinalizationRegistry === 'undefined' &&
|
|
36
|
+
typeof FinalizationGroup !== 'undefined'
|
|
37
|
+
) {
|
|
38
|
+
global.FinalizationRegistry = FinalizationGroup;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
Object.keys(dittoCore)
|
|
43
|
+
.filter((key) => key !== 'ditto_sdk_transports_init')
|
|
44
|
+
.forEach((key) => {
|
|
45
|
+
exports[key] = dittoCore[key as keyof DittoCoreType];
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
export function ditto_sdk_transports_init(
|
|
49
|
+
transportsErrorPointer: any
|
|
50
|
+
): boolean {
|
|
51
|
+
if (Platform.OS === 'android') {
|
|
52
|
+
const res = dittoCore.ditto_sdk_transports_set_android_context();
|
|
53
|
+
if (!res) {
|
|
54
|
+
throw new Error(
|
|
55
|
+
"Couldn't manage to set Android context with `ditto_sdk_transports_set_android_context()`"
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return dittoCore.ditto_sdk_transports_init(transportsErrorPointer);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Get the list of missing Android permissions for syncing. The returned value
|
|
65
|
+
* can be passed directly to `PermissionsAndroid.requestMultiple()`.
|
|
66
|
+
*
|
|
67
|
+
* Returns an empty array on other platforms.
|
|
68
|
+
*/
|
|
69
|
+
export function getMissingAndroidPermissions(): Permission[] {
|
|
70
|
+
if (Platform.OS !== 'android') {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
return dittoCore.ditto_sdk_transports_android_missing_permissions() as Permission[];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function boxCStringIntoString(something: any) {
|
|
77
|
+
return something;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function boxCBytesIntoBuffer(cborBytes: any) {
|
|
81
|
+
const bytes = dittoCore.sliceBoxedToUInt8Array(cborBytes);
|
|
82
|
+
return bytes ? new Uint8Array(bytes) : null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function getDeadlockTimeout(): number {
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function setDeadlockTimeout(something: any) {
|
|
90
|
+
return something;
|
|
91
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
|
|
2
|
+
export { getMissingAndroidPermissions } from './ditto.rn';
|
|
3
|
+
|
|
4
|
+
export * from './sources/essentials';
|
|
5
|
+
|
|
6
|
+
export * from './sources/logger';
|
|
7
|
+
export * from './sources/document-id';
|
|
8
|
+
export * from './sources/observer';
|
|
9
|
+
|
|
10
|
+
export * from './sources/authenticator';
|
|
11
|
+
export * from './sources/identity';
|
|
12
|
+
export * from './sources/ditto';
|
|
13
|
+
export * from './sources/store-observer';
|
|
14
|
+
export * from './sources/sync';
|
|
15
|
+
export * from './sources/sync-subscription';
|
|
16
|
+
export * from './sources/error';
|
|
17
|
+
export * from './sources/error-codes';
|
|
18
|
+
export * from './sources/query-result-item';
|
|
19
|
+
export * from './sources/query-result';
|
|
20
|
+
|
|
21
|
+
export * from './sources/small-peer-info';
|
|
22
|
+
export * from './sources/store';
|
|
23
|
+
export * from './sources/presence';
|
|
24
|
+
export * from './sources/transport-config';
|
|
25
|
+
|
|
26
|
+
export * from './sources/epilogue';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../ditto.rn';
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright © 2021 DittoLive Incorporated. All rights reserved.
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type { Attachment } from './attachment'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The types of attachment fetch events that can be delivered to an attachment
|
|
9
|
+
* fetcher's `callback`.
|
|
10
|
+
*/
|
|
11
|
+
export type AttachmentFetchEventType = 'Completed' | 'Progress' | 'Deleted'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* An attachment fetch event used when the attachment's download has completed.
|
|
15
|
+
*/
|
|
16
|
+
export type AttachmentFetchEventCompleted = {
|
|
17
|
+
type: 'Completed'
|
|
18
|
+
attachment: Attachment
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* An attachment fetch event used when the attachment's download progressed but
|
|
23
|
+
* is not yet complete.
|
|
24
|
+
*/
|
|
25
|
+
export type AttachmentFetchEventProgress = {
|
|
26
|
+
type: 'Progress'
|
|
27
|
+
totalBytes: number | BigInt
|
|
28
|
+
downloadedBytes: number | BigInt
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* An attachment fetch event used when the attachment is deleted.
|
|
33
|
+
*/
|
|
34
|
+
export type AttachmentFetchEventDeleted = {
|
|
35
|
+
type: 'Deleted'
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* A representation of the events that can occur in relation to an attachment
|
|
40
|
+
* fetch.
|
|
41
|
+
*
|
|
42
|
+
* There are three different attachment fetch events: `Completed`, `Progress`,
|
|
43
|
+
* or `Deleted`.
|
|
44
|
+
*
|
|
45
|
+
* There will be at most one `Completed` or `Deleted` event per attachment
|
|
46
|
+
* fetch. There can be many `Progress` events delivered for each attachment
|
|
47
|
+
* fetch.
|
|
48
|
+
*
|
|
49
|
+
* Updates relating to an attachment fetch are delivered by registering an
|
|
50
|
+
* {@link AttachmentFetcher} through a call to
|
|
51
|
+
* {@link Collection.fetchAttachment | fetchAttachment()} on a
|
|
52
|
+
* {@link Collection} instance.
|
|
53
|
+
*/
|
|
54
|
+
export type AttachmentFetchEvent = AttachmentFetchEventCompleted | AttachmentFetchEventProgress | AttachmentFetchEventDeleted
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import * as FFI from './ffi'
|
|
2
|
+
|
|
3
|
+
import { AttachmentFetcher } from './attachment-fetcher'
|
|
4
|
+
import { AttachmentToken } from './attachment-token'
|
|
5
|
+
import { Bridge } from './bridge'
|
|
6
|
+
import { Ditto } from './ditto'
|
|
7
|
+
|
|
8
|
+
import type { AttachmentFetchEvent } from './attachment-fetch-event'
|
|
9
|
+
|
|
10
|
+
/** @internal */
|
|
11
|
+
type AttachmentFetcherContextInfo = {
|
|
12
|
+
attachmentFetcher: WeakRef<AttachmentFetcher>
|
|
13
|
+
attachmentTokenID: Uint8Array
|
|
14
|
+
id: string
|
|
15
|
+
cancelTokenPromise: Promise<unknown | null> | null
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Manages attachment fetchers to make sure we free all resources when the
|
|
20
|
+
* fetcher is garbage collected and to allow us to wait for freeing of
|
|
21
|
+
* ressources to be finished before the ditto instance is closed.
|
|
22
|
+
*
|
|
23
|
+
* @internal */
|
|
24
|
+
export class AttachmentFetcherManager {
|
|
25
|
+
readonly ditto: Ditto
|
|
26
|
+
|
|
27
|
+
/** @internal */
|
|
28
|
+
constructor(ditto: Ditto) {
|
|
29
|
+
this.ditto = ditto
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Start an attachment fetcher.
|
|
34
|
+
*
|
|
35
|
+
* @internal */
|
|
36
|
+
startAttachmentFetcher(token: AttachmentToken, eventHandler?: (attachmentFetchEvent: AttachmentFetchEvent) => void): AttachmentFetcher {
|
|
37
|
+
return this.ditto.deferClose(() => {
|
|
38
|
+
const attachmentFetcher = new AttachmentFetcher(this.ditto, token, this, eventHandler)
|
|
39
|
+
|
|
40
|
+
const contextInfo: AttachmentFetcherContextInfo = {
|
|
41
|
+
id: attachmentFetcher.id,
|
|
42
|
+
attachmentTokenID: token.id,
|
|
43
|
+
cancelTokenPromise: attachmentFetcher.cancelTokenPromise,
|
|
44
|
+
attachmentFetcher: new WeakRef(attachmentFetcher),
|
|
45
|
+
}
|
|
46
|
+
this.finalizationRegistry.register(attachmentFetcher, contextInfo, attachmentFetcher)
|
|
47
|
+
|
|
48
|
+
this.contextInfoByID[attachmentFetcher.id] = contextInfo
|
|
49
|
+
|
|
50
|
+
const resetCancelToken = () => {
|
|
51
|
+
if (this.contextInfoByID[attachmentFetcher.id] != null) {
|
|
52
|
+
this.contextInfoByID[attachmentFetcher.id].cancelTokenPromise = null
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
attachmentFetcher.attachment.then(
|
|
56
|
+
(value) => {
|
|
57
|
+
resetCancelToken()
|
|
58
|
+
return value
|
|
59
|
+
},
|
|
60
|
+
(reason) => {
|
|
61
|
+
resetCancelToken()
|
|
62
|
+
return reason
|
|
63
|
+
},
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
this.ditto.keepAlive.retain(`AttachmentFetcher.${attachmentFetcher.id})`)
|
|
67
|
+
|
|
68
|
+
return attachmentFetcher
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Stop an attachment fetcher and wait for it to be stopped.
|
|
74
|
+
*
|
|
75
|
+
* @internal */
|
|
76
|
+
async stopAttachmentFetcher(attachmentFetcher: AttachmentFetcher): Promise<void> {
|
|
77
|
+
this.finalizationRegistry.unregister(attachmentFetcher)
|
|
78
|
+
const contextInfo = this.contextInfoByID[attachmentFetcher.id]
|
|
79
|
+
if (contextInfo == null) {
|
|
80
|
+
throw new Error(`Internal inconsistency: cannot stop attachment fetcher ${attachmentFetcher.id}, which is not registered.`)
|
|
81
|
+
}
|
|
82
|
+
await this.stopWithContextInfo(contextInfo)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Closing the manager will cancel all attachment fetchers.
|
|
87
|
+
*
|
|
88
|
+
* @internal
|
|
89
|
+
*/
|
|
90
|
+
close() {
|
|
91
|
+
this.ditto.deferCloseAsync(async () => {
|
|
92
|
+
const contextInfos = Object.values(this.contextInfoByID)
|
|
93
|
+
const stopped = contextInfos.map(async (contextInfo) => {
|
|
94
|
+
const attachmentFetcher = contextInfo.attachmentFetcher.deref()
|
|
95
|
+
if (attachmentFetcher != null) {
|
|
96
|
+
await this.stopAttachmentFetcher(attachmentFetcher)
|
|
97
|
+
}
|
|
98
|
+
})
|
|
99
|
+
await Promise.all(stopped)
|
|
100
|
+
})
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// --- Private ---
|
|
104
|
+
|
|
105
|
+
private contextInfoByID: { [attachmentFetcherID: string]: AttachmentFetcherContextInfo } = {}
|
|
106
|
+
|
|
107
|
+
private finalizationRegistry: FinalizationRegistry<AttachmentFetcherContextInfo> = new FinalizationRegistry(this.stopWithContextInfo)
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Stop the attachment fetcher without unregistering it from the finalization
|
|
111
|
+
* registry.
|
|
112
|
+
*/
|
|
113
|
+
private stopWithContextInfo(contextInfo: AttachmentFetcherContextInfo): Promise<void> {
|
|
114
|
+
const dittoHandle = Bridge.ditto.handleFor(this.ditto)
|
|
115
|
+
return this.ditto.deferCloseAsync(async () => {
|
|
116
|
+
if (this.contextInfoByID[contextInfo.id] == null) {
|
|
117
|
+
throw new Error(`Internal inconsistency: attachment fetcher ${contextInfo.id} not found in active attachment fetchers.`)
|
|
118
|
+
}
|
|
119
|
+
delete this.contextInfoByID[contextInfo.id]
|
|
120
|
+
|
|
121
|
+
this.ditto.keepAlive.release(`AttachmentFetcher.${contextInfo.id})`)
|
|
122
|
+
|
|
123
|
+
const cancelToken = await contextInfo.cancelTokenPromise
|
|
124
|
+
if (cancelToken) {
|
|
125
|
+
FFI.dittoCancelResolveAttachment(dittoHandle.deref(), contextInfo.attachmentTokenID, cancelToken)
|
|
126
|
+
}
|
|
127
|
+
})
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright © 2021 DittoLive Incorporated. All rights reserved.
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as FFI from './ffi'
|
|
6
|
+
import { Bridge } from './bridge'
|
|
7
|
+
import { Attachment } from './attachment'
|
|
8
|
+
import { AttachmentToken } from './attachment-token'
|
|
9
|
+
import { generateEphemeralToken, step } from './internal'
|
|
10
|
+
|
|
11
|
+
import type { AttachmentFetchEvent } from './attachment-fetch-event'
|
|
12
|
+
import type { Ditto } from './ditto'
|
|
13
|
+
import type { AttachmentFetcherManager } from './attachment-fetcher-manager'
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* These objects are returned by calls to
|
|
17
|
+
* {@link Collection.fetchAttachment | fetchAttachment()} on {@link Collection}
|
|
18
|
+
* and allow you to stop an in-flight attachment fetch.
|
|
19
|
+
*/
|
|
20
|
+
export class AttachmentFetcher implements PromiseLike<Attachment | null> {
|
|
21
|
+
/**
|
|
22
|
+
* Returns a promise for the attachment that you can `await`. The promise
|
|
23
|
+
* resolves to either an attachment or `null` if the attachment has been
|
|
24
|
+
* deleted meanwhile. The promise is rejected if an error occurs during
|
|
25
|
+
* the fetch. Note that the `AttachmentFetcher` itself implementes
|
|
26
|
+
* `PromiseLike`, so you can `await` it directly.
|
|
27
|
+
*/
|
|
28
|
+
readonly attachment: Promise<Attachment | null>
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Stops fetching the associated attachment and cleans up any associated
|
|
32
|
+
* resources.
|
|
33
|
+
*
|
|
34
|
+
* Note that you are not required to call `stop()` once your attachment fetch
|
|
35
|
+
* operation has finished. The method primarily exists to allow you to cancel
|
|
36
|
+
* an attachment fetch request while it is ongoing if you no longer wish for
|
|
37
|
+
* the attachment to be made available locally to the device.
|
|
38
|
+
*/
|
|
39
|
+
stop() {
|
|
40
|
+
step(async () => {
|
|
41
|
+
await this.manager.stopAttachmentFetcher(this)
|
|
42
|
+
if (this.rejectPendingFetch != null) {
|
|
43
|
+
this.rejectPendingFetch()
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// --------------------------------------- Internal ------------------------
|
|
49
|
+
|
|
50
|
+
/** @internal */
|
|
51
|
+
readonly cancelTokenPromise: Promise<unknown | null> | null = null
|
|
52
|
+
|
|
53
|
+
/** @internal */
|
|
54
|
+
readonly ditto: Ditto
|
|
55
|
+
|
|
56
|
+
/** @internal */
|
|
57
|
+
readonly id: string
|
|
58
|
+
|
|
59
|
+
/** @internal */
|
|
60
|
+
readonly manager: AttachmentFetcherManager
|
|
61
|
+
|
|
62
|
+
/** @internal */
|
|
63
|
+
readonly token: AttachmentToken
|
|
64
|
+
|
|
65
|
+
/** @internal */
|
|
66
|
+
then<TResult1 = any, TResult2 = never>(onfulfilled?: ((value: any) => TResult1 | PromiseLike<TResult1>) | null | undefined, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined): PromiseLike<TResult1 | TResult2> {
|
|
67
|
+
return this.attachment.then(onfulfilled, onrejected)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** @internal */
|
|
71
|
+
constructor(ditto: Ditto, token: AttachmentToken, manager: AttachmentFetcherManager, eventHandler?: (attachmentFetchEvent: AttachmentFetchEvent) => void) {
|
|
72
|
+
this.ditto = ditto
|
|
73
|
+
this.token = token
|
|
74
|
+
this.manager = manager
|
|
75
|
+
this.id = generateEphemeralToken()
|
|
76
|
+
|
|
77
|
+
const eventHandlerOrNoOp = eventHandler || function () {}
|
|
78
|
+
const dittoHandle = Bridge.ditto.handleFor(ditto)
|
|
79
|
+
|
|
80
|
+
this.attachment = new Promise((resolve, reject) => {
|
|
81
|
+
const onComplete = (attachmentHandlePointer: FFI.Pointer<FFI.AttachmentHandle>) => {
|
|
82
|
+
const attachment = new Attachment(this.ditto, this.token)
|
|
83
|
+
Bridge.attachment.bridge(attachmentHandlePointer, () => attachment)
|
|
84
|
+
|
|
85
|
+
eventHandlerOrNoOp({ type: 'Completed', attachment })
|
|
86
|
+
|
|
87
|
+
this.rejectPendingFetch = null
|
|
88
|
+
resolve(attachment)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const onProgress = (downloaded: number | BigInt, toDownload: number | BigInt) => {
|
|
92
|
+
eventHandlerOrNoOp({ type: 'Progress', totalBytes: toDownload, downloadedBytes: downloaded })
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const onDelete = () => {
|
|
96
|
+
eventHandlerOrNoOp({ type: 'Deleted' })
|
|
97
|
+
|
|
98
|
+
this.rejectPendingFetch = null
|
|
99
|
+
resolve(null)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const onError = () => {
|
|
103
|
+
;(err: any) => {
|
|
104
|
+
this.rejectPendingFetch = null
|
|
105
|
+
reject(err)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
this.rejectPendingFetch = () => {
|
|
110
|
+
reject(new Error('Attachment fetch was canceled'))
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
this.cancelTokenPromise = FFI.dittoResolveAttachment(dittoHandle.deref(), token.id, { onComplete, onProgress, onDelete }, onError)
|
|
114
|
+
})
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* This function is defined while a fetch is in progress and is used to reject
|
|
119
|
+
* the promise `this.attachment` when the fetch is canceled.
|
|
120
|
+
*
|
|
121
|
+
* @internal
|
|
122
|
+
*/
|
|
123
|
+
private rejectPendingFetch: (() => void) | null = null
|
|
124
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright © 2021 DittoLive Incorporated. All rights reserved.
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as FFI from './ffi'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Serves as a token for a specific attachment that you can pass to a call to
|
|
9
|
+
* {@link Collection.fetchAttachment | fetchAttachment()} on a
|
|
10
|
+
* {@link Collection}.
|
|
11
|
+
*/
|
|
12
|
+
export class AttachmentToken {
|
|
13
|
+
/** @internal */
|
|
14
|
+
readonly id: Uint8Array
|
|
15
|
+
|
|
16
|
+
/** @internal */
|
|
17
|
+
readonly len: number
|
|
18
|
+
|
|
19
|
+
/** @internal */
|
|
20
|
+
readonly metadata: { [key: string]: string }
|
|
21
|
+
|
|
22
|
+
/** @internal */
|
|
23
|
+
constructor(jsObj: object) {
|
|
24
|
+
const type = jsObj[FFI.DittoCRDTTypeKey]
|
|
25
|
+
if (type !== FFI.DittoCRDTType.attachment) {
|
|
26
|
+
throw new Error('Invalid attachment token')
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const id = jsObj['_id']
|
|
30
|
+
if (!(id instanceof Uint8Array)) {
|
|
31
|
+
throw new Error('Invalid attachment token id')
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const len = jsObj['_len']
|
|
35
|
+
if (typeof len !== 'number' || len < 0) {
|
|
36
|
+
throw new Error('Invalid attachment token length')
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const meta = jsObj['_meta']
|
|
40
|
+
if (typeof meta !== 'object') {
|
|
41
|
+
throw new Error('Invalid attachment token meta')
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
this.id = id
|
|
45
|
+
this.len = len
|
|
46
|
+
this.metadata = meta
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright © 2021 DittoLive Incorporated. All rights reserved.
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as FFI from './ffi'
|
|
6
|
+
import { Bridge } from './bridge'
|
|
7
|
+
import * as Environment from './@environment'
|
|
8
|
+
|
|
9
|
+
import type { Ditto } from './ditto'
|
|
10
|
+
import type { AttachmentToken } from './attachment-token'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Represents an attachment and can be used to insert the associated attachment
|
|
14
|
+
* into a document at a specific key-path. You can't instantiate an attachment
|
|
15
|
+
* directly, please use the {@link Collection.newAttachment | newAttachment()}
|
|
16
|
+
* method of {@link Collection} instead.
|
|
17
|
+
*/
|
|
18
|
+
export class Attachment {
|
|
19
|
+
/** @internal */
|
|
20
|
+
readonly ditto: Ditto
|
|
21
|
+
|
|
22
|
+
/** @internal */
|
|
23
|
+
readonly token: AttachmentToken
|
|
24
|
+
|
|
25
|
+
/** The attachment's metadata. */
|
|
26
|
+
get metadata(): { [key: string]: string } {
|
|
27
|
+
return this.token.metadata
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Returns the attachment's data.
|
|
32
|
+
*/
|
|
33
|
+
getData(): Promise<Uint8Array> {
|
|
34
|
+
const ditto = this.ditto
|
|
35
|
+
const dittoHandle = Bridge.ditto.handleFor(ditto)
|
|
36
|
+
return this.ditto.deferCloseAsync(async () => {
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Copies the attachment to the specified file path. Node-only,
|
|
42
|
+
* throws in the browser.
|
|
43
|
+
*
|
|
44
|
+
* @param path The path that the attachment should be copied to.
|
|
45
|
+
*/
|
|
46
|
+
copyToPath(path: string): Promise<void> {
|
|
47
|
+
const ditto = this.ditto
|
|
48
|
+
const dittoHandle = Bridge.ditto.handleFor(ditto)
|
|
49
|
+
return this.ditto.deferCloseAsync(async () => {
|
|
50
|
+
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** @internal */
|
|
55
|
+
constructor(ditto: Ditto, token: AttachmentToken) {
|
|
56
|
+
this.ditto = ditto
|
|
57
|
+
this.token = token
|
|
58
|
+
}
|
|
59
|
+
}
|