dropspace 0.0.0-stage → 0.1.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.
Files changed (67) hide show
  1. package/README.md +17 -2
  2. package/dist/automerge/index.d.ts +108 -0
  3. package/dist/automerge/index.d.ts.map +1 -0
  4. package/dist/automerge/index.js +437 -0
  5. package/dist/automerge/index.js.map +1 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +372 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/client/channel.d.ts +153 -0
  11. package/dist/client/channel.d.ts.map +1 -0
  12. package/dist/client/channel.js +704 -0
  13. package/dist/client/channel.js.map +1 -0
  14. package/dist/client/client.d.ts +376 -0
  15. package/dist/client/client.d.ts.map +1 -0
  16. package/dist/client/client.js +1421 -0
  17. package/dist/client/client.js.map +1 -0
  18. package/dist/client/events.d.ts +14 -0
  19. package/dist/client/events.d.ts.map +1 -0
  20. package/dist/client/events.js +71 -0
  21. package/dist/client/events.js.map +1 -0
  22. package/dist/client/identity.d.ts +89 -0
  23. package/dist/client/identity.d.ts.map +1 -0
  24. package/dist/client/identity.js +274 -0
  25. package/dist/client/identity.js.map +1 -0
  26. package/dist/client/index.d.ts +8 -0
  27. package/dist/client/index.d.ts.map +1 -0
  28. package/dist/client/index.js +8 -0
  29. package/dist/client/index.js.map +1 -0
  30. package/dist/client/peer-connection.d.ts +190 -0
  31. package/dist/client/peer-connection.d.ts.map +1 -0
  32. package/dist/client/peer-connection.js +647 -0
  33. package/dist/client/peer-connection.js.map +1 -0
  34. package/dist/client/peer-selection.d.ts +70 -0
  35. package/dist/client/peer-selection.d.ts.map +1 -0
  36. package/dist/client/peer-selection.js +193 -0
  37. package/dist/client/peer-selection.js.map +1 -0
  38. package/dist/client/storage.d.ts +118 -0
  39. package/dist/client/storage.d.ts.map +1 -0
  40. package/dist/client/storage.js +463 -0
  41. package/dist/client/storage.js.map +1 -0
  42. package/dist/files/index.d.ts +140 -0
  43. package/dist/files/index.d.ts.map +1 -0
  44. package/dist/files/index.js +751 -0
  45. package/dist/files/index.js.map +1 -0
  46. package/dist/files/sha256.d.ts +24 -0
  47. package/dist/files/sha256.d.ts.map +1 -0
  48. package/dist/files/sha256.js +147 -0
  49. package/dist/files/sha256.js.map +1 -0
  50. package/dist/index.d.ts +4 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +4 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/protocol/envelope.d.ts +61 -0
  55. package/dist/protocol/envelope.d.ts.map +1 -0
  56. package/dist/protocol/envelope.js +268 -0
  57. package/dist/protocol/envelope.js.map +1 -0
  58. package/dist/protocol/framing.d.ts +69 -0
  59. package/dist/protocol/framing.d.ts.map +1 -0
  60. package/dist/protocol/framing.js +145 -0
  61. package/dist/protocol/framing.js.map +1 -0
  62. package/dist/protocol/index.d.ts +3 -0
  63. package/dist/protocol/index.d.ts.map +1 -0
  64. package/dist/protocol/index.js +3 -0
  65. package/dist/protocol/index.js.map +1 -0
  66. package/fixtures/envelopes.json +132 -0
  67. package/package.json +51 -4
