y-openrtc 2.0.1 → 2.2.0
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/README.md +6 -6
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/provider.d.ts +6 -6
- package/dist/provider.js +7 -7
- package/dist/roomName.d.ts +1 -1
- package/dist/roomName.js +1 -1
- package/dist/roomRuntime.d.ts +2 -2
- package/dist/roomRuntime.js +1 -1
- package/dist/runtimePool.d.ts +2 -2
- package/dist/types.d.ts +5 -5
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ pnpm add y-openrtc yjs
|
|
|
13
13
|
```ts
|
|
14
14
|
import * as Y from 'yjs';
|
|
15
15
|
import { OpenRTC } from 'openrtc';
|
|
16
|
-
import {
|
|
16
|
+
import { YProvider } from 'y-openrtc';
|
|
17
17
|
|
|
18
18
|
const rtc = OpenRTC({ apiKey: '<your public OpenRTC API key>' });
|
|
19
19
|
const room = await rtc.rooms.join('my-room', {
|
|
@@ -21,7 +21,7 @@ const room = await rtc.rooms.join('my-room', {
|
|
|
21
21
|
membership: 'ephemeral',
|
|
22
22
|
});
|
|
23
23
|
const doc = new Y.Doc();
|
|
24
|
-
const provider = new
|
|
24
|
+
const provider = new YProvider('my-room', doc, {
|
|
25
25
|
room,
|
|
26
26
|
});
|
|
27
27
|
```
|
|
@@ -31,7 +31,7 @@ const provider = new OpenrtcProvider('my-room', doc, {
|
|
|
31
31
|
```ts
|
|
32
32
|
import * as Y from 'yjs';
|
|
33
33
|
import { OpenRTC } from 'openrtc';
|
|
34
|
-
import {
|
|
34
|
+
import { YProvider } from 'y-openrtc';
|
|
35
35
|
|
|
36
36
|
const room = await rtc.rooms.join('private-room', {
|
|
37
37
|
access: 'authenticated',
|
|
@@ -39,7 +39,7 @@ const room = await rtc.rooms.join('private-room', {
|
|
|
39
39
|
});
|
|
40
40
|
|
|
41
41
|
const doc = new Y.Doc();
|
|
42
|
-
const provider = new
|
|
42
|
+
const provider = new YProvider('my-room', doc, {
|
|
43
43
|
room,
|
|
44
44
|
});
|
|
45
45
|
```
|
|
@@ -58,7 +58,7 @@ const rtc = OpenRTC({
|
|
|
58
58
|
},
|
|
59
59
|
});
|
|
60
60
|
const room = await rtc.rooms.join('private-room', { access: 'capability' });
|
|
61
|
-
const provider = new
|
|
61
|
+
const provider = new YProvider('private-room', doc, { room });
|
|
62
62
|
```
|
|
63
63
|
|
|
64
64
|
Keep TURN credentials server-generated and short lived. Do not commit `.env` files or long-lived secrets.
|
|
@@ -74,7 +74,7 @@ Keep TURN credentials server-generated and short lived. Do not commit `.env` fil
|
|
|
74
74
|
|
|
75
75
|
## Live test env
|
|
76
76
|
|
|
77
|
-
The live test at `tests/
|
|
77
|
+
The live test at `tests/YProvider.live.test.ts` reads package-local env values.
|
|
78
78
|
|
|
79
79
|
Create `openrtc/packages/y-openrtc/.env.local` with:
|
|
80
80
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export type {
|
|
1
|
+
export { YProvider, } from './provider.js';
|
|
2
|
+
export { roomIdFromName } from './roomName.js';
|
|
3
|
+
export type { ProviderEvents, YProviderOptions, Transports, PeersEventPayload, StatusEventPayload, SyncedEventPayload, } from './types.js';
|
|
4
4
|
export { runtimeFromRoom } from './roomRuntime.js';
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
1
|
+
export { YProvider, } from './provider.js';
|
|
2
|
+
export { roomIdFromName } from './roomName.js';
|
|
3
3
|
export { runtimeFromRoom } from './roomRuntime.js';
|
package/dist/provider.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as awarenessProtocol from 'y-protocols/awareness';
|
|
2
2
|
import type * as Y from 'yjs';
|
|
3
|
-
import type {
|
|
4
|
-
type EventName = keyof
|
|
5
|
-
type EventListener<K extends EventName> = (payload:
|
|
6
|
-
export declare class
|
|
3
|
+
import type { ProviderEvents, YProviderOptions } from './types.js';
|
|
4
|
+
type EventName = keyof ProviderEvents;
|
|
5
|
+
type EventListener<K extends EventName> = (payload: ProviderEvents[K]) => void;
|
|
6
|
+
export declare class YProvider {
|
|
7
7
|
readonly roomName: string;
|
|
8
8
|
readonly doc: Y.Doc;
|
|
9
9
|
readonly awareness: awarenessProtocol.Awareness;
|
|
@@ -35,12 +35,12 @@ export declare class OpenrtcProvider {
|
|
|
35
35
|
private connectPromise;
|
|
36
36
|
private reconcileTimer;
|
|
37
37
|
private readonly diagnostics;
|
|
38
|
-
constructor(roomName: string, doc: Y.Doc, options?:
|
|
38
|
+
constructor(roomName: string, doc: Y.Doc, options?: YProviderOptions);
|
|
39
39
|
get connected(): boolean;
|
|
40
40
|
on<K extends EventName>(name: K, listener: EventListener<K>): EventListener<K>;
|
|
41
41
|
off<K extends EventName>(name: K, listener: EventListener<K>): void;
|
|
42
42
|
once<K extends EventName>(name: K, listener: EventListener<K>): void;
|
|
43
|
-
emit<K extends EventName>(name: K, payload:
|
|
43
|
+
emit<K extends EventName>(name: K, payload: ProviderEvents[K]): void;
|
|
44
44
|
connect(): void;
|
|
45
45
|
disconnect(): void;
|
|
46
46
|
destroy(): void;
|
package/dist/provider.js
CHANGED
|
@@ -2,7 +2,7 @@ import * as awarenessProtocol from 'y-protocols/awareness';
|
|
|
2
2
|
import { BroadcastMeshTransport } from './broadcast.js';
|
|
3
3
|
import { applyProviderMessage, encodeAwarenessQuery, encodeAwarenessUpdate, encodeDocUpdate, encodeSyncStep1, encodeSyncStep2, } from './codec.js';
|
|
4
4
|
import { decryptFrame, deriveRoomKey, encryptFrame } from './crypto.js';
|
|
5
|
-
import {
|
|
5
|
+
import { roomIdFromName } from './roomName.js';
|
|
6
6
|
import { acquireRuntimeLease } from './runtimePool.js';
|
|
7
7
|
const warnedCompatibilityOptions = new Set();
|
|
8
8
|
function createProviderId() {
|
|
@@ -33,7 +33,7 @@ function hasActiveMember(member) {
|
|
|
33
33
|
const lastSeenAt = member.lastSeenAt ?? member.joinedAt ?? 0;
|
|
34
34
|
return now - lastSeenAt <= 5 * 60 * 1000;
|
|
35
35
|
}
|
|
36
|
-
function
|
|
36
|
+
function shouldInitiate(localNodeId, remoteNodeId) {
|
|
37
37
|
return localNodeId.localeCompare(remoteNodeId) < 0;
|
|
38
38
|
}
|
|
39
39
|
function normalizeOpenrtcRoomId(roomId) {
|
|
@@ -74,7 +74,7 @@ function isClosedConnectionSendError(error) {
|
|
|
74
74
|
function sleep(ms) {
|
|
75
75
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
76
76
|
}
|
|
77
|
-
export class
|
|
77
|
+
export class YProvider {
|
|
78
78
|
constructor(roomName, doc, options = {}) {
|
|
79
79
|
this.providerId = createProviderId();
|
|
80
80
|
this.listeners = new Map();
|
|
@@ -273,7 +273,7 @@ export class OpenrtcProvider {
|
|
|
273
273
|
}
|
|
274
274
|
this.runtime = runtime;
|
|
275
275
|
this.localNodeId = await runtime.getNodeId();
|
|
276
|
-
const preferredRoomId = normalizeOpenrtcRoomId(this.options.roomIdOverride ?? await
|
|
276
|
+
const preferredRoomId = normalizeOpenrtcRoomId(this.options.roomIdOverride ?? await roomIdFromName(this.roomName));
|
|
277
277
|
const roomCandidates = this.resolveRoomCandidates(preferredRoomId);
|
|
278
278
|
this.attachLocalObservers();
|
|
279
279
|
this.stopRuntimeConnections = runtime.onConnection((connection) => {
|
|
@@ -282,8 +282,8 @@ export class OpenrtcProvider {
|
|
|
282
282
|
}
|
|
283
283
|
this.attachConnection(connection);
|
|
284
284
|
});
|
|
285
|
-
if (typeof runtime.
|
|
286
|
-
const stopRuntimeConnectionStates = runtime.
|
|
285
|
+
if (typeof runtime.onStateChange === 'function') {
|
|
286
|
+
const stopRuntimeConnectionStates = runtime.onStateChange((state) => {
|
|
287
287
|
if (!this.shouldConnect || state.state !== 'connected') {
|
|
288
288
|
return;
|
|
289
289
|
}
|
|
@@ -489,7 +489,7 @@ export class OpenrtcProvider {
|
|
|
489
489
|
}
|
|
490
490
|
}
|
|
491
491
|
const connectableMembers = candidates.filter((member) => desiredNodeIds.has(member.nodeId) &&
|
|
492
|
-
|
|
492
|
+
shouldInitiate(localNodeId, member.nodeId) &&
|
|
493
493
|
!this.openrtcConnections.has(member.nodeId) &&
|
|
494
494
|
!this.pendingNodeIds.has(member.nodeId));
|
|
495
495
|
await Promise.allSettled(connectableMembers.map(async (member) => {
|
package/dist/roomName.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function
|
|
1
|
+
export declare function roomIdFromName(roomName: string): Promise<string>;
|
package/dist/roomName.js
CHANGED
|
@@ -24,7 +24,7 @@ async function sha256Hex(text) {
|
|
|
24
24
|
const digest = await subtle.digest('SHA-256', encoder.encode(text));
|
|
25
25
|
return toHex(new Uint8Array(digest));
|
|
26
26
|
}
|
|
27
|
-
export async function
|
|
27
|
+
export async function roomIdFromName(roomName) {
|
|
28
28
|
const normalized = roomName.trim();
|
|
29
29
|
if (!normalized) {
|
|
30
30
|
throw new Error('roomName must be a non-empty string.');
|
package/dist/roomRuntime.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Room } from 'openrtc';
|
|
2
2
|
import type { RuntimeClient } from 'openrtc/runtime';
|
|
3
3
|
/** One-handle adapter; cast is isolated here so provider code cannot see legacy construction. */
|
|
4
|
-
export declare function runtimeFromRoom(room:
|
|
4
|
+
export declare function runtimeFromRoom(room: Room): RuntimeClient;
|
package/dist/roomRuntime.js
CHANGED
|
@@ -55,7 +55,7 @@ export function runtimeFromRoom(room) {
|
|
|
55
55
|
publish();
|
|
56
56
|
return room.peers.watch(publish);
|
|
57
57
|
},
|
|
58
|
-
|
|
58
|
+
onStateChange: room.diagnostics.onStateChange,
|
|
59
59
|
getConnections: connections,
|
|
60
60
|
connectByTicket: ({ ticket, timeoutMs }) => room.peers.connect({ ticket, timeoutMs }),
|
|
61
61
|
};
|
package/dist/runtimePool.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { RuntimeClient } from 'openrtc/runtime';
|
|
2
|
-
import type {
|
|
2
|
+
import type { YProviderOptions } from './types.js';
|
|
3
3
|
export interface RuntimeLease {
|
|
4
4
|
runtime: RuntimeClient;
|
|
5
5
|
owned: boolean;
|
|
6
6
|
ensureReady(): Promise<RuntimeClient>;
|
|
7
7
|
release(): Promise<void>;
|
|
8
8
|
}
|
|
9
|
-
export declare function acquireRuntimeLease(options:
|
|
9
|
+
export declare function acquireRuntimeLease(options: YProviderOptions): RuntimeLease;
|
package/dist/types.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Options, Room } from 'openrtc';
|
|
2
2
|
import type { RuntimeClient } from 'openrtc/runtime';
|
|
3
3
|
import type { Awareness } from 'y-protocols/awareness';
|
|
4
|
-
export type
|
|
5
|
-
export interface
|
|
4
|
+
export type Transports = Options['transports'];
|
|
5
|
+
export interface YProviderOptions {
|
|
6
6
|
runtime?: RuntimeClient;
|
|
7
7
|
/** Preferred 2.0 path: one already-activated collaborative room. */
|
|
8
|
-
room?:
|
|
8
|
+
room?: Room;
|
|
9
9
|
awareness?: Awareness;
|
|
10
10
|
password?: string | null;
|
|
11
11
|
maxConns?: number;
|
|
@@ -45,7 +45,7 @@ export interface PeersEventPayload {
|
|
|
45
45
|
*/
|
|
46
46
|
awarenessPeers: number[];
|
|
47
47
|
}
|
|
48
|
-
export interface
|
|
48
|
+
export interface ProviderEvents {
|
|
49
49
|
status: StatusEventPayload;
|
|
50
50
|
synced: SyncedEventPayload;
|
|
51
51
|
peers: PeersEventPayload;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "y-openrtc",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -37,13 +37,13 @@
|
|
|
37
37
|
"build": "rm -rf dist && tsc",
|
|
38
38
|
"prepublishOnly": "pnpm run build",
|
|
39
39
|
"test": "vitest run tests",
|
|
40
|
-
"test:deterministic": "vitest run tests/TetrisSync.test.ts tests/TetrisPeerDiagnostic.test.ts tests/
|
|
40
|
+
"test:deterministic": "vitest run tests/TetrisSync.test.ts tests/TetrisPeerDiagnostic.test.ts tests/YProvider.test.ts tests/RoomRuntime.test.ts tests/PublicPackageGuard.test.ts tests/crypto.test.ts",
|
|
41
41
|
"test:watch": "vitest",
|
|
42
|
-
"test:live": "vitest run tests/
|
|
42
|
+
"test:live": "vitest run tests/YProvider.live.test.ts"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"lib0": "^0.2.114",
|
|
46
|
-
"openrtc": "^2.0
|
|
46
|
+
"openrtc": "^2.2.0",
|
|
47
47
|
"y-protocols": "^1.0.6"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|