@protobase/client 0.62.2 → 0.62.4

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.
@@ -36,31 +36,26 @@ const peerLink = (self, { iceServers, send, onTracks, createPeerConnection: crea
36
36
  ...track,
37
37
  ...receivedTrack(track) && { track: receivedTrack(track) }
38
38
  })));
39
- const connect = (member) => {
39
+ const open = (member, peer) => {
40
40
  const pc = createPeerConnection$1({ iceServers });
41
- const peer = {
42
- pc,
43
- polite: self < member,
44
- makingOffer: false,
45
- ignoreOffer: false,
46
- senders: /* @__PURE__ */ new Map()
47
- };
48
- peers.set(member, peer);
41
+ peer.pc = pc;
42
+ peer.senders = /* @__PURE__ */ new Map();
49
43
  pc.onnegotiationneeded = async () => {
50
- peer.makingOffer = true;
44
+ const making = pc.setLocalDescription();
45
+ peer.makingOffer = making;
51
46
  try {
52
- await pc.setLocalDescription();
53
- send({
47
+ await making;
48
+ if (peer.pc === pc) send({
54
49
  type: "signal",
55
50
  to: member,
56
51
  description: pc.localDescription.toJSON()
57
52
  });
58
53
  } finally {
59
- peer.makingOffer = false;
54
+ if (peer.makingOffer === making) peer.makingOffer = void 0;
60
55
  }
61
56
  };
62
57
  pc.onicecandidate = (event) => {
63
- if (event.candidate) send({
58
+ if (event.candidate && peer.pc === pc) send({
64
59
  type: "signal",
65
60
  to: member,
66
61
  candidate: event.candidate.toJSON()
@@ -71,19 +66,39 @@ const peerLink = (self, { iceServers, send, onTracks, createPeerConnection: crea
71
66
  };
72
67
  pc.ontrack = () => emitTracks();
73
68
  for (const [source, sending] of local) peer.senders.set(source, sendOn(pc, sending));
69
+ };
70
+ const connect = (member) => {
71
+ const peer = {
72
+ polite: self < member,
73
+ ignoreOffer: false
74
+ };
75
+ peers.set(member, peer);
76
+ open(member, peer);
74
77
  return peer;
75
78
  };
79
+ /**
80
+ * Chromium sometimes gathers no candidates on a connection whose first offer it rolled back, so neither side ever
81
+ * checks: the side that gives way on a connection never negotiated starts on a new one instead, once its offer is set.
82
+ */
83
+ const renew = async (member, peer) => {
84
+ await peer.makingOffer;
85
+ peer.pc.close();
86
+ open(member, peer);
87
+ };
76
88
  const disconnect = (member) => {
77
89
  peers.get(member)?.pc.close();
78
90
  peers.delete(member);
79
91
  };
80
92
  const signal = async (from, description, candidate) => {
81
93
  const peer = peers.get(from) ?? connect(from);
82
- const { pc } = peer;
83
94
  if (description) {
84
- const collision = description.type === "offer" && (peer.makingOffer || pc.signalingState !== "stable");
95
+ const collision = description.type === "offer" && (peer.makingOffer !== void 0 || peer.pc.signalingState !== "stable");
85
96
  peer.ignoreOffer = !politeTo(peer, description.sdp) && collision;
86
97
  if (peer.ignoreOffer) return;
98
+ if (collision && !peer.pc.currentRemoteDescription) await renew(from, peer);
99
+ }
100
+ const { pc } = peer;
101
+ if (description) {
87
102
  await pc.setRemoteDescription(description);
88
103
  if (description.type === "offer") {
89
104
  await pc.setLocalDescription();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@protobase/client",
3
- "version": "0.62.2",
3
+ "version": "0.62.4",
4
4
  "description": "Typed fetch client for the Protobase REST API.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -31,8 +31,8 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@better-auth/passkey": "^1.7.12",
34
- "@protobase/layout": "0.62.2",
35
- "@protobase/schema": "0.62.2",
34
+ "@protobase/layout": "0.62.4",
35
+ "@protobase/schema": "0.62.4",
36
36
  "@simplewebauthn/browser": "^13.3.0",
37
37
  "better-auth": "^1.7.12"
38
38
  }