meridian-sdk 1.6.0 → 1.7.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/CHANGELOG.md +22 -0
- package/README.md +56 -0
- package/dist/auth/permissions.d.ts +1 -0
- package/dist/auth/permissions.d.ts.map +1 -1
- package/dist/auth/permissions.js +1 -1
- package/dist/auth/permissions.js.map +1 -1
- package/dist/client.d.ts +55 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +223 -44
- package/dist/client.js.map +1 -1
- package/dist/conflict/types.d.ts +13 -1
- package/dist/conflict/types.d.ts.map +1 -1
- package/dist/crdt/lwwregister.d.ts +44 -0
- package/dist/crdt/lwwregister.d.ts.map +1 -1
- package/dist/crdt/lwwregister.js +91 -1
- package/dist/crdt/lwwregister.js.map +1 -1
- package/dist/crdt/orset.d.ts +20 -1
- package/dist/crdt/orset.d.ts.map +1 -1
- package/dist/crdt/orset.js +94 -14
- package/dist/crdt/orset.js.map +1 -1
- package/dist/crdt/pncounter.d.ts +2 -0
- package/dist/crdt/pncounter.d.ts.map +1 -1
- package/dist/crdt/pncounter.js +2 -0
- package/dist/crdt/pncounter.js.map +1 -1
- package/dist/crdt/presence.d.ts +4 -0
- package/dist/crdt/presence.d.ts.map +1 -1
- package/dist/crdt/presence.js +7 -3
- package/dist/crdt/presence.js.map +1 -1
- package/dist/crdt/tree.d.ts +3 -0
- package/dist/crdt/tree.d.ts.map +1 -1
- package/dist/crdt/tree.js +46 -31
- package/dist/crdt/tree.js.map +1 -1
- package/dist/crypto/aes-gcm.d.ts +37 -0
- package/dist/crypto/aes-gcm.d.ts.map +1 -0
- package/dist/crypto/aes-gcm.js +69 -0
- package/dist/crypto/aes-gcm.js.map +1 -0
- package/dist/crypto/ed25519.d.ts +30 -0
- package/dist/crypto/ed25519.d.ts.map +1 -0
- package/dist/crypto/ed25519.js +68 -0
- package/dist/crypto/ed25519.js.map +1 -0
- package/dist/crypto/index.d.ts +5 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +3 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/schema.d.ts +48 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +30 -0
- package/dist/schema.js.map +1 -1
- package/dist/sync/tab-sync.d.ts +22 -0
- package/dist/sync/tab-sync.d.ts.map +1 -0
- package/dist/sync/tab-sync.js +32 -0
- package/dist/sync/tab-sync.js.map +1 -0
- package/dist/transport/http.d.ts +23 -0
- package/dist/transport/http.d.ts.map +1 -1
- package/dist/transport/http.js +22 -0
- package/dist/transport/http.js.map +1 -1
- package/dist/transport/websocket.d.ts +8 -0
- package/dist/transport/websocket.d.ts.map +1 -1
- package/dist/transport/websocket.js +25 -3
- package/dist/transport/websocket.js.map +1 -1
- package/dist/undo/UndoManager.d.ts +22 -1
- package/dist/undo/UndoManager.d.ts.map +1 -1
- package/dist/undo/UndoManager.js +92 -6
- package/dist/undo/UndoManager.js.map +1 -1
- package/dist/undo/types.d.ts +33 -1
- package/dist/undo/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/auth/permissions.ts +1 -1
- package/src/client.ts +259 -43
- package/src/conflict/types.ts +15 -1
- package/src/crdt/lwwregister.ts +115 -1
- package/src/crdt/orset.ts +97 -15
- package/src/crdt/pncounter.ts +3 -0
- package/src/crdt/presence.ts +14 -3
- package/src/crdt/tree.ts +46 -33
- package/src/crypto/aes-gcm.ts +86 -0
- package/src/crypto/ed25519.ts +89 -0
- package/src/crypto/index.ts +15 -0
- package/src/index.ts +21 -0
- package/src/schema.ts +39 -0
- package/src/sync/tab-sync.ts +40 -0
- package/src/transport/http.ts +30 -0
- package/src/transport/websocket.ts +31 -3
- package/src/undo/UndoManager.ts +107 -7
- package/src/undo/types.ts +39 -1
- package/test/crdt.test.ts +133 -0
- package/test/crypto.test.ts +192 -0
- package/test/integration.test.ts +0 -5
- package/test/tab-sync.test.ts +164 -0
- package/test/undo.test.ts +0 -2
- package/test/validation.test.ts +0 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# meridian-sdk
|
|
2
2
|
|
|
3
|
+
## 1.7.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 51682b1: Add deterministic AES-GCM encryption for ORSet and Tree, and session revocation API.
|
|
8
|
+
|
|
9
|
+
- `encryptJsonDeterministic(key, value)` — nonce derived from SHA-256(plaintext)[0:12], required for ORSet so Remove ops can reconstruct the same server-side key
|
|
10
|
+
- `ORSetHandle` and `TreeHandle` now accept an `encryptFn` via the `encryption` config in `MeridianClient.create()`
|
|
11
|
+
- `client.http.revokeSession(ns, clientId)` — forcefully close a WebSocket session (admin token required, server sends close code 4401)
|
|
12
|
+
- `encryptJsonDeterministic` exported from `meridian-sdk`
|
|
13
|
+
|
|
14
|
+
## 1.7.0
|
|
15
|
+
|
|
16
|
+
### Minor Changes
|
|
17
|
+
|
|
18
|
+
- 664b1e4: Add E2E encryption, BFT signing, and cross-SDK feature parity.
|
|
19
|
+
|
|
20
|
+
- AES-GCM-256 envelope encryption and Ed25519 BFT signing in the TypeScript SDK
|
|
21
|
+
- New `packages/python/` — `meridian-crdt` Python package with full CRDT support (GCounter, PNCounter, LwwRegister, Presence), optional AES-GCM-256 encryption and Ed25519 signing, asyncio-native transport with auto-reconnect
|
|
22
|
+
- Rust client SDK (`meridian-client`): AES-GCM-256 encryption and Ed25519 BFT signing on LwwRegister and Presence handles (`--features crypto`), HTTP client for REST endpoints (`--features http`), auth token parsing and permission checks
|
|
23
|
+
- CRDT compactor background task for RGA and Tree tombstone cleanup
|
|
24
|
+
|
|
3
25
|
## 1.6.0
|
|
4
26
|
|
|
5
27
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -83,6 +83,10 @@ await Effect.runPromise(
|
|
|
83
83
|
| `namespace` | `string` | Namespace to connect to |
|
|
84
84
|
| `token` | `string` | Meridian token |
|
|
85
85
|
| `autoConnect` | `boolean?` | Open WebSocket immediately (default: `true`) |
|
|
86
|
+
| `offline` | `boolean?` | Start without connecting — operate from cache, call `client.connect()` later |
|
|
87
|
+
| `persistence` | `PersistenceConfig?` | Persist CRDT snapshots and the pending op queue across page loads |
|
|
88
|
+
| `tabSync` | `boolean?` | Broadcast deltas to other tabs in the same namespace via `BroadcastChannel` |
|
|
89
|
+
| `encryption` | `Record<string, CryptoKey>?` | Map from CRDT ID glob to AES-256-GCM key. Matching handles encrypt values before sending and decrypt on receive. Supports `LwwRegister`, `Presence`, `ORSet` (deterministic nonce), and `Tree`. |
|
|
86
90
|
|
|
87
91
|
### CRDT handles
|
|
88
92
|
|
|
@@ -203,6 +207,55 @@ unsubDelta();
|
|
|
203
207
|
|
|
204
208
|
The queue holds up to 500 ops. If the limit is reached, the oldest op is dropped to make room for the newest.
|
|
205
209
|
|
|
210
|
+
### Persistence (offline-first)
|
|
211
|
+
|
|
212
|
+
Enable persistence to cache CRDT state across page loads and survive disconnections:
|
|
213
|
+
|
|
214
|
+
```ts
|
|
215
|
+
import {
|
|
216
|
+
MeridianClient,
|
|
217
|
+
indexedDbStateStorage,
|
|
218
|
+
localStorageSyncOpsAdapter,
|
|
219
|
+
} from "meridian-sdk";
|
|
220
|
+
|
|
221
|
+
const client = await Effect.runPromise(
|
|
222
|
+
MeridianClient.create({
|
|
223
|
+
url: "http://localhost:3000",
|
|
224
|
+
namespace: "my-room",
|
|
225
|
+
token,
|
|
226
|
+
persistence: {
|
|
227
|
+
state: indexedDbStateStorage(), // CRDT snapshots → IndexedDB
|
|
228
|
+
ops: localStorageSyncOpsAdapter(), // pending op queue → localStorage (sync, survives tab close)
|
|
229
|
+
},
|
|
230
|
+
})
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
const views = client.gcounter("gc:views");
|
|
234
|
+
const cart = client.orset("or:cart");
|
|
235
|
+
await client.waitForRestore(); // wait for IndexedDB reads to complete
|
|
236
|
+
|
|
237
|
+
console.log(views.value()); // populated from cache before the WebSocket connects
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
The pending op queue is also flushed when the tab becomes hidden (`visibilitychange`), covering most crash and background-kill scenarios.
|
|
241
|
+
|
|
242
|
+
### Multi-tab sync
|
|
243
|
+
|
|
244
|
+
Pass `tabSync: true` to broadcast CRDT deltas to other open tabs in the same origin and namespace via the [BroadcastChannel API](https://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel):
|
|
245
|
+
|
|
246
|
+
```ts
|
|
247
|
+
const client = await Effect.runPromise(
|
|
248
|
+
MeridianClient.create({
|
|
249
|
+
url: "http://localhost:3000",
|
|
250
|
+
namespace: "my-room",
|
|
251
|
+
token,
|
|
252
|
+
tabSync: true,
|
|
253
|
+
})
|
|
254
|
+
);
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
When Tab A receives a delta from the server it immediately forwards it to Tab B — Tab B applies it without waiting for its own server round-trip. All CRDTs are convergent so applying the same delta twice is safe.
|
|
258
|
+
|
|
206
259
|
### Op latency
|
|
207
260
|
|
|
208
261
|
`client.getLatencyStats()` returns P50 and P99 round-trip latency in milliseconds, computed from the last 128 acknowledged ops. Returns `null` if fewer than 2 samples have been collected.
|
|
@@ -292,8 +345,11 @@ client.http.postOp(ns, id, op) // → Effect<CrdtOpResponse, ...>
|
|
|
292
345
|
client.http.syncCrdt(ns, id, sinceVc?) // → Effect<CrdtGetResponse, ...>
|
|
293
346
|
client.http.issueToken(ns, opts) // → Effect<TokenIssueResponse, ...>
|
|
294
347
|
client.http.tokenMe(ns) // → Effect<TokenClaims, ...>
|
|
348
|
+
client.http.revokeSession(ns, clientId) // → Effect<{ revoked: boolean; client_id: number }, ...>
|
|
295
349
|
```
|
|
296
350
|
|
|
351
|
+
`revokeSession` forcefully closes a client's WebSocket connection (requires admin token). The server sends the target a `{ code: 4401, message: "session revoked" }` error frame before closing. Returns `HttpError` with status `404` if the client is not connected.
|
|
352
|
+
|
|
297
353
|
`issueToken` accepts both V1 (glob lists) and V2 (fine-grained rules):
|
|
298
354
|
|
|
299
355
|
```ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/auth/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,cAAc,CAAC;AAE3D,eAAO,MAAM,OAAO;IAClB,yDAAyD;;;;;;;;;;;;;;;;CA8BjD,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/auth/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,cAAc,CAAC;AAE3D,eAAO,MAAM,OAAO;IAClB,yDAAyD;;;;;;;;;;;;;;;;CA8BjD,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAE5B,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAcjE;AA4BD;;;;;;;GAOG;AACH,wBAAgB,OAAO,CACrB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,SAAa,GACjB,OAAO,CAOT;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CACtB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,MAAoB,EAC5B,KAAK,SAAa,GACjB,OAAO,CAOT"}
|
package/dist/auth/permissions.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/auth/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,yDAAyD;IACzD,GAAG,EAAE,CAAC;IAEN,uBAAuB;IACvB,YAAY,EAAE,WAAW;IACzB,YAAY,EAAE,WAAW;IACzB,YAAY,EAAE,WAAW;IAEzB,QAAQ;IACR,MAAM,EAAK,WAAW;IACtB,SAAS,EAAE,WAAW;IAEtB,eAAe;IACf,OAAO,EAAE,WAAW;IAEpB,WAAW;IACX,eAAe,EAAE,WAAW;IAE5B,MAAM;IACN,UAAU,EAAE,WAAW;IACvB,UAAU,EAAE,WAAW;IAEvB,OAAO;IACP,QAAQ,EAAK,WAAW;IACxB,SAAS,EAAI,WAAW;IACxB,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,WAAW;IAExB,UAAU;IACV,SAAS,EAAE,WAAW;CACd,CAAC;AAIX,
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/auth/permissions.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -105,6 +105,43 @@ export interface MeridianClientConfig {
|
|
|
105
105
|
offline?: boolean;
|
|
106
106
|
/** Persistence configuration for offline-first support. */
|
|
107
107
|
persistence?: PersistenceConfig;
|
|
108
|
+
/**
|
|
109
|
+
* If `true`, broadcast CRDT deltas to other tabs in the same origin and namespace
|
|
110
|
+
* via `BroadcastChannel`. Other tabs with the same namespace apply updates instantly
|
|
111
|
+
* without a server round-trip. Safe to enable — re-applying a delta is idempotent.
|
|
112
|
+
*/
|
|
113
|
+
tabSync?: boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Client-side AES-256-GCM encryption keys, keyed by CRDT ID pattern (glob supported).
|
|
116
|
+
* Matching CRDTs encrypt their value fields before sending — the server stores and
|
|
117
|
+
* forwards ciphertext and never sees plaintext.
|
|
118
|
+
*
|
|
119
|
+
* Supported CRDT types: `LwwRegister`, `Presence`, `ORSet`, `Tree`.
|
|
120
|
+
* Not supported: `GCounter`, `PNCounter`, `RGA` (numeric/structural merge requires plaintext).
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```ts
|
|
124
|
+
* import { importAesGcmKey } from "meridian-sdk";
|
|
125
|
+
* const key = await importAesGcmKey(base64Key);
|
|
126
|
+
* MeridianClient.create({ ..., encryption: { "lw:profile": key, "pr:room-*": key2 } });
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
encryption?: Record<string, CryptoKey>;
|
|
130
|
+
/**
|
|
131
|
+
* If `true`, generate (or load from `localStorage`) a per-client Ed25519 keypair and
|
|
132
|
+
* sign every outgoing op before sending.
|
|
133
|
+
*
|
|
134
|
+
* The server verifies the signature against `client_pubkey` embedded in the token.
|
|
135
|
+
* This provides Byzantine fault tolerance in cluster mode: a compromised node cannot
|
|
136
|
+
* forge ops that appear to originate from legitimate clients.
|
|
137
|
+
*
|
|
138
|
+
* **Setup**: when issuing the token (via your app server), include `client_pubkey`
|
|
139
|
+
* (base64url-encoded 32-byte public key) in the token issuance request. Obtain the
|
|
140
|
+
* public key from `client.publicKeyBytes` after `create()` completes.
|
|
141
|
+
*
|
|
142
|
+
* Requires Chrome 113+, Firefox 130+, or Node.js 20+.
|
|
143
|
+
*/
|
|
144
|
+
signing?: boolean;
|
|
108
145
|
}
|
|
109
146
|
/**
|
|
110
147
|
* The main entry point for the Meridian real-time CRDT SDK.
|
|
@@ -138,6 +175,12 @@ export declare class MeridianClient {
|
|
|
138
175
|
readonly claims: TokenClaims;
|
|
139
176
|
private readonly transport;
|
|
140
177
|
readonly http: HttpClient;
|
|
178
|
+
/**
|
|
179
|
+
* Raw 32-byte Ed25519 public key for this client, or `null` if `signing` is disabled.
|
|
180
|
+
* Pass this (base64url-encoded) to your app server when issuing tokens so the server
|
|
181
|
+
* can verify op signatures.
|
|
182
|
+
*/
|
|
183
|
+
readonly publicKeyBytes: Uint8Array | null;
|
|
141
184
|
private readonly gcHandles;
|
|
142
185
|
private readonly pnHandles;
|
|
143
186
|
private readonly orHandles;
|
|
@@ -156,6 +199,8 @@ export declare class MeridianClient {
|
|
|
156
199
|
private readonly snapStore;
|
|
157
200
|
private readonly opsStore;
|
|
158
201
|
private readonly restorePromises;
|
|
202
|
+
private readonly tabSyncChannel;
|
|
203
|
+
private readonly encKeys;
|
|
159
204
|
private constructor();
|
|
160
205
|
/** Explicitly connect to the server. Use when `autoConnect: false` or `offline: true`. */
|
|
161
206
|
connect(): void;
|
|
@@ -178,6 +223,7 @@ export declare class MeridianClient {
|
|
|
178
223
|
private scheduleSnapRestore;
|
|
179
224
|
private saveSnap;
|
|
180
225
|
private readonly flushOpsToStorage;
|
|
226
|
+
private readonly onVisibilityChange;
|
|
181
227
|
/**
|
|
182
228
|
* Creates and validates a new `MeridianClient` from the supplied configuration.
|
|
183
229
|
*
|
|
@@ -200,6 +246,9 @@ export declare class MeridianClient {
|
|
|
200
246
|
* ```
|
|
201
247
|
*/
|
|
202
248
|
static create(config: MeridianClientConfig): Effect.Effect<MeridianClient, TokenParseError | TokenExpiredError>;
|
|
249
|
+
private resolveEncKey;
|
|
250
|
+
private encryptFnFor;
|
|
251
|
+
private encryptFnDeterministicFor;
|
|
203
252
|
/**
|
|
204
253
|
* Returns a handle for a grow-only counter (GCounter) CRDT.
|
|
205
254
|
*
|
|
@@ -480,6 +529,12 @@ export declare class MeridianClient {
|
|
|
480
529
|
private resubscribeLiveQueries;
|
|
481
530
|
private notifyAnyChange;
|
|
482
531
|
private handleServerMsg;
|
|
532
|
+
/**
|
|
533
|
+
* Apply a CRDT delta to the appropriate local handle.
|
|
534
|
+
* Called from the server message handler and from tab-sync broadcasts.
|
|
535
|
+
* When `broadcast` is true, the delta is forwarded to other tabs via BroadcastChannel.
|
|
536
|
+
*/
|
|
537
|
+
private applyDelta;
|
|
483
538
|
private notifyDelta;
|
|
484
539
|
}
|
|
485
540
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|