@edryslabs/genericprovider 1.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 +24 -0
- package/README.md +660 -0
- package/dist/index.d.ts +323 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1001 -0
- package/dist/index.js.map +1 -0
- package/dist/lib.d.ts +36 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +37 -0
- package/dist/lib.js.map +1 -0
- package/dist/providers/dummy/index.d.ts +226 -0
- package/dist/providers/dummy/index.d.ts.map +1 -0
- package/dist/providers/dummy/index.js +326 -0
- package/dist/providers/dummy/index.js.map +1 -0
- package/dist/providers/gun/index.d.ts +269 -0
- package/dist/providers/gun/index.d.ts.map +1 -0
- package/dist/providers/gun/index.js +683 -0
- package/dist/providers/gun/index.js.map +1 -0
- package/dist/providers/indexeddb/index.d.ts +161 -0
- package/dist/providers/indexeddb/index.d.ts.map +1 -0
- package/dist/providers/indexeddb/index.js +369 -0
- package/dist/providers/indexeddb/index.js.map +1 -0
- package/dist/providers/matrix/index.d.ts +109 -0
- package/dist/providers/matrix/index.d.ts.map +1 -0
- package/dist/providers/matrix/index.js +329 -0
- package/dist/providers/matrix/index.js.map +1 -0
- package/dist/providers/nostr/index.d.ts +172 -0
- package/dist/providers/nostr/index.d.ts.map +1 -0
- package/dist/providers/nostr/index.js +280 -0
- package/dist/providers/nostr/index.js.map +1 -0
- package/dist/providers/peerjs/index.d.ts +231 -0
- package/dist/providers/peerjs/index.d.ts.map +1 -0
- package/dist/providers/peerjs/index.js +1038 -0
- package/dist/providers/peerjs/index.js.map +1 -0
- package/dist/providers/pubnub/index.d.ts +106 -0
- package/dist/providers/pubnub/index.d.ts.map +1 -0
- package/dist/providers/pubnub/index.js +357 -0
- package/dist/providers/pubnub/index.js.map +1 -0
- package/dist/providers/simple-peer/index.d.ts +253 -0
- package/dist/providers/simple-peer/index.d.ts.map +1 -0
- package/dist/providers/simple-peer/index.js +783 -0
- package/dist/providers/simple-peer/index.js.map +1 -0
- package/dist/providers/supabase/index.d.ts +80 -0
- package/dist/providers/supabase/index.d.ts.map +1 -0
- package/dist/providers/supabase/index.js +202 -0
- package/dist/providers/supabase/index.js.map +1 -0
- package/dist/providers/trystero/index.d.ts +181 -0
- package/dist/providers/trystero/index.d.ts.map +1 -0
- package/dist/providers/trystero/index.js +187 -0
- package/dist/providers/trystero/index.js.map +1 -0
- package/dist/providers/websocket/index.d.ts +92 -0
- package/dist/providers/websocket/index.d.ts.map +1 -0
- package/dist/providers/websocket/index.js +272 -0
- package/dist/providers/websocket/index.js.map +1 -0
- package/dist/sync-monitor.d.ts +90 -0
- package/dist/sync-monitor.d.ts.map +1 -0
- package/dist/sync-monitor.js +149 -0
- package/dist/sync-monitor.js.map +1 -0
- package/dist/transport.d.ts +116 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +2 -0
- package/dist/transport.js.map +1 -0
- package/package.json +137 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SimplePeer Transport Provider
|
|
3
|
+
*
|
|
4
|
+
* Peer-to-peer transport using WebRTC data channels with simple-peer library.
|
|
5
|
+
* Connects directly to other clients without going through a central server.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Direct peer-to-peer connections
|
|
9
|
+
* - Mesh network (each peer connects to multiple others)
|
|
10
|
+
* - Uses signaling server only for peer discovery (not for data)
|
|
11
|
+
* - Optional encryption
|
|
12
|
+
* - Automatic connection management
|
|
13
|
+
* - Resilient to peer disconnections
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* import { GenericProvider } from 'y-generic'
|
|
18
|
+
* import { SimplePeerTransport } from 'y-generic/providers/simple-peer'
|
|
19
|
+
* import Peer from 'simple-peer'
|
|
20
|
+
*
|
|
21
|
+
* const doc = new Y.Doc()
|
|
22
|
+
* const transport = new SimplePeerTransport({
|
|
23
|
+
* peer: Peer, // Pass the simple-peer constructor
|
|
24
|
+
* signaling: ['wss://signaling.example.com'],
|
|
25
|
+
* password: 'optional-encryption-key'
|
|
26
|
+
* })
|
|
27
|
+
* const provider = new GenericProvider(doc, transport)
|
|
28
|
+
* await provider.connect({ room: 'my-room' })
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
import type { Transport, ConnectionConfig } from '../../transport';
|
|
32
|
+
/**
|
|
33
|
+
* SimplePeer constructor type (from simple-peer library).
|
|
34
|
+
*/
|
|
35
|
+
export type SimplePeerConstructor = any;
|
|
36
|
+
/**
|
|
37
|
+
* ICE server configuration for STUN/TURN servers.
|
|
38
|
+
* Used to establish WebRTC connections through NAT/firewalls.
|
|
39
|
+
*/
|
|
40
|
+
export interface IceServer {
|
|
41
|
+
/**
|
|
42
|
+
* STUN/TURN server URLs.
|
|
43
|
+
* @example ['stun:stun.l.google.com:19302']
|
|
44
|
+
* @example ['turn:turn.example.com:3478']
|
|
45
|
+
*/
|
|
46
|
+
urls: string | string[];
|
|
47
|
+
/**
|
|
48
|
+
* Username for TURN server authentication.
|
|
49
|
+
*/
|
|
50
|
+
username?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Credential for TURN server authentication.
|
|
53
|
+
*/
|
|
54
|
+
credential?: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Configuration options for SimplePeer transport.
|
|
58
|
+
*/
|
|
59
|
+
export interface SimplePeerTransportOptions {
|
|
60
|
+
/**
|
|
61
|
+
* The simple-peer library constructor.
|
|
62
|
+
* Users must provide this to avoid bundling the library.
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* import Peer from 'simple-peer'
|
|
66
|
+
* const transport = new SimplePeerTransport({ peer: Peer })
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
peer: SimplePeerConstructor;
|
|
70
|
+
/**
|
|
71
|
+
* Array of signaling server URLs for peer discovery.
|
|
72
|
+
* Signaling servers are only used to discover peers, not for data transfer.
|
|
73
|
+
* @default ['wss://signaling.yjs.dev']
|
|
74
|
+
*/
|
|
75
|
+
signaling?: string[];
|
|
76
|
+
/**
|
|
77
|
+
* ICE servers for STUN/TURN configuration.
|
|
78
|
+
* Used to establish WebRTC connections through NAT/firewalls.
|
|
79
|
+
* @default [{ urls: 'stun:stun.l.google.com:19302' }]
|
|
80
|
+
* @example
|
|
81
|
+
* ```typescript
|
|
82
|
+
* iceServers: [
|
|
83
|
+
* { urls: 'stun:stun.l.google.com:19302' },
|
|
84
|
+
* {
|
|
85
|
+
* urls: 'turn:turn.example.com:3478',
|
|
86
|
+
* username: 'user',
|
|
87
|
+
* credential: 'pass'
|
|
88
|
+
* }
|
|
89
|
+
* ]
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
iceServers?: IceServer[];
|
|
93
|
+
/**
|
|
94
|
+
* Optional password for encrypting messages.
|
|
95
|
+
* When provided, all messages are encrypted before sending.
|
|
96
|
+
* @default undefined
|
|
97
|
+
*/
|
|
98
|
+
password?: string;
|
|
99
|
+
/**
|
|
100
|
+
* Maximum number of WebRTC peer connections.
|
|
101
|
+
* Too many connections can overwhelm the browser.
|
|
102
|
+
* @default 20 + random(0-15)
|
|
103
|
+
*/
|
|
104
|
+
maxConns?: number;
|
|
105
|
+
/**
|
|
106
|
+
* Options passed to simple-peer.
|
|
107
|
+
* See https://github.com/feross/simple-peer#api
|
|
108
|
+
* Note: iceServers will be merged into peerOpts.config if not already present
|
|
109
|
+
* @default {}
|
|
110
|
+
*/
|
|
111
|
+
peerOpts?: Record<string, any>;
|
|
112
|
+
/**
|
|
113
|
+
* Enable debug logging.
|
|
114
|
+
* @default false
|
|
115
|
+
*/
|
|
116
|
+
debug?: boolean;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* SimplePeer transport implementation using simple-peer library.
|
|
120
|
+
* Creates direct peer-to-peer connections for data transfer.
|
|
121
|
+
*/
|
|
122
|
+
export declare class SimplePeerTransport implements Transport {
|
|
123
|
+
private options;
|
|
124
|
+
private _connected;
|
|
125
|
+
private _room;
|
|
126
|
+
private _callback?;
|
|
127
|
+
private _peerConnectCallbacks;
|
|
128
|
+
private _peerDisconnectCallbacks;
|
|
129
|
+
private _controlCallbacks;
|
|
130
|
+
private peerId;
|
|
131
|
+
private peers;
|
|
132
|
+
private signalingConns;
|
|
133
|
+
private announcedPeers;
|
|
134
|
+
private announceInterval?;
|
|
135
|
+
/**
|
|
136
|
+
* Create a new SimplePeer transport.
|
|
137
|
+
*
|
|
138
|
+
* @param options - Configuration options (must include peer constructor)
|
|
139
|
+
*/
|
|
140
|
+
constructor(options: SimplePeerTransportOptions);
|
|
141
|
+
/**
|
|
142
|
+
* Connect to the room via signaling servers and start discovering peers.
|
|
143
|
+
*/
|
|
144
|
+
connect(config: ConnectionConfig): Promise<void>;
|
|
145
|
+
/**
|
|
146
|
+
* Disconnect from all peers and signaling servers.
|
|
147
|
+
*/
|
|
148
|
+
disconnect(): void;
|
|
149
|
+
/**
|
|
150
|
+
* Send data to all connected peers.
|
|
151
|
+
* Large messages are automatically chunked to fit within WebRTC DataChannel limits.
|
|
152
|
+
*/
|
|
153
|
+
send(data: Uint8Array): void;
|
|
154
|
+
/**
|
|
155
|
+
* Send data to a single connected peer by ID (targeted delivery).
|
|
156
|
+
*/
|
|
157
|
+
sendTo(peerId: string, data: Uint8Array): void;
|
|
158
|
+
/**
|
|
159
|
+
* Send data to a single peer, chunking if necessary.
|
|
160
|
+
* Uses flow control to avoid overwhelming the WebRTC buffer.
|
|
161
|
+
*/
|
|
162
|
+
private sendToPeer;
|
|
163
|
+
/**
|
|
164
|
+
* Send chunks with backpressure handling.
|
|
165
|
+
* Waits for buffer to drain before sending more data.
|
|
166
|
+
*/
|
|
167
|
+
private sendChunksWithFlowControl;
|
|
168
|
+
/**
|
|
169
|
+
* Register callback for incoming messages.
|
|
170
|
+
*/
|
|
171
|
+
onMessage(callback: (data: Uint8Array) => void): () => void;
|
|
172
|
+
/**
|
|
173
|
+
* Register callback for new peer data-channel connections.
|
|
174
|
+
*/
|
|
175
|
+
onPeerConnect(callback: (peerId: string) => void): () => void;
|
|
176
|
+
/**
|
|
177
|
+
* Register callback for peer disconnects (channel close or error). Only fires
|
|
178
|
+
* for peers that had reached the connected state.
|
|
179
|
+
*/
|
|
180
|
+
onPeerDisconnect(callback: (peerId: string) => void): () => void;
|
|
181
|
+
/**
|
|
182
|
+
* Register callback for consumer control frames (MSG_TYPE_CONTROL).
|
|
183
|
+
* These bypass the provider pipe — use for per-peer handshakes/auth.
|
|
184
|
+
*/
|
|
185
|
+
onControlFrame(callback: (peerId: string, payload: Uint8Array) => void): () => void;
|
|
186
|
+
/**
|
|
187
|
+
* Tear down a single peer connection (e.g. to reject a peer that failed an
|
|
188
|
+
* out-of-band handshake). Fires onPeerDisconnect if the peer was connected.
|
|
189
|
+
*/
|
|
190
|
+
disconnectPeer(peerId: string): void;
|
|
191
|
+
/**
|
|
192
|
+
* Send a control frame to a single peer. Not chunked or encrypted — keep
|
|
193
|
+
* payloads small (they must fit one DataChannel message).
|
|
194
|
+
*/
|
|
195
|
+
sendControl(peerId: string, payload: Uint8Array): void;
|
|
196
|
+
/**
|
|
197
|
+
* Check if connected.
|
|
198
|
+
*/
|
|
199
|
+
get isConnected(): boolean;
|
|
200
|
+
/**
|
|
201
|
+
* Get number of connected peers (for debugging).
|
|
202
|
+
*/
|
|
203
|
+
get connectedPeers(): number;
|
|
204
|
+
/**
|
|
205
|
+
* Connect to a signaling server.
|
|
206
|
+
*/
|
|
207
|
+
private connectSignaling;
|
|
208
|
+
/**
|
|
209
|
+
* Handle messages from signaling server.
|
|
210
|
+
*/
|
|
211
|
+
private handleSignalingMessage;
|
|
212
|
+
/**
|
|
213
|
+
* Send message to signaling server.
|
|
214
|
+
*/
|
|
215
|
+
private sendSignaling;
|
|
216
|
+
/**
|
|
217
|
+
* Broadcast message to all signaling servers.
|
|
218
|
+
*/
|
|
219
|
+
private broadcastSignaling;
|
|
220
|
+
/**
|
|
221
|
+
* Create a WebRTC peer connection.
|
|
222
|
+
*/
|
|
223
|
+
private createPeerConnection;
|
|
224
|
+
/**
|
|
225
|
+
* Handle WebRTC signal from peer.
|
|
226
|
+
*/
|
|
227
|
+
private handlePeerSignal;
|
|
228
|
+
/**
|
|
229
|
+
* Remove and cleanup a peer connection.
|
|
230
|
+
*/
|
|
231
|
+
private removePeer;
|
|
232
|
+
/**
|
|
233
|
+
* Generate a unique peer ID.
|
|
234
|
+
*/
|
|
235
|
+
private generatePeerId;
|
|
236
|
+
/**
|
|
237
|
+
* Simple XOR encryption (not cryptographically secure, just obfuscation).
|
|
238
|
+
*/
|
|
239
|
+
private encrypt;
|
|
240
|
+
/**
|
|
241
|
+
* Simple XOR decryption.
|
|
242
|
+
*/
|
|
243
|
+
private decrypt;
|
|
244
|
+
/**
|
|
245
|
+
* Hash password to key.
|
|
246
|
+
*/
|
|
247
|
+
private hashPassword;
|
|
248
|
+
/**
|
|
249
|
+
* Log debug messages if enabled.
|
|
250
|
+
*/
|
|
251
|
+
private log;
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/simple-peer/index.ts"],"names":[],"mappings":"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"}
|