@sidebandchat/client 0.0.0-stage → 0.1.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.
Files changed (224) hide show
  1. package/COPYRIGHT +8 -0
  2. package/LICENSE +674 -0
  3. package/README.md +121 -2
  4. package/dist/activity/activity-sharing-controller.d.ts +131 -0
  5. package/dist/activity/activity-sharing-controller.d.ts.map +1 -0
  6. package/dist/activity/activity-sharing-controller.js +351 -0
  7. package/dist/activity/activity-sharing-controller.js.map +1 -0
  8. package/dist/activity/index.d.ts +2 -0
  9. package/dist/activity/index.d.ts.map +1 -0
  10. package/dist/activity/index.js +2 -0
  11. package/dist/activity/index.js.map +1 -0
  12. package/dist/attachments/attachment-client.d.ts +36 -0
  13. package/dist/attachments/attachment-client.d.ts.map +1 -0
  14. package/dist/attachments/attachment-client.js +98 -0
  15. package/dist/attachments/attachment-client.js.map +1 -0
  16. package/dist/attachments/draft-attachment.d.ts +17 -0
  17. package/dist/attachments/draft-attachment.d.ts.map +1 -0
  18. package/dist/attachments/draft-attachment.js +2 -0
  19. package/dist/attachments/draft-attachment.js.map +1 -0
  20. package/dist/auth/identity-client.d.ts +64 -0
  21. package/dist/auth/identity-client.d.ts.map +1 -0
  22. package/dist/auth/identity-client.js +65 -0
  23. package/dist/auth/identity-client.js.map +1 -0
  24. package/dist/auth/index.d.ts +2 -0
  25. package/dist/auth/index.d.ts.map +1 -0
  26. package/dist/auth/index.js +2 -0
  27. package/dist/auth/index.js.map +1 -0
  28. package/dist/badges/badge-verifier.d.ts +11 -0
  29. package/dist/badges/badge-verifier.d.ts.map +1 -0
  30. package/dist/badges/badge-verifier.js +128 -0
  31. package/dist/badges/badge-verifier.js.map +1 -0
  32. package/dist/calls/calls-client.d.ts +16 -0
  33. package/dist/calls/calls-client.d.ts.map +1 -0
  34. package/dist/calls/calls-client.js +55 -0
  35. package/dist/calls/calls-client.js.map +1 -0
  36. package/dist/calls/index.d.ts +3 -0
  37. package/dist/calls/index.d.ts.map +1 -0
  38. package/dist/calls/index.js +2 -0
  39. package/dist/calls/index.js.map +1 -0
  40. package/dist/calls/media-controls.d.ts +38 -0
  41. package/dist/calls/media-controls.d.ts.map +1 -0
  42. package/dist/calls/media-controls.js +134 -0
  43. package/dist/calls/media-controls.js.map +1 -0
  44. package/dist/calls/media-presentation-controller.d.ts +39 -0
  45. package/dist/calls/media-presentation-controller.d.ts.map +1 -0
  46. package/dist/calls/media-presentation-controller.js +106 -0
  47. package/dist/calls/media-presentation-controller.js.map +1 -0
  48. package/dist/calls/media-types.d.ts +37 -0
  49. package/dist/calls/media-types.d.ts.map +1 -0
  50. package/dist/calls/media-types.js +2 -0
  51. package/dist/calls/media-types.js.map +1 -0
  52. package/dist/calls/media.d.ts +39 -0
  53. package/dist/calls/media.d.ts.map +1 -0
  54. package/dist/calls/media.js +501 -0
  55. package/dist/calls/media.js.map +1 -0
  56. package/dist/client/ephemeral-state.d.ts +52 -0
  57. package/dist/client/ephemeral-state.d.ts.map +1 -0
  58. package/dist/client/ephemeral-state.js +371 -0
  59. package/dist/client/ephemeral-state.js.map +1 -0
  60. package/dist/client/index.d.ts +7 -0
  61. package/dist/client/index.d.ts.map +1 -0
  62. package/dist/client/index.js +4 -0
  63. package/dist/client/index.js.map +1 -0
  64. package/dist/client/live-event-controller.d.ts +14 -0
  65. package/dist/client/live-event-controller.d.ts.map +1 -0
  66. package/dist/client/live-event-controller.js +28 -0
  67. package/dist/client/live-event-controller.js.map +1 -0
  68. package/dist/client/platform-adapters.d.ts +122 -0
  69. package/dist/client/platform-adapters.d.ts.map +1 -0
  70. package/dist/client/platform-adapters.js +2 -0
  71. package/dist/client/platform-adapters.js.map +1 -0
  72. package/dist/client/session-runtime.d.ts +115 -0
  73. package/dist/client/session-runtime.d.ts.map +1 -0
  74. package/dist/client/session-runtime.js +607 -0
  75. package/dist/client/session-runtime.js.map +1 -0
  76. package/dist/client/sideband-client.d.ts +141 -0
  77. package/dist/client/sideband-client.d.ts.map +1 -0
  78. package/dist/client/sideband-client.js +575 -0
  79. package/dist/client/sideband-client.js.map +1 -0
  80. package/dist/client/snapshot-client.d.ts +9 -0
  81. package/dist/client/snapshot-client.d.ts.map +1 -0
  82. package/dist/client/snapshot-client.js +18 -0
  83. package/dist/client/snapshot-client.js.map +1 -0
  84. package/dist/client/state.d.ts +112 -0
  85. package/dist/client/state.d.ts.map +1 -0
  86. package/dist/client/state.js +992 -0
  87. package/dist/client/state.js.map +1 -0
  88. package/dist/communities/community-client.d.ts +40 -0
  89. package/dist/communities/community-client.d.ts.map +1 -0
  90. package/dist/communities/community-client.js +166 -0
  91. package/dist/communities/community-client.js.map +1 -0
  92. package/dist/conversations/index.d.ts +2 -0
  93. package/dist/conversations/index.d.ts.map +1 -0
  94. package/dist/conversations/index.js +2 -0
  95. package/dist/conversations/index.js.map +1 -0
  96. package/dist/conversations/mentions.d.ts +18 -0
  97. package/dist/conversations/mentions.d.ts.map +1 -0
  98. package/dist/conversations/mentions.js +108 -0
  99. package/dist/conversations/mentions.js.map +1 -0
  100. package/dist/conversations/messaging-client.d.ts +56 -0
  101. package/dist/conversations/messaging-client.d.ts.map +1 -0
  102. package/dist/conversations/messaging-client.js +333 -0
  103. package/dist/conversations/messaging-client.js.map +1 -0
  104. package/dist/conversations/replies-controller.d.ts +50 -0
  105. package/dist/conversations/replies-controller.d.ts.map +1 -0
  106. package/dist/conversations/replies-controller.js +206 -0
  107. package/dist/conversations/replies-controller.js.map +1 -0
  108. package/dist/devices/device-client.d.ts +11 -0
  109. package/dist/devices/device-client.d.ts.map +1 -0
  110. package/dist/devices/device-client.js +27 -0
  111. package/dist/devices/device-client.js.map +1 -0
  112. package/dist/domain.d.ts +528 -0
  113. package/dist/domain.d.ts.map +1 -0
  114. package/dist/domain.js +13 -0
  115. package/dist/domain.js.map +1 -0
  116. package/dist/entity-id.d.ts +32 -0
  117. package/dist/entity-id.d.ts.map +1 -0
  118. package/dist/entity-id.js +17 -0
  119. package/dist/entity-id.js.map +1 -0
  120. package/dist/index.d.ts +11 -0
  121. package/dist/index.d.ts.map +1 -0
  122. package/dist/index.js +10 -0
  123. package/dist/index.js.map +1 -0
  124. package/dist/instance/index.d.ts +5 -0
  125. package/dist/instance/index.d.ts.map +1 -0
  126. package/dist/instance/index.js +3 -0
  127. package/dist/instance/index.js.map +1 -0
  128. package/dist/instance/instance-policy.d.ts +13 -0
  129. package/dist/instance/instance-policy.d.ts.map +1 -0
  130. package/dist/instance/instance-policy.js +2 -0
  131. package/dist/instance/instance-policy.js.map +1 -0
  132. package/dist/instance-access.d.ts +66 -0
  133. package/dist/instance-access.d.ts.map +1 -0
  134. package/dist/instance-access.js +84 -0
  135. package/dist/instance-access.js.map +1 -0
  136. package/dist/instance-capabilities.d.ts +12 -0
  137. package/dist/instance-capabilities.d.ts.map +1 -0
  138. package/dist/instance-capabilities.js +2 -0
  139. package/dist/instance-capabilities.js.map +1 -0
  140. package/dist/instance-endpoint.d.ts +32 -0
  141. package/dist/instance-endpoint.d.ts.map +1 -0
  142. package/dist/instance-endpoint.js +147 -0
  143. package/dist/instance-endpoint.js.map +1 -0
  144. package/dist/model/index.d.ts +3 -0
  145. package/dist/model/index.d.ts.map +1 -0
  146. package/dist/model/index.js +3 -0
  147. package/dist/model/index.js.map +1 -0
  148. package/dist/model/selectors.d.ts +22 -0
  149. package/dist/model/selectors.d.ts.map +1 -0
  150. package/dist/model/selectors.js +73 -0
  151. package/dist/model/selectors.js.map +1 -0
  152. package/dist/private-conversation/file-hash.d.ts +2 -0
  153. package/dist/private-conversation/file-hash.d.ts.map +1 -0
  154. package/dist/private-conversation/file-hash.js +13 -0
  155. package/dist/private-conversation/file-hash.js.map +1 -0
  156. package/dist/private-conversation/private-conversation-crypto.d.ts +48 -0
  157. package/dist/private-conversation/private-conversation-crypto.d.ts.map +1 -0
  158. package/dist/private-conversation/private-conversation-crypto.js +169 -0
  159. package/dist/private-conversation/private-conversation-crypto.js.map +1 -0
  160. package/dist/private-conversation/private-conversations-client.d.ts +23 -0
  161. package/dist/private-conversation/private-conversations-client.d.ts.map +1 -0
  162. package/dist/private-conversation/private-conversations-client.js +77 -0
  163. package/dist/private-conversation/private-conversations-client.js.map +1 -0
  164. package/dist/private-conversation/private-transfer-limits.d.ts +9 -0
  165. package/dist/private-conversation/private-transfer-limits.d.ts.map +1 -0
  166. package/dist/private-conversation/private-transfer-limits.js +9 -0
  167. package/dist/private-conversation/private-transfer-limits.js.map +1 -0
  168. package/dist/private-conversation/private-transfer-protocol.d.ts +53 -0
  169. package/dist/private-conversation/private-transfer-protocol.d.ts.map +1 -0
  170. package/dist/private-conversation/private-transfer-protocol.js +184 -0
  171. package/dist/private-conversation/private-transfer-protocol.js.map +1 -0
  172. package/dist/private-conversation/private-transfer-transport.d.ts +22 -0
  173. package/dist/private-conversation/private-transfer-transport.d.ts.map +1 -0
  174. package/dist/private-conversation/private-transfer-transport.js +94 -0
  175. package/dist/private-conversation/private-transfer-transport.js.map +1 -0
  176. package/dist/realtime/realtime-client.d.ts +31 -0
  177. package/dist/realtime/realtime-client.d.ts.map +1 -0
  178. package/dist/realtime/realtime-client.js +103 -0
  179. package/dist/realtime/realtime-client.js.map +1 -0
  180. package/dist/sbp/codec.d.ts +33 -0
  181. package/dist/sbp/codec.d.ts.map +1 -0
  182. package/dist/sbp/codec.js +93 -0
  183. package/dist/sbp/codec.js.map +1 -0
  184. package/dist/sbp/command-transport.d.ts +9 -0
  185. package/dist/sbp/command-transport.d.ts.map +1 -0
  186. package/dist/sbp/command-transport.js +2 -0
  187. package/dist/sbp/command-transport.js.map +1 -0
  188. package/dist/sbp/frame.d.ts +34 -0
  189. package/dist/sbp/frame.d.ts.map +1 -0
  190. package/dist/sbp/frame.js +95 -0
  191. package/dist/sbp/frame.js.map +1 -0
  192. package/dist/sbp/records.d.ts +32 -0
  193. package/dist/sbp/records.d.ts.map +1 -0
  194. package/dist/sbp/records.js +527 -0
  195. package/dist/sbp/records.js.map +1 -0
  196. package/dist/sbp/session.d.ts +110 -0
  197. package/dist/sbp/session.d.ts.map +1 -0
  198. package/dist/sbp/session.js +349 -0
  199. package/dist/sbp/session.js.map +1 -0
  200. package/dist/sbp/value.d.ts +13 -0
  201. package/dist/sbp/value.d.ts.map +1 -0
  202. package/dist/sbp/value.js +58 -0
  203. package/dist/sbp/value.js.map +1 -0
  204. package/dist/social/social-client.d.ts +38 -0
  205. package/dist/social/social-client.d.ts.map +1 -0
  206. package/dist/social/social-client.js +110 -0
  207. package/dist/social/social-client.js.map +1 -0
  208. package/dist/transports/media-server-identity.d.ts +8 -0
  209. package/dist/transports/media-server-identity.d.ts.map +1 -0
  210. package/dist/transports/media-server-identity.js +22 -0
  211. package/dist/transports/media-server-identity.js.map +1 -0
  212. package/dist/workspace/index.d.ts +2 -0
  213. package/dist/workspace/index.d.ts.map +1 -0
  214. package/dist/workspace/index.js +2 -0
  215. package/dist/workspace/index.js.map +1 -0
  216. package/dist/workspace/workspace-controller.d.ts +39 -0
  217. package/dist/workspace/workspace-controller.d.ts.map +1 -0
  218. package/dist/workspace/workspace-controller.js +188 -0
  219. package/dist/workspace/workspace-controller.js.map +1 -0
  220. package/dist/workspace/workspace-selectors.d.ts +49 -0
  221. package/dist/workspace/workspace-selectors.d.ts.map +1 -0
  222. package/dist/workspace/workspace-selectors.js +110 -0
  223. package/dist/workspace/workspace-selectors.js.map +1 -0
  224. package/package.json +88 -4
