@takosjp/yurucommu-api 3.4.3 → 3.4.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.
package/dist/index.js CHANGED
@@ -56,26 +56,56 @@ function getYurucommuApiTransport() {
56
56
  // src/lib/api/fetch.ts
57
57
  class ApiError extends Error {
58
58
  status;
59
- constructor(status, message) {
59
+ code;
60
+ retryAfterSeconds;
61
+ constructor(status, message, details = {}) {
60
62
  super(message);
61
63
  this.status = status;
62
64
  this.name = "ApiError";
65
+ this.code = details.code ?? null;
66
+ this.retryAfterSeconds = details.retryAfterSeconds ?? null;
63
67
  }
64
68
  }
65
- async function extractErrorMessage(res, fallback) {
69
+ function parseRetryAfterSeconds(bodyValue, headerValue) {
70
+ const bodySeconds = typeof bodyValue === "number" && Number.isFinite(bodyValue) && bodyValue > 0 ? Math.ceil(bodyValue) : null;
71
+ if (bodySeconds !== null)
72
+ return bodySeconds;
73
+ if (!headerValue)
74
+ return null;
75
+ const numeric = Number(headerValue);
76
+ if (Number.isFinite(numeric) && numeric > 0)
77
+ return Math.ceil(numeric);
78
+ const dateMs = Date.parse(headerValue);
79
+ if (!Number.isFinite(dateMs) || dateMs <= Date.now())
80
+ return null;
81
+ return Math.ceil((dateMs - Date.now()) / 1000);
82
+ }
83
+ async function extractApiErrorDetails(res, fallback) {
66
84
  try {
67
85
  const data = await res.json();
68
86
  const err = data.error;
69
87
  const message = typeof err === "string" ? err : err?.message;
70
- return message || fallback;
88
+ const code = typeof data.code === "string" && data.code.trim().length > 0 ? data.code.trim().slice(0, 100) : null;
89
+ return {
90
+ message: message || fallback,
91
+ code,
92
+ retryAfterSeconds: parseRetryAfterSeconds(data.retry_after, res.headers.get("retry-after"))
93
+ };
71
94
  } catch {
72
- return res.statusText || fallback;
95
+ return {
96
+ message: res.statusText || fallback,
97
+ code: null,
98
+ retryAfterSeconds: parseRetryAfterSeconds(null, res.headers.get("retry-after"))
99
+ };
73
100
  }
74
101
  }
102
+ async function extractErrorMessage(res, fallback) {
103
+ return (await extractApiErrorDetails(res, fallback)).message;
104
+ }
75
105
  async function assertOk(res, fallback) {
76
106
  if (!res.ok) {
77
- const message = await extractErrorMessage(res, fallback);
78
- throw new ApiError(res.status, message);
107
+ const details = await extractApiErrorDetails(res, fallback);
108
+ throw new ApiError(res.status, details.message, details);
79
109
  }
80
110
  }
81
111
  function apiFetch(url, options = {}) {
@@ -215,20 +245,21 @@ function resolveNotificationTarget(notification) {
215
245
  function formatUsernameFromApId(apId, preferred) {
216
246
  try {
217
247
  const url = new URL(apId);
218
- const match = apId.match(/\/(users|groups)\/([^/]+)$/);
219
- if (match)
220
- return `${match[2]}@${url.host}`;
221
248
  if (preferred)
222
249
  return `${preferred}@${url.host}`;
250
+ const match = url.pathname.match(/\/(users|groups)\/([^/]+)\/?$/u);
251
+ if (match)
252
+ return `${match[2]}@${url.host}`;
223
253
  } catch {}
224
254
  return null;
225
255
  }
226
256
  function normalizeActor(actor) {
227
- if (!actor || !actor.ap_id)
228
- return actor;
229
257
  const rawUsername = actor.username?.trim();
230
- const formatted = rawUsername || formatUsernameFromApId(actor.ap_id, actor.preferred_username) || actor.preferred_username || actor.username || actor.ap_id;
231
- const preferred = actor.preferred_username?.trim() || (formatted.includes("@") ? formatted.split("@")[0] : formatted);
258
+ const declaredPreferred = actor.preferred_username?.trim() || null;
259
+ const rawSeparator = rawUsername?.lastIndexOf("@") ?? -1;
260
+ const rebasedRawUsername = declaredPreferred && rawUsername && !rawUsername.includes("://") && rawSeparator > 0 && rawSeparator < rawUsername.length - 1 ? `${declaredPreferred}@${rawUsername.slice(rawSeparator + 1)}` : null;
261
+ const formatted = rebasedRawUsername || (declaredPreferred ? formatUsernameFromApId(actor.ap_id, declaredPreferred) : rawUsername) || formatUsernameFromApId(actor.ap_id) || declaredPreferred || actor.username || actor.ap_id;
262
+ const preferred = declaredPreferred || (formatted.includes("@") ? formatted.split("@")[0] : formatted);
232
263
  return {
233
264
  ...actor,
234
265
  username: formatted,
@@ -734,7 +765,7 @@ async function fetchUnreadCount() {
734
765
  return data.count || 0;
735
766
  }
736
767
  async function markNotificationsRead(ids) {
737
- const res = await apiPost("/api/notifications/read", { ids });
768
+ const res = await apiPost("/api/notifications/read", ids === undefined ? { read_all: true } : { ids });
738
769
  await assertOk(res, "Failed to mark as read");
739
770
  }
740
771
  async function archiveNotifications(ids) {
@@ -1359,6 +1390,7 @@ async function reportContent(input) {
1359
1390
  }
1360
1391
  // src/lib/rtc-client.ts
1361
1392
  var CANDIDATE_FLUSH_MS = 200;
1393
+ var MAX_PENDING_SOCKET_FRAMES = 64;
1362
1394
 
1363
1395
  class CallClient {
1364
1396
  options;
@@ -1366,6 +1398,8 @@ class CallClient {
1366
1398
  wantConnected = false;
1367
1399
  backoff = 500;
1368
1400
  reconnectTimer = null;
1401
+ openingSocket = false;
1402
+ pendingFrames = [];
1369
1403
  listeners = new Map;
1370
1404
  call = null;
1371
1405
  localStream = null;
@@ -1396,12 +1430,24 @@ class CallClient {
1396
1430
  getState() {
1397
1431
  return this.state;
1398
1432
  }
1399
- origin() {
1400
- return this.options.origin ?? (typeof location !== "undefined" ? location.origin : "");
1401
- }
1402
- socketUrl() {
1403
- const o = this.origin();
1404
- return `${o.replace(/^http/, "ws")}/api/rtc/socket`;
1433
+ apiUrl(path) {
1434
+ const origin = this.options.origin;
1435
+ return origin ? new URL(path, `${origin}/`).toString() : path;
1436
+ }
1437
+ socketUrl(actorApId, ticket) {
1438
+ const transport = getYurucommuApiTransport();
1439
+ const resolved = transport.resolveUrl(this.apiUrl("/api/rtc/socket"));
1440
+ const base = this.options.origin ?? (typeof location !== "undefined" ? location.origin : "http://localhost");
1441
+ const url = new URL(resolved, base);
1442
+ if (url.protocol === "http:")
1443
+ url.protocol = "ws:";
1444
+ else if (url.protocol === "https:")
1445
+ url.protocol = "wss:";
1446
+ else
1447
+ throw new Error("call socket URL must use HTTP(S)");
1448
+ url.searchParams.set("actor", actorApId);
1449
+ url.searchParams.set("ticket", ticket);
1450
+ return url.toString();
1405
1451
  }
1406
1452
  connect() {
1407
1453
  this.wantConnected = true;
@@ -1414,13 +1460,41 @@ class CallClient {
1414
1460
  this.reconnectTimer = null;
1415
1461
  this.ws?.close();
1416
1462
  this.ws = null;
1463
+ this.pendingFrames.length = 0;
1417
1464
  }
1418
1465
  openSocket() {
1419
1466
  if (this.ws && this.ws.readyState <= WebSocket.OPEN)
1420
1467
  return;
1468
+ if (this.openingSocket)
1469
+ return;
1470
+ this.openingSocket = true;
1471
+ this.openSocketWithTicket().finally(() => {
1472
+ this.openingSocket = false;
1473
+ });
1474
+ }
1475
+ async openSocketWithTicket() {
1476
+ let actorApId;
1477
+ let ticket;
1478
+ try {
1479
+ const response = await apiPost(this.apiUrl("/api/rtc/ticket"));
1480
+ if (!response.ok)
1481
+ throw new Error(`ticket ${response.status}`);
1482
+ const body = await response.json();
1483
+ if (typeof body.actor_ap_id !== "string" || typeof body.ticket !== "string") {
1484
+ throw new Error("bad ticket response");
1485
+ }
1486
+ actorApId = body.actor_ap_id;
1487
+ ticket = body.ticket;
1488
+ } catch (err) {
1489
+ this.emit("error", "socket_ticket_failed", String(err));
1490
+ this.scheduleReconnect();
1491
+ return;
1492
+ }
1493
+ if (!this.wantConnected)
1494
+ return;
1421
1495
  let socket;
1422
1496
  try {
1423
- socket = new WebSocket(this.socketUrl());
1497
+ socket = new WebSocket(this.socketUrl(actorApId, ticket));
1424
1498
  } catch (err) {
1425
1499
  this.emit("error", "socket_open_failed", String(err));
1426
1500
  this.scheduleReconnect();
@@ -1429,9 +1503,17 @@ class CallClient {
1429
1503
  this.ws = socket;
1430
1504
  socket.onopen = () => {
1431
1505
  this.backoff = 500;
1432
- this.send({ t: "hello" });
1433
- if (this.call)
1434
- this.send({ t: "resume", callId: this.call.callId });
1506
+ socket.send(JSON.stringify({ t: "hello" }));
1507
+ const pending = this.pendingFrames.splice(0);
1508
+ const hasInitialInvite = this.call !== null && pending.some((frame) => frame.t === "invite" && frame.callId === this.call?.callId);
1509
+ if (this.call && !hasInitialInvite) {
1510
+ socket.send(JSON.stringify({
1511
+ t: "resume",
1512
+ callId: this.call.callId
1513
+ }));
1514
+ }
1515
+ for (const frame of pending)
1516
+ socket.send(JSON.stringify(frame));
1435
1517
  };
1436
1518
  socket.onmessage = (ev) => {
1437
1519
  this.onFrame(ev.data);
@@ -1460,16 +1542,22 @@ class CallClient {
1460
1542
  send(frame) {
1461
1543
  if (this.ws && this.ws.readyState === WebSocket.OPEN) {
1462
1544
  this.ws.send(JSON.stringify(frame));
1545
+ return;
1463
1546
  }
1547
+ if (!this.wantConnected)
1548
+ return;
1549
+ if (this.pendingFrames.length >= MAX_PENDING_SOCKET_FRAMES) {
1550
+ this.emit("error", "socket_queue_full");
1551
+ return;
1552
+ }
1553
+ this.pendingFrames.push(frame);
1464
1554
  }
1465
1555
  async startCall(peer, media) {
1466
1556
  if (this.call)
1467
1557
  throw new Error("already in a call");
1468
- const res = await fetch(`${this.origin()}/api/rtc/calls`, {
1469
- method: "POST",
1470
- credentials: "include",
1471
- headers: { "Content-Type": "application/json" },
1472
- body: JSON.stringify({ to: peer, media })
1558
+ const res = await apiPost(this.apiUrl("/api/rtc/calls"), {
1559
+ to: peer,
1560
+ media
1473
1561
  });
1474
1562
  if (!res.ok) {
1475
1563
  const code = res.status === 403 ? "blocked" : "start_failed";
@@ -1477,12 +1565,14 @@ class CallClient {
1477
1565
  throw new Error(code);
1478
1566
  }
1479
1567
  const data = await res.json();
1480
- this.call = this.newCall(data.callId, peer, media, "caller", data.iceServers);
1568
+ const call = this.newCall(data.callId, peer, media, "caller", data.iceServers);
1569
+ this.call = call;
1481
1570
  this.setState("calling");
1482
1571
  this.connect();
1483
1572
  this.send({ t: "invite", callId: data.callId, to: peer, media });
1484
- await this.setupMedia(this.call);
1485
- await this.makeOffer(this.call);
1573
+ if (!await this.setupMedia(call))
1574
+ return;
1575
+ await this.makeOffer(call);
1486
1576
  }
1487
1577
  async accept() {
1488
1578
  const call = this.call;
@@ -1490,10 +1580,16 @@ class CallClient {
1490
1580
  return;
1491
1581
  this.setState("connecting");
1492
1582
  this.send({ t: "accept", callId: call.callId });
1493
- await this.setupMedia(call);
1494
- if (call.pc && call.remoteDescriptionSet) {
1495
- const answer = await call.pc.createAnswer();
1496
- await call.pc.setLocalDescription(answer);
1583
+ if (!await this.setupMedia(call))
1584
+ return;
1585
+ const pc = call.pc;
1586
+ if (pc && call.remoteDescriptionSet && this.isActiveCall(call)) {
1587
+ const answer = await pc.createAnswer();
1588
+ if (!this.isActivePeer(call, pc))
1589
+ return;
1590
+ await pc.setLocalDescription(answer);
1591
+ if (!this.isActivePeer(call, pc))
1592
+ return;
1497
1593
  this.send({ t: "answer", callId: call.callId, sdp: answer.sdp ?? "" });
1498
1594
  }
1499
1595
  }
@@ -1639,25 +1735,44 @@ class CallClient {
1639
1735
  } catch {}
1640
1736
  }
1641
1737
  }
1738
+ isActiveCall(call) {
1739
+ return this.call === call;
1740
+ }
1741
+ isActivePeer(call, pc) {
1742
+ return this.isActiveCall(call) && call.pc === pc;
1743
+ }
1642
1744
  async setupMedia(call) {
1745
+ if (!this.isActiveCall(call))
1746
+ return false;
1643
1747
  if (!this.localStream) {
1748
+ let stream;
1644
1749
  try {
1645
- this.localStream = await navigator.mediaDevices.getUserMedia({
1750
+ stream = await navigator.mediaDevices.getUserMedia({
1646
1751
  audio: call.media.audio,
1647
1752
  video: call.media.video
1648
1753
  });
1649
1754
  } catch (err) {
1755
+ if (!this.isActiveCall(call))
1756
+ return false;
1650
1757
  this.emit("error", "media_denied", String(err));
1651
1758
  this.hangup("media_denied");
1652
- return;
1759
+ return false;
1653
1760
  }
1761
+ if (!this.isActiveCall(call)) {
1762
+ stream.getTracks().forEach((track) => track.stop());
1763
+ return false;
1764
+ }
1765
+ this.localStream = stream;
1654
1766
  this.emit("localstream", this.localStream);
1655
1767
  }
1768
+ if (!this.isActiveCall(call))
1769
+ return false;
1656
1770
  if (!call.pc)
1657
1771
  this.buildPeerConnection(call);
1658
1772
  for (const track of this.localStream.getTracks()) {
1659
1773
  call.pc?.addTrack(track, this.localStream);
1660
1774
  }
1775
+ return this.isActiveCall(call);
1661
1776
  }
1662
1777
  buildPeerConnection(call) {
1663
1778
  const pc = new RTCPeerConnection({
@@ -1668,15 +1783,21 @@ class CallClient {
1668
1783
  }))
1669
1784
  });
1670
1785
  pc.onicecandidate = (ev) => {
1786
+ if (!this.isActivePeer(call, pc))
1787
+ return;
1671
1788
  if (ev.candidate)
1672
1789
  this.bufferCandidate(call, ev.candidate.toJSON());
1673
1790
  else
1674
1791
  this.flushCandidates(call);
1675
1792
  };
1676
1793
  pc.ontrack = (ev) => {
1794
+ if (!this.isActivePeer(call, pc))
1795
+ return;
1677
1796
  this.emit("remotestream", ev.streams[0] ?? null);
1678
1797
  };
1679
1798
  pc.onconnectionstatechange = () => {
1799
+ if (!this.isActivePeer(call, pc))
1800
+ return;
1680
1801
  if (pc.connectionState === "connected")
1681
1802
  this.setState("connected");
1682
1803
  else if (pc.connectionState === "failed" || pc.connectionState === "closed") {
@@ -1686,10 +1807,19 @@ class CallClient {
1686
1807
  call.pc = pc;
1687
1808
  }
1688
1809
  async makeOffer(call) {
1810
+ if (!this.isActiveCall(call))
1811
+ return;
1689
1812
  if (!call.pc)
1690
1813
  this.buildPeerConnection(call);
1691
- const offer = await call.pc.createOffer();
1692
- await call.pc.setLocalDescription(offer);
1814
+ const pc = call.pc;
1815
+ if (!pc)
1816
+ return;
1817
+ const offer = await pc.createOffer();
1818
+ if (!this.isActivePeer(call, pc))
1819
+ return;
1820
+ await pc.setLocalDescription(offer);
1821
+ if (!this.isActivePeer(call, pc))
1822
+ return;
1693
1823
  this.send({ t: "offer", callId: call.callId, sdp: offer.sdp ?? "" });
1694
1824
  }
1695
1825
  bufferCandidate(call, cand) {
@@ -25,6 +25,8 @@ export interface CommunityMember {
25
25
  icon_url: string | null;
26
26
  role: "owner" | "moderator" | "member";
27
27
  joined_at: string;
28
+ /** False for Follow-backed federated membership, which has no local role row. */
29
+ can_change_role?: boolean;
28
30
  }
29
31
  export interface CommunityMessage {
30
32
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"communities.d.ts","sourceRoot":"","sources":["../../../src/lib/api/communities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"communities.d.ts","sourceRoot":"","sources":["../../../src/lib/api/communities.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,12 @@ import { type FetchWithTimeoutInit } from "../fetch-with-timeout.js";
9
9
  */
10
10
  export declare class ApiError extends Error {
11
11
  readonly status: number;
12
- constructor(status: number, message: string);
12
+ readonly code: string | null;
13
+ readonly retryAfterSeconds: number | null;
14
+ constructor(status: number, message: string, details?: {
15
+ readonly code?: string | null;
16
+ readonly retryAfterSeconds?: number | null;
17
+ });
13
18
  }
14
19
  /**
15
20
  * Read an error message from a failed API response. Attempts to parse JSON
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/lib/api/fetch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAC;AAGlC;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;aAEf,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM;CASlB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7E;AAED,MAAM,WAAW,cAAe,SAAQ,oBAAoB;CAAG;AAE/D,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,QAAQ,CAAC,CAiBnB;AAsBD,eAAO,MAAM,OAAO,QAlBX,MAAM,SACJ,OAAO,YACL,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,CAAC,KAC/C,OAAO,CAAC,QAAQ,CAeyB,CAAC;AAC/C,eAAO,MAAM,MAAM,QAnBV,MAAM,SACJ,OAAO,YACL,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,CAAC,KAC/C,OAAO,CAAC,QAAQ,CAgBuB,CAAC;AAC7C,eAAO,MAAM,QAAQ,QApBZ,MAAM,SACJ,OAAO,YACL,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,CAAC,KAC/C,OAAO,CAAC,QAAQ,CAiB2B,CAAC;AACjD,eAAO,MAAM,SAAS,QArBb,MAAM,SACJ,OAAO,YACL,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,CAAC,KAC/C,OAAO,CAAC,QAAQ,CAkB6B,CAAC"}
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/lib/api/fetch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAC;AAGlC;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;aAKf,MAAM,EAAE,MAAM;IAJhC,SAAgB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,SAAgB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;gBAG/B,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QACP,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACvC;CAWT;AA6DD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7E;AAED,MAAM,WAAW,cAAe,SAAQ,oBAAoB;CAAG;AAE/D,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,QAAQ,CAAC,CAiBnB;AAsBD,eAAO,MAAM,OAAO,QAlBX,MAAM,SACJ,OAAO,YACL,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,CAAC,KAC/C,OAAO,CAAC,QAAQ,CAeyB,CAAC;AAC/C,eAAO,MAAM,MAAM,QAnBV,MAAM,SACJ,OAAO,YACL,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,CAAC,KAC/C,OAAO,CAAC,QAAQ,CAgBuB,CAAC;AAC7C,eAAO,MAAM,QAAQ,QApBZ,MAAM,SACJ,OAAO,YACL,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,CAAC,KAC/C,OAAO,CAAC,QAAQ,CAiB2B,CAAC;AACjD,eAAO,MAAM,SAAS,QArBb,MAAM,SACJ,OAAO,YACL,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,MAAM,CAAC,KAC/C,OAAO,CAAC,QAAQ,CAkB6B,CAAC"}
@@ -2,9 +2,13 @@ import { ActorStories, ActorNote, Notification, Post, Story } from "../../types/
2
2
  type ActorLike = {
3
3
  ap_id: string;
4
4
  username?: string;
5
- preferred_username?: string;
5
+ preferred_username?: string | null;
6
6
  };
7
- export declare function normalizeActor<T extends ActorLike>(actor: T): T;
7
+ type NormalizedActor<T extends ActorLike> = Omit<T, "username" | "preferred_username"> & {
8
+ username: string;
9
+ preferred_username: string;
10
+ };
11
+ export declare function normalizeActor<T extends ActorLike>(actor: T): NormalizedActor<T>;
8
12
  export declare const normalizePost: (post: Post) => Post;
9
13
  export declare const normalizeStory: (story: Story) => Story;
10
14
  export declare const normalizeActorStories: (stories: ActorStories) => ActorStories;
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/lib/api/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,IAAI,EACJ,KAAK,EACN,MAAM,sBAAsB,CAAC;AAG9B,KAAK,SAAS,GAAG;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAiBF,wBAAgB,cAAc,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAkB/D;AAED,eAAO,MAAM,aAAa,GAAI,MAAM,IAAI,KAAG,IAGzC,CAAC;AAEH,eAAO,MAAM,cAAc,GAAI,OAAO,KAAK,KAAG,KAG5C,CAAC;AAEH,eAAO,MAAM,qBAAqB,GAAI,SAAS,YAAY,KAAG,YAI5D,CAAC;AAEH,eAAO,MAAM,kBAAkB,GAAI,MAAM,SAAS,KAAG,SAGnD,CAAC;AAEH,eAAO,MAAM,qBAAqB,GAChC,cAAc,YAAY,KACzB,YAaF,CAAC"}
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/lib/api/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,IAAI,EACJ,KAAK,EACN,MAAM,sBAAsB,CAAC;AAG9B,KAAK,SAAS,GAAG;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC,CAAC;AAEF,KAAK,eAAe,CAAC,CAAC,SAAS,SAAS,IAAI,IAAI,CAC9C,CAAC,EACD,UAAU,GAAG,oBAAoB,CAClC,GAAG;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC;AAiBF,wBAAgB,cAAc,CAAC,CAAC,SAAS,SAAS,EAChD,KAAK,EAAE,CAAC,GACP,eAAe,CAAC,CAAC,CAAC,CA8BpB;AAED,eAAO,MAAM,aAAa,GAAI,MAAM,IAAI,KAAG,IAGzC,CAAC;AAEH,eAAO,MAAM,cAAc,GAAI,OAAO,KAAK,KAAG,KAG5C,CAAC;AAEH,eAAO,MAAM,qBAAqB,GAAI,SAAS,YAAY,KAAG,YAI5D,CAAC;AAEH,eAAO,MAAM,kBAAkB,GAAI,MAAM,SAAS,KAAG,SAGnD,CAAC;AAEH,eAAO,MAAM,qBAAqB,GAChC,cAAc,YAAY,KACzB,YAaF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../../src/lib/api/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,uBAAuB,EACvB,yBAAyB,EACzB,8BAA8B,EAC/B,MAAM,sBAAsB,CAAC;AAI9B,wBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,OAAO,CAAC;IACV,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC,CAmBD;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAKxD;AAED,wBAAsB,qBAAqB,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzE;AAED,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvE;AAED,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzE;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAK/D;AAED,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IACtD,OAAO,EAAE,yBAAyB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,uBAAuB,CAAC;CACjC,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAO1C;AAED,wBAAsB,4BAA4B,CAAC,KAAK,EAAE;IACxD,OAAO,EAAE,yBAAyB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhB;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,oEAAoE;AACpE,wBAAsB,mCAAmC,IAAI,OAAO,CAAC,8BAA8B,CAAC,CAenG"}
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../../src/lib/api/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,uBAAuB,EACvB,yBAAyB,EACzB,8BAA8B,EAC/B,MAAM,sBAAsB,CAAC;AAI9B,wBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,OAAO,CAAC;IACV,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC,CAmBD;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAKxD;AAED,wBAAsB,qBAAqB,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAMzE;AAED,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvE;AAED,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzE;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAK/D;AAED,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IACtD,OAAO,EAAE,yBAAyB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,uBAAuB,CAAC;CACjC,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAO1C;AAED,wBAAsB,4BAA4B,CAAC,KAAK,EAAE;IACxD,OAAO,EAAE,yBAAyB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhB;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,oEAAoE;AACpE,wBAAsB,mCAAmC,IAAI,OAAO,CAAC,8BAA8B,CAAC,CAenG"}
@@ -29,7 +29,7 @@ export interface CallClientEvents {
29
29
  error: (code: string, message?: string) => void;
30
30
  }
31
31
  export interface CallClientOptions {
32
- /** Origin the app is served from (defaults to the page origin). */
32
+ /** Explicit server-origin override; otherwise the configured API transport owns it. */
33
33
  origin?: string;
34
34
  /** WebSocket reconnect backoff ceiling (ms). */
35
35
  maxBackoffMs?: number;
@@ -40,6 +40,8 @@ export declare class CallClient {
40
40
  private wantConnected;
41
41
  private backoff;
42
42
  private reconnectTimer;
43
+ private openingSocket;
44
+ private readonly pendingFrames;
43
45
  private readonly listeners;
44
46
  private call;
45
47
  private localStream;
@@ -49,11 +51,12 @@ export declare class CallClient {
49
51
  private emit;
50
52
  private setState;
51
53
  getState(): CallUiState;
52
- private origin;
54
+ private apiUrl;
53
55
  private socketUrl;
54
56
  connect(): void;
55
57
  disconnect(): void;
56
58
  private openSocket;
59
+ private openSocketWithTicket;
57
60
  private scheduleReconnect;
58
61
  private send;
59
62
  /** Place an outgoing call. Fetches a callId + ICE, then rings the peer. */
@@ -73,6 +76,8 @@ export declare class CallClient {
73
76
  private onRemoteAnswer;
74
77
  private onRemoteCandidates;
75
78
  private drainRemoteCandidates;
79
+ private isActiveCall;
80
+ private isActivePeer;
76
81
  private setupMedia;
77
82
  private buildPeerConnection;
78
83
  private makeOffer;
@@ -1 +1 @@
1
- {"version":3,"file":"rtc-client.d.ts","sourceRoot":"","sources":["../../src/lib/rtc-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EACV,aAAa,EAId,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,SAAS,GACT,UAAU,GACV,YAAY,GACZ,WAAW,GACX,OAAO,CAAC;AAEZ,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3C,WAAW,EAAE,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,YAAY,EAAE,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACnD,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAChC,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAClC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,iBAAiB;IAChC,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAmBD,qBAAa,UAAU;IAUT,OAAO,CAAC,QAAQ,CAAC,OAAO;IATpC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAO;IACtB,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoD;IAC9E,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,KAAK,CAAuB;gBAEP,OAAO,GAAE,iBAAsB;IAG5D,EAAE,CAAC,CAAC,SAAS,MAAM,gBAAgB,EACjC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC5B,MAAM,IAAI;IAUb,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,QAAQ;IAMhB,QAAQ,IAAI,WAAW;IAKvB,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,SAAS;IAKjB,OAAO,IAAI,IAAI;IAKf,UAAU,IAAI,IAAI;IAQlB,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,IAAI;IAQZ,2EAA2E;IACrE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BlE,wCAAwC;IAClC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAc7B,yCAAyC;IACzC,MAAM,CAAC,MAAM,SAAa,GAAG,IAAI;IAOjC,wCAAwC;IACxC,MAAM,CAAC,MAAM,SAAW,GAAG,IAAI;IAO/B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAO9B,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;YAQ1B,OAAO;IAiDrB,OAAO,CAAC,SAAS;IAqBjB,OAAO,CAAC,WAAW;YAeL,aAAa;YAsBb,cAAc;YAUd,kBAAkB;YAkBlB,qBAAqB;YAarB,UAAU;IAoBxB,OAAO,CAAC,mBAAmB;YA2Bb,SAAS;IAOvB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,OAAO;IAqBf,OAAO,CAAC,QAAQ;CA0BjB"}
1
+ {"version":3,"file":"rtc-client.d.ts","sourceRoot":"","sources":["../../src/lib/rtc-client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takosjp/yurucommu-api",
3
- "version": "3.4.3",
3
+ "version": "3.4.4",
4
4
  "description": "Typed client SDK and public API contract for yurucommu-server clients.",
5
5
  "license": "AGPL-3.0-only",
6
6
  "type": "module",