@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.
- package/README.md +2 -2
- package/node/ditto.cjs.js +1111 -563
- 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/node/transports.darwin-arm64.node +0 -0
- package/node/transports.darwin-x64.node +0 -0
- package/package.json +45 -1
- package/react-native/android/build.gradle +1 -1
- package/react-native/android/cpp-adapter.cpp +68 -59
- package/react-native/android/src/main/java/com/dittolive/rnsdk/DittoRNSDKModule.java +35 -0
- package/react-native/cpp/include/Arc.hpp +1 -1
- package/react-native/cpp/include/Attachment.h +5 -1
- package/react-native/cpp/include/DQL.h +9 -9
- package/react-native/cpp/include/FFIUtils.h +14 -0
- package/react-native/cpp/include/IO.h +13 -0
- package/react-native/cpp/include/Lifecycle.h +0 -1
- package/react-native/cpp/include/Misc.h +3 -0
- package/react-native/cpp/include/Utils.h +0 -2
- package/react-native/cpp/src/Attachment.cpp +200 -13
- package/react-native/cpp/src/Authentication.cpp +3 -3
- package/react-native/cpp/src/DQL.cpp +23 -23
- package/react-native/cpp/src/Document.cpp +10 -10
- package/react-native/cpp/src/FFIUtils.cpp +64 -0
- package/react-native/cpp/src/IO.cpp +35 -0
- package/react-native/cpp/src/Identity.cpp +3 -3
- package/react-native/cpp/src/Lifecycle.cpp +2 -19
- package/react-native/cpp/src/LiveQuery.cpp +3 -5
- package/react-native/cpp/src/Logger.cpp +171 -172
- package/react-native/cpp/src/Misc.cpp +52 -4
- package/react-native/cpp/src/Presence.cpp +1 -1
- package/react-native/cpp/src/SmallPeerInfo.cpp +1 -1
- package/react-native/cpp/src/Transports.cpp +10 -5
- package/react-native/cpp/src/Utils.cpp +110 -114
- package/react-native/cpp/src/main.cpp +28 -15
- package/react-native/dittoffi/dittoffi.h +328 -280
- package/react-native/ios/DittoRNSDK.mm +123 -71
- package/react-native/src/ditto.rn.ts +30 -6
- package/react-native/src/index.ts +7 -4
- package/react-native/src/sources/@cbor-redux.ts +1 -1
- package/react-native/src/sources/attachment-fetch-event.ts +2 -2
- package/react-native/src/sources/attachment-fetcher-manager.ts +5 -4
- package/react-native/src/sources/attachment-fetcher.ts +152 -21
- package/react-native/src/sources/attachment-token.ts +94 -13
- package/react-native/src/sources/attachment.ts +66 -19
- package/react-native/src/sources/augment.ts +13 -6
- package/react-native/src/sources/base-pending-cursor-operation.ts +22 -6
- package/react-native/src/sources/base-pending-id-specific-operation.ts +3 -0
- package/react-native/src/sources/bridge.ts +2 -2
- package/react-native/src/sources/cbor.ts +0 -15
- package/react-native/src/sources/collection-interface.ts +12 -6
- package/react-native/src/sources/collection.ts +9 -2
- package/react-native/src/sources/ditto.ts +26 -18
- package/react-native/src/sources/document-id.ts +11 -7
- package/react-native/src/sources/document-path.ts +4 -2
- package/react-native/src/sources/document.ts +49 -5
- package/react-native/src/sources/error-codes.ts +28 -0
- package/react-native/src/sources/error.ts +20 -1
- package/react-native/src/sources/essentials.ts +25 -3
- package/react-native/src/sources/ffi-error.ts +2 -1
- package/react-native/src/sources/ffi.ts +180 -102
- package/react-native/src/sources/internal.ts +37 -3
- package/react-native/src/sources/live-query-manager.ts +10 -1
- package/react-native/src/sources/live-query.ts +1 -1
- package/react-native/src/sources/observer-manager.ts +7 -0
- package/react-native/src/sources/pending-id-specific-operation.ts +2 -2
- package/react-native/src/sources/presence-manager.ts +12 -2
- package/react-native/src/sources/presence.ts +5 -0
- package/react-native/src/sources/query-result-item.ts +15 -0
- package/react-native/src/sources/small-peer-info.ts +2 -2
- package/react-native/src/sources/static-tcp-client.ts +2 -0
- package/react-native/src/sources/store-observer.ts +4 -2
- package/react-native/src/sources/store.ts +253 -3
- package/react-native/src/sources/sync.ts +6 -3
- package/react-native/src/sources/transport-config.ts +2 -2
- package/react-native/src/sources/update-results-map.ts +8 -0
- package/react-native/src/sources/write-transaction-collection.ts +1 -1
- package/react-native/src/sources/write-transaction.ts +1 -1
- package/types/ditto.d.ts +2866 -2568
- package/web/ditto.es6.js +1 -1
- package/web/ditto.umd.js +1 -1
- package/web/ditto.wasm +0 -0
- package/react-native/.yarn/install-state.gz +0 -0
- 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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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 `
|
|
17
|
-
slice_ref_uint8_t
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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(
|
|
61
|
-
REGISTER_JS_FUNCTION(
|
|
62
|
-
REGISTER_JS_FUNCTION(
|
|
63
|
-
REGISTER_JS_FUNCTION(
|
|
64
|
-
REGISTER_JS_FUNCTION(
|
|
65
|
-
REGISTER_JS_FUNCTION(
|
|
66
|
-
REGISTER_JS_FUNCTION(
|
|
67
|
-
REGISTER_JS_FUNCTION(
|
|
68
|
-
REGISTER_JS_FUNCTION(
|
|
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
|
}
|