@evolu/common 6.0.1-preview.0 → 6.0.1-preview.10
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/dist/src/Assert.d.ts +6 -3
- package/dist/src/Assert.d.ts.map +1 -1
- package/dist/src/Assert.js +6 -3
- package/dist/src/Crypto.d.ts +11 -0
- package/dist/src/Crypto.d.ts.map +1 -1
- package/dist/src/Evolu/Config.d.ts +17 -4
- package/dist/src/Evolu/Config.d.ts.map +1 -1
- package/dist/src/Evolu/Config.js +1 -1
- package/dist/src/Evolu/Db.d.ts +21 -13
- package/dist/src/Evolu/Db.d.ts.map +1 -1
- package/dist/src/Evolu/Db.js +81 -64
- package/dist/src/Evolu/Evolu.d.ts +6 -6
- package/dist/src/Evolu/Evolu.d.ts.map +1 -1
- package/dist/src/Evolu/Evolu.js +19 -24
- package/dist/src/Evolu/Owner.d.ts +6 -1
- package/dist/src/Evolu/Owner.d.ts.map +1 -1
- package/dist/src/Evolu/Owner.js +5 -0
- package/dist/src/Evolu/Protocol.d.ts +134 -64
- package/dist/src/Evolu/Protocol.d.ts.map +1 -1
- package/dist/src/Evolu/Protocol.js +227 -77
- package/dist/src/Evolu/Relay.d.ts +3 -1
- package/dist/src/Evolu/Relay.d.ts.map +1 -1
- package/dist/src/Evolu/Relay.js +39 -3
- package/dist/src/Evolu/Schema.d.ts +24 -40
- package/dist/src/Evolu/Schema.d.ts.map +1 -1
- package/dist/src/Evolu/Schema.js +13 -72
- package/dist/src/Evolu/Storage.d.ts +1 -0
- package/dist/src/Evolu/Storage.d.ts.map +1 -1
- package/dist/src/Evolu/Storage.js +10 -0
- package/package.json +3 -3
- package/src/Assert.ts +6 -3
- package/src/Crypto.ts +13 -0
- package/src/Evolu/Config.ts +19 -5
- package/src/Evolu/Db.ts +92 -76
- package/src/Evolu/Evolu.ts +38 -35
- package/src/Evolu/Owner.ts +7 -1
- package/src/Evolu/Protocol.ts +276 -110
- package/src/Evolu/Relay.ts +45 -4
- package/src/Evolu/Schema.ts +102 -130
- package/src/Evolu/Storage.ts +12 -0
package/dist/src/Evolu/Evolu.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isNonEmptyArray, isNonEmptyReadonlyArray } from "../Array.js";
|
|
2
|
-
import { assertNonEmptyArray } from "../Assert.js";
|
|
2
|
+
import { assert, assertNonEmptyArray } from "../Assert.js";
|
|
3
3
|
import { createCallbacks } from "../Callbacks.js";
|
|
4
4
|
import { exhaustiveCheck } from "../Function.js";
|
|
5
5
|
import { err, ok } from "../Result.js";
|
|
@@ -9,8 +9,9 @@ import { createId, } from "../Type.js";
|
|
|
9
9
|
import { defaultConfig } from "./Config.js";
|
|
10
10
|
import { applyPatches } from "./Diff.js";
|
|
11
11
|
import { kysely } from "./Kysely.js";
|
|
12
|
+
import { DbChange, } from "./Protocol.js";
|
|
12
13
|
import { createSubscribedQueries, emptyRows, serializeQuery, } from "./Query.js";
|
|
13
|
-
import {
|
|
14
|
+
import { evoluSchemaToDbSchema, insertable, updateable, upsertable, } from "./Schema.js";
|
|
14
15
|
import { initialSyncState } from "./Sync.js";
|
|
15
16
|
// For hot reloading and Evolu multitenancy.
|
|
16
17
|
const evoluInstances = new Map();
|
|
@@ -62,10 +63,7 @@ let tabId = null;
|
|
|
62
63
|
* const evolu = createEvolu(evoluReactDeps)(Schema);
|
|
63
64
|
* ```
|
|
64
65
|
*/
|
|
65
|
-
export const createEvolu = (deps) => (
|
|
66
|
-
// TODO: Validate missing Id, unsupported types, used default types via TS types
|
|
67
|
-
// with type errors messages as we had it in the old Evolu.
|
|
68
|
-
schema, partialConfig = {}) => {
|
|
66
|
+
export const createEvolu = (deps) => (schema, partialConfig = {}) => {
|
|
69
67
|
const config = { ...defaultConfig, ...partialConfig };
|
|
70
68
|
let evolu = evoluInstances.get(config.name);
|
|
71
69
|
if (evolu == null) {
|
|
@@ -159,7 +157,7 @@ const createEvoluInstance = (deps) => (schema, evoluConfig) => {
|
|
|
159
157
|
exhaustiveCheck(message);
|
|
160
158
|
}
|
|
161
159
|
});
|
|
162
|
-
const dbSchema =
|
|
160
|
+
const dbSchema = evoluSchemaToDbSchema(schema, indexes);
|
|
163
161
|
const mutationTypesCache = new Map();
|
|
164
162
|
// Lazy create mutation Types like this: `insertable(Schema.todo)`
|
|
165
163
|
const getMutationType = (table, kind) => {
|
|
@@ -185,18 +183,15 @@ const createEvoluInstance = (deps) => (schema, evoluConfig) => {
|
|
|
185
183
|
if (initialData)
|
|
186
184
|
initialData({
|
|
187
185
|
insert: (table, props) => {
|
|
188
|
-
const Type = getMutationType(table, "insert");
|
|
189
186
|
const id = createId(deps);
|
|
190
|
-
const
|
|
191
|
-
if (
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
values: result.value,
|
|
196
|
-
});
|
|
187
|
+
const values = getMutationType(table, "insert").fromUnknown(props);
|
|
188
|
+
if (values.ok) {
|
|
189
|
+
const dbChange = { table, id, values: values.value };
|
|
190
|
+
assertValidDbChange(dbChange);
|
|
191
|
+
initialDataDbChanges.push(dbChange);
|
|
197
192
|
return ok({ id });
|
|
198
193
|
}
|
|
199
|
-
return
|
|
194
|
+
return values;
|
|
200
195
|
},
|
|
201
196
|
});
|
|
202
197
|
dbWorker.postMessage({
|
|
@@ -222,9 +217,9 @@ const createEvoluInstance = (deps) => (schema, evoluConfig) => {
|
|
|
222
217
|
else {
|
|
223
218
|
// Remove `id` from values.
|
|
224
219
|
const { id: _id, ...values } = result.value;
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
mutateMicrotaskQueue.push([
|
|
220
|
+
const dbChange = { table, id, values };
|
|
221
|
+
assertValidDbChange(dbChange);
|
|
222
|
+
mutateMicrotaskQueue.push([dbChange, options?.onComplete]);
|
|
228
223
|
}
|
|
229
224
|
if (mutateMicrotaskQueue.length === 1)
|
|
230
225
|
queueMicrotask(() => {
|
|
@@ -350,11 +345,8 @@ const createEvoluInstance = (deps) => (schema, evoluConfig) => {
|
|
|
350
345
|
},
|
|
351
346
|
ensureSchema: (schema) => {
|
|
352
347
|
mutationTypesCache.clear();
|
|
353
|
-
const
|
|
354
|
-
dbWorker.postMessage({
|
|
355
|
-
type: "ensureDbSchema",
|
|
356
|
-
dbSchema: validEvoluSchemaToDbSchema(validSchema),
|
|
357
|
-
});
|
|
348
|
+
const dbSchema = evoluSchemaToDbSchema(schema);
|
|
349
|
+
dbWorker.postMessage({ type: "ensureDbSchema", dbSchema });
|
|
358
350
|
},
|
|
359
351
|
exportDatabase: () => {
|
|
360
352
|
const { promise, resolve } = Promise.withResolvers();
|
|
@@ -432,3 +424,6 @@ const createLoadingPromises = (subscribedQueries) => {
|
|
|
432
424
|
};
|
|
433
425
|
return loadingPromises;
|
|
434
426
|
};
|
|
427
|
+
const assertValidDbChange = (dbChange) => {
|
|
428
|
+
assert(DbChange.is(dbChange), `Failed to create DbChange for table "${dbChange.table}". If you see this message, you either disabled EvoluSchema validation or Evolu has a bug - please report it.`);
|
|
429
|
+
};
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TODO:
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
1
6
|
import { CreateMnemonicDep, CreateRandomBytesDep, EncryptionKey, MnemonicSeed } from "../Crypto.js";
|
|
2
7
|
import { NanoIdLibDep } from "../NanoId.js";
|
|
3
8
|
import { TimeDep } from "../Time.js";
|
|
@@ -17,7 +22,7 @@ import { TimestampString } from "./Timestamp.js";
|
|
|
17
22
|
* {@link SharedReadonlyOwner}, each with specific roles and properties detailed
|
|
18
23
|
* in their respective definitions.
|
|
19
24
|
*
|
|
20
|
-
* Public-key cryptography isn’t included here as it belongs to
|
|
25
|
+
* Public-key cryptography isn’t included here as it belongs to app and varies
|
|
21
26
|
* by use case. An Evolu app without collaboration doesn’t need it, while a
|
|
22
27
|
* Nostr-like app can leverage Nostr NIPs, or a super-safe app can use
|
|
23
28
|
* post-quantum cryptography.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Owner.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Owner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Owner.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Owner.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Evolu/Owner.js
CHANGED
|
@@ -7,31 +7,47 @@
|
|
|
7
7
|
* relays with each other.
|
|
8
8
|
*
|
|
9
9
|
* Evolu Protocol is designed for SQLite but can be extended to any database. It
|
|
10
|
-
* implements [Range-Based Set
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* Negentropy but uses different encoding and also provides data transfer and
|
|
16
|
-
* ownership.
|
|
10
|
+
* implements [Range-Based Set
|
|
11
|
+
* Reconciliation](https://arxiv.org/abs/2212.13567). To learn how RBSR works,
|
|
12
|
+
* check [Negentropy](https://logperiodic.com/rbsr.html). Evolu Protocol is
|
|
13
|
+
* similar to Negentropy but uses different encoding and also provides data
|
|
14
|
+
* transfer and ownership.
|
|
17
15
|
*
|
|
18
16
|
* ### Message Structure
|
|
19
17
|
*
|
|
20
|
-
* | Field | Notes
|
|
21
|
-
* | :----------------------------- |
|
|
22
|
-
* | **Header** |
|
|
23
|
-
* | - {@link protocolVersion} |
|
|
24
|
-
* | - {@link OwnerId} |
|
|
25
|
-
* |
|
|
26
|
-
* |
|
|
27
|
-
* | - {@link
|
|
28
|
-
* | - {@link
|
|
29
|
-
* | -
|
|
30
|
-
* |
|
|
31
|
-
* |
|
|
32
|
-
* | - {@link
|
|
33
|
-
*
|
|
34
|
-
*
|
|
18
|
+
* | Field | Notes |
|
|
19
|
+
* | :----------------------------- | :------------------------ |
|
|
20
|
+
* | **Header** | |
|
|
21
|
+
* | - {@link protocolVersion} | |
|
|
22
|
+
* | - {@link OwnerId} | {@link Owner} |
|
|
23
|
+
* | **Initiator** | |
|
|
24
|
+
* | - {@link WriteKeyMode} | |
|
|
25
|
+
* | - {@link WriteKey} | If WriteKeyMode >= 1 |
|
|
26
|
+
* | - {@link WriteKey} | If WriteKeyMode = 2 (new) |
|
|
27
|
+
* | **Non-initiator** | |
|
|
28
|
+
* | - {@link ProtocolErrorCode} | |
|
|
29
|
+
* | **Messages** | |
|
|
30
|
+
* | - {@link NonNegativeInt} | A number of messages. |
|
|
31
|
+
* | - {@link EncryptedCrdtMessage} | |
|
|
32
|
+
* | **Ranges** | |
|
|
33
|
+
* | - {@link NonNegativeInt} | Number of ranges. |
|
|
34
|
+
* | - {@link Range} | |
|
|
35
|
+
*
|
|
36
|
+
* ### WriteKey Validation
|
|
37
|
+
*
|
|
38
|
+
* The initiator sends WriteKeyMode and optionally one or two WriteKeys. One key
|
|
39
|
+
* for write operations and two for key rotation (current and new). Note that
|
|
40
|
+
* it's ok to not send any key if initiator is going to be synced with readonly
|
|
41
|
+
* owner. The non-initiator validates them immediately after parsing the
|
|
42
|
+
* initiator header, before processing any messages or ranges.
|
|
43
|
+
*
|
|
44
|
+
* ### WriteKey Rotation
|
|
45
|
+
*
|
|
46
|
+
* When initiator's {@link WriteKeyMode} is `Rotation`, two WriteKeys are
|
|
47
|
+
* present:
|
|
48
|
+
*
|
|
49
|
+
* 1. Current WriteKey (for validation)
|
|
50
|
+
* 2. New WriteKey (to be stored)
|
|
35
51
|
*
|
|
36
52
|
* ### Synchronization
|
|
37
53
|
*
|
|
@@ -48,21 +64,34 @@
|
|
|
48
64
|
* Both **Messages** and **Ranges** are optional, allowing each side to send,
|
|
49
65
|
* sync, or only subscribe data as needed.
|
|
50
66
|
*
|
|
51
|
-
* When the initiator sends data, the {@link WriteKey} is
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
67
|
+
* When the initiator sends data, the {@link WriteKey} is required in Messages as
|
|
68
|
+
* a secure token proving the initiator can write changes. The non-initiator
|
|
69
|
+
* responds without a {@link WriteKey}, since the initiator’s request already
|
|
70
|
+
* signals it wants data. If the non-initiator detects an issue, it sends an
|
|
71
|
+
* error code via the `Error` field in the header back to the initiator. In
|
|
72
|
+
* relay-to-relay or P2P sync, both sides may require the {@link WriteKey}
|
|
73
|
+
* depending on who is the initiator.
|
|
74
|
+
*
|
|
75
|
+
* ### Protocol Errors
|
|
76
|
+
*
|
|
77
|
+
* The protocol uses error codes in the header to signal issues:
|
|
78
|
+
*
|
|
79
|
+
* - {@link ProtocolWriteKeyError}: The provided WriteKey is invalid or missing.
|
|
80
|
+
* - {@link ProtocolWriteError}: A write operation failed (e.g., due to storage
|
|
81
|
+
* limits or billing).
|
|
82
|
+
* - {@link ProtocolSyncError}: A generic or unexpected synchronization failure
|
|
83
|
+
* occurred.
|
|
84
|
+
* - {@link ProtocolUnsupportedVersionError}: Protocol version mismatch.
|
|
85
|
+
* - {@link ProtocolInvalidDataError}: The message is malformed or corrupted.
|
|
86
|
+
*
|
|
87
|
+
* All protocol errors except `ProtocolInvalidDataError` include the `ownerId`
|
|
88
|
+
* to allow clients to associate errors with the correct owner.
|
|
60
89
|
*
|
|
61
90
|
* ### Message Size Limit
|
|
62
91
|
*
|
|
63
92
|
* The protocol enforces a strict maximum size for all messages, defined by
|
|
64
|
-
* {@link maxProtocolMessageSize}. This ensures every
|
|
65
|
-
* than or equal to this limit, eliminating the need for applications to
|
|
93
|
+
* {@link maxProtocolMessageSize}. This ensures every {@link ProtocolMessage} is
|
|
94
|
+
* less than or equal to this limit, eliminating the need for applications to
|
|
66
95
|
* fragment and reconstruct messages during transmission.
|
|
67
96
|
*
|
|
68
97
|
* ### Why Binary?
|
|
@@ -88,18 +117,30 @@
|
|
|
88
117
|
*
|
|
89
118
|
* ### Versioning
|
|
90
119
|
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
120
|
+
* Evolu Protocol uses explicit versioning to ensure compatibility between
|
|
121
|
+
* clients and relays (or peers). Each protocol message begins with a version
|
|
122
|
+
* number and an `ownerId` in its header.
|
|
123
|
+
*
|
|
124
|
+
* **How version negotiation works:**
|
|
125
|
+
*
|
|
126
|
+
* - The initiator (usually a client) sends a `ProtocolMessage` that includes its
|
|
127
|
+
* protocol version and the `ownerId`.
|
|
128
|
+
* - The non-initiator (usually a relay or peer) checks the version.
|
|
129
|
+
*
|
|
130
|
+
* - If the versions match, synchronization proceeds as normal.
|
|
131
|
+
* - If the versions do not match, the non-initiator responds with a message
|
|
132
|
+
* containing **its own protocol version and the same `ownerId`**.
|
|
133
|
+
* - The initiator can then detect the version mismatch for that specific owner
|
|
134
|
+
* and handle it appropriately (e.g., prompt for an update or halt sync).
|
|
135
|
+
*
|
|
136
|
+
* Version negotiation is per-owner, allowing Evolu Protocol to evolve safely
|
|
137
|
+
* over time and provide clear feedback about version mismatches.
|
|
96
138
|
*
|
|
97
139
|
* @module
|
|
98
140
|
*/
|
|
99
141
|
import { NonEmptyReadonlyArray } from "../Array.js";
|
|
100
142
|
import { Buffer } from "../Buffer.js";
|
|
101
143
|
import { CreateRandomBytesDep, EncryptionKey, SymmetricCryptoDecryptError, SymmetricCryptoDep } from "../Crypto.js";
|
|
102
|
-
import { ReadonlyRecord } from "../Object.js";
|
|
103
144
|
import { Result } from "../Result.js";
|
|
104
145
|
import { SqliteValue } from "../Sqlite.js";
|
|
105
146
|
import { Id, NanoId, NonNegativeInt, PositiveInt } from "../Type.js";
|
|
@@ -124,6 +165,11 @@ export declare const ProtocolErrorCode: {
|
|
|
124
165
|
readonly SyncError: 3;
|
|
125
166
|
};
|
|
126
167
|
type ProtocolErrorCode = (typeof ProtocolErrorCode)[keyof typeof ProtocolErrorCode];
|
|
168
|
+
export declare const WriteKeyMode: {
|
|
169
|
+
readonly None: 0;
|
|
170
|
+
readonly Single: 1;
|
|
171
|
+
readonly Rotation: 2;
|
|
172
|
+
};
|
|
127
173
|
/**
|
|
128
174
|
* Evolu Protocol Storage
|
|
129
175
|
*
|
|
@@ -145,17 +191,16 @@ export interface Storage {
|
|
|
145
191
|
readonly fingerprintRanges: (ownerId: BinaryOwnerId, buckets: ReadonlyArray<NonNegativeInt>, upperBound?: RangeUpperBound) => ReadonlyArray<FingerprintRange> | null;
|
|
146
192
|
readonly findLowerBound: (ownerId: BinaryOwnerId, begin: NonNegativeInt, end: NonNegativeInt, upperBound: RangeUpperBound) => NonNegativeInt | null;
|
|
147
193
|
readonly iterate: (ownerId: BinaryOwnerId, begin: NonNegativeInt, end: NonNegativeInt, callback: (timestamp: BinaryTimestamp, index: NonNegativeInt) => boolean) => void;
|
|
148
|
-
/**
|
|
149
|
-
* Authorizes the initiator's {@link WriteKey} for the given
|
|
150
|
-
* {@link BinaryOwnerId}.
|
|
151
|
-
*
|
|
152
|
-
* For a client that does not expect foreign writes, return `false`.
|
|
153
|
-
*/
|
|
194
|
+
/** Validates the {@link WriteKey} for the given {@link Owner}. */
|
|
154
195
|
readonly validateWriteKey: (ownerId: BinaryOwnerId, writeKey: WriteKey) => boolean;
|
|
196
|
+
/** Sets the {@link WriteKey} for the given {@link Owner}. */
|
|
197
|
+
readonly setWriteKey: (ownerId: BinaryOwnerId, writeKey: WriteKey) => boolean;
|
|
155
198
|
/** Write encrypted {@link CrdtMessage}s to storage. */
|
|
156
199
|
readonly writeMessages: (ownerId: BinaryOwnerId, messages: NonEmptyReadonlyArray<EncryptedCrdtMessage>) => boolean;
|
|
157
200
|
/** Read encrypted {@link DbChange}s from storage. */
|
|
158
201
|
readonly readDbChange: (ownerId: BinaryOwnerId, timestamp: BinaryTimestamp) => EncryptedDbChange | null;
|
|
202
|
+
/** Delete all data for the given {@link Owner}. */
|
|
203
|
+
readonly deleteOwner: (ownerId: BinaryOwnerId) => boolean;
|
|
159
204
|
}
|
|
160
205
|
export interface StorageDep {
|
|
161
206
|
readonly storage: Storage;
|
|
@@ -175,15 +220,22 @@ export interface CrdtMessage {
|
|
|
175
220
|
readonly timestamp: Timestamp;
|
|
176
221
|
readonly change: DbChange;
|
|
177
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* Base64Url string with maximum length of 256 characters. Encoding strings as
|
|
225
|
+
* Base64UrlString saves up to 25% in size compared to regular strings.
|
|
226
|
+
*/
|
|
227
|
+
export declare const Base64Url256: import("../Type.js").BrandType<import("../Type.js").Type<"Brand", string & Brand<"Base64Url">, string, import("../Type.js").RegexError<"Base64Url">, string, import("../Type.js").StringError>, "MaxLength256", import("../Type.js").MaxLengthError<256>, import("../Type.js").StringError | import("../Type.js").RegexError<"Base64Url">>;
|
|
228
|
+
export type Base64Url256 = typeof Base64Url256.Type;
|
|
178
229
|
/**
|
|
179
230
|
* A DbChange is a change to a table row. Together with a unique
|
|
180
231
|
* {@link Timestamp}, it forms a {@link CrdtMessage}.
|
|
181
232
|
*/
|
|
182
|
-
export
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
}
|
|
233
|
+
export declare const DbChange: import("../Type.js").ObjectType<{
|
|
234
|
+
table: import("../Type.js").BrandType<import("../Type.js").Type<"Brand", string & Brand<"Base64Url">, string, import("../Type.js").RegexError<"Base64Url">, string, import("../Type.js").StringError>, "MaxLength256", import("../Type.js").MaxLengthError<256>, import("../Type.js").StringError | import("../Type.js").RegexError<"Base64Url">>;
|
|
235
|
+
id: import("../Type.js").BrandType<import("../Type.js").Type<"String", string, string, import("../Type.js").StringError, string, import("../Type.js").StringError>, "Id", import("../Type.js").RegexError<"Id">, import("../Type.js").StringError>;
|
|
236
|
+
values: import("../Type.js").RecordType<"Brand", string & Brand<"Base64Url"> & Brand<"MaxLength256">, string, import("../Type.js").MaxLengthError<256>, string & Brand<"Base64Url">, import("../Type.js").StringError | import("../Type.js").RegexError<"Base64Url">, import("../Type.js").UnionType<[import("../Type.js").Type<"Null", null, null, import("../Type.js").NullError, null, import("../Type.js").NullError>, import("../Type.js").Type<"String", string, string, import("../Type.js").StringError, string, import("../Type.js").StringError>, import("../Type.js").Type<"Number", number, number, import("../Type.js").NumberError, number, import("../Type.js").NumberError>, import("../Type.js").Type<"Uint8Array", Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, import("../Type.js").Uint8ArrayError, Uint8Array<ArrayBufferLike>, import("../Type.js").Uint8ArrayError>]>>;
|
|
237
|
+
}>;
|
|
238
|
+
export type DbChange = typeof DbChange.Type;
|
|
187
239
|
export declare const RangeType: {
|
|
188
240
|
readonly Fingerprint: 1;
|
|
189
241
|
readonly Skip: 0;
|
|
@@ -228,11 +280,15 @@ export interface TimestampsRangeWithTimestampsBuffer extends BaseRange {
|
|
|
228
280
|
}
|
|
229
281
|
export type Range = SkipRange | FingerprintRange | TimestampsRange;
|
|
230
282
|
export type ProtocolError = ProtocolUnsupportedVersionError | ProtocolInvalidDataError | ProtocolWriteKeyError | ProtocolWriteError | ProtocolSyncError;
|
|
283
|
+
/** Base interface for all protocol errors. */
|
|
284
|
+
export interface ProtocolErrorBase {
|
|
285
|
+
readonly ownerId: OwnerId;
|
|
286
|
+
}
|
|
231
287
|
/**
|
|
232
288
|
* Represents a version mismatch in the Evolu Protocol. Occurs when the
|
|
233
289
|
* initiator and non-initiator are using incompatible protocol versions.
|
|
234
290
|
*/
|
|
235
|
-
export interface ProtocolUnsupportedVersionError {
|
|
291
|
+
export interface ProtocolUnsupportedVersionError extends ProtocolErrorBase {
|
|
236
292
|
readonly type: "ProtocolUnsupportedVersionError";
|
|
237
293
|
readonly unsupportedVersion: NonNegativeInt;
|
|
238
294
|
/** Indicates which side is obsolete and should update. */
|
|
@@ -245,21 +301,21 @@ export interface ProtocolInvalidDataError {
|
|
|
245
301
|
readonly error: unknown;
|
|
246
302
|
}
|
|
247
303
|
/** Error when a {@link WriteKey} is invalid, missing, or fails validation. */
|
|
248
|
-
export interface ProtocolWriteKeyError {
|
|
304
|
+
export interface ProtocolWriteKeyError extends ProtocolErrorBase {
|
|
249
305
|
readonly type: "ProtocolWriteKeyError";
|
|
250
306
|
}
|
|
251
307
|
/**
|
|
252
308
|
* Error when a write fails due to storage limits or billing requirements.
|
|
253
309
|
* Indicates the need to expand capacity or resolve payment issues.
|
|
254
310
|
*/
|
|
255
|
-
export interface ProtocolWriteError {
|
|
311
|
+
export interface ProtocolWriteError extends ProtocolErrorBase {
|
|
256
312
|
readonly type: "ProtocolWriteError";
|
|
257
313
|
}
|
|
258
314
|
/**
|
|
259
315
|
* Error indicating a synchronization failure during the protocol exchange. Used
|
|
260
316
|
* for unexpected or generic sync errors not covered by other error types.
|
|
261
317
|
*/
|
|
262
|
-
export interface ProtocolSyncError {
|
|
318
|
+
export interface ProtocolSyncError extends ProtocolErrorBase {
|
|
263
319
|
readonly type: "ProtocolSyncError";
|
|
264
320
|
}
|
|
265
321
|
/**
|
|
@@ -272,6 +328,8 @@ export interface ProtocolSyncError {
|
|
|
272
328
|
export declare const createProtocolMessageFromCrdtMessages: (deps: SymmetricCryptoDep & CreateRandomBytesDep) => (owner: OwnerWithWriteAccess, messages: NonEmptyReadonlyArray<CrdtMessage>, maxSize?: PositiveInt) => ProtocolMessage;
|
|
273
329
|
/** Creates a {@link ProtocolMessage} for sync. */
|
|
274
330
|
export declare const createProtocolMessageForSync: (deps: StorageDep) => (ownerId: OwnerId) => ProtocolMessage | null;
|
|
331
|
+
/** Creates a ProtocolMessage for {@link WriteKey} rotation. */
|
|
332
|
+
export declare const createProtocolMessageForWriteKeyRotation: (ownerId: OwnerId, currentWriteKey: WriteKey, newWriteKey: WriteKey) => ProtocolMessage;
|
|
275
333
|
/**
|
|
276
334
|
* Mutable builder for constructing {@link ProtocolMessage} respecting size
|
|
277
335
|
* limits.
|
|
@@ -285,13 +343,18 @@ export interface ProtocolMessageBuffer {
|
|
|
285
343
|
readonly unwrap: () => ProtocolMessage;
|
|
286
344
|
readonly getSize: () => PositiveInt;
|
|
287
345
|
}
|
|
288
|
-
export declare const createProtocolMessageBuffer: (ownerId: OwnerId, options
|
|
289
|
-
readonly errorCode?: ProtocolErrorCode;
|
|
290
|
-
readonly writeKey?: WriteKey;
|
|
346
|
+
export declare const createProtocolMessageBuffer: (ownerId: OwnerId, options: {
|
|
291
347
|
readonly totalMaxSize?: PositiveInt | undefined;
|
|
292
348
|
readonly rangesMaxSize?: PositiveInt | undefined;
|
|
293
349
|
readonly version?: NonNegativeInt;
|
|
294
|
-
}
|
|
350
|
+
} & ({
|
|
351
|
+
readonly type: "initiator";
|
|
352
|
+
/** Single key or [current, new] for rotation. */
|
|
353
|
+
readonly writeKey?: WriteKey | readonly [WriteKey, WriteKey];
|
|
354
|
+
} | {
|
|
355
|
+
readonly type: "non-initiator";
|
|
356
|
+
readonly errorCode: ProtocolErrorCode;
|
|
357
|
+
})) => ProtocolMessageBuffer;
|
|
295
358
|
export interface TimestampsBuffer {
|
|
296
359
|
readonly add: (timestamp: Timestamp) => void;
|
|
297
360
|
readonly addInfinite: () => void;
|
|
@@ -328,12 +391,6 @@ export declare const binaryIdToId: (binaryId: BinaryId) => Id;
|
|
|
328
391
|
export type BinaryOwnerId = Uint8Array & Brand<"BinaryOwnerId">;
|
|
329
392
|
export declare const ownerIdToBinaryOwnerId: (ownerId: OwnerId) => BinaryOwnerId;
|
|
330
393
|
export declare const binaryOwnerIdToOwnerId: (binaryOwnerId: BinaryOwnerId) => OwnerId;
|
|
331
|
-
/**
|
|
332
|
-
* Base64Url string with maximum length of 256 characters. Encoding strings as
|
|
333
|
-
* Base64UrlString saves up to 25% in size compared to regular strings.
|
|
334
|
-
*/
|
|
335
|
-
export declare const Base64Url256: import("../Type.js").BrandType<import("../Type.js").Type<"Brand", string & Brand<"Base64Url">, string, import("../Type.js").RegexError<"Base64Url">, string, import("../Type.js").StringError>, "MaxLength256", import("../Type.js").MaxLengthError<256>, import("../Type.js").StringError | import("../Type.js").RegexError<"Base64Url">>;
|
|
336
|
-
export type Base64Url256 = typeof Base64Url256.Type;
|
|
337
394
|
/**
|
|
338
395
|
* Union type for all variants of Base64Url strings with limited length. All
|
|
339
396
|
* these types use Base64Url alphabet and are < 256 characters.
|
|
@@ -397,5 +454,18 @@ export declare const ProtocolValueType: {
|
|
|
397
454
|
};
|
|
398
455
|
export declare const encodeSqliteValue: (buffer: Buffer, value: SqliteValue) => void;
|
|
399
456
|
export declare const decodeSqliteValue: (buffer: Buffer) => SqliteValue;
|
|
457
|
+
/**
|
|
458
|
+
* Decodes a ProtocolMessage into a readable JSON object for debugging.
|
|
459
|
+
*
|
|
460
|
+
* Note: This is a stub for future implementation. It should use:
|
|
461
|
+
*
|
|
462
|
+
* - DecodeVersionAndOwner
|
|
463
|
+
* - DecodeError or decodeWriteKeys (depending on context)
|
|
464
|
+
* - DecodeMessages
|
|
465
|
+
* - DecodeRanges
|
|
466
|
+
*
|
|
467
|
+
* If you want to help, please contribute to this function.
|
|
468
|
+
*/
|
|
469
|
+
export declare const decodeProtocolMessageToJson: (_protocolMessage: ProtocolMessage, _isInitiator: boolean) => unknown;
|
|
400
470
|
export {};
|
|
401
471
|
//# sourceMappingURL=Protocol.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Protocol.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Protocol.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"Protocol.d.ts","sourceRoot":"","sources":["../../../src/Evolu/Protocol.ts"],"names":[],"mappings":"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"}
|