@quereus/plugin-sync 0.3.1
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 +154 -0
- package/dist/src/clock/hlc.d.ts +105 -0
- package/dist/src/clock/hlc.d.ts.map +1 -0
- package/dist/src/clock/hlc.js +251 -0
- package/dist/src/clock/hlc.js.map +1 -0
- package/dist/src/clock/index.d.ts +6 -0
- package/dist/src/clock/index.d.ts.map +1 -0
- package/dist/src/clock/index.js +6 -0
- package/dist/src/clock/index.js.map +1 -0
- package/dist/src/clock/site.d.ts +58 -0
- package/dist/src/clock/site.d.ts.map +1 -0
- package/dist/src/clock/site.js +137 -0
- package/dist/src/clock/site.js.map +1 -0
- package/dist/src/create-sync-module.d.ts +85 -0
- package/dist/src/create-sync-module.d.ts.map +1 -0
- package/dist/src/create-sync-module.js +54 -0
- package/dist/src/create-sync-module.js.map +1 -0
- package/dist/src/index.d.ts +31 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +42 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/metadata/change-log.d.ts +67 -0
- package/dist/src/metadata/change-log.d.ts.map +1 -0
- package/dist/src/metadata/change-log.js +107 -0
- package/dist/src/metadata/change-log.js.map +1 -0
- package/dist/src/metadata/column-version.d.ts +58 -0
- package/dist/src/metadata/column-version.d.ts.map +1 -0
- package/dist/src/metadata/column-version.js +100 -0
- package/dist/src/metadata/column-version.js.map +1 -0
- package/dist/src/metadata/index.d.ts +11 -0
- package/dist/src/metadata/index.d.ts.map +1 -0
- package/dist/src/metadata/index.js +11 -0
- package/dist/src/metadata/index.js.map +1 -0
- package/dist/src/metadata/keys.d.ts +180 -0
- package/dist/src/metadata/keys.d.ts.map +1 -0
- package/dist/src/metadata/keys.js +390 -0
- package/dist/src/metadata/keys.js.map +1 -0
- package/dist/src/metadata/peer-state.d.ts +52 -0
- package/dist/src/metadata/peer-state.d.ts.map +1 -0
- package/dist/src/metadata/peer-state.js +87 -0
- package/dist/src/metadata/peer-state.js.map +1 -0
- package/dist/src/metadata/schema-migration.d.ts +60 -0
- package/dist/src/metadata/schema-migration.d.ts.map +1 -0
- package/dist/src/metadata/schema-migration.js +126 -0
- package/dist/src/metadata/schema-migration.js.map +1 -0
- package/dist/src/metadata/schema-version.d.ts +163 -0
- package/dist/src/metadata/schema-version.d.ts.map +1 -0
- package/dist/src/metadata/schema-version.js +307 -0
- package/dist/src/metadata/schema-version.js.map +1 -0
- package/dist/src/metadata/tombstones.d.ts +67 -0
- package/dist/src/metadata/tombstones.d.ts.map +1 -0
- package/dist/src/metadata/tombstones.js +125 -0
- package/dist/src/metadata/tombstones.js.map +1 -0
- package/dist/src/sync/events.d.ts +117 -0
- package/dist/src/sync/events.d.ts.map +1 -0
- package/dist/src/sync/events.js +56 -0
- package/dist/src/sync/events.js.map +1 -0
- package/dist/src/sync/index.d.ts +8 -0
- package/dist/src/sync/index.d.ts.map +1 -0
- package/dist/src/sync/index.js +8 -0
- package/dist/src/sync/index.js.map +1 -0
- package/dist/src/sync/manager.d.ts +146 -0
- package/dist/src/sync/manager.d.ts.map +1 -0
- package/dist/src/sync/manager.js +8 -0
- package/dist/src/sync/manager.js.map +1 -0
- package/dist/src/sync/protocol.d.ts +282 -0
- package/dist/src/sync/protocol.d.ts.map +1 -0
- package/dist/src/sync/protocol.js +16 -0
- package/dist/src/sync/protocol.js.map +1 -0
- package/dist/src/sync/store-adapter.d.ts +42 -0
- package/dist/src/sync/store-adapter.d.ts.map +1 -0
- package/dist/src/sync/store-adapter.js +232 -0
- package/dist/src/sync/store-adapter.js.map +1 -0
- package/dist/src/sync/sync-manager-impl.d.ts +91 -0
- package/dist/src/sync/sync-manager-impl.d.ts.map +1 -0
- package/dist/src/sync/sync-manager-impl.js +1123 -0
- package/dist/src/sync/sync-manager-impl.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key builders for CRDT metadata storage.
|
|
3
|
+
*
|
|
4
|
+
* Key prefixes (sync-specific):
|
|
5
|
+
* cv: - Column versions (HLC per column per row)
|
|
6
|
+
* tb: - Tombstones (deleted row markers)
|
|
7
|
+
* tx: - Transaction records
|
|
8
|
+
* ps: - Peer sync state
|
|
9
|
+
* sm: - Schema migrations
|
|
10
|
+
* si: - Site identity
|
|
11
|
+
* hc: - HLC clock state
|
|
12
|
+
* cl: - Change log (HLC-indexed for efficient delta queries)
|
|
13
|
+
*/
|
|
14
|
+
const encoder = new TextEncoder();
|
|
15
|
+
/** Key prefix bytes for sync metadata. */
|
|
16
|
+
export const SYNC_KEY_PREFIX = {
|
|
17
|
+
COLUMN_VERSION: encoder.encode('cv:'),
|
|
18
|
+
TOMBSTONE: encoder.encode('tb:'),
|
|
19
|
+
TRANSACTION: encoder.encode('tx:'),
|
|
20
|
+
PEER_STATE: encoder.encode('ps:'),
|
|
21
|
+
SCHEMA_MIGRATION: encoder.encode('sm:'),
|
|
22
|
+
SITE_IDENTITY: encoder.encode('si:'),
|
|
23
|
+
HLC_STATE: encoder.encode('hc:'),
|
|
24
|
+
CHANGE_LOG: encoder.encode('cl:'),
|
|
25
|
+
};
|
|
26
|
+
/** Separator between key components. */
|
|
27
|
+
const SEPARATOR = ':';
|
|
28
|
+
/**
|
|
29
|
+
* Encode a primary key as a string for use in metadata keys.
|
|
30
|
+
* Uses JSON for simplicity and determinism.
|
|
31
|
+
*/
|
|
32
|
+
export function encodePK(pk) {
|
|
33
|
+
return JSON.stringify(pk);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Decode a primary key from its string representation.
|
|
37
|
+
*/
|
|
38
|
+
export function decodePK(encoded) {
|
|
39
|
+
return JSON.parse(encoded);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Build a column version key.
|
|
43
|
+
* Format: cv:{schema}.{table}:{pk_json}:{column}
|
|
44
|
+
*/
|
|
45
|
+
export function buildColumnVersionKey(schemaName, tableName, pk, column) {
|
|
46
|
+
const key = `cv:${schemaName}.${tableName}${SEPARATOR}${encodePK(pk)}${SEPARATOR}${column}`;
|
|
47
|
+
return encoder.encode(key);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Build a tombstone key.
|
|
51
|
+
* Format: tb:{schema}.{table}:{pk_json}
|
|
52
|
+
*/
|
|
53
|
+
export function buildTombstoneKey(schemaName, tableName, pk) {
|
|
54
|
+
const key = `tb:${schemaName}.${tableName}${SEPARATOR}${encodePK(pk)}`;
|
|
55
|
+
return encoder.encode(key);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Build a transaction record key.
|
|
59
|
+
* Format: tx:{transactionId}
|
|
60
|
+
*/
|
|
61
|
+
export function buildTransactionKey(transactionId) {
|
|
62
|
+
return encoder.encode(`tx:${transactionId}`);
|
|
63
|
+
}
|
|
64
|
+
// Base64url alphabet (RFC 4648 Section 5)
|
|
65
|
+
const BASE64URL_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
|
|
66
|
+
/**
|
|
67
|
+
* Build a peer sync state key.
|
|
68
|
+
* Format: ps:{siteId_base64url}
|
|
69
|
+
*/
|
|
70
|
+
export function buildPeerStateKey(siteId) {
|
|
71
|
+
// Inline base64url encoding to avoid import cycle
|
|
72
|
+
let base64 = '';
|
|
73
|
+
for (let i = 0; i < siteId.length; i += 3) {
|
|
74
|
+
const byte1 = siteId[i];
|
|
75
|
+
const byte2 = i + 1 < siteId.length ? siteId[i + 1] : 0;
|
|
76
|
+
const byte3 = i + 2 < siteId.length ? siteId[i + 2] : 0;
|
|
77
|
+
const triplet = (byte1 << 16) | (byte2 << 8) | byte3;
|
|
78
|
+
base64 += BASE64URL_CHARS[(triplet >>> 18) & 0x3f];
|
|
79
|
+
base64 += BASE64URL_CHARS[(triplet >>> 12) & 0x3f];
|
|
80
|
+
if (i + 1 < siteId.length)
|
|
81
|
+
base64 += BASE64URL_CHARS[(triplet >>> 6) & 0x3f];
|
|
82
|
+
if (i + 2 < siteId.length)
|
|
83
|
+
base64 += BASE64URL_CHARS[triplet & 0x3f];
|
|
84
|
+
}
|
|
85
|
+
return encoder.encode(`ps:${base64}`);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Build a schema migration key.
|
|
89
|
+
* Format: sm:{schema}.{table}:{version}
|
|
90
|
+
*/
|
|
91
|
+
export function buildSchemaMigrationKey(schemaName, tableName, version) {
|
|
92
|
+
return encoder.encode(`sm:${schemaName}.${tableName}${SEPARATOR}${version.toString().padStart(10, '0')}`);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Build scan bounds for all column versions of a row.
|
|
96
|
+
* Returns keys to scan cv:{schema}.{table}:{pk_json}:*
|
|
97
|
+
*/
|
|
98
|
+
export function buildColumnVersionScanBounds(schemaName, tableName, pk) {
|
|
99
|
+
const prefix = `cv:${schemaName}.${tableName}${SEPARATOR}${encodePK(pk)}${SEPARATOR}`;
|
|
100
|
+
return {
|
|
101
|
+
gte: encoder.encode(prefix),
|
|
102
|
+
lt: incrementLastByte(encoder.encode(prefix)),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Build scan bounds for all tombstones in a table.
|
|
107
|
+
*/
|
|
108
|
+
export function buildTombstoneScanBounds(schemaName, tableName) {
|
|
109
|
+
const prefix = `tb:${schemaName}.${tableName}${SEPARATOR}`;
|
|
110
|
+
return {
|
|
111
|
+
gte: encoder.encode(prefix),
|
|
112
|
+
lt: incrementLastByte(encoder.encode(prefix)),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Build scan bounds for all schema migrations of a table.
|
|
117
|
+
*/
|
|
118
|
+
export function buildSchemaMigrationScanBounds(schemaName, tableName) {
|
|
119
|
+
const prefix = `sm:${schemaName}.${tableName}${SEPARATOR}`;
|
|
120
|
+
return {
|
|
121
|
+
gte: encoder.encode(prefix),
|
|
122
|
+
lt: incrementLastByte(encoder.encode(prefix)),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Increment the last byte of a key to create an exclusive upper bound.
|
|
127
|
+
*/
|
|
128
|
+
function incrementLastByte(key) {
|
|
129
|
+
const result = new Uint8Array(key.length);
|
|
130
|
+
result.set(key);
|
|
131
|
+
for (let i = result.length - 1; i >= 0; i--) {
|
|
132
|
+
if (result[i] < 255) {
|
|
133
|
+
result[i]++;
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
result[i] = 0;
|
|
137
|
+
}
|
|
138
|
+
return result;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Build scan bounds for ALL column versions across all tables.
|
|
142
|
+
*/
|
|
143
|
+
export function buildAllColumnVersionsScanBounds() {
|
|
144
|
+
return {
|
|
145
|
+
gte: SYNC_KEY_PREFIX.COLUMN_VERSION,
|
|
146
|
+
lt: incrementLastByte(SYNC_KEY_PREFIX.COLUMN_VERSION),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Build scan bounds for ALL tombstones across all tables.
|
|
151
|
+
*/
|
|
152
|
+
export function buildAllTombstonesScanBounds() {
|
|
153
|
+
return {
|
|
154
|
+
gte: SYNC_KEY_PREFIX.TOMBSTONE,
|
|
155
|
+
lt: incrementLastByte(SYNC_KEY_PREFIX.TOMBSTONE),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Build scan bounds for ALL schema migrations across all tables.
|
|
160
|
+
*/
|
|
161
|
+
export function buildAllSchemaMigrationsScanBounds() {
|
|
162
|
+
return {
|
|
163
|
+
gte: SYNC_KEY_PREFIX.SCHEMA_MIGRATION,
|
|
164
|
+
lt: incrementLastByte(SYNC_KEY_PREFIX.SCHEMA_MIGRATION),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Parse a column version key to extract components.
|
|
169
|
+
* Key format: cv:{schema}.{table}:{pk_json}:{column}
|
|
170
|
+
*/
|
|
171
|
+
export function parseColumnVersionKey(key) {
|
|
172
|
+
const keyStr = new TextDecoder().decode(key);
|
|
173
|
+
if (!keyStr.startsWith('cv:'))
|
|
174
|
+
return null;
|
|
175
|
+
// cv:{schema}.{table}:{pk_json}:{column}
|
|
176
|
+
const rest = keyStr.slice(3); // Remove 'cv:'
|
|
177
|
+
const firstDot = rest.indexOf('.');
|
|
178
|
+
if (firstDot === -1)
|
|
179
|
+
return null;
|
|
180
|
+
const schema = rest.slice(0, firstDot);
|
|
181
|
+
const afterDot = rest.slice(firstDot + 1);
|
|
182
|
+
const firstColon = afterDot.indexOf(':');
|
|
183
|
+
if (firstColon === -1)
|
|
184
|
+
return null;
|
|
185
|
+
const table = afterDot.slice(0, firstColon);
|
|
186
|
+
const afterTable = afterDot.slice(firstColon + 1);
|
|
187
|
+
const lastColon = afterTable.lastIndexOf(':');
|
|
188
|
+
if (lastColon === -1)
|
|
189
|
+
return null;
|
|
190
|
+
const pkJson = afterTable.slice(0, lastColon);
|
|
191
|
+
const column = afterTable.slice(lastColon + 1);
|
|
192
|
+
try {
|
|
193
|
+
const pk = decodePK(pkJson);
|
|
194
|
+
return { schema, table, pk, column };
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Parse a tombstone key to extract components.
|
|
202
|
+
* Key format: tb:{schema}.{table}:{pk_json}
|
|
203
|
+
*/
|
|
204
|
+
export function parseTombstoneKey(key) {
|
|
205
|
+
const keyStr = new TextDecoder().decode(key);
|
|
206
|
+
if (!keyStr.startsWith('tb:'))
|
|
207
|
+
return null;
|
|
208
|
+
// tb:{schema}.{table}:{pk_json}
|
|
209
|
+
const rest = keyStr.slice(3); // Remove 'tb:'
|
|
210
|
+
const firstDot = rest.indexOf('.');
|
|
211
|
+
if (firstDot === -1)
|
|
212
|
+
return null;
|
|
213
|
+
const schema = rest.slice(0, firstDot);
|
|
214
|
+
const afterDot = rest.slice(firstDot + 1);
|
|
215
|
+
const firstColon = afterDot.indexOf(':');
|
|
216
|
+
if (firstColon === -1)
|
|
217
|
+
return null;
|
|
218
|
+
const table = afterDot.slice(0, firstColon);
|
|
219
|
+
const pkJson = afterDot.slice(firstColon + 1);
|
|
220
|
+
try {
|
|
221
|
+
const pk = decodePK(pkJson);
|
|
222
|
+
return { schema, table, pk };
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Parse a schema migration key to extract components.
|
|
230
|
+
* Key format: sm:{schema}.{table}:{version}
|
|
231
|
+
*/
|
|
232
|
+
export function parseSchemaMigrationKey(key) {
|
|
233
|
+
const keyStr = new TextDecoder().decode(key);
|
|
234
|
+
if (!keyStr.startsWith('sm:'))
|
|
235
|
+
return null;
|
|
236
|
+
// sm:{schema}.{table}:{version}
|
|
237
|
+
const rest = keyStr.slice(3); // Remove 'sm:'
|
|
238
|
+
const firstDot = rest.indexOf('.');
|
|
239
|
+
if (firstDot === -1)
|
|
240
|
+
return null;
|
|
241
|
+
const schema = rest.slice(0, firstDot);
|
|
242
|
+
const afterDot = rest.slice(firstDot + 1);
|
|
243
|
+
const firstColon = afterDot.indexOf(':');
|
|
244
|
+
if (firstColon === -1)
|
|
245
|
+
return null;
|
|
246
|
+
const table = afterDot.slice(0, firstColon);
|
|
247
|
+
const versionStr = afterDot.slice(firstColon + 1);
|
|
248
|
+
const version = parseInt(versionStr, 10);
|
|
249
|
+
if (isNaN(version))
|
|
250
|
+
return null;
|
|
251
|
+
return { schema, table, version };
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Serialize an HLC to a sortable key component (26 bytes, big-endian).
|
|
255
|
+
* This format ensures lexicographic ordering matches HLC ordering.
|
|
256
|
+
*/
|
|
257
|
+
export function serializeHLCForKey(hlc) {
|
|
258
|
+
const buffer = new Uint8Array(26);
|
|
259
|
+
const view = new DataView(buffer.buffer);
|
|
260
|
+
// Wall time as big-endian 64-bit
|
|
261
|
+
view.setBigUint64(0, hlc.wallTime, false);
|
|
262
|
+
// Counter as big-endian 16-bit
|
|
263
|
+
view.setUint16(8, hlc.counter, false);
|
|
264
|
+
// Site ID (16 bytes)
|
|
265
|
+
buffer.set(hlc.siteId, 10);
|
|
266
|
+
return buffer;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Deserialize an HLC from a key component.
|
|
270
|
+
*/
|
|
271
|
+
export function deserializeHLCFromKey(buffer) {
|
|
272
|
+
const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
|
|
273
|
+
const wallTime = view.getBigUint64(0, false);
|
|
274
|
+
const counter = view.getUint16(8, false);
|
|
275
|
+
const siteId = new Uint8Array(buffer.slice(10, 26));
|
|
276
|
+
return { wallTime, counter, siteId };
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Build a change log key.
|
|
280
|
+
* Format: cl:{hlc_bytes}{type_byte}{schema}.{table}:{pk_json}:{column?}
|
|
281
|
+
*
|
|
282
|
+
* The HLC comes first to enable efficient range scans by time.
|
|
283
|
+
* type_byte: 0x01 for column change, 0x02 for delete
|
|
284
|
+
*/
|
|
285
|
+
export function buildChangeLogKey(hlc, entryType, schemaName, tableName, pk, column) {
|
|
286
|
+
const hlcBytes = serializeHLCForKey(hlc);
|
|
287
|
+
const typeByte = entryType === 'column' ? 0x01 : 0x02;
|
|
288
|
+
const suffix = column
|
|
289
|
+
? `${schemaName}.${tableName}${SEPARATOR}${encodePK(pk)}${SEPARATOR}${column}`
|
|
290
|
+
: `${schemaName}.${tableName}${SEPARATOR}${encodePK(pk)}`;
|
|
291
|
+
const suffixBytes = encoder.encode(suffix);
|
|
292
|
+
// cl: (3) + hlc (26) + type (1) + suffix
|
|
293
|
+
const key = new Uint8Array(3 + 26 + 1 + suffixBytes.length);
|
|
294
|
+
key.set(SYNC_KEY_PREFIX.CHANGE_LOG, 0);
|
|
295
|
+
key.set(hlcBytes, 3);
|
|
296
|
+
key[29] = typeByte;
|
|
297
|
+
key.set(suffixBytes, 30);
|
|
298
|
+
return key;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Build scan bounds for change log entries after a given HLC.
|
|
302
|
+
* Returns keys to scan cl:{sinceHLC}* to end of change log.
|
|
303
|
+
*/
|
|
304
|
+
export function buildChangeLogScanBoundsAfter(sinceHLC) {
|
|
305
|
+
const hlcBytes = serializeHLCForKey(sinceHLC);
|
|
306
|
+
// Start just after sinceHLC
|
|
307
|
+
const gte = new Uint8Array(3 + 26);
|
|
308
|
+
gte.set(SYNC_KEY_PREFIX.CHANGE_LOG, 0);
|
|
309
|
+
gte.set(incrementHLCBytes(hlcBytes), 3);
|
|
310
|
+
return {
|
|
311
|
+
gte,
|
|
312
|
+
lt: incrementLastByte(SYNC_KEY_PREFIX.CHANGE_LOG),
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Build scan bounds for all change log entries.
|
|
317
|
+
*/
|
|
318
|
+
export function buildAllChangeLogScanBounds() {
|
|
319
|
+
return {
|
|
320
|
+
gte: SYNC_KEY_PREFIX.CHANGE_LOG,
|
|
321
|
+
lt: incrementLastByte(SYNC_KEY_PREFIX.CHANGE_LOG),
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Increment HLC bytes to get the next possible HLC key prefix.
|
|
326
|
+
*/
|
|
327
|
+
function incrementHLCBytes(hlcBytes) {
|
|
328
|
+
const result = new Uint8Array(hlcBytes.length);
|
|
329
|
+
result.set(hlcBytes);
|
|
330
|
+
for (let i = result.length - 1; i >= 0; i--) {
|
|
331
|
+
if (result[i] < 255) {
|
|
332
|
+
result[i]++;
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
result[i] = 0;
|
|
336
|
+
}
|
|
337
|
+
return result;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Parse a change log key to extract components.
|
|
341
|
+
*/
|
|
342
|
+
export function parseChangeLogKey(key) {
|
|
343
|
+
// Minimum: cl: (3) + hlc (26) + type (1) + some suffix
|
|
344
|
+
if (key.length < 31)
|
|
345
|
+
return null;
|
|
346
|
+
const prefixStr = new TextDecoder().decode(key.slice(0, 3));
|
|
347
|
+
if (prefixStr !== 'cl:')
|
|
348
|
+
return null;
|
|
349
|
+
const hlcBytes = key.slice(3, 29);
|
|
350
|
+
const hlc = deserializeHLCFromKey(hlcBytes);
|
|
351
|
+
const typeByte = key[29];
|
|
352
|
+
const entryType = typeByte === 0x01 ? 'column' : 'delete';
|
|
353
|
+
const suffixStr = new TextDecoder().decode(key.slice(30));
|
|
354
|
+
// Parse suffix: {schema}.{table}:{pk_json}:{column?}
|
|
355
|
+
const firstDot = suffixStr.indexOf('.');
|
|
356
|
+
if (firstDot === -1)
|
|
357
|
+
return null;
|
|
358
|
+
const schema = suffixStr.slice(0, firstDot);
|
|
359
|
+
const afterDot = suffixStr.slice(firstDot + 1);
|
|
360
|
+
const firstColon = afterDot.indexOf(':');
|
|
361
|
+
if (firstColon === -1)
|
|
362
|
+
return null;
|
|
363
|
+
const table = afterDot.slice(0, firstColon);
|
|
364
|
+
const afterTable = afterDot.slice(firstColon + 1);
|
|
365
|
+
if (entryType === 'column') {
|
|
366
|
+
const lastColon = afterTable.lastIndexOf(':');
|
|
367
|
+
if (lastColon === -1)
|
|
368
|
+
return null;
|
|
369
|
+
const pkJson = afterTable.slice(0, lastColon);
|
|
370
|
+
const column = afterTable.slice(lastColon + 1);
|
|
371
|
+
try {
|
|
372
|
+
const pk = decodePK(pkJson);
|
|
373
|
+
return { hlc, entryType, schema, table, pk, column };
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
// Delete entry - no column
|
|
381
|
+
try {
|
|
382
|
+
const pk = decodePK(afterTable);
|
|
383
|
+
return { hlc, entryType, schema, table, pk };
|
|
384
|
+
}
|
|
385
|
+
catch {
|
|
386
|
+
return null;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/metadata/keys.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Peer sync state tracking.
|
|
3
|
+
*
|
|
4
|
+
* Tracks the last HLC we've synced to with each peer.
|
|
5
|
+
* Used to determine what changes to send during delta sync.
|
|
6
|
+
*/
|
|
7
|
+
import type { KVStore } from '@quereus/plugin-store';
|
|
8
|
+
import { type HLC } from '../clock/hlc.js';
|
|
9
|
+
import type { SiteId } from '../clock/site.js';
|
|
10
|
+
/**
|
|
11
|
+
* Peer sync state record.
|
|
12
|
+
*/
|
|
13
|
+
export interface PeerState {
|
|
14
|
+
lastSyncHLC: HLC;
|
|
15
|
+
lastSyncTime: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Serialize peer state for storage.
|
|
19
|
+
* Format: 26 bytes HLC + 8 bytes lastSyncTime
|
|
20
|
+
*/
|
|
21
|
+
export declare function serializePeerState(state: PeerState): Uint8Array;
|
|
22
|
+
/**
|
|
23
|
+
* Deserialize peer state from storage.
|
|
24
|
+
*/
|
|
25
|
+
export declare function deserializePeerState(buffer: Uint8Array): PeerState;
|
|
26
|
+
/**
|
|
27
|
+
* Peer state store operations.
|
|
28
|
+
*/
|
|
29
|
+
export declare class PeerStateStore {
|
|
30
|
+
private readonly kv;
|
|
31
|
+
constructor(kv: KVStore);
|
|
32
|
+
/**
|
|
33
|
+
* Get the sync state for a peer.
|
|
34
|
+
*/
|
|
35
|
+
getPeerState(peerSiteId: SiteId): Promise<PeerState | undefined>;
|
|
36
|
+
/**
|
|
37
|
+
* Update the sync state for a peer.
|
|
38
|
+
*/
|
|
39
|
+
setPeerState(peerSiteId: SiteId, hlc: HLC): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Get all known peers.
|
|
42
|
+
*/
|
|
43
|
+
getAllPeers(): AsyncIterable<{
|
|
44
|
+
siteId: SiteId;
|
|
45
|
+
state: PeerState;
|
|
46
|
+
}>;
|
|
47
|
+
/**
|
|
48
|
+
* Delete peer state (e.g., when peer is no longer known).
|
|
49
|
+
*/
|
|
50
|
+
deletePeerState(peerSiteId: SiteId): Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=peer-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-state.d.ts","sourceRoot":"","sources":["../../../src/metadata/peer-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,KAAK,GAAG,EAAgC,MAAM,iBAAiB,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI/C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,GAAG,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,UAAU,CAS/D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAKlE;AAED;;GAEG;AACH,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,OAAO;IAExC;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAOtE;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/D;;OAEG;IACI,WAAW,IAAI,aAAa,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,CAAA;KAAE,CAAC;IAmBzE;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIzD"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Peer sync state tracking.
|
|
3
|
+
*
|
|
4
|
+
* Tracks the last HLC we've synced to with each peer.
|
|
5
|
+
* Used to determine what changes to send during delta sync.
|
|
6
|
+
*/
|
|
7
|
+
import { serializeHLC, deserializeHLC } from '../clock/hlc.js';
|
|
8
|
+
import { buildPeerStateKey } from './keys.js';
|
|
9
|
+
import { SYNC_KEY_PREFIX } from './keys.js';
|
|
10
|
+
/**
|
|
11
|
+
* Serialize peer state for storage.
|
|
12
|
+
* Format: 26 bytes HLC + 8 bytes lastSyncTime
|
|
13
|
+
*/
|
|
14
|
+
export function serializePeerState(state) {
|
|
15
|
+
const result = new Uint8Array(34);
|
|
16
|
+
const hlcBytes = serializeHLC(state.lastSyncHLC);
|
|
17
|
+
result.set(hlcBytes, 0);
|
|
18
|
+
const view = new DataView(result.buffer);
|
|
19
|
+
view.setBigUint64(26, BigInt(state.lastSyncTime), false);
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Deserialize peer state from storage.
|
|
24
|
+
*/
|
|
25
|
+
export function deserializePeerState(buffer) {
|
|
26
|
+
const lastSyncHLC = deserializeHLC(buffer.slice(0, 26));
|
|
27
|
+
const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
|
|
28
|
+
const lastSyncTime = Number(view.getBigUint64(26, false));
|
|
29
|
+
return { lastSyncHLC, lastSyncTime };
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Peer state store operations.
|
|
33
|
+
*/
|
|
34
|
+
export class PeerStateStore {
|
|
35
|
+
kv;
|
|
36
|
+
constructor(kv) {
|
|
37
|
+
this.kv = kv;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get the sync state for a peer.
|
|
41
|
+
*/
|
|
42
|
+
async getPeerState(peerSiteId) {
|
|
43
|
+
const key = buildPeerStateKey(peerSiteId);
|
|
44
|
+
const data = await this.kv.get(key);
|
|
45
|
+
if (!data)
|
|
46
|
+
return undefined;
|
|
47
|
+
return deserializePeerState(data);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Update the sync state for a peer.
|
|
51
|
+
*/
|
|
52
|
+
async setPeerState(peerSiteId, hlc) {
|
|
53
|
+
const key = buildPeerStateKey(peerSiteId);
|
|
54
|
+
const state = {
|
|
55
|
+
lastSyncHLC: hlc,
|
|
56
|
+
lastSyncTime: Date.now(),
|
|
57
|
+
};
|
|
58
|
+
await this.kv.put(key, serializePeerState(state));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get all known peers.
|
|
62
|
+
*/
|
|
63
|
+
async *getAllPeers() {
|
|
64
|
+
const prefix = SYNC_KEY_PREFIX.PEER_STATE;
|
|
65
|
+
const lt = new Uint8Array(prefix.length);
|
|
66
|
+
lt.set(prefix);
|
|
67
|
+
lt[lt.length - 1]++;
|
|
68
|
+
for await (const entry of this.kv.iterate({ gte: prefix, lt })) {
|
|
69
|
+
// Extract site ID from key: ps:{siteId_hex}
|
|
70
|
+
const keyStr = new TextDecoder().decode(entry.key);
|
|
71
|
+
const hex = keyStr.slice(3); // Skip "ps:"
|
|
72
|
+
const siteId = new Uint8Array(16);
|
|
73
|
+
for (let i = 0; i < 16; i++) {
|
|
74
|
+
siteId[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
|
75
|
+
}
|
|
76
|
+
yield { siteId, state: deserializePeerState(entry.value) };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Delete peer state (e.g., when peer is no longer known).
|
|
81
|
+
*/
|
|
82
|
+
async deletePeerState(peerSiteId) {
|
|
83
|
+
const key = buildPeerStateKey(peerSiteId);
|
|
84
|
+
await this.kv.delete(key);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=peer-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-state.js","sourceRoot":"","sources":["../../../src/metadata/peer-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAY,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAU5C;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAgB;IACjD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAExB,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;IAEzD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAkB;IACrD,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC/E,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,EAAW;QAAX,OAAE,GAAF,EAAE,CAAS;IAAG,CAAC;IAE5C;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,UAAkB;QACnC,MAAM,GAAG,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAC5B,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,GAAQ;QAC7C,MAAM,GAAG,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAc;YACvB,WAAW,EAAE,GAAG;YAChB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;SACzB,CAAC;QACF,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAC,WAAW;QAChB,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC;QAC1C,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACf,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QAEpB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC/D,4CAA4C;YAC5C,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,aAAa;YAC3C,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;YAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,UAAkB;QACtC,MAAM,GAAG,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema migration tracking for sync.
|
|
3
|
+
*
|
|
4
|
+
* Tracks DDL changes (CREATE TABLE, ALTER TABLE, etc.) with HLC timestamps.
|
|
5
|
+
* Uses first-writer-wins for conflict resolution on schema changes.
|
|
6
|
+
*/
|
|
7
|
+
import type { KVStore, WriteBatch } from '@quereus/plugin-store';
|
|
8
|
+
import { type HLC } from '../clock/hlc.js';
|
|
9
|
+
import type { SchemaMigrationType } from '../sync/protocol.js';
|
|
10
|
+
/**
|
|
11
|
+
* Stored schema migration record.
|
|
12
|
+
*/
|
|
13
|
+
export interface StoredMigration {
|
|
14
|
+
type: SchemaMigrationType;
|
|
15
|
+
ddl: string;
|
|
16
|
+
hlc: HLC;
|
|
17
|
+
schemaVersion: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Serialize a migration for storage.
|
|
21
|
+
* Format: 26 bytes HLC + 4 bytes version + 1 byte type length + type + ddl
|
|
22
|
+
*/
|
|
23
|
+
export declare function serializeMigration(migration: StoredMigration): Uint8Array;
|
|
24
|
+
/**
|
|
25
|
+
* Deserialize a migration from storage.
|
|
26
|
+
*/
|
|
27
|
+
export declare function deserializeMigration(buffer: Uint8Array): StoredMigration;
|
|
28
|
+
/**
|
|
29
|
+
* Schema migration store operations.
|
|
30
|
+
*/
|
|
31
|
+
export declare class SchemaMigrationStore {
|
|
32
|
+
private readonly kv;
|
|
33
|
+
constructor(kv: KVStore);
|
|
34
|
+
/**
|
|
35
|
+
* Get a specific migration by version.
|
|
36
|
+
*/
|
|
37
|
+
getMigration(schemaName: string, tableName: string, version: number): Promise<StoredMigration | undefined>;
|
|
38
|
+
/**
|
|
39
|
+
* Record a new migration.
|
|
40
|
+
*/
|
|
41
|
+
recordMigration(schemaName: string, tableName: string, migration: StoredMigration): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Record migration in a batch.
|
|
44
|
+
*/
|
|
45
|
+
recordMigrationBatch(batch: WriteBatch, schemaName: string, tableName: string, migration: StoredMigration): void;
|
|
46
|
+
/**
|
|
47
|
+
* Get the current schema version for a table.
|
|
48
|
+
*/
|
|
49
|
+
getCurrentVersion(schemaName: string, tableName: string): Promise<number>;
|
|
50
|
+
/**
|
|
51
|
+
* Get all migrations for a table.
|
|
52
|
+
*/
|
|
53
|
+
getAllMigrations(schemaName: string, tableName: string): AsyncIterable<StoredMigration>;
|
|
54
|
+
/**
|
|
55
|
+
* Check if a migration conflicts with an existing one.
|
|
56
|
+
* Returns the existing migration if there's a conflict, undefined otherwise.
|
|
57
|
+
*/
|
|
58
|
+
checkConflict(schemaName: string, tableName: string, version: number, incomingHLC: HLC): Promise<StoredMigration | undefined>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=schema-migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-migration.d.ts","sourceRoot":"","sources":["../../../src/metadata/schema-migration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,KAAK,GAAG,EAA4C,MAAM,iBAAiB,CAAC;AAErF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,GAAG,CAAC;IACT,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,eAAe,GAAG,UAAU,CA4BzE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,eAAe,CAuBxE;AAED;;GAEG;AACH,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,OAAO;IAExC;;OAEG;IACG,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAOvC;;OAEG;IACG,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,eAAe,GACzB,OAAO,CAAC,IAAI,CAAC;IAKhB;;OAEG;IACH,oBAAoB,CAClB,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,eAAe,GACzB,IAAI;IAKP;;OAEG;IACG,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY/E;;OAEG;IACI,gBAAgB,CACrB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,aAAa,CAAC,eAAe,CAAC;IAQjC;;;OAGG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,GAAG,GACf,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;CAWxC"}
|