trellis 3.1.35 → 3.2.2
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 +23 -5
- package/README.md +63 -156
- package/bin/trellis.mjs +2 -75
- package/dist/{better-sqlite-backend-ahx5p0br.js → better-sqlite-backend-2P4F6AOJ.js} +91 -29
- package/dist/boot-middleware-MHLHFCUC.js +9 -0
- package/dist/browser/index.d.ts +18 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +95 -0
- package/dist/{index-53f3b8p8.js → chunk-2W3MHTMG.js} +552 -213
- package/dist/chunk-44FFQKQX.js +142 -0
- package/dist/chunk-4HYPLFJD.js +150 -0
- package/dist/chunk-4XIVMVHC.js +361 -0
- package/dist/{index-yp88he8n.js → chunk-6CTA6MCE.js} +88 -64
- package/dist/chunk-6GEZ6DN5.js +394 -0
- package/dist/chunk-7ZFRVCUE.js +211 -0
- package/dist/chunk-CAG4FULI.js +121 -0
- package/dist/chunk-FF36CQHZ.js +61 -0
- package/dist/{index-h32txmxe.js → chunk-FKQO5A3H.js} +6 -13
- package/dist/{index-nq520y6k.js → chunk-FWRS4CSC.js} +46 -32
- package/dist/chunk-GFZCJ4EH.js +108 -0
- package/dist/chunk-GLM4HGN4.js +55 -0
- package/dist/{index-4cdr7x2x.js → chunk-GU374KWZ.js} +182 -111
- package/dist/chunk-H6JB3PZ3.js +45 -0
- package/dist/chunk-IZX2PLIB.js +1240 -0
- package/dist/chunk-J2TXUFCZ.js +289 -0
- package/dist/chunk-J3WYZO3Q.js +211 -0
- package/dist/{index-xzym9w0m.js → chunk-JA7AIHRK.js} +12 -7
- package/dist/chunk-JHHEXEDM.js +162 -0
- package/dist/chunk-JUEMDWLU.js +233 -0
- package/dist/chunk-KFQGP6VL.js +33 -0
- package/dist/chunk-KIJITUZB.js +419 -0
- package/dist/{index-4wxa8xz4.js → chunk-KQ4A2D2P.js} +162 -23
- package/dist/chunk-KSU2GW22.js +958 -0
- package/dist/{index-rv1p47gp.js → chunk-L5N5PR2S.js} +3015 -2480
- package/dist/{index-h9e2efx4.js → chunk-LNUIGRDZ.js} +71 -55
- package/dist/{index-skhn0agf.js → chunk-MLC5BUYO.js} +19 -20
- package/dist/chunk-MPXUVGT3.js +104 -0
- package/dist/chunk-N6MYZT4O.js +68 -0
- package/dist/chunk-O2AV5WMN.js +48 -0
- package/dist/chunk-PZ4XYZ4J.js +143 -0
- package/dist/chunk-QB5ISE47.js +419 -0
- package/dist/chunk-RSWUFTO2.js +857 -0
- package/dist/chunk-S3XLFZ27.js +1095 -0
- package/dist/{index-w5wccer3.js → chunk-S6GBJ2ZB.js} +28 -12
- package/dist/{index-7pjz3tsy.js → chunk-SGMDTWJJ.js} +57 -15
- package/dist/chunk-SPSPV5BC.js +390 -0
- package/dist/chunk-TCKXSOBP.js +123 -0
- package/dist/chunk-UBGUDMUV.js +59 -0
- package/dist/{index-wt8rz4gn.js → chunk-UQISRW6T.js} +97 -26
- package/dist/chunk-USEINYUL.js +12 -0
- package/dist/{index-bmyt7k8n.js → chunk-UZRUP7QW.js} +12 -4
- package/dist/{index-xhcp6xrn.js → chunk-VBYUTRXX.js} +695 -514
- package/dist/{index-vkpkfwhq.js → chunk-VDAKEOML.js} +234 -194
- package/dist/chunk-WXSWA3MV.js +0 -0
- package/dist/{index-n9f2qyh5.js → chunk-X5FLTRUB.js} +55 -33
- package/dist/{index-h7zxhhhh.js → chunk-XMQ7G77X.js} +46 -38
- package/dist/{index-w7ng765c.js → chunk-YCM7ZYEZ.js} +102 -49
- package/dist/cli/deploy-cli.d.ts +18 -0
- package/dist/cli/deploy-cli.d.ts.map +1 -0
- package/dist/cli/errors.d.ts +6 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/examples.d.ts +23 -0
- package/dist/cli/examples.d.ts.map +1 -0
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2426 -6225
- package/dist/client/index.browser.d.ts +29 -0
- package/dist/client/index.browser.d.ts.map +1 -0
- package/dist/client/index.browser.js +64 -0
- package/dist/client/index.d.ts +6 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +41 -21
- package/dist/client/live.d.ts +67 -0
- package/dist/client/live.d.ts.map +1 -0
- package/dist/client/reactive.d.ts +31 -0
- package/dist/client/reactive.d.ts.map +1 -0
- package/dist/client/sdk.browser.d.ts +104 -0
- package/dist/client/sdk.browser.d.ts.map +1 -0
- package/dist/client/sdk.browser.js +9 -0
- package/dist/client/sdk.d.ts +26 -2
- package/dist/client/sdk.d.ts.map +1 -1
- package/dist/client/sdk.js +9 -0
- package/dist/client/vcs-client.d.ts +129 -0
- package/dist/client/vcs-client.d.ts.map +1 -0
- package/dist/cms/index.js +171 -163
- package/dist/{config-8hczw0rs.js → config-PFTP67TR.js} +8 -9
- package/dist/core/computation/index.d.ts +5 -0
- package/dist/core/computation/index.d.ts.map +1 -0
- package/dist/core/computation/rollup.d.ts +18 -0
- package/dist/core/computation/rollup.d.ts.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +171 -104
- package/dist/core/kernel/boot-middleware.d.ts +10 -0
- package/dist/core/kernel/boot-middleware.d.ts.map +1 -0
- package/dist/core/kernel/logic-middleware.d.ts +7 -1
- package/dist/core/kernel/logic-middleware.d.ts.map +1 -1
- package/dist/core/kernel/trellis-kernel.d.ts.map +1 -1
- package/dist/core/ontology/types.d.ts +5 -0
- package/dist/core/ontology/types.d.ts.map +1 -1
- package/dist/core/persist/better-sqlite-backend.d.ts +9 -2
- package/dist/core/persist/better-sqlite-backend.d.ts.map +1 -1
- package/dist/core/persist/factory.d.ts +6 -7
- package/dist/core/persist/factory.d.ts.map +1 -1
- package/dist/core/persist/factory.js +2 -3
- package/dist/core/persist/sqljs-backend.js +2 -3
- package/dist/db/index.d.ts +4 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +67 -54
- package/dist/db/inspector.js +11 -19
- package/dist/db/trellis.css +1 -1
- package/dist/decisions/index.js +9 -10
- package/dist/deploy-LQ7GUGJ5.js +9 -0
- package/dist/deploy-YNVG5E4E.js +9 -0
- package/dist/deploy-cli-24BCHAXY.js +67 -0
- package/dist/deploy-cli-C35HTITO.js +67 -0
- package/dist/embeddings/auto-embed.d.ts +2 -2
- package/dist/embeddings/auto-embed.d.ts.map +1 -1
- package/dist/embeddings/index.js +20 -22
- package/dist/embeddings/search.d.ts +2 -1
- package/dist/embeddings/search.d.ts.map +1 -1
- package/dist/embeddings/store.d.ts +25 -4
- package/dist/embeddings/store.d.ts.map +1 -1
- package/dist/engine.d.ts +59 -19
- package/dist/engine.d.ts.map +1 -1
- package/dist/import-UZEKXU3B.js +10 -0
- package/dist/index.js +102 -93
- package/dist/launch-explorer-HZ4ZJA4X.js +95 -0
- package/dist/links/index.js +24 -26
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/plugins/agent-memory/index.js +316 -0
- package/dist/plugins/idea-garden/index.js +165 -0
- package/dist/plugins/plan-approval/index.js +579 -0
- package/dist/plugins/proactive-watcher/index.js +194 -0
- package/dist/{index-2r4jxwnb.js → query-XYLTJYSA.js} +14 -15
- package/dist/react/index.js +39 -70
- package/dist/react/realtime.js +11 -0
- package/dist/react/schema-hooks.js +87 -0
- package/dist/realtime/broadcast-channel-transport.d.ts +43 -0
- package/dist/realtime/broadcast-channel-transport.d.ts.map +1 -0
- package/dist/realtime/durable-object-relay-transport.d.ts +96 -0
- package/dist/realtime/durable-object-relay-transport.d.ts.map +1 -0
- package/dist/realtime/index.d.ts +44 -0
- package/dist/realtime/index.d.ts.map +1 -0
- package/dist/realtime/index.js +40 -0
- package/dist/realtime/memory-hub.d.ts +32 -0
- package/dist/realtime/memory-hub.d.ts.map +1 -0
- package/dist/realtime/persistent-channel.d.ts +105 -0
- package/dist/realtime/persistent-channel.d.ts.map +1 -0
- package/dist/realtime/presence.d.ts +73 -0
- package/dist/realtime/presence.d.ts.map +1 -0
- package/dist/realtime/relay-persistence.d.ts +37 -0
- package/dist/realtime/relay-persistence.d.ts.map +1 -0
- package/dist/realtime/relay-persistence.js +107 -0
- package/dist/realtime/relay-server.d.ts +103 -0
- package/dist/realtime/relay-server.d.ts.map +1 -0
- package/dist/realtime/room.d.ts +98 -0
- package/dist/realtime/room.d.ts.map +1 -0
- package/dist/realtime/text.d.ts +73 -0
- package/dist/realtime/text.d.ts.map +1 -0
- package/dist/realtime/types.d.ts +89 -0
- package/dist/realtime/types.d.ts.map +1 -0
- package/dist/realtime/websocket-relay-transport.d.ts +28 -0
- package/dist/realtime/websocket-relay-transport.d.ts.map +1 -0
- package/dist/realtime.bundle.js +1100 -0
- package/dist/{remote-manager-xvbg4230.js → remote-manager-ODE3T2KR.js} +25 -15
- package/dist/scaffold/seed.d.ts.map +1 -1
- package/dist/scaffold/write.d.ts +1 -1
- package/dist/scaffold/write.d.ts.map +1 -1
- package/dist/schema/define.d.ts +137 -0
- package/dist/schema/define.d.ts.map +1 -0
- package/dist/schema/entity-projection.d.ts +34 -0
- package/dist/schema/entity-projection.d.ts.map +1 -0
- package/dist/schema/eql.d.ts +46 -0
- package/dist/schema/eql.d.ts.map +1 -0
- package/dist/schema/index.d.ts +21 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +46 -0
- package/dist/schema/kernel-resolve.d.ts +21 -0
- package/dist/schema/kernel-resolve.d.ts.map +1 -0
- package/dist/schema/mutations.d.ts +20 -0
- package/dist/schema/mutations.d.ts.map +1 -0
- package/dist/schema/resolve.d.ts +21 -0
- package/dist/schema/resolve.d.ts.map +1 -0
- package/dist/server/deploy-meta.d.ts +25 -0
- package/dist/server/deploy-meta.d.ts.map +1 -0
- package/dist/server/deploy.d.ts +7 -2
- package/dist/server/deploy.d.ts.map +1 -1
- package/dist/server/index.d.ts +7 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +100 -58
- package/dist/server/node-adapter.js +5 -104
- package/dist/server/realtime.d.ts +14 -3
- package/dist/server/realtime.d.ts.map +1 -1
- package/dist/server/server.d.ts +8 -16
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/sprites.d.ts +18 -1
- package/dist/server/sprites.d.ts.map +1 -1
- package/dist/server/tenancy.d.ts +4 -0
- package/dist/server/tenancy.d.ts.map +1 -1
- package/dist/server/usage-meter.d.ts +53 -0
- package/dist/server/usage-meter.d.ts.map +1 -0
- package/dist/server-MB3OPSPI.js +18 -0
- package/dist/server-ZVWGLLRF.js +18 -0
- package/dist/sprites-KQGTGM6W.js +27 -0
- package/dist/{sprites-vc4qbrp1.js → sprites-RU3E4XQN.js} +6 -7
- package/dist/svelte/index.d.ts +17 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +51 -0
- package/dist/svelte/schema-hooks.d.ts +45 -0
- package/dist/svelte/schema-hooks.d.ts.map +1 -0
- package/dist/svelte/schema-hooks.js +71 -0
- package/dist/svelte/stores.d.ts +78 -0
- package/dist/svelte/stores.d.ts.map +1 -0
- package/dist/sync/http-transport.d.ts +3 -3
- package/dist/sync/http-transport.d.ts.map +1 -1
- package/dist/sync/index.d.ts +15 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +617 -0
- package/dist/sync/memory-room.d.ts +37 -0
- package/dist/sync/memory-room.d.ts.map +1 -0
- package/dist/sync/memory-transport.d.ts +3 -3
- package/dist/sync/memory-transport.d.ts.map +1 -1
- package/dist/sync/partykit-room.d.ts +40 -0
- package/dist/sync/partykit-room.d.ts.map +1 -0
- package/dist/sync/partykit-transport.d.ts +84 -0
- package/dist/sync/partykit-transport.d.ts.map +1 -0
- package/dist/sync/room-core.d.ts +53 -0
- package/dist/sync/room-core.d.ts.map +1 -0
- package/dist/sync/sync-engine.d.ts +40 -2
- package/dist/sync/sync-engine.d.ts.map +1 -1
- package/dist/sync/sync-room-server.d.ts +39 -0
- package/dist/sync/sync-room-server.d.ts.map +1 -0
- package/dist/sync/types.d.ts +70 -3
- package/dist/sync/types.d.ts.map +1 -1
- package/dist/sync/vcs-sync-peer.d.ts +63 -0
- package/dist/sync/vcs-sync-peer.d.ts.map +1 -0
- package/dist/sync/ws-transport.d.ts +2 -2
- package/dist/sync/ws-transport.d.ts.map +1 -1
- package/dist/tenancy-NBLLGCNJ.js +14 -0
- package/dist/tenancy-POMWQP6M.js +16 -0
- package/dist/ui/client.html +355 -67
- package/dist/ui/launch-explorer.d.ts +22 -0
- package/dist/ui/launch-explorer.d.ts.map +1 -0
- package/dist/ui/server.d.ts +1 -1
- package/dist/ui/server.d.ts.map +1 -1
- package/dist/vcs/blob-store.d.ts.map +1 -1
- package/dist/vcs/idb-op-log.d.ts +67 -0
- package/dist/vcs/idb-op-log.d.ts.map +1 -0
- package/dist/vcs/index.d.ts +1 -0
- package/dist/vcs/index.d.ts.map +1 -1
- package/dist/vcs/index.js +81 -72
- package/dist/vcs/issue.d.ts +22 -5
- package/dist/vcs/issue.d.ts.map +1 -1
- package/dist/vcs/lane-materialize.d.ts +5 -0
- package/dist/vcs/lane-materialize.d.ts.map +1 -1
- package/dist/vcs/op-log.d.ts +28 -2
- package/dist/vcs/op-log.d.ts.map +1 -1
- package/dist/vcs/ops.d.ts +10 -0
- package/dist/vcs/ops.d.ts.map +1 -1
- package/dist/vcs/types.d.ts +2 -0
- package/dist/vcs/types.d.ts.map +1 -1
- package/dist/{vm-config-6xhsj6b3.js → vm-config-JI4OXKDQ.js} +9 -10
- package/dist/vue/hooks.d.ts +64 -0
- package/dist/vue/hooks.d.ts.map +1 -0
- package/dist/vue/index.d.ts +19 -0
- package/dist/vue/index.d.ts.map +1 -0
- package/dist/vue/index.js +59 -0
- package/dist/vue/schema-hooks.d.ts +41 -0
- package/dist/vue/schema-hooks.d.ts.map +1 -0
- package/dist/vue/schema-hooks.js +64 -0
- package/package.json +130 -17
- package/dist/deploy-999q207z.js +0 -10
- package/dist/engine-y0724kjq.js +0 -8
- package/dist/import-s2b8e0ft.js +0 -11
- package/dist/index-a76rekgs.js +0 -67
- package/dist/index-c9h37r6h.js +0 -1
- package/dist/index-hr9qvv77.js +0 -860
- package/dist/index-k5b0xskw.js +0 -1
- package/dist/index-nzb3am4f.js +0 -80
- package/dist/index-wncptktd.js +0 -292
- package/dist/index-y6a4kj0p.js +0 -43
- package/dist/index-yhwjgfvj.js +0 -342
- package/dist/sdk-bepky0xs.js +0 -16
- package/dist/server-szdjx0nt.js +0 -13
- package/dist/sqlite-backend-0vsmc6qj.js +0 -8
- package/dist/tenancy-pjm32b4v.js +0 -14
|
@@ -0,0 +1,617 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_SNAPSHOT_MAX_OPS,
|
|
3
|
+
MAX_SUPPORTED_VERSION,
|
|
4
|
+
MIN_SUPPORTED_VERSION,
|
|
5
|
+
PROTOCOL_VERSION,
|
|
6
|
+
PartyKitRoomTransport,
|
|
7
|
+
SyncEngine,
|
|
8
|
+
SyncRoomCore,
|
|
9
|
+
TrellisVcsSyncPeer
|
|
10
|
+
} from "../chunk-RSWUFTO2.js";
|
|
11
|
+
import {
|
|
12
|
+
findForkPoint,
|
|
13
|
+
init_reconciler,
|
|
14
|
+
reconcile
|
|
15
|
+
} from "../chunk-4HYPLFJD.js";
|
|
16
|
+
import "../chunk-GLM4HGN4.js";
|
|
17
|
+
import "../chunk-KFQGP6VL.js";
|
|
18
|
+
|
|
19
|
+
// src/sync/index.ts
|
|
20
|
+
init_reconciler();
|
|
21
|
+
|
|
22
|
+
// src/sync/memory-transport.ts
|
|
23
|
+
var MemoryTransport = class {
|
|
24
|
+
peerId;
|
|
25
|
+
peerName;
|
|
26
|
+
handlers = [];
|
|
27
|
+
connectedPeers = /* @__PURE__ */ new Map();
|
|
28
|
+
constructor(peerId, peerName = peerId) {
|
|
29
|
+
this.peerId = peerId;
|
|
30
|
+
this.peerName = peerName;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Connect two transports so they can exchange messages.
|
|
34
|
+
*/
|
|
35
|
+
static connect(a, b) {
|
|
36
|
+
a.connectedPeers.set(b.peerId, b);
|
|
37
|
+
b.connectedPeers.set(a.peerId, a);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Disconnect two transports.
|
|
41
|
+
*/
|
|
42
|
+
static disconnect(a, b) {
|
|
43
|
+
a.connectedPeers.delete(b.peerId);
|
|
44
|
+
b.connectedPeers.delete(a.peerId);
|
|
45
|
+
}
|
|
46
|
+
async send(peerId, message) {
|
|
47
|
+
const peer = this.connectedPeers.get(peerId);
|
|
48
|
+
if (!peer) {
|
|
49
|
+
throw new Error(`Peer not connected: ${peerId}`);
|
|
50
|
+
}
|
|
51
|
+
for (const handler of peer.handlers) {
|
|
52
|
+
await handler(message);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
onMessage(handler) {
|
|
56
|
+
this.handlers.push(handler);
|
|
57
|
+
}
|
|
58
|
+
peers() {
|
|
59
|
+
return [...this.connectedPeers.entries()].map(([id, transport]) => ({
|
|
60
|
+
id,
|
|
61
|
+
name: transport.peerName
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
getPeerId() {
|
|
65
|
+
return this.peerId;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// src/sync/memory-room.ts
|
|
70
|
+
var MemorySyncRoom = class {
|
|
71
|
+
core;
|
|
72
|
+
transports = /* @__PURE__ */ new Map();
|
|
73
|
+
constructor(roomId = "room", roomName = roomId) {
|
|
74
|
+
this.core = new SyncRoomCore(roomId, roomName);
|
|
75
|
+
}
|
|
76
|
+
connectPeer(peerId, peerName = peerId) {
|
|
77
|
+
this.core.connectPeer(peerId, peerName);
|
|
78
|
+
const transport = new MemoryRoomTransport(this, peerId, peerName);
|
|
79
|
+
this.transports.set(peerId, transport);
|
|
80
|
+
return transport;
|
|
81
|
+
}
|
|
82
|
+
disconnectPeer(peerId) {
|
|
83
|
+
this.core.disconnectPeer(peerId);
|
|
84
|
+
this.transports.delete(peerId);
|
|
85
|
+
}
|
|
86
|
+
getRoomPeer() {
|
|
87
|
+
return this.core.getRoomPeer();
|
|
88
|
+
}
|
|
89
|
+
peersFor(peerId) {
|
|
90
|
+
return this.core.peersFor(peerId);
|
|
91
|
+
}
|
|
92
|
+
getOps() {
|
|
93
|
+
return this.core.getOps();
|
|
94
|
+
}
|
|
95
|
+
getOpCount() {
|
|
96
|
+
return this.core.getOpCount();
|
|
97
|
+
}
|
|
98
|
+
async receive(fromPeerId, message) {
|
|
99
|
+
const deliveries = await this.core.receive(fromPeerId, message);
|
|
100
|
+
for (const delivery of deliveries) {
|
|
101
|
+
await this.deliver(delivery.peerId, delivery.message);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async deliver(peerId, message) {
|
|
105
|
+
const transport = this.transports.get(peerId);
|
|
106
|
+
if (!transport) {
|
|
107
|
+
throw new Error(`Peer not connected to room: ${peerId}`);
|
|
108
|
+
}
|
|
109
|
+
await transport.deliver(message);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
var MemoryRoomTransport = class {
|
|
113
|
+
room;
|
|
114
|
+
peerId;
|
|
115
|
+
peerName;
|
|
116
|
+
handlers = [];
|
|
117
|
+
constructor(room, peerId, peerName = peerId) {
|
|
118
|
+
this.room = room;
|
|
119
|
+
this.peerId = peerId;
|
|
120
|
+
this.peerName = peerName;
|
|
121
|
+
}
|
|
122
|
+
async send(peerId, message) {
|
|
123
|
+
if (peerId !== this.room.getRoomPeer().id) {
|
|
124
|
+
throw new Error(`Peer not connected through room: ${peerId}`);
|
|
125
|
+
}
|
|
126
|
+
await this.room.receive(this.peerId, message);
|
|
127
|
+
}
|
|
128
|
+
onMessage(handler) {
|
|
129
|
+
this.handlers.push(handler);
|
|
130
|
+
}
|
|
131
|
+
peers() {
|
|
132
|
+
return this.room.peersFor(this.peerId);
|
|
133
|
+
}
|
|
134
|
+
getPeerId() {
|
|
135
|
+
return this.peerId;
|
|
136
|
+
}
|
|
137
|
+
getPeerName() {
|
|
138
|
+
return this.peerName;
|
|
139
|
+
}
|
|
140
|
+
async deliver(message) {
|
|
141
|
+
for (const handler of this.handlers) {
|
|
142
|
+
await handler(message);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
// src/sync/sync-room-server.ts
|
|
148
|
+
var SyncRoomServer = class {
|
|
149
|
+
core;
|
|
150
|
+
connections = /* @__PURE__ */ new Map();
|
|
151
|
+
welcomeSnapshot;
|
|
152
|
+
welcomeSnapshotMaxOps;
|
|
153
|
+
constructor(opts = {}) {
|
|
154
|
+
this.core = new SyncRoomCore(opts.roomId, opts.roomName);
|
|
155
|
+
this.welcomeSnapshot = opts.welcomeSnapshot !== false;
|
|
156
|
+
this.welcomeSnapshotMaxOps = opts.welcomeSnapshotMaxOps ?? DEFAULT_SNAPSHOT_MAX_OPS;
|
|
157
|
+
}
|
|
158
|
+
getRoomId() {
|
|
159
|
+
return this.core.getRoomPeer().id;
|
|
160
|
+
}
|
|
161
|
+
getOpCount() {
|
|
162
|
+
return this.core.getOpCount();
|
|
163
|
+
}
|
|
164
|
+
getOps() {
|
|
165
|
+
return this.core.getOps();
|
|
166
|
+
}
|
|
167
|
+
buildSnapshot(maxOps) {
|
|
168
|
+
return this.core.buildSnapshot(maxOps);
|
|
169
|
+
}
|
|
170
|
+
/** Register a connected peer and optionally send a welcome snapshot. */
|
|
171
|
+
async connect(conn) {
|
|
172
|
+
this.core.connectPeer(conn.peerId);
|
|
173
|
+
this.connections.set(conn.peerId, conn);
|
|
174
|
+
if (this.welcomeSnapshot) {
|
|
175
|
+
await this.sendSnapshot(conn.peerId, this.welcomeSnapshotMaxOps);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
disconnect(peerId) {
|
|
179
|
+
this.core.disconnectPeer(peerId);
|
|
180
|
+
this.connections.delete(peerId);
|
|
181
|
+
}
|
|
182
|
+
/** Route an inbound sync message from a peer. */
|
|
183
|
+
async handleMessage(fromPeerId, message) {
|
|
184
|
+
const deliveries = await this.core.receive(fromPeerId, message);
|
|
185
|
+
await this.deliverAll(deliveries);
|
|
186
|
+
}
|
|
187
|
+
/** Push a tail snapshot to a peer without an inbound message. */
|
|
188
|
+
async sendSnapshot(peerId, maxOps = DEFAULT_SNAPSHOT_MAX_OPS) {
|
|
189
|
+
const deliveries = this.core.snapshotDeliveries(peerId, maxOps);
|
|
190
|
+
await this.deliverAll(deliveries);
|
|
191
|
+
}
|
|
192
|
+
async deliverAll(deliveries) {
|
|
193
|
+
for (const delivery of deliveries) {
|
|
194
|
+
const conn = this.connections.get(delivery.peerId);
|
|
195
|
+
if (!conn) continue;
|
|
196
|
+
await conn.send(delivery.message);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
// src/sync/partykit-room.ts
|
|
202
|
+
function createPartyKitRoomHandler(opts = {}) {
|
|
203
|
+
function getState(room) {
|
|
204
|
+
const bag = room;
|
|
205
|
+
if (!bag.trellis) {
|
|
206
|
+
bag.trellis = {
|
|
207
|
+
server: new SyncRoomServer({
|
|
208
|
+
roomId: "room",
|
|
209
|
+
roomName: room.id,
|
|
210
|
+
welcomeSnapshot: opts.welcomeSnapshot,
|
|
211
|
+
welcomeSnapshotMaxOps: opts.welcomeSnapshotMaxOps
|
|
212
|
+
})
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
return bag.trellis;
|
|
216
|
+
}
|
|
217
|
+
function peerIdFromConnection(connection, requestUrl) {
|
|
218
|
+
if (requestUrl) {
|
|
219
|
+
try {
|
|
220
|
+
const peer = new URL(requestUrl).searchParams.get("peerId");
|
|
221
|
+
if (peer) return peer;
|
|
222
|
+
} catch {
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return connection.id;
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
async onConnect(connection, room, request) {
|
|
229
|
+
const { server } = getState(room);
|
|
230
|
+
const peerId = peerIdFromConnection(connection, request?.url);
|
|
231
|
+
const conn = {
|
|
232
|
+
peerId,
|
|
233
|
+
send(message) {
|
|
234
|
+
connection.send(JSON.stringify(message));
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
await server.connect(conn);
|
|
238
|
+
},
|
|
239
|
+
async onMessage(message, connection, room, request) {
|
|
240
|
+
const { server } = getState(room);
|
|
241
|
+
const peerId = peerIdFromConnection(connection, request?.url);
|
|
242
|
+
const raw = typeof message === "string" ? message : new TextDecoder().decode(message);
|
|
243
|
+
let parsed;
|
|
244
|
+
try {
|
|
245
|
+
parsed = JSON.parse(raw);
|
|
246
|
+
} catch {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if (!parsed || typeof parsed.type !== "string") return;
|
|
250
|
+
await server.handleMessage(peerId, parsed);
|
|
251
|
+
},
|
|
252
|
+
onClose(connection, room, request) {
|
|
253
|
+
const { server } = getState(room);
|
|
254
|
+
const peerId = peerIdFromConnection(connection, request?.url);
|
|
255
|
+
server.disconnect(peerId);
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// src/sync/http-transport.ts
|
|
261
|
+
var HttpSyncTransport = class {
|
|
262
|
+
localPeerId;
|
|
263
|
+
peerUrls = /* @__PURE__ */ new Map();
|
|
264
|
+
messageHandler = null;
|
|
265
|
+
knownPeers = /* @__PURE__ */ new Map();
|
|
266
|
+
constructor(localPeerId) {
|
|
267
|
+
this.localPeerId = localPeerId;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Add a remote peer by URL (e.g. "http://192.168.1.10:4200").
|
|
271
|
+
*/
|
|
272
|
+
addPeer(peerId, url, name) {
|
|
273
|
+
this.peerUrls.set(peerId, url);
|
|
274
|
+
this.knownPeers.set(peerId, {
|
|
275
|
+
id: peerId,
|
|
276
|
+
name: name ?? peerId,
|
|
277
|
+
lastSeen: (/* @__PURE__ */ new Date()).toISOString()
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Remove a remote peer.
|
|
282
|
+
*/
|
|
283
|
+
removePeer(peerId) {
|
|
284
|
+
this.peerUrls.delete(peerId);
|
|
285
|
+
this.knownPeers.delete(peerId);
|
|
286
|
+
}
|
|
287
|
+
async send(peerId, message) {
|
|
288
|
+
const url = this.peerUrls.get(peerId);
|
|
289
|
+
if (!url) throw new Error(`Unknown peer "${peerId}". Add it with addPeer() first.`);
|
|
290
|
+
const resp = await fetch(`${url}/sync/message`, {
|
|
291
|
+
method: "POST",
|
|
292
|
+
headers: { "Content-Type": "application/json" },
|
|
293
|
+
body: JSON.stringify(message)
|
|
294
|
+
});
|
|
295
|
+
if (!resp.ok) {
|
|
296
|
+
throw new Error(`Sync message to ${peerId} failed: ${resp.status} ${resp.statusText}`);
|
|
297
|
+
}
|
|
298
|
+
const contentType = resp.headers.get("content-type");
|
|
299
|
+
if (contentType?.includes("application/json")) {
|
|
300
|
+
const reply = await resp.json();
|
|
301
|
+
if (reply && reply.type && this.messageHandler) {
|
|
302
|
+
await this.messageHandler(reply);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
onMessage(handler) {
|
|
307
|
+
this.messageHandler = handler;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Receive a message (called by the HTTP server handler).
|
|
311
|
+
*/
|
|
312
|
+
async receiveMessage(message) {
|
|
313
|
+
this.knownPeers.set(message.peerId, {
|
|
314
|
+
id: message.peerId,
|
|
315
|
+
name: message.peerId,
|
|
316
|
+
lastSeen: (/* @__PURE__ */ new Date()).toISOString()
|
|
317
|
+
});
|
|
318
|
+
if (this.messageHandler) {
|
|
319
|
+
await this.messageHandler(message);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
peers() {
|
|
323
|
+
return [...this.knownPeers.values()];
|
|
324
|
+
}
|
|
325
|
+
getLocalPeerId() {
|
|
326
|
+
return this.localPeerId;
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
function createSyncHandler(transport) {
|
|
330
|
+
return (req) => {
|
|
331
|
+
const url = new URL(req.url);
|
|
332
|
+
if (url.pathname === "/sync/message" && req.method === "POST") {
|
|
333
|
+
return new Response(
|
|
334
|
+
req.json().then(async (body) => {
|
|
335
|
+
await transport.receiveMessage(body);
|
|
336
|
+
return JSON.stringify({ ok: true });
|
|
337
|
+
}),
|
|
338
|
+
{ headers: { "Content-Type": "application/json" } }
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
if (url.pathname === "/sync/peers" && req.method === "GET") {
|
|
342
|
+
return new Response(
|
|
343
|
+
JSON.stringify({
|
|
344
|
+
localPeerId: transport.getLocalPeerId(),
|
|
345
|
+
peers: transport.peers()
|
|
346
|
+
}),
|
|
347
|
+
{ headers: { "Content-Type": "application/json" } }
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
return null;
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// src/sync/ws-transport.ts
|
|
355
|
+
var WebSocketSyncTransport = class {
|
|
356
|
+
localPeerId;
|
|
357
|
+
connections = /* @__PURE__ */ new Map();
|
|
358
|
+
knownPeers = /* @__PURE__ */ new Map();
|
|
359
|
+
messageHandler = null;
|
|
360
|
+
constructor(localPeerId) {
|
|
361
|
+
this.localPeerId = localPeerId;
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Connect to a remote peer's WebSocket endpoint.
|
|
365
|
+
*/
|
|
366
|
+
async connect(peerId, url, name) {
|
|
367
|
+
return new Promise((resolve, reject) => {
|
|
368
|
+
const ws = new WebSocket(url);
|
|
369
|
+
ws.onopen = () => {
|
|
370
|
+
this.connections.set(peerId, ws);
|
|
371
|
+
this.knownPeers.set(peerId, {
|
|
372
|
+
id: peerId,
|
|
373
|
+
name: name ?? peerId,
|
|
374
|
+
lastSeen: (/* @__PURE__ */ new Date()).toISOString()
|
|
375
|
+
});
|
|
376
|
+
resolve();
|
|
377
|
+
};
|
|
378
|
+
ws.onmessage = async (event) => {
|
|
379
|
+
try {
|
|
380
|
+
const msg = JSON.parse(String(event.data));
|
|
381
|
+
this.knownPeers.set(msg.peerId, {
|
|
382
|
+
id: msg.peerId,
|
|
383
|
+
name: msg.peerId,
|
|
384
|
+
lastSeen: (/* @__PURE__ */ new Date()).toISOString()
|
|
385
|
+
});
|
|
386
|
+
if (this.messageHandler) {
|
|
387
|
+
await this.messageHandler(msg);
|
|
388
|
+
}
|
|
389
|
+
} catch {
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
ws.onclose = () => {
|
|
393
|
+
this.connections.delete(peerId);
|
|
394
|
+
};
|
|
395
|
+
ws.onerror = (err) => {
|
|
396
|
+
reject(new Error(`WebSocket connection to ${peerId} failed`));
|
|
397
|
+
};
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Accept an incoming WebSocket connection (server side).
|
|
402
|
+
*/
|
|
403
|
+
acceptConnection(peerId, ws) {
|
|
404
|
+
this.connections.set(peerId, ws);
|
|
405
|
+
this.knownPeers.set(peerId, {
|
|
406
|
+
id: peerId,
|
|
407
|
+
name: peerId,
|
|
408
|
+
lastSeen: (/* @__PURE__ */ new Date()).toISOString()
|
|
409
|
+
});
|
|
410
|
+
ws.onmessage = async (event) => {
|
|
411
|
+
try {
|
|
412
|
+
const msg = JSON.parse(String(event.data));
|
|
413
|
+
this.knownPeers.set(msg.peerId, {
|
|
414
|
+
id: msg.peerId,
|
|
415
|
+
name: msg.peerId,
|
|
416
|
+
lastSeen: (/* @__PURE__ */ new Date()).toISOString()
|
|
417
|
+
});
|
|
418
|
+
if (this.messageHandler) {
|
|
419
|
+
await this.messageHandler(msg);
|
|
420
|
+
}
|
|
421
|
+
} catch {
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
ws.onclose = () => {
|
|
425
|
+
this.connections.delete(peerId);
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
async send(peerId, message) {
|
|
429
|
+
const ws = this.connections.get(peerId);
|
|
430
|
+
if (!ws || ws.readyState !== WebSocket.OPEN) {
|
|
431
|
+
throw new Error(`No open connection to peer "${peerId}".`);
|
|
432
|
+
}
|
|
433
|
+
ws.send(JSON.stringify(message));
|
|
434
|
+
}
|
|
435
|
+
onMessage(handler) {
|
|
436
|
+
this.messageHandler = handler;
|
|
437
|
+
}
|
|
438
|
+
peers() {
|
|
439
|
+
return [...this.knownPeers.values()];
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Disconnect from a peer.
|
|
443
|
+
*/
|
|
444
|
+
disconnect(peerId) {
|
|
445
|
+
const ws = this.connections.get(peerId);
|
|
446
|
+
if (ws) {
|
|
447
|
+
ws.close();
|
|
448
|
+
this.connections.delete(peerId);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Disconnect from all peers.
|
|
453
|
+
*/
|
|
454
|
+
disconnectAll() {
|
|
455
|
+
for (const [id, ws] of this.connections) {
|
|
456
|
+
ws.close();
|
|
457
|
+
}
|
|
458
|
+
this.connections.clear();
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Check if connected to a specific peer.
|
|
462
|
+
*/
|
|
463
|
+
isConnected(peerId) {
|
|
464
|
+
const ws = this.connections.get(peerId);
|
|
465
|
+
return ws !== void 0 && ws.readyState === WebSocket.OPEN;
|
|
466
|
+
}
|
|
467
|
+
getLocalPeerId() {
|
|
468
|
+
return this.localPeerId;
|
|
469
|
+
}
|
|
470
|
+
};
|
|
471
|
+
|
|
472
|
+
// src/sync/multi-repo.ts
|
|
473
|
+
var MultiRepoManager = class {
|
|
474
|
+
kernel;
|
|
475
|
+
constructor(kernel) {
|
|
476
|
+
this.kernel = kernel;
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Link a remote repository.
|
|
480
|
+
*/
|
|
481
|
+
async linkRepo(alias, location, description) {
|
|
482
|
+
const id = `repo:${alias}`;
|
|
483
|
+
const existing = this.kernel.getEntity(id);
|
|
484
|
+
if (existing) {
|
|
485
|
+
throw new Error(`Repo alias "${alias}" is already linked to "${existing.facts.find((f) => f.a === "location")?.v}".`);
|
|
486
|
+
}
|
|
487
|
+
await this.kernel.createEntity(id, "LinkedRepo", {
|
|
488
|
+
alias,
|
|
489
|
+
location,
|
|
490
|
+
...description ? { description } : {},
|
|
491
|
+
linkedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Unlink a remote repository.
|
|
496
|
+
*/
|
|
497
|
+
async unlinkRepo(alias) {
|
|
498
|
+
const id = `repo:${alias}`;
|
|
499
|
+
await this.kernel.deleteEntity(id);
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* List all linked repos.
|
|
503
|
+
*/
|
|
504
|
+
listLinkedRepos() {
|
|
505
|
+
const entities = this.kernel.listEntities("LinkedRepo");
|
|
506
|
+
return entities.map((e) => {
|
|
507
|
+
const get = (a) => e.facts.find((f) => f.a === a)?.v;
|
|
508
|
+
return {
|
|
509
|
+
alias: String(get("alias") ?? ""),
|
|
510
|
+
location: String(get("location") ?? ""),
|
|
511
|
+
description: get("description"),
|
|
512
|
+
linkedAt: String(get("linkedAt") ?? ""),
|
|
513
|
+
lastSyncedAt: get("lastSyncedAt")
|
|
514
|
+
};
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
/**
|
|
518
|
+
* Get a linked repo by alias.
|
|
519
|
+
*/
|
|
520
|
+
getLinkedRepo(alias) {
|
|
521
|
+
const entity = this.kernel.getEntity(`repo:${alias}`);
|
|
522
|
+
if (!entity) return null;
|
|
523
|
+
const get = (a) => entity.facts.find((f) => f.a === a)?.v;
|
|
524
|
+
return {
|
|
525
|
+
alias: String(get("alias") ?? ""),
|
|
526
|
+
location: String(get("location") ?? ""),
|
|
527
|
+
description: get("description"),
|
|
528
|
+
linkedAt: String(get("linkedAt") ?? ""),
|
|
529
|
+
lastSyncedAt: get("lastSyncedAt")
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Create a cross-repo link: entity in this repo → entity in remote repo.
|
|
534
|
+
*/
|
|
535
|
+
async addCrossRepoLink(sourceEntityId, attribute, targetRepoAlias, targetEntityId) {
|
|
536
|
+
const repo = this.getLinkedRepo(targetRepoAlias);
|
|
537
|
+
if (!repo) {
|
|
538
|
+
throw new Error(`Repo alias "${targetRepoAlias}" is not linked. Use linkRepo() first.`);
|
|
539
|
+
}
|
|
540
|
+
const crossRef = `@${targetRepoAlias}:${targetEntityId}`;
|
|
541
|
+
await this.kernel.addLink(sourceEntityId, attribute, crossRef);
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* Remove a cross-repo link.
|
|
545
|
+
*/
|
|
546
|
+
async removeCrossRepoLink(sourceEntityId, attribute, targetRepoAlias, targetEntityId) {
|
|
547
|
+
const crossRef = `@${targetRepoAlias}:${targetEntityId}`;
|
|
548
|
+
await this.kernel.removeLink(sourceEntityId, attribute, crossRef);
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* Find all cross-repo references from a given entity.
|
|
552
|
+
*/
|
|
553
|
+
getCrossRepoLinks(entityId) {
|
|
554
|
+
const store = this.kernel.getStore();
|
|
555
|
+
const links = store.getLinksByEntity(entityId);
|
|
556
|
+
const results = [];
|
|
557
|
+
for (const link of links) {
|
|
558
|
+
if (link.e1 !== entityId) continue;
|
|
559
|
+
const parsed = parseCrossRepoRef(link.e2);
|
|
560
|
+
if (parsed) {
|
|
561
|
+
results.push({ attribute: link.a, ref: parsed });
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
return results;
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Find all cross-repo references pointing to a specific remote entity.
|
|
568
|
+
*/
|
|
569
|
+
findReferencesTo(repoAlias, entityId) {
|
|
570
|
+
const crossRef = `@${repoAlias}:${entityId}`;
|
|
571
|
+
const store = this.kernel.getStore();
|
|
572
|
+
return store.getAllLinks().filter((l) => l.e2 === crossRef);
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* Update the lastSyncedAt timestamp for a linked repo.
|
|
576
|
+
*/
|
|
577
|
+
async markSynced(alias) {
|
|
578
|
+
await this.kernel.updateEntity(`repo:${alias}`, {
|
|
579
|
+
lastSyncedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
580
|
+
});
|
|
581
|
+
}
|
|
582
|
+
};
|
|
583
|
+
function parseCrossRepoRef(ref) {
|
|
584
|
+
if (!ref.startsWith("@")) return null;
|
|
585
|
+
const colonIdx = ref.indexOf(":", 1);
|
|
586
|
+
if (colonIdx === -1) return null;
|
|
587
|
+
return {
|
|
588
|
+
repoAlias: ref.slice(1, colonIdx),
|
|
589
|
+
entityId: ref.slice(colonIdx + 1)
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
function formatCrossRepoRef(repoAlias, entityId) {
|
|
593
|
+
return `@${repoAlias}:${entityId}`;
|
|
594
|
+
}
|
|
595
|
+
export {
|
|
596
|
+
DEFAULT_SNAPSHOT_MAX_OPS,
|
|
597
|
+
HttpSyncTransport,
|
|
598
|
+
MAX_SUPPORTED_VERSION,
|
|
599
|
+
MIN_SUPPORTED_VERSION,
|
|
600
|
+
MemoryRoomTransport,
|
|
601
|
+
MemorySyncRoom,
|
|
602
|
+
MemoryTransport,
|
|
603
|
+
MultiRepoManager,
|
|
604
|
+
PROTOCOL_VERSION,
|
|
605
|
+
PartyKitRoomTransport,
|
|
606
|
+
SyncEngine,
|
|
607
|
+
SyncRoomCore,
|
|
608
|
+
SyncRoomServer,
|
|
609
|
+
TrellisVcsSyncPeer,
|
|
610
|
+
WebSocketSyncTransport,
|
|
611
|
+
createPartyKitRoomHandler,
|
|
612
|
+
createSyncHandler,
|
|
613
|
+
findForkPoint,
|
|
614
|
+
formatCrossRepoRef,
|
|
615
|
+
parseCrossRepoRef,
|
|
616
|
+
reconcile
|
|
617
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { PeerId, SyncMessage, SyncMessageHandler, SyncTransport } from './types.js';
|
|
2
|
+
import { type SyncRoomAppendRejection, type SyncRoomAppendResult } from './room-core.js';
|
|
3
|
+
export type MemorySyncRoomAppendRejection = SyncRoomAppendRejection;
|
|
4
|
+
export type MemorySyncRoomAppendResult = SyncRoomAppendResult;
|
|
5
|
+
/**
|
|
6
|
+
* In-process room relay that models a PartyKit room for sync tests.
|
|
7
|
+
*
|
|
8
|
+
* The room keeps a canonical catch-up log, asks clients for missing ops,
|
|
9
|
+
* serves catch-up requests, and broadcasts newly accepted ops.
|
|
10
|
+
*/
|
|
11
|
+
export declare class MemorySyncRoom {
|
|
12
|
+
private core;
|
|
13
|
+
private transports;
|
|
14
|
+
constructor(roomId?: string, roomName?: string);
|
|
15
|
+
connectPeer(peerId: string, peerName?: string): MemoryRoomTransport;
|
|
16
|
+
disconnectPeer(peerId: string): void;
|
|
17
|
+
getRoomPeer(): PeerId;
|
|
18
|
+
peersFor(peerId: string): PeerId[];
|
|
19
|
+
getOps(): import("../index.js").VcsOp[];
|
|
20
|
+
getOpCount(): number;
|
|
21
|
+
receive(fromPeerId: string, message: SyncMessage): Promise<void>;
|
|
22
|
+
private deliver;
|
|
23
|
+
}
|
|
24
|
+
export declare class MemoryRoomTransport implements SyncTransport {
|
|
25
|
+
private room;
|
|
26
|
+
private peerId;
|
|
27
|
+
private peerName;
|
|
28
|
+
private handlers;
|
|
29
|
+
constructor(room: MemorySyncRoom, peerId: string, peerName?: string);
|
|
30
|
+
send(peerId: string, message: SyncMessage): Promise<void>;
|
|
31
|
+
onMessage(handler: SyncMessageHandler): void;
|
|
32
|
+
peers(): PeerId[];
|
|
33
|
+
getPeerId(): string;
|
|
34
|
+
getPeerName(): string;
|
|
35
|
+
deliver(message: SyncMessage): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=memory-room.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-room.d.ts","sourceRoot":"","sources":["../../src/sync/memory-room.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,WAAW,EACX,kBAAkB,EAClB,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,6BAA6B,GAAG,uBAAuB,CAAC;AACpE,MAAM,MAAM,0BAA0B,GAAG,oBAAoB,CAAC;AAE9D;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,UAAU,CAA0C;gBAEhD,MAAM,SAAS,EAAE,QAAQ,SAAS;IAI9C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAS,GAAG,mBAAmB;IAOnE,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKpC,WAAW,IAAI,MAAM;IAIrB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAIlC,MAAM;IAIN,UAAU,IAAI,MAAM;IAId,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;YAOxD,OAAO;CAOtB;AAED,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAA4B;gBAEhC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAS;IAM7D,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/D,SAAS,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAI5C,KAAK,IAAI,MAAM,EAAE;IAIjB,SAAS,IAAI,MAAM;IAInB,WAAW,IAAI,MAAM;IAIf,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAKnD"}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* In-Memory Sync Transport
|
|
3
3
|
*
|
|
4
4
|
* A simple in-memory transport for testing and local multi-engine sync.
|
|
5
|
-
* Messages are delivered
|
|
5
|
+
* Messages are delivered in-process and await each peer handler.
|
|
6
6
|
*/
|
|
7
|
-
import type { SyncTransport, SyncMessage, PeerId } from './types.js';
|
|
7
|
+
import type { SyncTransport, SyncMessage, SyncMessageHandler, PeerId } from './types.js';
|
|
8
8
|
export declare class MemoryTransport implements SyncTransport {
|
|
9
9
|
private peerId;
|
|
10
10
|
private peerName;
|
|
@@ -20,7 +20,7 @@ export declare class MemoryTransport implements SyncTransport {
|
|
|
20
20
|
*/
|
|
21
21
|
static disconnect(a: MemoryTransport, b: MemoryTransport): void;
|
|
22
22
|
send(peerId: string, message: SyncMessage): Promise<void>;
|
|
23
|
-
onMessage(handler:
|
|
23
|
+
onMessage(handler: SyncMessageHandler): void;
|
|
24
24
|
peers(): PeerId[];
|
|
25
25
|
getPeerId(): string;
|
|
26
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-transport.d.ts","sourceRoot":"","sources":["../../src/sync/memory-transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"memory-transport.d.ts","sourceRoot":"","sources":["../../src/sync/memory-transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,MAAM,EACP,MAAM,YAAY,CAAC;AAMpB,qBAAa,eAAgB,YAAW,aAAa;IACnD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,cAAc,CAA2C;gBAErD,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAe;IAKrD;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,eAAe,GAAG,IAAI;IAK5D;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,eAAe,GAAG,IAAI;IAKzD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/D,SAAS,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAI5C,KAAK,IAAI,MAAM,EAAE;IAOjB,SAAS,IAAI,MAAM;CAGpB"}
|