y-openrtc 0.1.1 → 0.1.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/README.md CHANGED
@@ -79,7 +79,6 @@ The live test at `tests/OpenrtcProvider.live.test.ts` reads package-local env va
79
79
  Create `openrtc/packages/y-openrtc/.env.local` with:
80
80
 
81
81
  ```bash
82
- OPENRTC_LIVE_TESTS=1
83
82
  OPENRTC_Y_OPENRTC_API_KEY=<your public OpenRTC API key>
84
83
  ```
85
84
 
@@ -49,7 +49,9 @@ export declare class OpenrtcProvider {
49
49
  private warnCompatibilityOptions;
50
50
  private emitStatus;
51
51
  private emitSynced;
52
+ private currentPeersPayload;
52
53
  private emitPeers;
54
+ private replayEvent;
53
55
  private attachLocalObservers;
54
56
  private detachLocalObservers;
55
57
  private connectInternal;
package/dist/provider.js CHANGED
@@ -129,6 +129,9 @@ export class OpenrtcProvider {
129
129
  }
130
130
  const clients = added.concat(updated, removed);
131
131
  void this.broadcastProviderPayload(encodeAwarenessUpdate(this.awareness, clients));
132
+ if (added.concat(removed).some((clientId) => clientId !== this.doc.clientID)) {
133
+ this.emitPeers([], []);
134
+ }
132
135
  };
133
136
  this.destroyHandler = () => {
134
137
  void this.destroyInternal();
@@ -144,6 +147,7 @@ export class OpenrtcProvider {
144
147
  const listeners = this.listeners.get(name) ?? new Set();
145
148
  listeners.add(listener);
146
149
  this.listeners.set(name, listeners);
150
+ this.replayEvent(name, listener);
147
151
  return listener;
148
152
  }
149
153
  off(name, listener) {
@@ -154,7 +158,9 @@ export class OpenrtcProvider {
154
158
  this.off(name, wrapped);
155
159
  listener(payload);
156
160
  });
157
- this.on(name, wrapped);
161
+ const listeners = this.listeners.get(name) ?? new Set();
162
+ listeners.add(wrapped);
163
+ this.listeners.set(name, listeners);
158
164
  }
159
165
  emit(name, payload) {
160
166
  for (const listener of this.listeners.get(name) ?? []) {
@@ -206,16 +212,37 @@ export class OpenrtcProvider {
206
212
  this.synced = nextSynced;
207
213
  this.emit('synced', { synced: nextSynced });
208
214
  }
209
- emitPeers(added, removed) {
210
- const payload = {
215
+ currentPeersPayload(added = [], removed = []) {
216
+ return {
211
217
  added,
212
218
  removed,
213
219
  openrtcPeers: Array.from(this.openrtcConnections.keys()),
214
220
  webrtcPeers: Array.from(this.openrtcConnections.keys()),
215
221
  bcPeers: Array.from(this.bcPeers.keys()),
222
+ awarenessPeers: Array.from(this.awareness.getStates().keys())
223
+ .filter((clientId) => clientId !== this.doc.clientID),
216
224
  };
225
+ }
226
+ emitPeers(added, removed) {
227
+ const payload = this.currentPeersPayload(added, removed);
217
228
  this.emit('peers', payload);
218
229
  }
230
+ replayEvent(name, listener) {
231
+ queueMicrotask(() => {
232
+ if (this.destroyed || !this.listeners.get(name)?.has(listener)) {
233
+ return;
234
+ }
235
+ if (name === 'status') {
236
+ listener({ connected: this.connected });
237
+ return;
238
+ }
239
+ if (name === 'synced') {
240
+ listener({ synced: this.synced });
241
+ return;
242
+ }
243
+ listener(this.currentPeersPayload());
244
+ });
245
+ }
219
246
  attachLocalObservers() {
220
247
  if (this.localObserversAttached) {
221
248
  return;
package/dist/types.d.ts CHANGED
@@ -52,6 +52,12 @@ export interface PeersEventPayload {
52
52
  openrtcPeers: string[];
53
53
  webrtcPeers: string[];
54
54
  bcPeers: string[];
55
+ /**
56
+ * Remote Yjs awareness client ids currently visible to this provider.
57
+ * This is the best source for participant counts in collaborative UIs,
58
+ * because OpenRTC may use a mesh subset or BroadcastChannel for transport.
59
+ */
60
+ awarenessPeers: number[];
55
61
  }
56
62
  export interface OpenrtcProviderEvents {
57
63
  status: StatusEventPayload;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "y-openrtc",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -34,14 +34,16 @@
34
34
  "./package.json": "./package.json"
35
35
  },
36
36
  "scripts": {
37
- "build": "tsc",
37
+ "build": "rm -rf dist && tsc",
38
+ "prepublishOnly": "pnpm run build",
38
39
  "test": "vitest run tests",
40
+ "test:deterministic": "vitest run tests/TetrisSync.test.ts tests/TetrisPeerDiagnostic.test.ts tests/OpenrtcProvider.test.ts tests/PublicPackageGuard.test.ts tests/crypto.test.ts",
39
41
  "test:watch": "vitest",
40
- "test:live": "OPENRTC_LIVE_TESTS=1 vitest run tests/OpenrtcProvider.live.test.ts"
42
+ "test:live": "vitest run tests/OpenrtcProvider.live.test.ts"
41
43
  },
42
44
  "dependencies": {
43
45
  "lib0": "^0.2.114",
44
- "openrtc": "workspace:*",
46
+ "openrtc": "^0.2.0",
45
47
  "y-protocols": "^1.0.6"
46
48
  },
47
49
  "peerDependencies": {