@affectively/aeon 1.3.0 → 5.0.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/LICENSE +5 -11
- package/README.md +90 -10
- package/dist/compression/index.cjs +20 -3
- package/dist/compression/index.cjs.map +1 -1
- package/dist/compression/index.js +20 -3
- package/dist/compression/index.js.map +1 -1
- package/dist/crypto/index.cjs +30 -0
- package/dist/crypto/index.cjs.map +1 -1
- package/dist/crypto/index.js +29 -1
- package/dist/crypto/index.js.map +1 -1
- package/dist/distributed/index.cjs +15 -8
- package/dist/distributed/index.cjs.map +1 -1
- package/dist/distributed/index.js +15 -8
- package/dist/distributed/index.js.map +1 -1
- package/dist/index.cjs +2923 -46
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2879 -47
- package/dist/index.js.map +1 -1
- package/dist/optimization/index.cjs +6 -3
- package/dist/optimization/index.cjs.map +1 -1
- package/dist/optimization/index.js +6 -3
- package/dist/optimization/index.js.map +1 -1
- package/dist/persistence/index.cjs +91 -29
- package/dist/persistence/index.cjs.map +1 -1
- package/dist/persistence/index.js +91 -29
- package/dist/persistence/index.js.map +1 -1
- package/dist/presence/index.cjs.map +1 -1
- package/dist/presence/index.js.map +1 -1
- package/dist/versioning/index.cjs +4 -3
- package/dist/versioning/index.cjs.map +1 -1
- package/dist/versioning/index.js +4 -3
- package/dist/versioning/index.js.map +1 -1
- package/package.json +7 -8
- package/dist/compression/index.d.cts +0 -189
- package/dist/compression/index.d.ts +0 -189
- package/dist/core/index.d.cts +0 -216
- package/dist/core/index.d.ts +0 -216
- package/dist/crypto/index.d.cts +0 -446
- package/dist/crypto/index.d.ts +0 -446
- package/dist/distributed/index.d.cts +0 -1016
- package/dist/distributed/index.d.ts +0 -1016
- package/dist/index.d.cts +0 -12
- package/dist/index.d.ts +0 -12
- package/dist/offline/index.d.cts +0 -154
- package/dist/offline/index.d.ts +0 -154
- package/dist/optimization/index.d.cts +0 -347
- package/dist/optimization/index.d.ts +0 -347
- package/dist/persistence/index.d.cts +0 -63
- package/dist/persistence/index.d.ts +0 -63
- package/dist/presence/index.d.cts +0 -283
- package/dist/presence/index.d.ts +0 -283
- package/dist/types-B7gCpNX9.d.cts +0 -33
- package/dist/types-B7gCpNX9.d.ts +0 -33
- package/dist/utils/index.d.cts +0 -38
- package/dist/utils/index.d.ts +0 -38
- package/dist/versioning/index.d.cts +0 -537
- package/dist/versioning/index.d.ts +0 -537
package/LICENSE
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
Copyright (c) 2026 Taylor William Buley (https://buley.fyi)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
All rights reserved.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
5
|
+
This software is provided for personal, non-commercial, and academic use only.
|
|
6
|
+
You may not use, modify, distribute, or sell this software, in whole or in part,
|
|
7
|
+
for any commercial purpose without explicit written permission from the copyright holder.
|
|
14
8
|
|
|
15
9
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
10
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Aeon
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> TCP had its 40-year run. UDP by default everywhere, TCP only when necessary.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/@affectively/aeon)
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
@@ -10,18 +10,76 @@
|
|
|
10
10
|
|
|
11
11
|
In Gnosticism, **Aeons** are not just time periods; they are divine beings or powers that emanate from the "One" (the Pleroma). They function as links or "levels" between the pure divine source and the material world, often existing in pairs (syzygies) to maintain balance.
|
|
12
12
|
|
|
13
|
-
In the Affectively framework, if "halos" are the users, then **Aeons are the collaborative structures**
|
|
13
|
+
In the Affectively framework, if "halos" are the users, then **Aeons are the collaborative structures** — the channels that allow users to communicate with the higher-level logic of the platform. They bridge the gap between individual user state and the distributed system, maintaining harmony across the network.
|
|
14
14
|
|
|
15
15
|
## Overview
|
|
16
16
|
|
|
17
17
|
**Aeon** is a comprehensive TypeScript library for building distributed, collaborative applications. It provides the primitives needed for:
|
|
18
18
|
|
|
19
|
+
- **Aeon Flow Protocol** - 10-byte binary multiplexing with fork/race/collapse over UDP
|
|
19
20
|
- **Distributed Synchronization** - Coordinate sync sessions across multiple nodes
|
|
20
21
|
- **Schema Versioning** - Manage schema evolution with migrations and rollbacks
|
|
21
22
|
- **Data Replication** - Configure consistency levels and replication policies
|
|
22
23
|
- **Conflict Resolution** - Multiple strategies for resolving divergent state
|
|
23
24
|
- **Real-time Presence** - Track node health and status in real-time
|
|
24
25
|
|
|
26
|
+
### Aeon Flow Protocol
|
|
27
|
+
|
|
28
|
+
One connection. Every stream independent. Zero head-of-line blocking.
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
┌──────────────────────────────────────────────────────────┐
|
|
32
|
+
│ 10-byte Flow Frame │
|
|
33
|
+
├──────────┬──────────┬───────┬────────────────────────────┤
|
|
34
|
+
│ stream_id│ sequence │ flags │ length │ payload ... │
|
|
35
|
+
│ (u16) │ (u32) │ (u8) │ (u24) │ │
|
|
36
|
+
└──────────┴──────────┴───────┴────────────────────────────┘
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Every frame is self-describing. `stream_id` + `sequence` means frames arrive out of order and reassemble correctly. This is the same insight as QUIC/HTTP3 — but with 10-byte frames instead of QUIC's complex framing.
|
|
40
|
+
|
|
41
|
+
**What was 100+ HTTP requests becomes 1 multiplexed stream:**
|
|
42
|
+
|
|
43
|
+
| | HTTP (before) | Aeon Flow (after) |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| Full site load | 5+ connections | 1 connection |
|
|
46
|
+
| Service worker preload | 100 fetches in batches of 5 | 1 multiplexed stream |
|
|
47
|
+
| ESI inference per page | N sequential fetches | N forked streams, raced |
|
|
48
|
+
| Deploy artifact transfer | File-by-file | 1 multiplexed stream |
|
|
49
|
+
| Protocol overhead per asset | ~200 bytes HTTP headers | 10 bytes flow header |
|
|
50
|
+
| 100-page overhead | ~20KB HTTP headers | 1KB flow headers |
|
|
51
|
+
|
|
52
|
+
**Transport-agnostic.** Same protocol over WebSocket, UDP, WebTransport, IPC, or anything that moves bytes:
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
import { AeonFlowProtocol, UDPFlowTransport } from '@affectively/aeon';
|
|
56
|
+
|
|
57
|
+
// Native UDP — zero connection setup, zero head-of-line blocking
|
|
58
|
+
const transport = new UDPFlowTransport({
|
|
59
|
+
host: '0.0.0.0', port: 4242,
|
|
60
|
+
remoteHost: 'target.example.com', remotePort: 4242,
|
|
61
|
+
reliable: true, // ACK bitmaps + AIMD congestion control
|
|
62
|
+
});
|
|
63
|
+
await transport.bind();
|
|
64
|
+
|
|
65
|
+
const flow = new AeonFlowProtocol(transport, {
|
|
66
|
+
role: 'client',
|
|
67
|
+
maxConcurrentStreams: 256,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Fork 3 streams, race them, collapse to winner
|
|
71
|
+
const results = await flow.fork([stream1, stream2, stream3]);
|
|
72
|
+
const winner = await flow.race(results);
|
|
73
|
+
await flow.collapse(winner);
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**UDP features:**
|
|
77
|
+
- MTU-aware fragmentation (4-byte header, max 255 fragments x 1468 bytes = 366KB per frame)
|
|
78
|
+
- ACK bitmaps: 14 bytes covers 64 contiguous sequences
|
|
79
|
+
- AIMD congestion control (additive increase, multiplicative decrease)
|
|
80
|
+
- Per-stream out-of-order reassembly via `FrameReassembler`
|
|
81
|
+
- WebTransport bridge for browsers (HTTP/3 unreliable datagrams)
|
|
82
|
+
|
|
25
83
|
Roadmap vision: see [ROADMAP.md](./ROADMAP.md).
|
|
26
84
|
|
|
27
85
|
## Installation
|
|
@@ -173,6 +231,24 @@ if (reconciler.detectConflicts('user:123')) {
|
|
|
173
231
|
|
|
174
232
|
## Modules
|
|
175
233
|
|
|
234
|
+
### Flow (`@affectively/aeon/flow`)
|
|
235
|
+
|
|
236
|
+
Binary multiplexing protocol with fork/race/collapse primitives.
|
|
237
|
+
|
|
238
|
+
- `AeonFlowProtocol` - Protocol engine (transport-agnostic)
|
|
239
|
+
- `FlowCodec` - Frame encoding/decoding (10-byte headers)
|
|
240
|
+
- `UDPFlowTransport` - Native UDP transport with AIMD congestion control
|
|
241
|
+
- `WebTransportFlowTransport` - Browser-side HTTP/3 unreliable datagrams
|
|
242
|
+
- `FrameReassembler` - Per-stream out-of-order frame reconstruction
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
import {
|
|
246
|
+
AeonFlowProtocol,
|
|
247
|
+
UDPFlowTransport,
|
|
248
|
+
FrameReassembler,
|
|
249
|
+
} from '@affectively/aeon';
|
|
250
|
+
```
|
|
251
|
+
|
|
176
252
|
### Core (`@affectively/aeon/core`)
|
|
177
253
|
|
|
178
254
|
Shared types and utilities used across all modules.
|
|
@@ -313,14 +389,18 @@ disableLogging();
|
|
|
313
389
|
|
|
314
390
|
## Comparison with Similar Libraries
|
|
315
391
|
|
|
316
|
-
| Feature | Aeon | Yjs | Automerge |
|
|
317
|
-
|
|
318
|
-
|
|
|
319
|
-
|
|
|
320
|
-
|
|
|
321
|
-
|
|
|
322
|
-
|
|
|
323
|
-
|
|
|
392
|
+
| Feature | Aeon | Yjs | Automerge | QUIC |
|
|
393
|
+
|---------|------|-----|-----------|------|
|
|
394
|
+
| Binary Multiplexing | ✅ 10-byte frames | ❌ | ❌ | ✅ Complex framing |
|
|
395
|
+
| Fork/Race/Collapse | ✅ | ❌ | ❌ | ❌ |
|
|
396
|
+
| UDP Transport | ✅ Native | ❌ | ❌ | ✅ |
|
|
397
|
+
| Zero HOL Blocking | ✅ | ❌ | ❌ | ✅ |
|
|
398
|
+
| Schema Versioning | ✅ | ❌ | ❌ | ❌ |
|
|
399
|
+
| Migrations | ✅ | ❌ | ❌ | ❌ |
|
|
400
|
+
| Replication Policies | ✅ | ❌ | ❌ | ❌ |
|
|
401
|
+
| Multiple Merge Strategies | ✅ | ⚠️ | ⚠️ | ❌ |
|
|
402
|
+
| TypeScript-first | ✅ | ⚠️ | ⚠️ | ❌ |
|
|
403
|
+
| Zero Dependencies* | ✅ | ❌ | ❌ | ❌ |
|
|
324
404
|
|
|
325
405
|
*Only `eventemitter3` for event handling
|
|
326
406
|
|
|
@@ -223,7 +223,10 @@ var CompressionEngine = class {
|
|
|
223
223
|
*/
|
|
224
224
|
reassembleChunks(chunks) {
|
|
225
225
|
const sorted = [...chunks].sort((a, b) => a.index - b.index);
|
|
226
|
-
|
|
226
|
+
if (sorted.length === 0) {
|
|
227
|
+
throw new Error("Cannot reassemble: no chunks provided");
|
|
228
|
+
}
|
|
229
|
+
const total = sorted[0].total;
|
|
227
230
|
if (sorted.length !== total) {
|
|
228
231
|
throw new Error(
|
|
229
232
|
`Missing chunks: got ${sorted.length}, expected ${total}`
|
|
@@ -249,7 +252,7 @@ var CompressionEngine = class {
|
|
|
249
252
|
for (let i = 0; i < data.length; i++) {
|
|
250
253
|
hash = (hash << 5) - hash + data[i] | 0;
|
|
251
254
|
}
|
|
252
|
-
return hash.toString(16);
|
|
255
|
+
return (hash >>> 0).toString(16);
|
|
253
256
|
}
|
|
254
257
|
/**
|
|
255
258
|
* Update average compression ratio
|
|
@@ -293,7 +296,8 @@ function resetCompressionEngine() {
|
|
|
293
296
|
|
|
294
297
|
// src/compression/DeltaSyncOptimizer.ts
|
|
295
298
|
var logger2 = getLogger();
|
|
296
|
-
var DeltaSyncOptimizer = class {
|
|
299
|
+
var DeltaSyncOptimizer = class _DeltaSyncOptimizer {
|
|
300
|
+
static MAX_HISTORY_SIZE = 1e4;
|
|
297
301
|
operationHistory = /* @__PURE__ */ new Map();
|
|
298
302
|
stats = {
|
|
299
303
|
totalOperations: 0,
|
|
@@ -338,6 +342,10 @@ var DeltaSyncOptimizer = class {
|
|
|
338
342
|
).byteLength;
|
|
339
343
|
this.stats.totalDeltaSize += deltaSize2;
|
|
340
344
|
this.operationHistory.set(operation.id, operation);
|
|
345
|
+
if (this.operationHistory.size > _DeltaSyncOptimizer.MAX_HISTORY_SIZE) {
|
|
346
|
+
const firstKey = this.operationHistory.keys().next().value;
|
|
347
|
+
if (firstKey !== void 0) this.operationHistory.delete(firstKey);
|
|
348
|
+
}
|
|
341
349
|
return delta;
|
|
342
350
|
}
|
|
343
351
|
const changes = {};
|
|
@@ -388,6 +396,10 @@ var DeltaSyncOptimizer = class {
|
|
|
388
396
|
this.stats.totalOriginalSize += originalSize;
|
|
389
397
|
this.stats.totalDeltaSize += deltaSize;
|
|
390
398
|
this.operationHistory.set(operation.id, operation);
|
|
399
|
+
if (this.operationHistory.size > _DeltaSyncOptimizer.MAX_HISTORY_SIZE) {
|
|
400
|
+
const firstKey = this.operationHistory.keys().next().value;
|
|
401
|
+
if (firstKey !== void 0) this.operationHistory.delete(firstKey);
|
|
402
|
+
}
|
|
391
403
|
return finalDelta;
|
|
392
404
|
}
|
|
393
405
|
/**
|
|
@@ -472,6 +484,11 @@ var DeltaSyncOptimizer = class {
|
|
|
472
484
|
for (const op of operations) {
|
|
473
485
|
this.operationHistory.set(op.id, op);
|
|
474
486
|
}
|
|
487
|
+
while (this.operationHistory.size > _DeltaSyncOptimizer.MAX_HISTORY_SIZE) {
|
|
488
|
+
const firstKey = this.operationHistory.keys().next().value;
|
|
489
|
+
if (firstKey !== void 0) this.operationHistory.delete(firstKey);
|
|
490
|
+
else break;
|
|
491
|
+
}
|
|
475
492
|
logger2.debug("[DeltaSyncOptimizer] History updated", {
|
|
476
493
|
count: operations.length,
|
|
477
494
|
totalHistorySize: this.operationHistory.size
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/logger.ts","../../src/compression/CompressionEngine.ts","../../src/compression/DeltaSyncOptimizer.ts"],"names":["logger","deltaSize"],"mappings":";;;AAoBA,IAAM,aAAA,GAAwB;AAAA,EAC5B,KAAA,EAAO,IAAI,IAAA,KAAoB;AAE7B,IAAA,OAAA,CAAQ,KAAA,CAAM,cAAA,EAAgB,GAAG,IAAI,CAAA;AAAA,EACvC,CAAA;AAAA,EACA,IAAA,EAAM,IAAI,IAAA,KAAoB;AAE5B,IAAA,OAAA,CAAQ,IAAA,CAAK,aAAA,EAAe,GAAG,IAAI,CAAA;AAAA,EACrC,CAAA;AAAA,EACA,IAAA,EAAM,IAAI,IAAA,KAAoB;AAE5B,IAAA,OAAA,CAAQ,IAAA,CAAK,aAAA,EAAe,GAAG,IAAI,CAAA;AAAA,EACrC,CAAA;AAAA,EACA,KAAA,EAAO,IAAI,IAAA,KAAoB;AAE7B,IAAA,OAAA,CAAQ,KAAA,CAAM,cAAA,EAAgB,GAAG,IAAI,CAAA;AAAA,EACvC;AACF,CAAA;AAeA,IAAI,aAAA,GAAwB,aAAA;AAKrB,SAAS,SAAA,GAAoB;AAClC,EAAA,OAAO,aAAA;AACT;;;AClDA,IAAM,SAAS,SAAA,EAAU;AAuClB,IAAM,oBAAN,MAAwB;AAAA,EACrB,KAAA,GAA0B;AAAA,IAChC,eAAA,EAAiB,CAAA;AAAA,IACjB,iBAAA,EAAmB,CAAA;AAAA,IACnB,kBAAA,EAAoB,CAAA;AAAA,IACpB,oBAAA,EAAsB,CAAA;AAAA,IACtB,uBAAA,EAAyB,CAAA;AAAA,IACzB,iBAAA,EAAmB,CAAA;AAAA,IACnB,mBAAA,EAAqB;AAAA,GACvB;AAAA,EACQ,kBAAA,GAAyC,MAAA;AAAA,EAEjD,WAAA,CAAY,qBAAyC,MAAA,EAAQ;AAC3D,IAAA,IAAA,CAAK,kBAAA,GAAqB,kBAAA;AAC1B,IAAA,MAAA,CAAO,MAAM,iCAAA,EAAmC;AAAA,MAC9C,SAAA,EAAW,kBAAA;AAAA,MACX,cAAA,EAAgB,KAAK,yBAAA;AAA0B,KAChD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAA,GAAqC;AACnC,IAAA,OACE,OAAO,iBAAA,KAAsB,WAAA,IAC7B,OAAO,mBAAA,KAAwB,WAAA;AAAA,EAEnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,IAAA,EAAqD;AAClE,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAElC,IAAA,MAAM,SAAA,GACJ,OAAO,IAAA,KAAS,QAAA,GAAW,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA;AAC9D,IAAA,MAAM,eAAe,SAAA,CAAU,UAAA;AAE/B,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,YAAyC,IAAA,CAAK,kBAAA;AAElD,IAAA,IAAI,IAAA,CAAK,2BAA0B,EAAG;AACpC,MAAA,IAAI;AACF,QAAA,UAAA,GAAa,MAAM,IAAA,CAAK,cAAA;AAAA,UACtB,SAAA;AAAA,UACA,IAAA,CAAK;AAAA,SACP;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,+DAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,UAAA,GAAa,SAAA;AACb,QAAA,SAAA,GAAY,MAAA;AAAA,MACd;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,UAAA,GAAa,SAAA;AACb,MAAA,SAAA,GAAY,MAAA;AAAA,IACd;AAEA,IAAA,MAAM,mBACJ,YAAA,GAAe,CAAA,GAAI,CAAA,GAAI,UAAA,CAAW,aAAa,YAAA,GAAe,CAAA;AAEhE,IAAA,MAAM,KAAA,GAAyB;AAAA,MAC7B,EAAA,EAAI,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,MAC9D,UAAA;AAAA,MACA,YAAA;AAAA,MACA,gBAAgB,UAAA,CAAW,UAAA;AAAA,MAC3B,gBAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAGA,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AACpC,IAAA,IAAA,CAAK,KAAA,CAAM,eAAA,EAAA;AACX,IAAA,IAAA,CAAK,MAAM,kBAAA,IAAsB,YAAA;AACjC,IAAA,IAAA,CAAK,KAAA,CAAM,wBAAwB,UAAA,CAAW,UAAA;AAC9C,IAAA,IAAA,CAAK,MAAM,iBAAA,IAAqB,OAAA;AAChC,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAExB,IAAA,MAAA,CAAO,MAAM,gCAAA,EAAkC;AAAA,MAC7C,QAAA,EAAU,YAAA;AAAA,MACV,YAAY,UAAA,CAAW,UAAA;AAAA,MACvB,KAAA,EAAA,CAAQ,gBAAA,GAAmB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA;AAAA,MAC7C,SAAA;AAAA,MACA,MAAA,EAAQ,OAAA,CAAQ,OAAA,CAAQ,CAAC;AAAA,KAC1B,CAAA;AAED,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,KAAA,EAA6C;AAC5D,IAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAElC,IAAA,IAAI,YAAA;AAEJ,IAAA,IAAI,KAAA,CAAM,cAAc,MAAA,EAAQ;AAC9B,MAAA,YAAA,GAAe,KAAA,CAAM,UAAA;AAAA,IACvB,CAAA,MAAA,IAAW,IAAA,CAAK,yBAAA,EAA0B,EAAG;AAC3C,MAAA,IAAI;AACF,QAAA,YAAA,GAAe,MAAM,IAAA,CAAK,gBAAA;AAAA,UACxB,KAAA,CAAM,UAAA;AAAA,UACN,KAAA,CAAM;AAAA,SACR;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,IAAA,CAAK,mDAAmD,KAAK,CAAA;AACpE,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,IACtD;AAGA,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AACpC,IAAA,IAAA,CAAK,KAAA,CAAM,iBAAA,EAAA;AACX,IAAA,IAAA,CAAK,MAAM,mBAAA,IAAuB,OAAA;AAElC,IAAA,MAAA,CAAO,MAAM,kCAAA,EAAoC;AAAA,MAC/C,YAAY,KAAA,CAAM,cAAA;AAAA,MAClB,cAAc,YAAA,CAAa,UAAA;AAAA,MAC3B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,MAAA,EAAQ,OAAA,CAAQ,OAAA,CAAQ,CAAC;AAAA,KAC1B,CAAA;AAED,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAA,CACZ,IAAA,EACA,SAAA,EACqB;AACrB,IAAA,MAAM,MAAA,GAAS,IAAI,iBAAA,CAAkB,SAAS,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,SAAA,EAAU;AACzC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,SAAA,EAAU;AAEzC,IAAA,MAAA,CAAO,KAAA;AAAA,MACL,IAAI,UAAA;AAAA,QACF,IAAA,CAAK,MAAA;AAAA,QACL,IAAA,CAAK,UAAA;AAAA,QACL,IAAA,CAAK;AAAA;AACP,KACF;AACA,IAAA,MAAA,CAAO,KAAA,EAAM;AAEb,IAAA,MAAM,SAAuB,EAAC;AAC9B,IAAA,IAAI,IAAA,GAAO,KAAA;AAEX,IAAA,OAAO,CAAC,IAAA,EAAM;AACZ,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,EAAK;AACjC,MAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,MAC1B;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AACvE,IAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,WAAW,CAAA;AAC3C,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,QAAA,CAAS,GAAA,CAAI,OAAO,MAAM,CAAA;AAC1B,MAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA,IAClB;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAA,CACZ,IAAA,EACA,SAAA,EACqB;AACrB,IAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,SAAS,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,SAAA,EAAU;AACzC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,SAAA,EAAU;AAEzC,IAAA,MAAA,CAAO,KAAA;AAAA,MACL,IAAI,UAAA;AAAA,QACF,IAAA,CAAK,MAAA;AAAA,QACL,IAAA,CAAK,UAAA;AAAA,QACL,IAAA,CAAK;AAAA;AACP,KACF;AACA,IAAA,MAAA,CAAO,KAAA,EAAM;AAEb,IAAA,MAAM,SAAuB,EAAC;AAC9B,IAAA,IAAI,IAAA,GAAO,KAAA;AAEX,IAAA,OAAO,CAAC,IAAA,EAAM;AACZ,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,EAAK;AACjC,MAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,MAC1B;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AACvE,IAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,WAAW,CAAA;AAC3C,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,QAAA,CAAS,GAAA,CAAI,OAAO,MAAM,CAAA;AAC1B,MAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA,IAClB;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CACE,KAAA,EACA,SAAA,GAAY,EAAA,GAAK,IAAA,EACE;AACnB,IAAA,MAAM,SAA4B,EAAC;AACnC,IAAA,MAAM,OAAO,KAAA,CAAM,UAAA;AACnB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,aAAa,SAAS,CAAA;AAEnD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,QAAQ,CAAA,GAAI,SAAA;AAClB,MAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,SAAA,EAAW,KAAK,UAAU,CAAA;AACvD,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AAEvC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,OAAA,EAAS,CAAA,EAAG,KAAA,CAAM,EAAE,UAAU,CAAC,CAAA,CAAA;AAAA,QAC/B,SAAS,KAAA,CAAM,EAAA;AAAA,QACf,IAAA,EAAM,SAAA;AAAA,QACN,KAAA,EAAO,CAAA;AAAA,QACP,KAAA;AAAA,QACA,QAAA,EAAU,IAAA,CAAK,cAAA,CAAe,SAAS;AAAA,OACxC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,MAAA,EAAuC;AAEtD,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA;AAG3D,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,KAAA,IAAS,CAAA;AAClC,IAAA,IAAI,MAAA,CAAO,WAAW,KAAA,EAAO;AAC3B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,oBAAA,EAAuB,MAAA,CAAO,MAAM,CAAA,WAAA,EAAc,KAAK,CAAA;AAAA,OACzD;AAAA,IACF;AAGA,IAAA,MAAM,cAAc,MAAA,CAAO,MAAA;AAAA,MACzB,CAAC,GAAA,EAAK,KAAA,KAAU,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA;AAAA,MACjC;AAAA,KACF;AACA,IAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,WAAW,CAAA;AAC3C,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,MAAM,CAAA;AAC/B,MAAA,MAAA,IAAU,MAAM,IAAA,CAAK,MAAA;AAAA,IACvB;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,IAAA,EAA0B;AAC/C,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,IAAA,GAAA,CAAS,IAAA,IAAQ,CAAA,IAAK,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,GAAK,CAAA;AAAA,IAC1C;AACA,IAAA,OAAO,IAAA,CAAK,SAAS,EAAE,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,GAA2B;AACjC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,kBAAA,GAAqB,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,MAAM,uBAAA,GACT,CAAA,GAAI,KAAK,KAAA,CAAM,oBAAA,GAAuB,KAAK,KAAA,CAAM,kBAAA;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA6B;AAC3B,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,eAAA,EAAiB,CAAA;AAAA,MACjB,iBAAA,EAAmB,CAAA;AAAA,MACnB,kBAAA,EAAoB,CAAA;AAAA,MACpB,oBAAA,EAAsB,CAAA;AAAA,MACtB,uBAAA,EAAyB,CAAA;AAAA,MACzB,iBAAA,EAAmB,CAAA;AAAA,MACnB,mBAAA,EAAqB;AAAA,KACvB;AAAA,EACF;AACF;AAMA,IAAI,yBAAA,GAAsD,IAAA;AAEnD,SAAS,oBAAA,GAA0C;AACxD,EAAA,IAAI,CAAC,yBAAA,EAA2B;AAC9B,IAAA,yBAAA,GAA4B,IAAI,iBAAA,EAAkB;AAAA,EACpD;AACA,EAAA,OAAO,yBAAA;AACT;AAEO,SAAS,sBAAA,GAA+B;AAC7C,EAAA,yBAAA,GAA4B,IAAA;AAC9B;;;ACrXA,IAAMA,UAAS,SAAA,EAAU;AAoDlB,IAAM,qBAAN,MAAyB;AAAA,EACtB,gBAAA,uBAA+C,GAAA,EAAI;AAAA,EACnD,KAAA,GAAoB;AAAA,IAC1B,eAAA,EAAiB,CAAA;AAAA,IACjB,SAAA,EAAW,CAAA;AAAA,IACX,UAAA,EAAY,CAAA;AAAA,IACZ,iBAAA,EAAmB,CAAA;AAAA,IACnB,cAAA,EAAgB,CAAA;AAAA,IAChB,uBAAA,EAAyB,CAAA;AAAA,IACzB,YAAA,EAAc,CAAA;AAAA,IACd,sBAAA,EAAwB;AAAA;AAAA,GAC1B;AAAA,EAEA,WAAA,CAAY,yBAAyB,GAAA,EAAM;AACzC,IAAA,IAAA,CAAK,MAAM,sBAAA,GAAyB,sBAAA;AACpC,IAAAA,OAAAA,CAAO,MAAM,kCAAA,EAAoC;AAAA,MAC/C,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAAA,EAAsC;AACjD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAC9C,IAAA,MAAM,eAAe,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,aAAa,CAAA,CAAE,UAAA;AAG7D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,UAAU,EAAE,CAAA;AAEvD,IAAA,IAAI,CAAC,QAAA,EAAU;AAEb,MAAA,MAAM,KAAA,GAAwB;AAAA,QAC5B,EAAA,EAAI,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,QAC9D,IAAA,EAAM,MAAA;AAAA,QACN,aAAa,SAAA,CAAU,EAAA;AAAA,QACvB,eAAe,SAAA,CAAU,IAAA;AAAA,QACzB,WAAW,SAAA,CAAU,SAAA;AAAA,QACrB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,UAAU,SAAA,CAAU,IAAA;AAAA,QACpB,UAAU,SAAA,CAAU;AAAA,OACtB;AAGA,MAAA,IAAA,CAAK,KAAA,CAAM,eAAA,EAAA;AACX,MAAA,IAAA,CAAK,KAAA,CAAM,SAAA,EAAA;AACX,MAAA,IAAA,CAAK,MAAM,iBAAA,IAAqB,YAAA;AAEhC,MAAA,MAAMC,UAAAA,GAAY,IAAI,WAAA,EAAY,CAAE,MAAA;AAAA,QAClC,IAAA,CAAK,UAAU,KAAK;AAAA,OACtB,CAAE,UAAA;AACF,MAAA,IAAA,CAAK,MAAM,cAAA,IAAkBA,UAAAA;AAG7B,MAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAA,CAAU,EAAA,EAAI,SAAS,CAAA;AAEjD,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,IAAI,oBAAA,GAAuB,KAAA;AAE3B,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAA,EAAG;AACzD,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAElC,MAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,QAAQ,CAAA,EAAG;AACpC,QAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AACf,QAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AACnB,QAAA,oBAAA,GAAuB,IAAA;AAAA,MACzB;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5C,MAAA,IAAI,EAAE,GAAA,IAAO,SAAA,CAAU,IAAA,CAAA,EAAO;AAC5B,QAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,IAAA;AACf,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,QAAA,CAAU,CAAA;AAChC,QAAA,oBAAA,GAAuB,IAAA;AAAA,MACzB;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAA4B;AAAA,MAChC,EAAA,EAAI,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,MAC9D,IAAA,EAAM,OAAA;AAAA,MACN,aAAa,SAAA,CAAU,EAAA;AAAA,MACvB,eAAe,SAAA,CAAU,IAAA;AAAA,MACzB,WAAW,SAAA,CAAU,SAAA;AAAA,MACrB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS,uBAAuB,OAAA,GAAU,MAAA;AAAA,MAC1C,UAAA,EAAY,uBAAuB,UAAA,GAAa,MAAA;AAAA,MAChD,UAAU,SAAA,CAAU;AAAA,KACtB;AAGA,IAAA,MAAM,SAAA,GAAY,IAAI,WAAA,EAAY,CAAE,MAAA;AAAA,MAClC,IAAA,CAAK,UAAU,SAAS;AAAA,KAC1B,CAAE,UAAA;AAEF,IAAA,MAAM,UAAA,GACJ,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,sBAAA,GACnB;AAAA,MACE,GAAG,SAAA;AAAA,MACH,IAAA,EAAM,MAAA;AAAA,MACN,UAAU,SAAA,CAAU,IAAA;AAAA,MACpB,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACd,GACA,SAAA;AAGN,IAAA,IAAA,CAAK,KAAA,CAAM,eAAA,EAAA;AACX,IAAA,IAAI,UAAA,CAAW,SAAS,MAAA,EAAQ;AAC9B,MAAA,IAAA,CAAK,KAAA,CAAM,SAAA,EAAA;AAAA,IACb,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,KAAA,CAAM,UAAA,EAAA;AAAA,IACb;AAEA,IAAA,IAAA,CAAK,MAAM,iBAAA,IAAqB,YAAA;AAChC,IAAA,IAAA,CAAK,MAAM,cAAA,IAAkB,SAAA;AAG7B,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAA,CAAU,EAAA,EAAI,SAAS,CAAA;AAEjD,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,UAAA,EAAqC;AACtD,IAAA,MAAM,MAAA,GAAS,WAAW,GAAA,CAAI,CAAC,OAAO,IAAA,CAAK,YAAA,CAAa,EAAE,CAAC,CAAA;AAE3D,IAAA,MAAM,oBAAoB,UAAA,CAAW,MAAA;AAAA,MACnC,CAAC,GAAA,EAAK,EAAA,KACJ,GAAA,GAAM,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA,CAAE,UAAA;AAAA,MACrD;AAAA,KACF;AAEA,IAAA,MAAM,iBAAiB,MAAA,CAAO,MAAA;AAAA,MAC5B,CAAC,GAAA,EAAK,KAAA,KACJ,GAAA,GAAM,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA,CAAE,UAAA;AAAA,MACxD;AAAA,KACF;AAEA,IAAA,MAAM,gBAAA,GACJ,iBAAA,GAAoB,CAAA,GAChB,IAAA,CAAK,KAAA;AAAA,MAAA,CACD,iBAAA,GAAoB,kBAAkB,iBAAA,GAAqB;AAAA,KAC/D,GACA,CAAA;AAEN,IAAA,MAAM,KAAA,GAAoB;AAAA,MACxB,OAAA,EAAS,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,MACnE,UAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,iBAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAAD,OAAAA,CAAO,MAAM,qCAAA,EAAuC;AAAA,MAClD,YAAY,UAAA,CAAW,MAAA;AAAA,MACvB,SAAA,EAAW,gBAAA;AAAA,MACX,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,KAAA,EAAkC;AAChD,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,MAAA,OAAO;AAAA,QACL,IAAI,KAAA,CAAM,WAAA;AAAA,QACV,MAAM,KAAA,CAAM,aAAA;AAAA,QACZ,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,IAAA,EAAM,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,QACzB,MAAA,EAAQ,SAAA;AAAA,QACR,WAAW,KAAA,CAAM;AAAA,OACnB;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,MAAM,WAAW,CAAA;AAE5D,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAAA,OAAAA,CAAO,KAAK,qDAAA,EAAuD;AAAA,QACjE,aAAa,KAAA,CAAM;AAAA,OACpB,CAAA;AAED,MAAA,OAAO;AAAA,QACL,IAAI,KAAA,CAAM,WAAA;AAAA,QACV,MAAM,KAAA,CAAM,aAAA;AAAA,QACZ,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,IAAA,EAAM,KAAA,CAAM,OAAA,IAAW,EAAC;AAAA,QACxB,MAAA,EAAQ,SAAA;AAAA,QACR,WAAW,KAAA,CAAM;AAAA,OACnB;AAAA,IACF;AAGA,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,GAAG,QAAA;AAAA,MACH,IAAA,EAAM;AAAA,QACJ,GAAG,QAAA,CAAS,IAAA;AAAA,QACZ,GAAI,KAAA,CAAM,OAAA,IAAW;AAAC;AACxB,KACF;AAGA,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AACxD,QAAA,IAAI,UAAU,IAAA,EAAM;AAClB,UAAA,OAAO,aAAA,CAAc,KAAK,GAAG,CAAA;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,aAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,UAAA,EAA+B;AAC3C,IAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,MAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,EAAA,CAAG,EAAA,EAAI,EAAE,CAAA;AAAA,IACrC;AAEA,IAAAA,OAAAA,CAAO,MAAM,sCAAA,EAAwC;AAAA,MACnD,OAAO,UAAA,CAAW,MAAA;AAAA,MAClB,gBAAA,EAAkB,KAAK,gBAAA,CAAiB;AAAA,KACzC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,YAAA,EAA8B;AACzC,IAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,EAAE,CAAA;AAAA,IACjC;AAEA,IAAAA,OAAAA,CAAO,MAAM,sCAAA,EAAwC;AAAA,MACnD,SAAS,YAAA,CAAa,MAAA;AAAA,MACtB,SAAA,EAAW,KAAK,gBAAA,CAAiB;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAuB;AACrB,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,eAAA,GAAkB,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,KAAA,CAAM,0BAA0B,IAAA,CAAK,KAAA;AAAA,QAAA,CACtC,IAAA,CAAK,MAAM,iBAAA,GAAoB,IAAA,CAAK,MAAM,cAAA,IAC1C,IAAA,CAAK,MAAM,iBAAA,GACX;AAAA,OACJ;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,eAAA,EAAiB,CAAA;AAAA,MACjB,SAAA,EAAW,CAAA;AAAA,MACX,UAAA,EAAY,CAAA;AAAA,MACZ,iBAAA,EAAmB,CAAA;AAAA,MACnB,cAAA,EAAgB,CAAA;AAAA,MAChB,uBAAA,EAAyB,CAAA;AAAA,MACzB,YAAA,EAAc,CAAA;AAAA,MACd,sBAAA,EAAwB,KAAK,KAAA,CAAM;AAAA,KACrC;AAEA,IAAAA,OAAAA,CAAO,MAAM,kCAAkC,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,0BAA0B,KAAA,EAAqB;AAC7C,IAAA,IAAA,CAAK,MAAM,sBAAA,GAAyB,KAAA;AACpC,IAAAA,OAAAA,CAAO,KAAA,CAAM,wCAAA,EAA0C,EAAE,OAAO,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAyB;AACvB,IAAA,OAAO,KAAK,gBAAA,CAAiB,IAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAA4B;AAC1B,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,KAAA,MAAW,EAAA,IAAM,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAO,EAAG;AAC/C,MAAA,UAAA,IAAc,IAAI,aAAY,CAAE,MAAA,CAAO,KAAK,SAAA,CAAU,EAAE,CAAC,CAAA,CAAE,UAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,CAAU,GAAY,CAAA,EAAqB;AACjD,IAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,IAAA,IAAI,CAAA,IAAK,IAAA,IAAQ,CAAA,IAAK,IAAA,EAAM,OAAO,KAAA;AACnC,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,CAAA,KAAM,UAAU,OAAO,KAAA;AAE3D,IAAA,MAAM,IAAA,GAAO,CAAA;AACb,IAAA,MAAM,IAAA,GAAO,CAAA;AAEb,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAE9B,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA;AAE1C,IAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,MAAA,IAAI,CAAC,KAAK,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG;AACzC,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMA,IAAI,iBAAA,GAA+C,IAAA;AAE5C,SAAS,sBAAsB,SAAA,EAAwC;AAC5E,EAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,IAAA,iBAAA,GAAoB,IAAI,mBAAmB,SAAS,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,iBAAA;AACT;AAEO,SAAS,uBAAA,GAAgC;AAC9C,EAAA,iBAAA,GAAoB,IAAA;AACtB","file":"index.cjs","sourcesContent":["/**\n * Aeon Logger Interface\n *\n * Provides a pluggable logging interface that can be configured\n * by consumers to integrate with their preferred logging solution.\n */\n\n/**\n * Logger interface that consumers can implement\n */\nexport interface Logger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\n/**\n * Default console logger implementation\n */\nconst consoleLogger: Logger = {\n debug: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.debug('[AEON:DEBUG]', ...args);\n },\n info: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.info('[AEON:INFO]', ...args);\n },\n warn: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.warn('[AEON:WARN]', ...args);\n },\n error: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.error('[AEON:ERROR]', ...args);\n },\n};\n\n/**\n * No-op logger for production or when logging is disabled\n */\nconst noopLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\n/**\n * Current logger instance\n */\nlet currentLogger: Logger = consoleLogger;\n\n/**\n * Get the current logger instance\n */\nexport function getLogger(): Logger {\n return currentLogger;\n}\n\n/**\n * Set a custom logger implementation\n */\nexport function setLogger(logger: Logger): void {\n currentLogger = logger;\n}\n\n/**\n * Reset to the default console logger\n */\nexport function resetLogger(): void {\n currentLogger = consoleLogger;\n}\n\n/**\n * Disable all logging\n */\nexport function disableLogging(): void {\n currentLogger = noopLogger;\n}\n\n/**\n * Create a namespaced logger\n */\nexport function createNamespacedLogger(namespace: string): Logger {\n const logger = getLogger();\n return {\n debug: (...args: unknown[]) => logger.debug(`[${namespace}]`, ...args),\n info: (...args: unknown[]) => logger.info(`[${namespace}]`, ...args),\n warn: (...args: unknown[]) => logger.warn(`[${namespace}]`, ...args),\n error: (...args: unknown[]) => logger.error(`[${namespace}]`, ...args),\n };\n}\n\n// Export default logger for convenience\nexport const logger: Logger = {\n debug: (...args: unknown[]) => getLogger().debug(...args),\n info: (...args: unknown[]) => getLogger().info(...args),\n warn: (...args: unknown[]) => getLogger().warn(...args),\n error: (...args: unknown[]) => getLogger().error(...args),\n};\n","/**\n * Compression Engine (Phase 12)\n *\n * Provides compression for delta operations using native CompressionStream API.\n * Falls back gracefully when native compression is unavailable.\n */\n\nimport { getLogger } from '../utils/logger';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CompressedBatch {\n id: string;\n compressed: Uint8Array;\n originalSize: number;\n compressedSize: number;\n compressionRatio: number;\n algorithm: 'gzip' | 'deflate' | 'none';\n timestamp: number;\n}\n\nexport interface CompressedChunk {\n chunkId: string;\n batchId: string;\n data: Uint8Array;\n index: number;\n total: number;\n checksum: string;\n}\n\nexport interface CompressionStats {\n totalCompressed: number;\n totalDecompressed: number;\n totalOriginalBytes: number;\n totalCompressedBytes: number;\n averageCompressionRatio: number;\n compressionTimeMs: number;\n decompressionTimeMs: number;\n}\n\n// ============================================================================\n// Compression Engine\n// ============================================================================\n\nexport class CompressionEngine {\n private stats: CompressionStats = {\n totalCompressed: 0,\n totalDecompressed: 0,\n totalOriginalBytes: 0,\n totalCompressedBytes: 0,\n averageCompressionRatio: 0,\n compressionTimeMs: 0,\n decompressionTimeMs: 0,\n };\n private preferredAlgorithm: 'gzip' | 'deflate' = 'gzip';\n\n constructor(preferredAlgorithm: 'gzip' | 'deflate' = 'gzip') {\n this.preferredAlgorithm = preferredAlgorithm;\n logger.debug('[CompressionEngine] Initialized', {\n algorithm: preferredAlgorithm,\n supportsNative: this.supportsNativeCompression(),\n });\n }\n\n /**\n * Check if native compression is available\n */\n supportsNativeCompression(): boolean {\n return (\n typeof CompressionStream !== 'undefined' &&\n typeof DecompressionStream !== 'undefined'\n );\n }\n\n /**\n * Compress data\n */\n async compress(data: Uint8Array | string): Promise<CompressedBatch> {\n const startTime = performance.now();\n\n const inputData =\n typeof data === 'string' ? new TextEncoder().encode(data) : data;\n const originalSize = inputData.byteLength;\n\n let compressed: Uint8Array;\n let algorithm: 'gzip' | 'deflate' | 'none' = this.preferredAlgorithm;\n\n if (this.supportsNativeCompression()) {\n try {\n compressed = await this.compressNative(\n inputData,\n this.preferredAlgorithm\n );\n } catch (error) {\n logger.warn(\n '[CompressionEngine] Native compression failed, using fallback',\n error\n );\n compressed = inputData;\n algorithm = 'none';\n }\n } else {\n // No native compression - return uncompressed\n compressed = inputData;\n algorithm = 'none';\n }\n\n const compressionRatio =\n originalSize > 0 ? 1 - compressed.byteLength / originalSize : 0;\n\n const batch: CompressedBatch = {\n id: `batch-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n compressed,\n originalSize,\n compressedSize: compressed.byteLength,\n compressionRatio,\n algorithm,\n timestamp: Date.now(),\n };\n\n // Update stats\n const elapsed = performance.now() - startTime;\n this.stats.totalCompressed++;\n this.stats.totalOriginalBytes += originalSize;\n this.stats.totalCompressedBytes += compressed.byteLength;\n this.stats.compressionTimeMs += elapsed;\n this.updateAverageRatio();\n\n logger.debug('[CompressionEngine] Compressed', {\n original: originalSize,\n compressed: compressed.byteLength,\n ratio: (compressionRatio * 100).toFixed(1) + '%',\n algorithm,\n timeMs: elapsed.toFixed(2),\n });\n\n return batch;\n }\n\n /**\n * Decompress data\n */\n async decompress(batch: CompressedBatch): Promise<Uint8Array> {\n const startTime = performance.now();\n\n let decompressed: Uint8Array;\n\n if (batch.algorithm === 'none') {\n decompressed = batch.compressed;\n } else if (this.supportsNativeCompression()) {\n try {\n decompressed = await this.decompressNative(\n batch.compressed,\n batch.algorithm\n );\n } catch (error) {\n logger.warn('[CompressionEngine] Native decompression failed', error);\n throw error;\n }\n } else {\n throw new Error('Native decompression not available');\n }\n\n // Update stats\n const elapsed = performance.now() - startTime;\n this.stats.totalDecompressed++;\n this.stats.decompressionTimeMs += elapsed;\n\n logger.debug('[CompressionEngine] Decompressed', {\n compressed: batch.compressedSize,\n decompressed: decompressed.byteLength,\n algorithm: batch.algorithm,\n timeMs: elapsed.toFixed(2),\n });\n\n return decompressed;\n }\n\n /**\n * Compress using native CompressionStream\n */\n private async compressNative(\n data: Uint8Array,\n algorithm: 'gzip' | 'deflate'\n ): Promise<Uint8Array> {\n const stream = new CompressionStream(algorithm);\n const writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n\n writer.write(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength\n ) as BufferSource\n );\n writer.close();\n\n const chunks: Uint8Array[] = [];\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (result.value) {\n chunks.push(result.value);\n }\n }\n\n // Combine chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combined;\n }\n\n /**\n * Decompress using native DecompressionStream\n */\n private async decompressNative(\n data: Uint8Array,\n algorithm: 'gzip' | 'deflate'\n ): Promise<Uint8Array> {\n const stream = new DecompressionStream(algorithm);\n const writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n\n writer.write(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength\n ) as BufferSource\n );\n writer.close();\n\n const chunks: Uint8Array[] = [];\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (result.value) {\n chunks.push(result.value);\n }\n }\n\n // Combine chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combined;\n }\n\n /**\n * Split compressed batch into chunks for transmission\n */\n splitIntoChunks(\n batch: CompressedBatch,\n chunkSize = 64 * 1024\n ): CompressedChunk[] {\n const chunks: CompressedChunk[] = [];\n const data = batch.compressed;\n const total = Math.ceil(data.byteLength / chunkSize);\n\n for (let i = 0; i < total; i++) {\n const start = i * chunkSize;\n const end = Math.min(start + chunkSize, data.byteLength);\n const chunkData = data.slice(start, end);\n\n chunks.push({\n chunkId: `${batch.id}-chunk-${i}`,\n batchId: batch.id,\n data: chunkData,\n index: i,\n total,\n checksum: this.simpleChecksum(chunkData),\n });\n }\n\n return chunks;\n }\n\n /**\n * Reassemble chunks into compressed batch\n */\n reassembleChunks(chunks: CompressedChunk[]): Uint8Array {\n // Sort by index\n const sorted = [...chunks].sort((a, b) => a.index - b.index);\n\n // Verify all chunks present\n const total = sorted[0]?.total ?? 0;\n if (sorted.length !== total) {\n throw new Error(\n `Missing chunks: got ${sorted.length}, expected ${total}`\n );\n }\n\n // Combine\n const totalLength = sorted.reduce(\n (sum, chunk) => sum + chunk.data.length,\n 0\n );\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of sorted) {\n combined.set(chunk.data, offset);\n offset += chunk.data.length;\n }\n\n return combined;\n }\n\n /**\n * Simple checksum for chunk verification\n */\n private simpleChecksum(data: Uint8Array): string {\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n hash = ((hash << 5) - hash + data[i]) | 0;\n }\n return hash.toString(16);\n }\n\n /**\n * Update average compression ratio\n */\n private updateAverageRatio(): void {\n if (this.stats.totalOriginalBytes > 0) {\n this.stats.averageCompressionRatio =\n 1 - this.stats.totalCompressedBytes / this.stats.totalOriginalBytes;\n }\n }\n\n /**\n * Get statistics\n */\n getStats(): CompressionStats {\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalCompressed: 0,\n totalDecompressed: 0,\n totalOriginalBytes: 0,\n totalCompressedBytes: 0,\n averageCompressionRatio: 0,\n compressionTimeMs: 0,\n decompressionTimeMs: 0,\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet compressionEngineInstance: CompressionEngine | null = null;\n\nexport function getCompressionEngine(): CompressionEngine {\n if (!compressionEngineInstance) {\n compressionEngineInstance = new CompressionEngine();\n }\n return compressionEngineInstance;\n}\n\nexport function resetCompressionEngine(): void {\n compressionEngineInstance = null;\n}\n","/**\n * Delta Sync Optimizer (Phase 12)\n *\n * Implements field-level change detection to reduce payload size.\n * Computes delta between current and previous operation state.\n *\n * Performance Impact:\n * - Delta sync alone: 70-80% payload reduction\n * - Combined with compression: 80-90% total reduction\n */\n\nimport { getLogger } from '../utils/logger';\nimport type { Operation } from '../core/types';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Delta operation - represents only changed fields\n */\nexport interface DeltaOperation {\n id: string;\n type: 'full' | 'delta';\n operationId: string;\n operationType: Operation['type'];\n sessionId: string;\n timestamp: number;\n changes?: Record<string, unknown>; // Only for delta type\n changeMask?: string[]; // Field names that changed\n fullData?: Record<string, unknown>; // Only for full type (new records)\n priority?: 'high' | 'normal' | 'low';\n}\n\n/**\n * Batch of delta operations\n */\nexport interface DeltaBatch {\n batchId: string;\n operations: DeltaOperation[];\n timestamp: number;\n totalOriginalSize: number;\n totalDeltaSize: number;\n reductionPercent: number;\n}\n\n/**\n * Statistics about delta sync performance\n */\nexport interface DeltaStats {\n totalOperations: number;\n totalFull: number;\n totalDelta: number;\n totalOriginalSize: number;\n totalDeltaSize: number;\n averageReductionPercent: number;\n lastSyncTime: number;\n fullOperationThreshold: number;\n}\n\n// ============================================================================\n// Delta Sync Optimizer\n// ============================================================================\n\nexport class DeltaSyncOptimizer {\n private operationHistory: Map<string, Operation> = new Map();\n private stats: DeltaStats = {\n totalOperations: 0,\n totalFull: 0,\n totalDelta: 0,\n totalOriginalSize: 0,\n totalDeltaSize: 0,\n averageReductionPercent: 0,\n lastSyncTime: 0,\n fullOperationThreshold: 1000, // Force full if delta > 1KB\n };\n\n constructor(fullOperationThreshold = 1000) {\n this.stats.fullOperationThreshold = fullOperationThreshold;\n logger.debug('[DeltaSyncOptimizer] Initialized', {\n threshold: fullOperationThreshold,\n });\n }\n\n /**\n * Compute delta for single operation\n */\n computeDelta(operation: Operation): DeltaOperation {\n const operationJson = JSON.stringify(operation);\n const originalSize = new TextEncoder().encode(operationJson).byteLength;\n\n // Check if we have historical state\n const previous = this.operationHistory.get(operation.id);\n\n if (!previous) {\n // New operation - return as full\n const delta: DeltaOperation = {\n id: `delta-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type: 'full',\n operationId: operation.id,\n operationType: operation.type,\n sessionId: operation.sessionId,\n timestamp: Date.now(),\n fullData: operation.data,\n priority: operation.priority,\n };\n\n // Update stats\n this.stats.totalOperations++;\n this.stats.totalFull++;\n this.stats.totalOriginalSize += originalSize;\n\n const deltaSize = new TextEncoder().encode(\n JSON.stringify(delta)\n ).byteLength;\n this.stats.totalDeltaSize += deltaSize;\n\n // Store in history\n this.operationHistory.set(operation.id, operation);\n\n return delta;\n }\n\n // Compare with previous - extract changed fields\n const changes: Record<string, unknown> = {};\n const changeMask: string[] = [];\n let hasMeaningfulChanges = false;\n\n for (const [key, value] of Object.entries(operation.data)) {\n const oldValue = previous.data[key];\n\n if (!this.deepEqual(value, oldValue)) {\n changes[key] = value;\n changeMask.push(key);\n hasMeaningfulChanges = true;\n }\n }\n\n // Check for deleted fields\n for (const key of Object.keys(previous.data)) {\n if (!(key in operation.data)) {\n changes[key] = null;\n changeMask.push(`${key}:deleted`);\n hasMeaningfulChanges = true;\n }\n }\n\n // Build delta operation\n const deltaData: DeltaOperation = {\n id: `delta-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type: 'delta',\n operationId: operation.id,\n operationType: operation.type,\n sessionId: operation.sessionId,\n timestamp: Date.now(),\n changes: hasMeaningfulChanges ? changes : undefined,\n changeMask: hasMeaningfulChanges ? changeMask : undefined,\n priority: operation.priority,\n };\n\n // If delta is too large, send as full instead\n const deltaSize = new TextEncoder().encode(\n JSON.stringify(deltaData)\n ).byteLength;\n\n const finalDelta =\n deltaSize > this.stats.fullOperationThreshold\n ? {\n ...deltaData,\n type: 'full' as const,\n fullData: operation.data,\n changes: undefined,\n changeMask: undefined,\n }\n : deltaData;\n\n // Update stats\n this.stats.totalOperations++;\n if (finalDelta.type === 'full') {\n this.stats.totalFull++;\n } else {\n this.stats.totalDelta++;\n }\n\n this.stats.totalOriginalSize += originalSize;\n this.stats.totalDeltaSize += deltaSize;\n\n // Update history\n this.operationHistory.set(operation.id, operation);\n\n return finalDelta;\n }\n\n /**\n * Compute deltas for batch of operations\n */\n computeBatchDeltas(operations: Operation[]): DeltaBatch {\n const deltas = operations.map((op) => this.computeDelta(op));\n\n const totalOriginalSize = operations.reduce(\n (sum, op) =>\n sum + new TextEncoder().encode(JSON.stringify(op)).byteLength,\n 0\n );\n\n const totalDeltaSize = deltas.reduce(\n (sum, delta) =>\n sum + new TextEncoder().encode(JSON.stringify(delta)).byteLength,\n 0\n );\n\n const reductionPercent =\n totalOriginalSize > 0\n ? Math.round(\n ((totalOriginalSize - totalDeltaSize) / totalOriginalSize) * 100\n )\n : 0;\n\n const batch: DeltaBatch = {\n batchId: `batch-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n operations: deltas,\n timestamp: Date.now(),\n totalOriginalSize,\n totalDeltaSize,\n reductionPercent,\n };\n\n logger.debug('[DeltaSyncOptimizer] Batch computed', {\n operations: operations.length,\n reduction: reductionPercent,\n size: totalDeltaSize,\n });\n\n return batch;\n }\n\n /**\n * Decompress delta operation back to full operation\n */\n decompressDelta(delta: DeltaOperation): Operation {\n if (delta.type === 'full') {\n return {\n id: delta.operationId,\n type: delta.operationType,\n sessionId: delta.sessionId,\n data: delta.fullData || {},\n status: 'pending',\n createdAt: delta.timestamp,\n };\n }\n\n const previous = this.operationHistory.get(delta.operationId);\n\n if (!previous) {\n logger.warn('[DeltaSyncOptimizer] Cannot decompress - no history', {\n operationId: delta.operationId,\n });\n\n return {\n id: delta.operationId,\n type: delta.operationType,\n sessionId: delta.sessionId,\n data: delta.changes || {},\n status: 'pending',\n createdAt: delta.timestamp,\n };\n }\n\n // Apply changes to historical state\n const reconstructed = {\n ...previous,\n data: {\n ...previous.data,\n ...(delta.changes || {}),\n },\n };\n\n // Remove null fields (marked as deleted)\n if (delta.changes) {\n for (const [key, value] of Object.entries(delta.changes)) {\n if (value === null) {\n delete reconstructed.data[key];\n }\n }\n }\n\n return reconstructed;\n }\n\n /**\n * Update history after successful sync\n */\n updateHistory(operations: Operation[]): void {\n for (const op of operations) {\n this.operationHistory.set(op.id, op);\n }\n\n logger.debug('[DeltaSyncOptimizer] History updated', {\n count: operations.length,\n totalHistorySize: this.operationHistory.size,\n });\n }\n\n /**\n * Clear history for specific operations\n */\n clearHistory(operationIds: string[]): void {\n for (const id of operationIds) {\n this.operationHistory.delete(id);\n }\n\n logger.debug('[DeltaSyncOptimizer] History cleared', {\n cleared: operationIds.length,\n remaining: this.operationHistory.size,\n });\n }\n\n /**\n * Get current performance statistics\n */\n getStats(): DeltaStats {\n if (this.stats.totalOperations > 0) {\n this.stats.averageReductionPercent = Math.round(\n ((this.stats.totalOriginalSize - this.stats.totalDeltaSize) /\n this.stats.totalOriginalSize) *\n 100\n );\n }\n\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalOperations: 0,\n totalFull: 0,\n totalDelta: 0,\n totalOriginalSize: 0,\n totalDeltaSize: 0,\n averageReductionPercent: 0,\n lastSyncTime: 0,\n fullOperationThreshold: this.stats.fullOperationThreshold,\n };\n\n logger.debug('[DeltaSyncOptimizer] Stats reset');\n }\n\n /**\n * Set the full operation threshold\n */\n setFullOperationThreshold(bytes: number): void {\n this.stats.fullOperationThreshold = bytes;\n logger.debug('[DeltaSyncOptimizer] Threshold updated', { bytes });\n }\n\n /**\n * Get history size for memory monitoring\n */\n getHistorySize(): number {\n return this.operationHistory.size;\n }\n\n /**\n * Get memory footprint estimate\n */\n getMemoryEstimate(): number {\n let totalBytes = 0;\n\n for (const op of this.operationHistory.values()) {\n totalBytes += new TextEncoder().encode(JSON.stringify(op)).byteLength;\n }\n\n return totalBytes;\n }\n\n /**\n * Deep equality check for nested objects\n */\n private deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n\n if (aKeys.length !== bKeys.length) return false;\n\n for (const key of aKeys) {\n if (!this.deepEqual(aObj[key], bObj[key])) {\n return false;\n }\n }\n\n return true;\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet deltaSyncInstance: DeltaSyncOptimizer | null = null;\n\nexport function getDeltaSyncOptimizer(threshold?: number): DeltaSyncOptimizer {\n if (!deltaSyncInstance) {\n deltaSyncInstance = new DeltaSyncOptimizer(threshold);\n }\n return deltaSyncInstance;\n}\n\nexport function resetDeltaSyncOptimizer(): void {\n deltaSyncInstance = null;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/logger.ts","../../src/compression/CompressionEngine.ts","../../src/compression/DeltaSyncOptimizer.ts"],"names":["logger","deltaSize"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Aeon Logger Interface\n *\n * Provides a pluggable logging interface that can be configured\n * by consumers to integrate with their preferred logging solution.\n */\n\n/**\n * Logger interface that consumers can implement\n */\nexport interface Logger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\n/**\n * Default console logger implementation\n */\nconst consoleLogger: Logger = {\n debug: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.debug('[AEON:DEBUG]', ...args);\n },\n info: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.info('[AEON:INFO]', ...args);\n },\n warn: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.warn('[AEON:WARN]', ...args);\n },\n error: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.error('[AEON:ERROR]', ...args);\n },\n};\n\n/**\n * No-op logger for production or when logging is disabled\n */\nconst noopLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\n/**\n * Current logger instance\n */\nlet currentLogger: Logger = consoleLogger;\n\n/**\n * Get the current logger instance\n */\nexport function getLogger(): Logger {\n return currentLogger;\n}\n\n/**\n * Set a custom logger implementation\n */\nexport function setLogger(logger: Logger): void {\n currentLogger = logger;\n}\n\n/**\n * Reset to the default console logger\n */\nexport function resetLogger(): void {\n currentLogger = consoleLogger;\n}\n\n/**\n * Disable all logging\n */\nexport function disableLogging(): void {\n currentLogger = noopLogger;\n}\n\n/**\n * Create a namespaced logger\n */\nexport function createNamespacedLogger(namespace: string): Logger {\n const logger = getLogger();\n return {\n debug: (...args: unknown[]) => logger.debug(`[${namespace}]`, ...args),\n info: (...args: unknown[]) => logger.info(`[${namespace}]`, ...args),\n warn: (...args: unknown[]) => logger.warn(`[${namespace}]`, ...args),\n error: (...args: unknown[]) => logger.error(`[${namespace}]`, ...args),\n };\n}\n\n// Export default logger for convenience\nexport const logger: Logger = {\n debug: (...args: unknown[]) => getLogger().debug(...args),\n info: (...args: unknown[]) => getLogger().info(...args),\n warn: (...args: unknown[]) => getLogger().warn(...args),\n error: (...args: unknown[]) => getLogger().error(...args),\n};\n","/**\n * Compression Engine (Phase 12)\n *\n * Provides compression for delta operations using native CompressionStream API.\n * Falls back gracefully when native compression is unavailable.\n */\n\nimport { getLogger } from '../utils/logger';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CompressedBatch {\n id: string;\n compressed: Uint8Array;\n originalSize: number;\n compressedSize: number;\n compressionRatio: number;\n algorithm: 'gzip' | 'deflate' | 'none';\n timestamp: number;\n}\n\nexport interface CompressedChunk {\n chunkId: string;\n batchId: string;\n data: Uint8Array;\n index: number;\n total: number;\n checksum: string;\n}\n\nexport interface CompressionStats {\n totalCompressed: number;\n totalDecompressed: number;\n totalOriginalBytes: number;\n totalCompressedBytes: number;\n averageCompressionRatio: number;\n compressionTimeMs: number;\n decompressionTimeMs: number;\n}\n\n// ============================================================================\n// Compression Engine\n// ============================================================================\n\nexport class CompressionEngine {\n private stats: CompressionStats = {\n totalCompressed: 0,\n totalDecompressed: 0,\n totalOriginalBytes: 0,\n totalCompressedBytes: 0,\n averageCompressionRatio: 0,\n compressionTimeMs: 0,\n decompressionTimeMs: 0,\n };\n private preferredAlgorithm: 'gzip' | 'deflate' = 'gzip';\n\n constructor(preferredAlgorithm: 'gzip' | 'deflate' = 'gzip') {\n this.preferredAlgorithm = preferredAlgorithm;\n logger.debug('[CompressionEngine] Initialized', {\n algorithm: preferredAlgorithm,\n supportsNative: this.supportsNativeCompression(),\n });\n }\n\n /**\n * Check if native compression is available\n */\n supportsNativeCompression(): boolean {\n return (\n typeof CompressionStream !== 'undefined' &&\n typeof DecompressionStream !== 'undefined'\n );\n }\n\n /**\n * Compress data\n */\n async compress(data: Uint8Array | string): Promise<CompressedBatch> {\n const startTime = performance.now();\n\n const inputData =\n typeof data === 'string' ? new TextEncoder().encode(data) : data;\n const originalSize = inputData.byteLength;\n\n let compressed: Uint8Array;\n let algorithm: 'gzip' | 'deflate' | 'none' = this.preferredAlgorithm;\n\n if (this.supportsNativeCompression()) {\n try {\n compressed = await this.compressNative(\n inputData,\n this.preferredAlgorithm\n );\n } catch (error) {\n logger.warn(\n '[CompressionEngine] Native compression failed, using fallback',\n error\n );\n compressed = inputData;\n algorithm = 'none';\n }\n } else {\n // No native compression - return uncompressed\n compressed = inputData;\n algorithm = 'none';\n }\n\n const compressionRatio =\n originalSize > 0 ? 1 - compressed.byteLength / originalSize : 0;\n\n const batch: CompressedBatch = {\n id: `batch-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n compressed,\n originalSize,\n compressedSize: compressed.byteLength,\n compressionRatio,\n algorithm,\n timestamp: Date.now(),\n };\n\n // Update stats\n const elapsed = performance.now() - startTime;\n this.stats.totalCompressed++;\n this.stats.totalOriginalBytes += originalSize;\n this.stats.totalCompressedBytes += compressed.byteLength;\n this.stats.compressionTimeMs += elapsed;\n this.updateAverageRatio();\n\n logger.debug('[CompressionEngine] Compressed', {\n original: originalSize,\n compressed: compressed.byteLength,\n ratio: (compressionRatio * 100).toFixed(1) + '%',\n algorithm,\n timeMs: elapsed.toFixed(2),\n });\n\n return batch;\n }\n\n /**\n * Decompress data\n */\n async decompress(batch: CompressedBatch): Promise<Uint8Array> {\n const startTime = performance.now();\n\n let decompressed: Uint8Array;\n\n if (batch.algorithm === 'none') {\n decompressed = batch.compressed;\n } else if (this.supportsNativeCompression()) {\n try {\n decompressed = await this.decompressNative(\n batch.compressed,\n batch.algorithm\n );\n } catch (error) {\n logger.warn('[CompressionEngine] Native decompression failed', error);\n throw error;\n }\n } else {\n throw new Error('Native decompression not available');\n }\n\n // Update stats\n const elapsed = performance.now() - startTime;\n this.stats.totalDecompressed++;\n this.stats.decompressionTimeMs += elapsed;\n\n logger.debug('[CompressionEngine] Decompressed', {\n compressed: batch.compressedSize,\n decompressed: decompressed.byteLength,\n algorithm: batch.algorithm,\n timeMs: elapsed.toFixed(2),\n });\n\n return decompressed;\n }\n\n /**\n * Compress using native CompressionStream\n */\n private async compressNative(\n data: Uint8Array,\n algorithm: 'gzip' | 'deflate'\n ): Promise<Uint8Array> {\n const stream = new CompressionStream(algorithm);\n const writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n\n writer.write(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength\n ) as BufferSource\n );\n writer.close();\n\n const chunks: Uint8Array[] = [];\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (result.value) {\n chunks.push(result.value);\n }\n }\n\n // Combine chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combined;\n }\n\n /**\n * Decompress using native DecompressionStream\n */\n private async decompressNative(\n data: Uint8Array,\n algorithm: 'gzip' | 'deflate'\n ): Promise<Uint8Array> {\n const stream = new DecompressionStream(algorithm);\n const writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n\n writer.write(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength\n ) as BufferSource\n );\n writer.close();\n\n const chunks: Uint8Array[] = [];\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (result.value) {\n chunks.push(result.value);\n }\n }\n\n // Combine chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combined;\n }\n\n /**\n * Split compressed batch into chunks for transmission\n */\n splitIntoChunks(\n batch: CompressedBatch,\n chunkSize = 64 * 1024\n ): CompressedChunk[] {\n const chunks: CompressedChunk[] = [];\n const data = batch.compressed;\n const total = Math.ceil(data.byteLength / chunkSize);\n\n for (let i = 0; i < total; i++) {\n const start = i * chunkSize;\n const end = Math.min(start + chunkSize, data.byteLength);\n const chunkData = data.slice(start, end);\n\n chunks.push({\n chunkId: `${batch.id}-chunk-${i}`,\n batchId: batch.id,\n data: chunkData,\n index: i,\n total,\n checksum: this.simpleChecksum(chunkData),\n });\n }\n\n return chunks;\n }\n\n /**\n * Reassemble chunks into compressed batch\n */\n reassembleChunks(chunks: CompressedChunk[]): Uint8Array {\n // Sort by index\n const sorted = [...chunks].sort((a, b) => a.index - b.index);\n\n // Verify all chunks present\n if (sorted.length === 0) {\n throw new Error('Cannot reassemble: no chunks provided');\n }\n const total = sorted[0].total;\n if (sorted.length !== total) {\n throw new Error(\n `Missing chunks: got ${sorted.length}, expected ${total}`\n );\n }\n\n // Combine\n const totalLength = sorted.reduce(\n (sum, chunk) => sum + chunk.data.length,\n 0\n );\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of sorted) {\n combined.set(chunk.data, offset);\n offset += chunk.data.length;\n }\n\n return combined;\n }\n\n /**\n * Simple checksum for chunk verification\n */\n private simpleChecksum(data: Uint8Array): string {\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n hash = ((hash << 5) - hash + data[i]) | 0;\n }\n return (hash >>> 0).toString(16);\n }\n\n /**\n * Update average compression ratio\n */\n private updateAverageRatio(): void {\n if (this.stats.totalOriginalBytes > 0) {\n this.stats.averageCompressionRatio =\n 1 - this.stats.totalCompressedBytes / this.stats.totalOriginalBytes;\n }\n }\n\n /**\n * Get statistics\n */\n getStats(): CompressionStats {\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalCompressed: 0,\n totalDecompressed: 0,\n totalOriginalBytes: 0,\n totalCompressedBytes: 0,\n averageCompressionRatio: 0,\n compressionTimeMs: 0,\n decompressionTimeMs: 0,\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet compressionEngineInstance: CompressionEngine | null = null;\n\nexport function getCompressionEngine(): CompressionEngine {\n if (!compressionEngineInstance) {\n compressionEngineInstance = new CompressionEngine();\n }\n return compressionEngineInstance;\n}\n\nexport function resetCompressionEngine(): void {\n compressionEngineInstance = null;\n}\n","/**\n * Delta Sync Optimizer (Phase 12)\n *\n * Implements field-level change detection to reduce payload size.\n * Computes delta between current and previous operation state.\n *\n * Performance Impact:\n * - Delta sync alone: 70-80% payload reduction\n * - Combined with compression: 80-90% total reduction\n */\n\nimport { getLogger } from '../utils/logger';\nimport type { Operation } from '../core/types';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Delta operation - represents only changed fields\n */\nexport interface DeltaOperation {\n id: string;\n type: 'full' | 'delta';\n operationId: string;\n operationType: Operation['type'];\n sessionId: string;\n timestamp: number;\n changes?: Record<string, unknown>; // Only for delta type\n changeMask?: string[]; // Field names that changed\n fullData?: Record<string, unknown>; // Only for full type (new records)\n priority?: 'high' | 'normal' | 'low';\n}\n\n/**\n * Batch of delta operations\n */\nexport interface DeltaBatch {\n batchId: string;\n operations: DeltaOperation[];\n timestamp: number;\n totalOriginalSize: number;\n totalDeltaSize: number;\n reductionPercent: number;\n}\n\n/**\n * Statistics about delta sync performance\n */\nexport interface DeltaStats {\n totalOperations: number;\n totalFull: number;\n totalDelta: number;\n totalOriginalSize: number;\n totalDeltaSize: number;\n averageReductionPercent: number;\n lastSyncTime: number;\n fullOperationThreshold: number;\n}\n\n// ============================================================================\n// Delta Sync Optimizer\n// ============================================================================\n\nexport class DeltaSyncOptimizer {\n private static readonly MAX_HISTORY_SIZE = 10000;\n private operationHistory: Map<string, Operation> = new Map();\n private stats: DeltaStats = {\n totalOperations: 0,\n totalFull: 0,\n totalDelta: 0,\n totalOriginalSize: 0,\n totalDeltaSize: 0,\n averageReductionPercent: 0,\n lastSyncTime: 0,\n fullOperationThreshold: 1000, // Force full if delta > 1KB\n };\n\n constructor(fullOperationThreshold = 1000) {\n this.stats.fullOperationThreshold = fullOperationThreshold;\n logger.debug('[DeltaSyncOptimizer] Initialized', {\n threshold: fullOperationThreshold,\n });\n }\n\n /**\n * Compute delta for single operation\n */\n computeDelta(operation: Operation): DeltaOperation {\n const operationJson = JSON.stringify(operation);\n const originalSize = new TextEncoder().encode(operationJson).byteLength;\n\n // Check if we have historical state\n const previous = this.operationHistory.get(operation.id);\n\n if (!previous) {\n // New operation - return as full\n const delta: DeltaOperation = {\n id: `delta-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type: 'full',\n operationId: operation.id,\n operationType: operation.type,\n sessionId: operation.sessionId,\n timestamp: Date.now(),\n fullData: operation.data,\n priority: operation.priority,\n };\n\n // Update stats\n this.stats.totalOperations++;\n this.stats.totalFull++;\n this.stats.totalOriginalSize += originalSize;\n\n const deltaSize = new TextEncoder().encode(\n JSON.stringify(delta)\n ).byteLength;\n this.stats.totalDeltaSize += deltaSize;\n\n // Store in history (evict oldest if over limit)\n this.operationHistory.set(operation.id, operation);\n if (this.operationHistory.size > DeltaSyncOptimizer.MAX_HISTORY_SIZE) {\n const firstKey = this.operationHistory.keys().next().value;\n if (firstKey !== undefined) this.operationHistory.delete(firstKey);\n }\n\n return delta;\n }\n\n // Compare with previous - extract changed fields\n const changes: Record<string, unknown> = {};\n const changeMask: string[] = [];\n let hasMeaningfulChanges = false;\n\n for (const [key, value] of Object.entries(operation.data)) {\n const oldValue = previous.data[key];\n\n if (!this.deepEqual(value, oldValue)) {\n changes[key] = value;\n changeMask.push(key);\n hasMeaningfulChanges = true;\n }\n }\n\n // Check for deleted fields\n for (const key of Object.keys(previous.data)) {\n if (!(key in operation.data)) {\n changes[key] = null;\n changeMask.push(`${key}:deleted`);\n hasMeaningfulChanges = true;\n }\n }\n\n // Build delta operation\n const deltaData: DeltaOperation = {\n id: `delta-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type: 'delta',\n operationId: operation.id,\n operationType: operation.type,\n sessionId: operation.sessionId,\n timestamp: Date.now(),\n changes: hasMeaningfulChanges ? changes : undefined,\n changeMask: hasMeaningfulChanges ? changeMask : undefined,\n priority: operation.priority,\n };\n\n // If delta is too large, send as full instead\n const deltaSize = new TextEncoder().encode(\n JSON.stringify(deltaData)\n ).byteLength;\n\n const finalDelta =\n deltaSize > this.stats.fullOperationThreshold\n ? {\n ...deltaData,\n type: 'full' as const,\n fullData: operation.data,\n changes: undefined,\n changeMask: undefined,\n }\n : deltaData;\n\n // Update stats\n this.stats.totalOperations++;\n if (finalDelta.type === 'full') {\n this.stats.totalFull++;\n } else {\n this.stats.totalDelta++;\n }\n\n this.stats.totalOriginalSize += originalSize;\n this.stats.totalDeltaSize += deltaSize;\n\n // Update history (evict oldest if over limit)\n this.operationHistory.set(operation.id, operation);\n if (this.operationHistory.size > DeltaSyncOptimizer.MAX_HISTORY_SIZE) {\n const firstKey = this.operationHistory.keys().next().value;\n if (firstKey !== undefined) this.operationHistory.delete(firstKey);\n }\n\n return finalDelta;\n }\n\n /**\n * Compute deltas for batch of operations\n */\n computeBatchDeltas(operations: Operation[]): DeltaBatch {\n const deltas = operations.map((op) => this.computeDelta(op));\n\n const totalOriginalSize = operations.reduce(\n (sum, op) =>\n sum + new TextEncoder().encode(JSON.stringify(op)).byteLength,\n 0\n );\n\n const totalDeltaSize = deltas.reduce(\n (sum, delta) =>\n sum + new TextEncoder().encode(JSON.stringify(delta)).byteLength,\n 0\n );\n\n const reductionPercent =\n totalOriginalSize > 0\n ? Math.round(\n ((totalOriginalSize - totalDeltaSize) / totalOriginalSize) * 100\n )\n : 0;\n\n const batch: DeltaBatch = {\n batchId: `batch-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n operations: deltas,\n timestamp: Date.now(),\n totalOriginalSize,\n totalDeltaSize,\n reductionPercent,\n };\n\n logger.debug('[DeltaSyncOptimizer] Batch computed', {\n operations: operations.length,\n reduction: reductionPercent,\n size: totalDeltaSize,\n });\n\n return batch;\n }\n\n /**\n * Decompress delta operation back to full operation\n */\n decompressDelta(delta: DeltaOperation): Operation {\n if (delta.type === 'full') {\n return {\n id: delta.operationId,\n type: delta.operationType,\n sessionId: delta.sessionId,\n data: delta.fullData || {},\n status: 'pending',\n createdAt: delta.timestamp,\n };\n }\n\n const previous = this.operationHistory.get(delta.operationId);\n\n if (!previous) {\n logger.warn('[DeltaSyncOptimizer] Cannot decompress - no history', {\n operationId: delta.operationId,\n });\n\n return {\n id: delta.operationId,\n type: delta.operationType,\n sessionId: delta.sessionId,\n data: delta.changes || {},\n status: 'pending',\n createdAt: delta.timestamp,\n };\n }\n\n // Apply changes to historical state\n const reconstructed = {\n ...previous,\n data: {\n ...previous.data,\n ...(delta.changes || {}),\n },\n };\n\n // Remove null fields (marked as deleted)\n if (delta.changes) {\n for (const [key, value] of Object.entries(delta.changes)) {\n if (value === null) {\n delete reconstructed.data[key];\n }\n }\n }\n\n return reconstructed;\n }\n\n /**\n * Update history after successful sync\n */\n updateHistory(operations: Operation[]): void {\n for (const op of operations) {\n this.operationHistory.set(op.id, op);\n }\n // Evict oldest entries if over limit\n while (this.operationHistory.size > DeltaSyncOptimizer.MAX_HISTORY_SIZE) {\n const firstKey = this.operationHistory.keys().next().value;\n if (firstKey !== undefined) this.operationHistory.delete(firstKey);\n else break;\n }\n\n logger.debug('[DeltaSyncOptimizer] History updated', {\n count: operations.length,\n totalHistorySize: this.operationHistory.size,\n });\n }\n\n /**\n * Clear history for specific operations\n */\n clearHistory(operationIds: string[]): void {\n for (const id of operationIds) {\n this.operationHistory.delete(id);\n }\n\n logger.debug('[DeltaSyncOptimizer] History cleared', {\n cleared: operationIds.length,\n remaining: this.operationHistory.size,\n });\n }\n\n /**\n * Get current performance statistics\n */\n getStats(): DeltaStats {\n if (this.stats.totalOperations > 0) {\n this.stats.averageReductionPercent = Math.round(\n ((this.stats.totalOriginalSize - this.stats.totalDeltaSize) /\n this.stats.totalOriginalSize) *\n 100\n );\n }\n\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalOperations: 0,\n totalFull: 0,\n totalDelta: 0,\n totalOriginalSize: 0,\n totalDeltaSize: 0,\n averageReductionPercent: 0,\n lastSyncTime: 0,\n fullOperationThreshold: this.stats.fullOperationThreshold,\n };\n\n logger.debug('[DeltaSyncOptimizer] Stats reset');\n }\n\n /**\n * Set the full operation threshold\n */\n setFullOperationThreshold(bytes: number): void {\n this.stats.fullOperationThreshold = bytes;\n logger.debug('[DeltaSyncOptimizer] Threshold updated', { bytes });\n }\n\n /**\n * Get history size for memory monitoring\n */\n getHistorySize(): number {\n return this.operationHistory.size;\n }\n\n /**\n * Get memory footprint estimate\n */\n getMemoryEstimate(): number {\n let totalBytes = 0;\n\n for (const op of this.operationHistory.values()) {\n totalBytes += new TextEncoder().encode(JSON.stringify(op)).byteLength;\n }\n\n return totalBytes;\n }\n\n /**\n * Deep equality check for nested objects\n */\n private deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n\n if (aKeys.length !== bKeys.length) return false;\n\n for (const key of aKeys) {\n if (!this.deepEqual(aObj[key], bObj[key])) {\n return false;\n }\n }\n\n return true;\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet deltaSyncInstance: DeltaSyncOptimizer | null = null;\n\nexport function getDeltaSyncOptimizer(threshold?: number): DeltaSyncOptimizer {\n if (!deltaSyncInstance) {\n deltaSyncInstance = new DeltaSyncOptimizer(threshold);\n }\n return deltaSyncInstance;\n}\n\nexport function resetDeltaSyncOptimizer(): void {\n deltaSyncInstance = null;\n}\n"]}
|
|
@@ -221,7 +221,10 @@ var CompressionEngine = class {
|
|
|
221
221
|
*/
|
|
222
222
|
reassembleChunks(chunks) {
|
|
223
223
|
const sorted = [...chunks].sort((a, b) => a.index - b.index);
|
|
224
|
-
|
|
224
|
+
if (sorted.length === 0) {
|
|
225
|
+
throw new Error("Cannot reassemble: no chunks provided");
|
|
226
|
+
}
|
|
227
|
+
const total = sorted[0].total;
|
|
225
228
|
if (sorted.length !== total) {
|
|
226
229
|
throw new Error(
|
|
227
230
|
`Missing chunks: got ${sorted.length}, expected ${total}`
|
|
@@ -247,7 +250,7 @@ var CompressionEngine = class {
|
|
|
247
250
|
for (let i = 0; i < data.length; i++) {
|
|
248
251
|
hash = (hash << 5) - hash + data[i] | 0;
|
|
249
252
|
}
|
|
250
|
-
return hash.toString(16);
|
|
253
|
+
return (hash >>> 0).toString(16);
|
|
251
254
|
}
|
|
252
255
|
/**
|
|
253
256
|
* Update average compression ratio
|
|
@@ -291,7 +294,8 @@ function resetCompressionEngine() {
|
|
|
291
294
|
|
|
292
295
|
// src/compression/DeltaSyncOptimizer.ts
|
|
293
296
|
var logger2 = getLogger();
|
|
294
|
-
var DeltaSyncOptimizer = class {
|
|
297
|
+
var DeltaSyncOptimizer = class _DeltaSyncOptimizer {
|
|
298
|
+
static MAX_HISTORY_SIZE = 1e4;
|
|
295
299
|
operationHistory = /* @__PURE__ */ new Map();
|
|
296
300
|
stats = {
|
|
297
301
|
totalOperations: 0,
|
|
@@ -336,6 +340,10 @@ var DeltaSyncOptimizer = class {
|
|
|
336
340
|
).byteLength;
|
|
337
341
|
this.stats.totalDeltaSize += deltaSize2;
|
|
338
342
|
this.operationHistory.set(operation.id, operation);
|
|
343
|
+
if (this.operationHistory.size > _DeltaSyncOptimizer.MAX_HISTORY_SIZE) {
|
|
344
|
+
const firstKey = this.operationHistory.keys().next().value;
|
|
345
|
+
if (firstKey !== void 0) this.operationHistory.delete(firstKey);
|
|
346
|
+
}
|
|
339
347
|
return delta;
|
|
340
348
|
}
|
|
341
349
|
const changes = {};
|
|
@@ -386,6 +394,10 @@ var DeltaSyncOptimizer = class {
|
|
|
386
394
|
this.stats.totalOriginalSize += originalSize;
|
|
387
395
|
this.stats.totalDeltaSize += deltaSize;
|
|
388
396
|
this.operationHistory.set(operation.id, operation);
|
|
397
|
+
if (this.operationHistory.size > _DeltaSyncOptimizer.MAX_HISTORY_SIZE) {
|
|
398
|
+
const firstKey = this.operationHistory.keys().next().value;
|
|
399
|
+
if (firstKey !== void 0) this.operationHistory.delete(firstKey);
|
|
400
|
+
}
|
|
389
401
|
return finalDelta;
|
|
390
402
|
}
|
|
391
403
|
/**
|
|
@@ -470,6 +482,11 @@ var DeltaSyncOptimizer = class {
|
|
|
470
482
|
for (const op of operations) {
|
|
471
483
|
this.operationHistory.set(op.id, op);
|
|
472
484
|
}
|
|
485
|
+
while (this.operationHistory.size > _DeltaSyncOptimizer.MAX_HISTORY_SIZE) {
|
|
486
|
+
const firstKey = this.operationHistory.keys().next().value;
|
|
487
|
+
if (firstKey !== void 0) this.operationHistory.delete(firstKey);
|
|
488
|
+
else break;
|
|
489
|
+
}
|
|
473
490
|
logger2.debug("[DeltaSyncOptimizer] History updated", {
|
|
474
491
|
count: operations.length,
|
|
475
492
|
totalHistorySize: this.operationHistory.size
|