@@ -0,0 +1,607 @@
1
+ import { decodeEntityRef } from "../sbp/codec.js";
2
+ import { decodeCall, decodePrivateConversation, decodePrivateTransfer, } from "../sbp/records.js";
3
+ import { MediaControls } from "../calls/media-controls.js";
4
+ import { arrayValue, bytesValue, mapValue, required, unsignedValue, } from "../sbp/value.js";
5
+ export class SessionRuntime {
6
+ session;
7
+ calls;
8
+ privateConversations;
9
+ endpoint;
10
+ ownUserId;
11
+ media;
12
+ crypto;
13
+ transferAdapter;
14
+ mediaControls;
15
+ current = {
16
+ calls: new Map(),
17
+ privateConversations: new Map(),
18
+ transfers: new Map(),
19
+ privateMessages: new Map(),
20
+ };
21
+ listeners = new Set();
22
+ privateEventListeners = new Set();
23
+ unsubscribers = [];
24
+ pending = Promise.resolve();
25
+ cryptoHandles = new Map();
26
+ privateInvites = new Map();
27
+ interruptedPrivateConversations = new Set();
28
+ connectingTransfers = new Map();
29
+ transferKeys = new Map();
30
+ transferProgress = new Map();
31
+ constructor(session, calls, privateConversations, endpoint, ownUserId, media, crypto, transferAdapter, mediaPreferences) {
32
+ this.session = session;
33
+ this.calls = calls;
34
+ this.privateConversations = privateConversations;
35
+ this.endpoint = endpoint;
36
+ this.ownUserId = ownUserId;
37
+ this.media = media;
38
+ this.crypto = crypto;
39
+ this.transferAdapter = transferAdapter;
40
+ if (media)
41
+ this.mediaControls = new MediaControls(media, mediaPreferences);
42
+ }
43
+ get state() {
44
+ return this.current;
45
+ }
46
+ subscribe = (listener) => {
47
+ this.listeners.add(listener);
48
+ return () => this.listeners.delete(listener);
49
+ };
50
+ subscribePrivateEvents = (listener) => {
51
+ this.privateEventListeners.add(listener);
52
+ return () => this.privateEventListeners.delete(listener);
53
+ };
54
+ privateConversationView(id) {
55
+ const session = id
56
+ ? this.current.privateConversations.get(id)
57
+ : [...this.current.privateConversations.values()].find((item) => item.state !== "ended");
58
+ if (!session)
59
+ return { status: "idle", messages: [] };
60
+ const status = session.state === "ringing"
61
+ ? session.initiatorId === this.ownUserId
62
+ ? "outgoing"
63
+ : "incoming"
64
+ : session.state === "negotiating" || session.state === "reconnecting"
65
+ ? "connecting"
66
+ : session.state === "active"
67
+ ? "active"
68
+ : "idle";
69
+ return {
70
+ session,
71
+ status,
72
+ messages: (this.current.privateMessages.get(session.id) ?? []).map((message) => ({
73
+ ...message,
74
+ attachments: message.transferIds?.flatMap((transferId) => {
75
+ const transfer = this.current.transfers.get(transferId);
76
+ if (!transfer?.filename || !transfer.mediaType || !transfer.sha256)
77
+ return [];
78
+ const state = transfer.state === "offered"
79
+ ? transfer.senderId === this.ownUserId
80
+ ? "waiting"
81
+ : "offered"
82
+ : transfer.state === "accepted"
83
+ ? "waiting"
84
+ : transfer.state;
85
+ return [
86
+ {
87
+ transferId,
88
+ filename: transfer.filename,
89
+ mediaType: transfer.mediaType,
90
+ byteSize: transfer.byteSize,
91
+ sha256: transfer.sha256,
92
+ state,
93
+ progress: this.transferProgress.get(transferId) ?? 0,
94
+ },
95
+ ];
96
+ }),
97
+ })),
98
+ };
99
+ }
100
+ start() {
101
+ if (this.unsubscribers.length)
102
+ return;
103
+ const unsubscribeStatus = this.session.subscribeStatus?.((status) => this.receiveStatus(status));
104
+ this.unsubscribers = [
105
+ this.session.subscribeEvents((frame) => this.receiveEvent(frame)),
106
+ this.session.subscribeControls((frame) => this.receiveControl(frame)),
107
+ ...(unsubscribeStatus ? [unsubscribeStatus] : []),
108
+ ];
109
+ void this.mediaControls?.start();
110
+ }
111
+ stop() {
112
+ this.unsubscribers.splice(0).forEach((unsubscribe) => unsubscribe());
113
+ this.current = {
114
+ calls: new Map(),
115
+ privateConversations: new Map(),
116
+ transfers: new Map(),
117
+ privateMessages: new Map(),
118
+ };
119
+ for (const handle of this.cryptoHandles.values())
120
+ void this.crypto?.close(handle);
121
+ this.cryptoHandles.clear();
122
+ this.privateInvites.clear();
123
+ this.interruptedPrivateConversations.clear();
124
+ for (const transferId of this.connectingTransfers.keys())
125
+ void this.transferAdapter?.disconnect(transferId);
126
+ this.connectingTransfers.clear();
127
+ this.transferKeys.clear();
128
+ this.transferProgress.clear();
129
+ this.mediaControls?.stop();
130
+ }
131
+ receiveStatus(status) {
132
+ if (status.state !== "offline")
133
+ return;
134
+ const interrupted = [...this.current.privateConversations.values()].filter((session) => session.state !== "ended");
135
+ if (!interrupted.length)
136
+ return;
137
+ for (const session of interrupted)
138
+ this.interruptedPrivateConversations.add(session.id);
139
+ for (const handle of this.cryptoHandles.values())
140
+ void this.crypto?.close(handle);
141
+ this.cryptoHandles.clear();
142
+ this.privateInvites.clear();
143
+ for (const transferId of this.connectingTransfers.keys())
144
+ void this.transferAdapter?.disconnect(transferId);
145
+ this.connectingTransfers.clear();
146
+ this.transferKeys.clear();
147
+ this.transferProgress.clear();
148
+ this.set({
149
+ ...this.current,
150
+ privateConversations: new Map([...this.current.privateConversations].filter(([, session]) => session.state === "ended")),
151
+ transfers: new Map(),
152
+ privateMessages: new Map(),
153
+ });
154
+ }
155
+ acceptCall(callId) {
156
+ return this.enqueue(async () => {
157
+ const activePrivate = [
158
+ ...this.current.privateConversations.values(),
159
+ ].find((item) => item.state !== "ended");
160
+ if (activePrivate)
161
+ await this.privateConversations.end(activePrivate.id);
162
+ await this.calls.join(callId);
163
+ if (!this.media)
164
+ return;
165
+ const call = this.current.calls.get(callId);
166
+ if (!call)
167
+ throw new Error("The call is not available");
168
+ try {
169
+ const admission = await this.calls.admit(callId);
170
+ await this.media.connect({
171
+ endpoint: this.endpoint,
172
+ localUserId: this.ownUserId,
173
+ call,
174
+ admission,
175
+ });
176
+ await this.calls.mediaConnected(callId);
177
+ }
178
+ catch (reason) {
179
+ await this.media.disconnect(callId).catch(() => undefined);
180
+ await this.calls.leave(callId).catch(() => undefined);
181
+ throw reason;
182
+ }
183
+ });
184
+ }
185
+ leaveCall(callId) {
186
+ return this.enqueue(async () => {
187
+ await this.media?.disconnect(callId);
188
+ await this.calls.leave(callId);
189
+ });
190
+ }
191
+ async startCall(...args) {
192
+ const call = await this.calls.start(...args);
193
+ this.upsert("calls", call, (item) => item.id);
194
+ return call;
195
+ }
196
+ async startPrivateConversation(peerId) {
197
+ if (!this.crypto)
198
+ throw new Error("Private conversation encryption is unavailable");
199
+ const offer = await this.crypto.createOffer(peerId);
200
+ const session = await this.privateConversations.start(peerId, offer.payload);
201
+ this.cryptoHandles.set(session.id, offer.handle);
202
+ this.upsert("privateConversations", session, (item) => item.id);
203
+ return session;
204
+ }
205
+ async sendPrivateMessage(privateConversationId, messageId, body, timestamp = new Date().toISOString(), transferIds = []) {
206
+ const handle = this.cryptoHandles.get(privateConversationId);
207
+ const session = this.current.privateConversations.get(privateConversationId);
208
+ const trimmed = body.trim();
209
+ if (!handle ||
210
+ !session ||
211
+ session.state !== "active" ||
212
+ (!trimmed && transferIds.length === 0))
213
+ return false;
214
+ const plaintext = new TextEncoder().encode(JSON.stringify({
215
+ kind: "message",
216
+ id: messageId,
217
+ body: trimmed,
218
+ timestamp,
219
+ transferIds,
220
+ }));
221
+ const ciphertext = await this.crypto.encrypt(handle, plaintext);
222
+ await this.privateConversations.signal(privateConversationId, ciphertext);
223
+ this.appendPrivateMessage({
224
+ id: messageId,
225
+ privateConversationId,
226
+ senderId: this.ownUserId,
227
+ body: trimmed,
228
+ timestamp,
229
+ transferIds,
230
+ });
231
+ return true;
232
+ }
233
+ async offerPrivateTransfer(privateConversationId, input) {
234
+ if (!this.transferAdapter || !this.crypto)
235
+ throw new Error("Private file transfers are unavailable");
236
+ const handle = this.cryptoHandles.get(privateConversationId);
237
+ if (!handle)
238
+ throw new Error("Private encryption is not ready");
239
+ const prepared = await this.transferAdapter.prepare(input);
240
+ const transfer = await this.privateConversations.offerTransfer({
241
+ privateConversationId,
242
+ byteSize: input.byteSize,
243
+ });
244
+ const describedTransfer = {
245
+ ...transfer,
246
+ filename: input.filename,
247
+ mediaType: input.mediaType,
248
+ sha256: prepared.sha256,
249
+ };
250
+ this.transferKeys.set(transfer.id, prepared.key);
251
+ await this.transferAdapter.registerSource(transfer.id, input.resource);
252
+ this.mergeTransfer(describedTransfer);
253
+ const offerSignal = await this.crypto.encrypt(handle, new TextEncoder().encode(JSON.stringify({
254
+ kind: "transfer-offer",
255
+ transferId: transfer.id,
256
+ filename: input.filename,
257
+ mediaType: input.mediaType,
258
+ byteSize: input.byteSize,
259
+ sha256: [...prepared.sha256],
260
+ key: [...prepared.key],
261
+ })));
262
+ await this.privateConversations.signal(privateConversationId, offerSignal);
263
+ return describedTransfer;
264
+ }
265
+ acceptPrivateConversation(id, encryptedAnswer) {
266
+ return this.enqueue(async () => {
267
+ const activeCall = [...this.current.calls.values()].find((item) => !["ended", "declined", "expired"].includes(item.state));
268
+ if (activeCall)
269
+ await this.calls.leave(activeCall.id);
270
+ let answer = encryptedAnswer;
271
+ if (this.crypto) {
272
+ const session = this.current.privateConversations.get(id);
273
+ const payload = this.privateInvites.get(id);
274
+ if (!session || !payload)
275
+ throw new Error("The private invitation is unavailable");
276
+ const accepted = await this.crypto.acceptOffer({ session, payload });
277
+ answer = accepted.payload;
278
+ this.cryptoHandles.set(id, accepted.handle);
279
+ }
280
+ if (!answer)
281
+ throw new Error("An encrypted private answer is required");
282
+ await this.privateConversations.accept(id, answer);
283
+ });
284
+ }
285
+ declinePrivateConversation(id) {
286
+ return this.finishPrivateConversation(id, "decline");
287
+ }
288
+ endPrivateConversation(id) {
289
+ return this.finishPrivateConversation(id, "end");
290
+ }
291
+ async acceptTransfer(transferId) {
292
+ const transfer = this.requireTransfer(transferId);
293
+ const accepted = await this.privateConversations.actOnTransfer(transfer.privateConversationId, transferId, "accept");
294
+ const transferWithMetadata = this.mergeTransfer(accepted);
295
+ await this.connectTransfer(transferWithMetadata);
296
+ return transferWithMetadata;
297
+ }
298
+ async cancelTransfer(transferId) {
299
+ return this.finishTransfer(transferId, "cancel");
300
+ }
301
+ async declineTransfer(transferId) {
302
+ const transfer = this.requireTransfer(transferId);
303
+ const updated = await this.privateConversations.actOnTransfer(transfer.privateConversationId, transferId, "decline");
304
+ this.mergeTransfer(updated);
305
+ return updated;
306
+ }
307
+ showTransferInFolder(transferId) {
308
+ if (!this.transferAdapter)
309
+ throw new Error("Private file transfers are unavailable");
310
+ return this.transferAdapter.showInFolder(transferId);
311
+ }
312
+ async completeTransfer(transferId) {
313
+ return this.finishTransfer(transferId, "complete");
314
+ }
315
+ receiveEvent(frame) {
316
+ if (frame.stream.kind !== "account")
317
+ return;
318
+ this.receiveRealtime(frame.opcode, frame.payload, frame.timestamp);
319
+ }
320
+ receiveRealtime(opcode, payload, timestamp) {
321
+ if (opcode === 400)
322
+ this.upsert("calls", decodeCall(payload), (item) => item.id);
323
+ else if (opcode === 401)
324
+ this.updateCallParticipant(payload);
325
+ else if (opcode === 420)
326
+ this.receivePrivateEvent(payload, timestamp);
327
+ else if (opcode === 422) {
328
+ const transfer = decodePrivateTransfer(payload);
329
+ const transferWithMetadata = this.mergeTransfer(transfer);
330
+ if (transfer.state === "accepted")
331
+ void this.connectTransfer(transferWithMetadata);
332
+ if (["completed", "declined", "canceled"].includes(transfer.state))
333
+ void this.transferAdapter?.disconnect(transfer.id);
334
+ }
335
+ }
336
+ receivePrivateEvent(payload, timestamp) {
337
+ const map = mapValue(payload);
338
+ const privateConversationId = decodeEntityRef(required(map, 0), "private-conversation");
339
+ const senderId = decodeEntityRef(required(map, 1), "user");
340
+ const actions = {
341
+ 0: "invite",
342
+ 1: "accept",
343
+ 2: "decline",
344
+ 3: "signal",
345
+ 5: "end",
346
+ 6: "reconnect",
347
+ 7: "state",
348
+ };
349
+ const states = [
350
+ "ringing",
351
+ "negotiating",
352
+ "active",
353
+ "reconnecting",
354
+ "ended",
355
+ ];
356
+ const action = actions[unsignedValue(required(map, 2))];
357
+ const state = states[unsignedValue(required(map, 4))];
358
+ if (!action || !state)
359
+ throw new TypeError("Invalid private conversation event");
360
+ const existing = this.current.privateConversations.get(privateConversationId);
361
+ const session = existing
362
+ ? {
363
+ ...existing,
364
+ state,
365
+ encryptedInvitation: action === "invite" ? existing.encryptedInvitation : undefined,
366
+ }
367
+ : {
368
+ id: privateConversationId,
369
+ initiatorId: senderId,
370
+ peerId: senderId === this.ownUserId ? this.ownUserId : senderId,
371
+ state,
372
+ startedAt: timestamp.toISOString(),
373
+ };
374
+ this.upsert("privateConversations", session, (item) => item.id);
375
+ const event = {
376
+ privateConversationId,
377
+ senderId,
378
+ action,
379
+ payload: bytesValue(required(map, 3)),
380
+ state,
381
+ receivedAt: timestamp.toISOString(),
382
+ };
383
+ if (action === "invite")
384
+ this.privateInvites.set(privateConversationId, event.payload);
385
+ const handle = this.cryptoHandles.get(privateConversationId);
386
+ if (handle &&
387
+ senderId !== this.ownUserId &&
388
+ (action === "accept" || action === "signal"))
389
+ void this.receivePrivateCrypto(handle, event);
390
+ if (action === "accept" || action === "end" || action === "decline") {
391
+ this.privateInvites.delete(privateConversationId);
392
+ }
393
+ if (action === "end" || action === "decline") {
394
+ this.interruptedPrivateConversations.delete(privateConversationId);
395
+ if (handle) {
396
+ this.cryptoHandles.delete(privateConversationId);
397
+ void this.crypto?.close(handle);
398
+ }
399
+ }
400
+ this.privateEventListeners.forEach((listener) => listener(event));
401
+ }
402
+ async receivePrivateCrypto(handle, event) {
403
+ try {
404
+ const result = await this.crypto.receive(handle, event);
405
+ for (const outbound of result.outbound ?? [])
406
+ await this.privateConversations.signal(event.privateConversationId, outbound);
407
+ for (const message of result.messages ?? [])
408
+ this.appendPrivateMessage({
409
+ ...message,
410
+ privateConversationId: event.privateConversationId,
411
+ senderId: event.senderId,
412
+ });
413
+ for (const offer of result.transferOffers ?? []) {
414
+ const existing = this.current.transfers.get(offer.transferId);
415
+ if (existing && existing.byteSize !== offer.byteSize)
416
+ throw new Error("Private transfer size does not match its encrypted offer");
417
+ this.transferKeys.set(offer.transferId, offer.key);
418
+ const transfer = {
419
+ id: offer.transferId,
420
+ privateConversationId: event.privateConversationId,
421
+ senderId: event.senderId,
422
+ state: existing?.state ?? "offered",
423
+ ...existing,
424
+ filename: offer.filename,
425
+ mediaType: offer.mediaType,
426
+ byteSize: offer.byteSize,
427
+ sha256: offer.sha256,
428
+ };
429
+ this.mergeTransfer(transfer);
430
+ if (transfer?.state === "accepted")
431
+ void this.connectTransfer(transfer);
432
+ }
433
+ }
434
+ catch {
435
+ await this.privateConversations.end(event.privateConversationId);
436
+ }
437
+ }
438
+ appendPrivateMessage(message) {
439
+ const privateMessages = new Map(this.current.privateMessages);
440
+ privateMessages.set(message.privateConversationId, [
441
+ ...(privateMessages.get(message.privateConversationId) ?? []),
442
+ message,
443
+ ]);
444
+ this.set({ ...this.current, privateMessages });
445
+ }
446
+ receiveControl(frame) {
447
+ if ([400, 401, 420, 422].includes(frame.opcode)) {
448
+ this.receiveRealtime(frame.opcode, frame.payload, new Date());
449
+ return;
450
+ }
451
+ if (frame.opcode !== 38)
452
+ return;
453
+ const map = mapValue(frame.payload);
454
+ const privateConversations = arrayValue(required(map, 3)).map(decodePrivateConversation);
455
+ const interruptedPrivateConversations = privateConversations.filter((conversation) => this.interruptedPrivateConversations.has(conversation.id) &&
456
+ conversation.state !== "ended");
457
+ const snapshotIds = new Set(privateConversations.map((conversation) => conversation.id));
458
+ for (const id of this.interruptedPrivateConversations) {
459
+ if (!snapshotIds.has(id))
460
+ this.interruptedPrivateConversations.delete(id);
461
+ }
462
+ for (const conversation of interruptedPrivateConversations)
463
+ void this.privateConversations
464
+ .end(conversation.id)
465
+ .catch(() => undefined);
466
+ const availablePrivateConversations = privateConversations.filter((conversation) => !this.interruptedPrivateConversations.has(conversation.id));
467
+ this.privateInvites.clear();
468
+ for (const conversation of availablePrivateConversations) {
469
+ if (conversation.encryptedInvitation)
470
+ this.privateInvites.set(conversation.id, conversation.encryptedInvitation);
471
+ }
472
+ this.set({
473
+ calls: keyed(arrayValue(required(map, 2)).map(decodeCall), (item) => item.id),
474
+ privateConversations: keyed(availablePrivateConversations, (item) => item.id),
475
+ transfers: this.current.transfers,
476
+ privateMessages: this.current.privateMessages,
477
+ });
478
+ }
479
+ updateCallParticipant(payload) {
480
+ const map = mapValue(payload);
481
+ const callId = decodeEntityRef(required(map, 0), "call");
482
+ const call = this.current.calls.get(callId);
483
+ if (!call)
484
+ return;
485
+ const userId = decodeEntityRef(required(map, 1), "user");
486
+ const states = [
487
+ "invited",
488
+ "ringing",
489
+ "joining",
490
+ "active",
491
+ "declined",
492
+ "left",
493
+ ];
494
+ const state = states[unsignedValue(required(map, 2))];
495
+ if (!state)
496
+ throw new TypeError("Invalid call participant state");
497
+ const participants = [
498
+ ...call.participants.filter((item) => item.userId !== userId),
499
+ { userId, state },
500
+ ];
501
+ this.upsert("calls", { ...call, participants }, (item) => item.id);
502
+ }
503
+ connectTransfer(transfer) {
504
+ if (!this.transferAdapter)
505
+ return Promise.resolve();
506
+ if (!completeTransferMetadata(transfer))
507
+ return Promise.resolve();
508
+ const key = this.transferKeys.get(transfer.id);
509
+ if (!key)
510
+ return Promise.resolve();
511
+ const existing = this.connectingTransfers.get(transfer.id);
512
+ if (existing)
513
+ return existing;
514
+ const operation = (async () => {
515
+ try {
516
+ const admission = await this.privateConversations.admitTransfer(transfer.privateConversationId, transfer.id);
517
+ await this.transferAdapter.connect({
518
+ endpoint: this.endpoint,
519
+ transfer,
520
+ admission,
521
+ key,
522
+ direction: transfer.senderId === this.ownUserId ? "send" : "receive",
523
+ onProgress: (progress) => {
524
+ this.transferProgress.set(transfer.id, progress);
525
+ this.set({ ...this.current });
526
+ },
527
+ onComplete: () => void this.completeTransfer(transfer.id),
528
+ onError: () => void this.cancelTransfer(transfer.id),
529
+ });
530
+ this.upsert("transfers", { ...transfer, state: "transferring" }, (item) => item.id);
531
+ }
532
+ catch (reason) {
533
+ await this.transferAdapter.disconnect(transfer.id).catch(() => undefined);
534
+ await this.privateConversations
535
+ .actOnTransfer(transfer.privateConversationId, transfer.id, "cancel")
536
+ .catch(() => undefined);
537
+ throw reason;
538
+ }
539
+ finally {
540
+ this.connectingTransfers.delete(transfer.id);
541
+ }
542
+ })();
543
+ this.connectingTransfers.set(transfer.id, operation);
544
+ return operation;
545
+ }
546
+ async finishTransfer(transferId, action) {
547
+ const transfer = this.requireTransfer(transferId);
548
+ await this.transferAdapter?.disconnect(transferId);
549
+ const updated = await this.privateConversations.actOnTransfer(transfer.privateConversationId, transferId, action);
550
+ return this.mergeTransfer(updated);
551
+ }
552
+ finishPrivateConversation(id, action) {
553
+ return this.enqueue(async () => {
554
+ if (action === "decline")
555
+ await this.privateConversations.decline(id);
556
+ else
557
+ await this.privateConversations.end(id);
558
+ const handle = this.cryptoHandles.get(id);
559
+ this.cryptoHandles.delete(id);
560
+ this.privateInvites.delete(id);
561
+ if (handle)
562
+ await this.crypto?.close(handle);
563
+ const session = this.current.privateConversations.get(id);
564
+ if (session)
565
+ this.upsert("privateConversations", { ...session, state: "ended" }, (item) => item.id);
566
+ });
567
+ }
568
+ requireTransfer(id) {
569
+ const transfer = this.current.transfers.get(id);
570
+ if (!transfer)
571
+ throw new Error("The private transfer is unavailable");
572
+ return transfer;
573
+ }
574
+ mergeTransfer(transfer) {
575
+ const merged = {
576
+ ...this.current.transfers.get(transfer.id),
577
+ ...transfer,
578
+ filename: transfer.filename ?? this.current.transfers.get(transfer.id)?.filename,
579
+ mediaType: transfer.mediaType ??
580
+ this.current.transfers.get(transfer.id)?.mediaType,
581
+ sha256: transfer.sha256 ?? this.current.transfers.get(transfer.id)?.sha256,
582
+ };
583
+ this.upsert("transfers", merged, (item) => item.id);
584
+ return merged;
585
+ }
586
+ upsert(name, value, key) {
587
+ const values = new Map(this.current[name]);
588
+ values.set(key(value), value);
589
+ this.set({ ...this.current, [name]: values });
590
+ }
591
+ set(state) {
592
+ this.current = state;
593
+ this.listeners.forEach((listener) => listener());
594
+ }
595
+ enqueue(operation) {
596
+ const result = this.pending.then(operation, operation);
597
+ this.pending = result.catch(() => undefined);
598
+ return result;
599
+ }
600
+ }
601
+ function keyed(values, key) {
602
+ return new Map(values.map((value) => [key(value), value]));
603
+ }
604
+ function completeTransferMetadata(transfer) {
605
+ return Boolean(transfer.filename && transfer.mediaType && transfer.sha256);
606
+ }
607
+ //# sourceMappingURL=session-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-runtime.js","sourceRoot":"","sources":["../../src/client/session-runtime.ts"],"names":[],"mappings":"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"}