@@ -0,0 +1,190 @@
1
+ import type { SignalingEnvelope } from "../protocol/index.js";
2
+ import { TypedEventEmitter } from "./events.js";
3
+ import { PeerChannelMultiplexer, type DataChannelLike } from "./channel.js";
4
+ export type PeerConnectionLifecycleState = "idle" | "waiting_for_peer" | "connecting" | "connected" | "reconnecting" | "failed" | "closed";
5
+ export interface RtcSessionDescriptionInitLike {
6
+ type: "offer" | "answer" | "pranswer" | "rollback";
7
+ sdp?: string;
8
+ }
9
+ export interface RtcIceCandidateInitLike {
10
+ candidate: string;
11
+ sdpMid?: string | null;
12
+ sdpMLineIndex?: number | null;
13
+ usernameFragment?: string | null;
14
+ }
15
+ export interface RtcPeerConnectionLike {
16
+ signalingState: string;
17
+ connectionState: string;
18
+ iceConnectionState: string;
19
+ localDescription: {
20
+ type: string;
21
+ sdp: string;
22
+ } | null;
23
+ remoteDescription: {
24
+ type: string;
25
+ sdp: string;
26
+ } | null;
27
+ createDataChannel(label: string, options?: {
28
+ ordered?: boolean;
29
+ }): DataChannelLike;
30
+ createOffer(options?: {
31
+ iceRestart?: boolean;
32
+ }): Promise<{
33
+ type: string;
34
+ sdp?: string;
35
+ }>;
36
+ createAnswer(): Promise<{
37
+ type: string;
38
+ sdp?: string;
39
+ }>;
40
+ setLocalDescription(desc?: RtcSessionDescriptionInitLike): Promise<void>;
41
+ setRemoteDescription(desc: RtcSessionDescriptionInitLike): Promise<void>;
42
+ addIceCandidate(candidate?: RtcIceCandidateInitLike | null): Promise<void>;
43
+ restartIce?(): void;
44
+ getStats?(): Promise<Map<string, any> | Array<any>>;
45
+ close(): void;
46
+ addEventListener(type: string, listener: (ev: any) => void): void;
47
+ removeEventListener(type: string, listener: (ev: any) => void): void;
48
+ }
49
+ export type PeerConnectionFactory = (config: {
50
+ iceServers: Array<{
51
+ urls: string | string[];
52
+ username?: string;
53
+ credential?: string;
54
+ }>;
55
+ iceTransportPolicy?: "all" | "relay";
56
+ }) => RtcPeerConnectionLike;
57
+ export interface ManagedPeerSessionOptions {
58
+ localDeviceId: string;
59
+ remoteDeviceId: string;
60
+ spaceId: string;
61
+ polite: boolean;
62
+ createPeerConnection: PeerConnectionFactory;
63
+ getIceServers: () => Promise<Array<{
64
+ urls: string | string[];
65
+ username?: string;
66
+ credential?: string;
67
+ }>>;
68
+ sendSignaling: (type: "webrtc.offer" | "webrtc.answer" | "webrtc.ice_candidate" | "webrtc.ice_restart" | "webrtc.close", connectionId: string, generation: number, payload: Record<string, unknown>) => Promise<void>;
69
+ iceTransportPolicy?: "all" | "relay";
70
+ disconnectGracePeriodMs?: number;
71
+ iceRestartTimeoutMs?: number;
72
+ connectTimeoutMs?: number;
73
+ maxReconnectAttempts?: number;
74
+ baseBackoffMs?: number;
75
+ maxBackoffMs?: number;
76
+ }
77
+ export type ManagedPeerSessionEvents = {
78
+ stateChange: {
79
+ peerDeviceId: string;
80
+ previousState: PeerConnectionLifecycleState;
81
+ state: PeerConnectionLifecycleState;
82
+ generation: number;
83
+ connectionId: string;
84
+ reason: string;
85
+ };
86
+ staleSignalDropped: {
87
+ peerDeviceId: string;
88
+ signalType: string;
89
+ signalGeneration: number;
90
+ currentGeneration: number;
91
+ signalConnectionId?: string;
92
+ currentConnectionId: string;
93
+ };
94
+ offerCollisionHandled: {
95
+ peerDeviceId: string;
96
+ polite: boolean;
97
+ action: "rolled_back" | "ignored_incoming";
98
+ generation: number;
99
+ };
100
+ routeSelected: {
101
+ peerDeviceId: string;
102
+ candidateType: "direct" | "relay" | "unknown";
103
+ protocol?: string;
104
+ rttMs?: number;
105
+ };
106
+ reconnectAttempt: {
107
+ peerDeviceId: string;
108
+ attempt: number;
109
+ strategy: "ice_restart" | "new_pc";
110
+ delayMs: number;
111
+ };
112
+ error: Error;
113
+ };
114
+ /**
115
+ * Manages the WebRTC RTCPeerConnection & RTCDataChannel lifecycle for a single remote peer,
116
+ * including Perfect Negotiation (offer collision resolution), generation-scoped signaling,
117
+ * transient disconnect grace period, ICE restart, and coalesced exponential-backoff reconnection.
118
+ */
119
+ export declare class ManagedPeerSession {
120
+ private readonly options;
121
+ readonly events: TypedEventEmitter<ManagedPeerSessionEvents>;
122
+ readonly multiplexer: PeerChannelMultiplexer;
123
+ private state;
124
+ private pc;
125
+ private dc;
126
+ private generation;
127
+ private connectionId;
128
+ private makingOffer;
129
+ private ignoreOffer;
130
+ private isSettingRemoteAnswerPending;
131
+ private pendingRemoteCandidates;
132
+ private manuallyClosed;
133
+ private reconnectAttempts;
134
+ private reconnectPromise;
135
+ private graceTimer;
136
+ private iceRestartTimer;
137
+ private connectTimeoutTimer;
138
+ private reconnectBackoffTimer;
139
+ private boundIceCandidateListener;
140
+ private boundConnectionStateListener;
141
+ private boundDataChannelListener;
142
+ private boundDcOpenListener;
143
+ private boundDcCloseListener;
144
+ private connectPromise;
145
+ staleSignalsDropped: number;
146
+ offerCollisionsHandled: number;
147
+ totalReconnectCount: number;
148
+ selectedRouteType: "direct" | "relay" | "unknown";
149
+ constructor(options: ManagedPeerSessionOptions);
150
+ getState(): PeerConnectionLifecycleState;
151
+ getGeneration(): number;
152
+ getConnectionId(): string;
153
+ isManuallyClosed(): boolean;
154
+ private transitionState;
155
+ /**
156
+ * Initiates or re-initiates a connection to the peer.
157
+ * Coalesces concurrent calls while connecting or reconnecting.
158
+ */
159
+ connect(reason?: string): Promise<void>;
160
+ /**
161
+ * Tears down any existing (potentially stale) RTCPeerConnection and immediately
162
+ * starts a fresh connection generation.
163
+ */
164
+ forceReconnect(reason?: string): Promise<void>;
165
+ private armConnectTimeout;
166
+ setWaitingForPeer(reason?: string): void;
167
+ private setupNewPeerConnection;
168
+ private bindDataChannel;
169
+ private performOffer;
170
+ /**
171
+ * Handles incoming WebRTC signaling envelopes (`webrtc.offer`, `webrtc.answer`, `webrtc.ice_candidate`, `webrtc.close`).
172
+ * Enforces monotonic generation and Perfect Negotiation offer-collision resolution.
173
+ */
174
+ handleSignalingEnvelope(envelope: SignalingEnvelope): Promise<void>;
175
+ private flushPendingCandidates;
176
+ private handleTransportStateChange;
177
+ /**
178
+ * Schedules a coalesced reconnect attempt with exponential backoff + jitter.
179
+ * First attempts an in-place ICE restart if a PC exists; otherwise creates a new RTCPeerConnection.
180
+ */
181
+ scheduleReconnect(reason: string): Promise<void>;
182
+ private inspectSelectedRoute;
183
+ private clearTimers;
184
+ private teardownPeerConnectionOnly;
185
+ /**
186
+ * Explicitly closes the peer connection and disables automatic reconnection.
187
+ */
188
+ close(notifyRemote?: boolean): void;
189
+ }
190
+ //# sourceMappingURL=peer-connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-connection.d.ts","sourceRoot":"","sources":["../../src/client/peer-connection.ts"],"names":[],"mappings":"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"}