@dittolive/ditto 4.5.4 → 4.6.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.
Files changed (87) hide show
  1. package/README.md +2 -2
  2. package/node/ditto.cjs.js +1111 -563
  3. package/node/ditto.darwin-arm64.node +0 -0
  4. package/node/ditto.darwin-x64.node +0 -0
  5. package/node/ditto.linux-arm.node +0 -0
  6. package/node/ditto.linux-arm64.node +0 -0
  7. package/node/ditto.linux-x64.node +0 -0
  8. package/node/ditto.win32-x64.node +0 -0
  9. package/node/transports.darwin-arm64.node +0 -0
  10. package/node/transports.darwin-x64.node +0 -0
  11. package/package.json +45 -1
  12. package/react-native/android/build.gradle +1 -1
  13. package/react-native/android/cpp-adapter.cpp +68 -59
  14. package/react-native/android/src/main/java/com/dittolive/rnsdk/DittoRNSDKModule.java +35 -0
  15. package/react-native/cpp/include/Arc.hpp +1 -1
  16. package/react-native/cpp/include/Attachment.h +5 -1
  17. package/react-native/cpp/include/DQL.h +9 -9
  18. package/react-native/cpp/include/FFIUtils.h +14 -0
  19. package/react-native/cpp/include/IO.h +13 -0
  20. package/react-native/cpp/include/Lifecycle.h +0 -1
  21. package/react-native/cpp/include/Misc.h +3 -0
  22. package/react-native/cpp/include/Utils.h +0 -2
  23. package/react-native/cpp/src/Attachment.cpp +200 -13
  24. package/react-native/cpp/src/Authentication.cpp +3 -3
  25. package/react-native/cpp/src/DQL.cpp +23 -23
  26. package/react-native/cpp/src/Document.cpp +10 -10
  27. package/react-native/cpp/src/FFIUtils.cpp +64 -0
  28. package/react-native/cpp/src/IO.cpp +35 -0
  29. package/react-native/cpp/src/Identity.cpp +3 -3
  30. package/react-native/cpp/src/Lifecycle.cpp +2 -19
  31. package/react-native/cpp/src/LiveQuery.cpp +3 -5
  32. package/react-native/cpp/src/Logger.cpp +171 -172
  33. package/react-native/cpp/src/Misc.cpp +52 -4
  34. package/react-native/cpp/src/Presence.cpp +1 -1
  35. package/react-native/cpp/src/SmallPeerInfo.cpp +1 -1
  36. package/react-native/cpp/src/Transports.cpp +10 -5
  37. package/react-native/cpp/src/Utils.cpp +110 -114
  38. package/react-native/cpp/src/main.cpp +28 -15
  39. package/react-native/dittoffi/dittoffi.h +328 -280
  40. package/react-native/ios/DittoRNSDK.mm +123 -71
  41. package/react-native/src/ditto.rn.ts +30 -6
  42. package/react-native/src/index.ts +7 -4
  43. package/react-native/src/sources/@cbor-redux.ts +1 -1
  44. package/react-native/src/sources/attachment-fetch-event.ts +2 -2
  45. package/react-native/src/sources/attachment-fetcher-manager.ts +5 -4
  46. package/react-native/src/sources/attachment-fetcher.ts +152 -21
  47. package/react-native/src/sources/attachment-token.ts +94 -13
  48. package/react-native/src/sources/attachment.ts +66 -19
  49. package/react-native/src/sources/augment.ts +13 -6
  50. package/react-native/src/sources/base-pending-cursor-operation.ts +22 -6
  51. package/react-native/src/sources/base-pending-id-specific-operation.ts +3 -0
  52. package/react-native/src/sources/bridge.ts +2 -2
  53. package/react-native/src/sources/cbor.ts +0 -15
  54. package/react-native/src/sources/collection-interface.ts +12 -6
  55. package/react-native/src/sources/collection.ts +9 -2
  56. package/react-native/src/sources/ditto.ts +26 -18
  57. package/react-native/src/sources/document-id.ts +11 -7
  58. package/react-native/src/sources/document-path.ts +4 -2
  59. package/react-native/src/sources/document.ts +49 -5
  60. package/react-native/src/sources/error-codes.ts +28 -0
  61. package/react-native/src/sources/error.ts +20 -1
  62. package/react-native/src/sources/essentials.ts +25 -3
  63. package/react-native/src/sources/ffi-error.ts +2 -1
  64. package/react-native/src/sources/ffi.ts +180 -102
  65. package/react-native/src/sources/internal.ts +37 -3
  66. package/react-native/src/sources/live-query-manager.ts +10 -1
  67. package/react-native/src/sources/live-query.ts +1 -1
  68. package/react-native/src/sources/observer-manager.ts +7 -0
  69. package/react-native/src/sources/pending-id-specific-operation.ts +2 -2
  70. package/react-native/src/sources/presence-manager.ts +12 -2
  71. package/react-native/src/sources/presence.ts +5 -0
  72. package/react-native/src/sources/query-result-item.ts +15 -0
  73. package/react-native/src/sources/small-peer-info.ts +2 -2
  74. package/react-native/src/sources/static-tcp-client.ts +2 -0
  75. package/react-native/src/sources/store-observer.ts +4 -2
  76. package/react-native/src/sources/store.ts +253 -3
  77. package/react-native/src/sources/sync.ts +6 -3
  78. package/react-native/src/sources/transport-config.ts +2 -2
  79. package/react-native/src/sources/update-results-map.ts +8 -0
  80. package/react-native/src/sources/write-transaction-collection.ts +1 -1
  81. package/react-native/src/sources/write-transaction.ts +1 -1
  82. package/types/ditto.d.ts +2866 -2568
  83. package/web/ditto.es6.js +1 -1
  84. package/web/ditto.umd.js +1 -1
  85. package/web/ditto.wasm +0 -0
  86. package/react-native/.yarn/install-state.gz +0 -0
  87. package/react-native/.yarnrc.yml +0 -1
@@ -5,134 +5,130 @@
5
5
  #include <thread>
6
6
  // #include <condition_variable>
7
7
 
8
- namespace sharedjsi {
8
+ namespace sharedjsi
9
+ {
10
+
11
+ std::string pointerToHexString(void const *ptr)
12
+ {
13
+ char buffer[20]; // Assuming a 64-bit pointer, 16 characters for address + 2 for "0x" + 1 for null-terminator.
14
+ snprintf(buffer, sizeof(buffer), "%p", ptr);
15
+ return std::string(buffer);
16
+ }
9
17
 
10
- std::string pointerToHexString(void const *ptr) {
11
- char buffer[20]; // Assuming a 64-bit pointer, 16 characters for address + 2 for "0x" + 1 for null-terminator.
12
- snprintf(buffer, sizeof(buffer), "%p", ptr);
13
- return std::string(buffer);
14
- }
18
+ // To be used with `Option<slice_ref_uint8_t> (check Rust Core API)
19
+ slice_ref_uint8_t borrowVecAsOptRefSlice(std::vector<uint8_t> const &v)
20
+ {
21
+ slice_ref_uint8_t it{};
22
+ it.ptr = v.empty() ? nullptr : v.data();
23
+ it.len = v.size();
24
+ return it;
25
+ }
15
26
 
16
- // To be used with `Option<slice_ref_uint8_t> (check Rust Core API)
17
- slice_ref_uint8_t borrowVecAsOptRefSlice(std::vector<uint8_t> const& v) {
18
- slice_ref_uint8_t it {};
19
- it.ptr = v.empty() ? nullptr : v.data();
20
- it.len = v.size();
21
- return it;
22
- }
27
+ // To be used with non-optional `slice_ref_uint8_t` (check Rust Core API)
28
+ slice_ref_uint8_t borrowVecAsRefSlice(std::vector<uint8_t> const &v)
29
+ {
30
+ slice_ref_uint8_t it{};
31
+ it.ptr = v.empty() ? (uint8_t *)0xbad000 : v.data();
32
+ it.len = v.size();
33
+ return it;
34
+ }
23
35
 
24
- // To be used with non-optional `slice_ref_uint8_t` (check Rust Core API)
25
- slice_ref_uint8_t borrowVecAsRefSlice(std::vector<uint8_t> const& v) {
26
- slice_ref_uint8_t it {};
27
- it.ptr = v.empty() ? (uint8_t *) 0xbad000 : v.data();
28
- it.len = v.size();
29
- return it;
30
- }
36
+ Function sliceBoxedToUInt8Array(Runtime &runtime)
37
+ {
38
+ return Function::createFromHostFunction(runtime,
39
+ PropNameID::forAscii(runtime,
40
+ STRINGIFIED_FUNC_NAME()),
41
+ 0,
42
+ [](Runtime &runtime,
43
+ const Value &thisValue,
44
+ const Value *arguments,
45
+ size_t count) -> Value
46
+ {
47
+ auto fatPtrJs = arguments[0].asObject(runtime);
48
+ auto ptr = jsPointerObjectToCPointer<uint8_t>(runtime, fatPtrJs.getProperty(runtime, "ptr"));
49
+ auto len = static_cast<size_t>(fatPtrJs.getProperty(runtime, "len").asNumber());
50
+ slice_boxed_uint8 slice = {.ptr = ptr, .len = len};
51
+ if (!slice.ptr)
52
+ {
53
+ return Value::null();
54
+ }
55
+
56
+ auto typedArray = TypedArray<TypedArrayKind::Uint8Array>(runtime, slice.len);
57
+ auto arrayBuffer = typedArray.getBuffer(runtime);
58
+ std::memcpy(arrayBuffer.data(runtime), slice.ptr, slice.len);
59
+
60
+ ::ditto_c_bytes_free(slice);
61
+
62
+ return typedArray;
63
+ });
64
+ }
31
65
 
32
- Function sliceBoxedToUInt8Array(Runtime &runtime) {
33
- return Function::createFromHostFunction(runtime,
34
- PropNameID::forAscii(runtime,
35
- STRINGIFIED_FUNC_NAME()),
36
- 0,
37
- [](Runtime &runtime,
38
- const Value &thisValue,
39
- const Value *arguments,
40
- size_t count) -> Value
41
- {
42
- auto fatPtrJs = arguments[0].asObject(runtime);
43
- auto ptr = jsPointerObjectToCPointer<uint8_t>(runtime, fatPtrJs.getProperty(runtime, "ptr"));
44
- auto len = static_cast<size_t>(fatPtrJs.getProperty(runtime, "len").asNumber());
45
- slice_boxed_uint8 slice = { .ptr = ptr, .len = len };
46
- if (!slice.ptr) {
47
- return Value::null();
66
+ std::vector<uint8_t> jsTypedArrayToCVector(Runtime &runtime, const Value &arg)
67
+ {
68
+ if (arg.isUndefined() || arg.isNull())
69
+ {
70
+ return {};
48
71
  }
49
-
50
- auto typedArray = TypedArray<TypedArrayKind::Uint8Array>(runtime, slice.len);
51
- auto arrayBuffer = typedArray.getBuffer(runtime);
52
- std::memcpy(arrayBuffer.data(runtime), slice.ptr, slice.len);
53
-
54
- ::ditto_c_bytes_free(slice);
55
-
56
- return typedArray;
57
- });
58
- }
59
-
60
- std::vector<uint8_t> jsTypedArrayToCVector(Runtime &runtime, const Value &arg) {
61
- if (arg.isUndefined() || arg.isNull()) {
62
- return {};
72
+ TypedArrayBase typedArrayBase(runtime, arg.asObject(runtime));
73
+ return typedArrayBase.toVector(runtime);
63
74
  }
64
- TypedArrayBase typedArrayBase(runtime, arg.asObject(runtime));
65
- return typedArrayBase.toVector(runtime);
66
- }
67
-
68
- std::string jsTypedArrayToCString(Runtime &runtime, const Value &arg) {
69
- std::vector<uint8_t> vec = jsTypedArrayToCVector(runtime, arg);
70
- return std::string(vec.begin(), vec.end());
71
- }
72
-
73
- Value cSlicedBoxToJSSlicedBox(Runtime &runtime, slice_boxed_uint8 box_c_bytes) {
74
- Object obj(runtime);
75
- obj.setProperty(runtime, "ptr", cPointerToJSPointerObject<uint8_t>(runtime, box_c_bytes.ptr));
76
- obj.setProperty(runtime, "len", static_cast<double>(box_c_bytes.len));
77
- return obj;
78
- }
79
-
80
- Function withOutBoxCBytes(Runtime &runtime) {
81
- return Function::createFromHostFunction(runtime,
82
- PropNameID::forAscii(runtime,
83
- STRINGIFIED_FUNC_NAME()),
84
- 0,
85
- [](Runtime &runtime,
86
- const Value &thisValue,
87
- const Value *arguments,
88
- size_t count) -> Value
89
- {
90
- auto callback = arguments[0].asObject(runtime).asFunction(runtime);
91
- slice_boxed_uint8 box_c_bytes = { 0 };
92
- auto out_box_cbytes = &box_c_bytes;
93
- auto out_box_cbytes_js = cPointerToJSPointerObject<slice_boxed_uint8>(runtime, out_box_cbytes);
94
-
95
- callback.call(runtime, out_box_cbytes_js);
96
-
97
- return cSlicedBoxToJSSlicedBox(runtime, box_c_bytes);
98
- });
99
- }
100
75
 
76
+ std::string jsTypedArrayToCString(Runtime &runtime, const Value &arg)
77
+ {
78
+ std::vector<uint8_t> vec = jsTypedArrayToCVector(runtime, arg);
79
+ return std::string(vec.begin(), vec.end());
80
+ }
101
81
 
82
+ Value cSlicedBoxToJSSlicedBox(Runtime &runtime, slice_boxed_uint8 box_c_bytes)
83
+ {
84
+ Object obj(runtime);
85
+ obj.setProperty(runtime, "ptr", cPointerToJSPointerObject<uint8_t>(runtime, box_c_bytes.ptr));
86
+ obj.setProperty(runtime, "len", static_cast<double>(box_c_bytes.len));
87
+ return obj;
88
+ }
102
89
 
103
- using Task = std::function<void(Runtime *)>;
90
+ using Task = std::function<void(Runtime *)>;
104
91
 
105
- struct {
106
- std::mutex mutex;
107
- std::vector<Task> tasks;
108
- // std::condition_variable condition;
109
- } TASKS;
92
+ struct
93
+ {
94
+ std::mutex mutex;
95
+ std::vector<Task> tasks;
96
+ // std::condition_variable condition;
97
+ } TASKS;
110
98
 
111
- void ditto_enqueue_call(Task &&task) {
112
- std::unique_lock<std::mutex> lock{TASKS.mutex};
113
- TASKS.tasks.emplace_back(task);
114
- // TASKS.condition.notify_one();
115
- }
99
+ void ditto_enqueue_call(Task &&task)
100
+ {
101
+ std::unique_lock<std::mutex> lock{TASKS.mutex};
102
+ TASKS.tasks.emplace_back(task);
103
+ // TASKS.condition.notify_one();
104
+ }
116
105
 
117
- Task try_recv_task() {
118
- std::unique_lock<std::mutex> lock(TASKS.mutex);
119
- // TASKS.condition.wait(lock, [] { return !TASKS.tasks.empty(); });
120
- if (TASKS.tasks.empty()) {
121
- return nullptr;
106
+ Task try_recv_task()
107
+ {
108
+ std::unique_lock<std::mutex> lock(TASKS.mutex);
109
+ // TASKS.condition.wait(lock, [] { return !TASKS.tasks.empty(); });
110
+ if (TASKS.tasks.empty())
111
+ {
112
+ return nullptr;
113
+ }
114
+ Task task{std::move(TASKS.tasks.back())};
115
+ TASKS.tasks.pop_back();
116
+ return task;
122
117
  }
123
- Task task{std::move(TASKS.tasks.back())};
124
- TASKS.tasks.pop_back();
125
- return task;
126
- }
127
118
 
128
- void ditto_tick(Runtime *jsi) {
129
- while (1) {
130
- Task task = try_recv_task();
131
- if (task == nullptr) {
132
- return;
133
- } else {
134
- task(jsi);
119
+ void ditto_tick(Runtime *jsi)
120
+ {
121
+ while (1)
122
+ {
123
+ Task task = try_recv_task();
124
+ if (task == nullptr)
125
+ {
126
+ return;
127
+ }
128
+ else
129
+ {
130
+ task(jsi);
131
+ }
135
132
  }
136
133
  }
137
134
  }
138
- }
@@ -16,6 +16,8 @@
16
16
  #include "Logger.h"
17
17
  #include "SmallPeerInfo.h"
18
18
  #include "Transports.h"
19
+ #include "IO.h"
20
+ #include "FFIUtils.h"
19
21
 
20
22
  // Note: `runtime` variable must exist in scope.
21
23
  #define REGISTER_JS_FUNCTION(fname) runtime.global().setProperty(runtime, STRINGIFY(fname), fname(runtime));
@@ -37,11 +39,16 @@ namespace sharedjsi
37
39
 
38
40
  // Lifecycle
39
41
  REGISTER_JS_FUNCTION(ditto_init_sdk_version);
40
- REGISTER_JS_FUNCTION(ditto_uninitialized_ditto_make);
41
42
  REGISTER_JS_FUNCTION(ditto_make);
42
43
  REGISTER_JS_FUNCTION(ditto_shutdown);
43
44
  REGISTER_JS_FUNCTION(ditto_free);
44
45
 
46
+ // FFI Utils
47
+ REGISTER_JS_FUNCTION(refCStringToString);
48
+ REGISTER_JS_FUNCTION(boxCStringIntoString);
49
+ REGISTER_JS_FUNCTION(withOutBoxCBytes);
50
+ REGISTER_JS_FUNCTION(sliceBoxedToUInt8Array);
51
+
45
52
  // Authentication
46
53
  REGISTER_JS_FUNCTION(ditto_auth_client_get_app_id);
47
54
  REGISTER_JS_FUNCTION(ditto_auth_client_is_x509_valid);
@@ -57,15 +64,15 @@ namespace sharedjsi
57
64
 
58
65
  // DQL
59
66
  REGISTER_JS_FUNCTION(dittoffi_try_experimental_register_change_observer_str_detached);
60
- REGISTER_JS_FUNCTION(dittoffi_try_experimental_add_dql_subscription);
61
- REGISTER_JS_FUNCTION(dittoffi_try_experimental_remove_dql_subscription);
62
- REGISTER_JS_FUNCTION(dittoffi_try_experimental_exec_statement_str);
63
- REGISTER_JS_FUNCTION(ditto_dql_response_result_count);
64
- REGISTER_JS_FUNCTION(ditto_dql_response_result_at);
65
- REGISTER_JS_FUNCTION(ditto_dql_response_affected_document_id_count);
66
- REGISTER_JS_FUNCTION(ditto_dql_response_affected_document_id_at);
67
- REGISTER_JS_FUNCTION(ditto_result_cbor);
68
- REGISTER_JS_FUNCTION(ditto_result_json);
67
+ REGISTER_JS_FUNCTION(dittoffi_try_add_sync_subscription);
68
+ REGISTER_JS_FUNCTION(dittoffi_try_remove_sync_subscription);
69
+ REGISTER_JS_FUNCTION(dittoffi_try_exec_statement);
70
+ REGISTER_JS_FUNCTION(dittoffi_query_result_item_count);
71
+ REGISTER_JS_FUNCTION(dittoffi_query_result_item_at);
72
+ REGISTER_JS_FUNCTION(dittoffi_query_result_mutated_document_id_count);
73
+ REGISTER_JS_FUNCTION(dittoffi_query_result_mutated_document_id_at);
74
+ REGISTER_JS_FUNCTION(dittoffi_query_result_item_cbor);
75
+ REGISTER_JS_FUNCTION(dittoffi_query_result_item_json);
69
76
 
70
77
  // Documents
71
78
  REGISTER_JS_FUNCTION(ditto_document_id_query_compatible);
@@ -80,10 +87,14 @@ namespace sharedjsi
80
87
  REGISTER_JS_FUNCTION(ditto_clear_presence_v3_callback);
81
88
 
82
89
  // Attachment
90
+ REGISTER_JS_FUNCTION(ditto_new_attachment_from_file);
91
+ REGISTER_JS_FUNCTION(ditto_new_attachment_from_bytes);
92
+ REGISTER_JS_FUNCTION(ditto_resolve_attachment);
83
93
  REGISTER_JS_FUNCTION(ditto_cancel_resolve_attachment);
84
94
  REGISTER_JS_FUNCTION(ditto_free_attachment_handle);
95
+ REGISTER_JS_FUNCTION(ditto_get_attachment_status);
96
+ REGISTER_JS_FUNCTION(ditto_get_complete_attachment_data);
85
97
  REGISTER_JS_FUNCTION(ditto_get_complete_attachment_path);
86
- REGISTER_JS_FUNCTION(ditto_new_attachment_from_bytes);
87
98
 
88
99
  // LiveQuery
89
100
  REGISTER_JS_FUNCTION(ditto_live_query_start);
@@ -112,10 +123,6 @@ namespace sharedjsi
112
123
  REGISTER_JS_FUNCTION(ditto_small_peer_info_get_metadata);
113
124
  REGISTER_JS_FUNCTION(ditto_small_peer_info_set_metadata);
114
125
 
115
- // FFI functions
116
- REGISTER_JS_FUNCTION(withOutBoxCBytes);
117
- REGISTER_JS_FUNCTION(sliceBoxedToUInt8Array);
118
-
119
126
  // Transports
120
127
  REGISTER_JS_FUNCTION(ditto_sdk_transports_init);
121
128
  REGISTER_JS_FUNCTION(ditto_sdk_transports_error_new);
@@ -148,5 +155,11 @@ namespace sharedjsi
148
155
  REGISTER_JS_FUNCTION(ditto_set_static_websocket_clients);
149
156
  REGISTER_JS_FUNCTION(ditto_set_sync_group);
150
157
  REGISTER_JS_FUNCTION(refCStringToString);
158
+ REGISTER_JS_FUNCTION(ditto_disable_sync_with_v3);
159
+ REGISTER_JS_FUNCTION(dittoffi_base64_encode);
160
+ REGISTER_JS_FUNCTION(dittoffi_try_base64_decode);
161
+
162
+ // IO
163
+ REGISTER_JS_FUNCTION(readFile);
151
164
  }
152
165
  }