@sidebandchat/client 0.0.0-stage → 0.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.
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,110 @@
1
+ import { decodeEntityRef, entityRef, wireMap } from "../sbp/codec.js";
2
+ import { decodeBlock, decodeFriendship, decodeInboxEntry, decodeNotificationSettings, decodeUserProfile, decodeUserSummary, } from "../sbp/records.js";
3
+ import { arrayValue, booleanValue, mapValue, orderedValue, required, } from "../sbp/value.js";
4
+ export class SbpSocialClient {
5
+ transport;
6
+ verifyProfile;
7
+ onOwnProfile;
8
+ constructor(transport, verifyProfile = async (profile) => profile, onOwnProfile = () => undefined) {
9
+ this.transport = transport;
10
+ this.verifyProfile = verifyProfile;
11
+ this.onOwnProfile = onOwnProfile;
12
+ }
13
+ async profile(userId) {
14
+ return this.verifyProfile(decodeUserProfile(await this.transport.command(20, wireMap([[0, entityRef("user", userId)]]))));
15
+ }
16
+ async updateProfile(input) {
17
+ const avatar = input.avatarId === null
18
+ ? null
19
+ : input.avatarId
20
+ ? entityRef("attachment", input.avatarId)
21
+ : undefined;
22
+ const profile = await this.verifyProfile(decodeUserProfile(await this.transport.command(21, wireMap([
23
+ ...optionalEntry(0, input.displayName),
24
+ ...optionalEntry(1, input.bio),
25
+ ...optionalEntry(2, avatar),
26
+ [3, input.revision],
27
+ ]))));
28
+ this.onOwnProfile(profile);
29
+ return profile;
30
+ }
31
+ async resolveHandle(handle) {
32
+ return decodeUserSummary(await this.transport.command(22, wireMap([[0, handle]])));
33
+ }
34
+ async summaries(userIds) {
35
+ if (!userIds.length)
36
+ return [];
37
+ const response = mapValue(await this.transport.command(23, wireMap([[0, userIds.map((id) => entityRef("user", id))]])));
38
+ return arrayValue(required(response, 0)).map(decodeUserSummary);
39
+ }
40
+ async requestFriend(userId) {
41
+ return decodeFriendship(await this.transport.command(24, wireMap([[0, entityRef("user", userId)]])));
42
+ }
43
+ acceptFriend(friendshipId, revision) {
44
+ return this.friendshipMutation(25, friendshipId, revision);
45
+ }
46
+ declineFriend(friendshipId, revision) {
47
+ return this.friendshipMutation(26, friendshipId, revision);
48
+ }
49
+ cancelFriend(friendshipId, revision) {
50
+ return this.friendshipMutation(27, friendshipId, revision);
51
+ }
52
+ removeFriend(friendshipId, revision) {
53
+ return this.friendshipMutation(28, friendshipId, revision);
54
+ }
55
+ async inbox(options = {}) {
56
+ const response = mapValue(await this.transport.command(30, wireMap([
57
+ ...optionalEntry(0, options.kind === undefined
58
+ ? undefined
59
+ : options.kind === "unread"
60
+ ? 0
61
+ : 1),
62
+ ...optionalEntry(1, options.limit),
63
+ ])));
64
+ return arrayValue(required(response, 0)).map(decodeInboxEntry);
65
+ }
66
+ async markInboxRead(notificationId) {
67
+ const response = mapValue(await this.transport.command(31, wireMap([[0, notificationId]])));
68
+ return {
69
+ id: orderedValue(required(response, 0)),
70
+ read: booleanValue(required(response, 1)),
71
+ };
72
+ }
73
+ async block(userId) {
74
+ return decodeBlock(await this.transport.command(32, wireMap([[0, entityRef("user", userId)]])));
75
+ }
76
+ async unblock(blockId, revision) {
77
+ const response = mapValue(await this.transport.command(33, wireMap([
78
+ [0, entityRef("block", blockId)],
79
+ [1, revision],
80
+ ])));
81
+ return decodeEntityRef(required(response, 0), "block");
82
+ }
83
+ async setNotificationSettings(settings) {
84
+ return decodeNotificationSettings(await this.transport.command(34, wireMap([[0, encodeNotificationSettings(settings)]])));
85
+ }
86
+ async friendshipMutation(opcode, friendshipId, revision) {
87
+ return decodeFriendship(await this.transport.command(opcode, wireMap([
88
+ [0, entityRef("friendship", friendshipId)],
89
+ [1, revision],
90
+ ])));
91
+ }
92
+ }
93
+ function encodeNotificationSettings(settings) {
94
+ const scope = settings.scope.kind === "account"
95
+ ? [0]
96
+ : settings.scope.kind === "conversation"
97
+ ? [1, entityRef("conversation", settings.scope.conversationId)]
98
+ : [2, entityRef("community", settings.scope.communityId)];
99
+ const level = { all: 0, mentions: 1, none: 2 }[settings.level];
100
+ return wireMap([
101
+ [0, scope],
102
+ [1, level],
103
+ [2, settings.suppressMassMentions],
104
+ [3, settings.revision],
105
+ ]);
106
+ }
107
+ function optionalEntry(key, value) {
108
+ return value === undefined ? [] : [[key, value]];
109
+ }
110
+ //# sourceMappingURL=social-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"social-client.js","sourceRoot":"","sources":["../../src/social/social-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type UserId } from "../entity-id.js";
2
+ export type MediaServerIdentity = {
3
+ endpointId: string;
4
+ userId: UserId;
5
+ };
6
+ /** Translate authenticated media-server metadata at the wire boundary. */
7
+ export declare function parseMediaServerIdentity(value: unknown): MediaServerIdentity | undefined;
8
+ //# sourceMappingURL=media-server-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-server-identity.d.ts","sourceRoot":"","sources":["../../src/transports/media-server-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,0EAA0E;AAC1E,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,GACb,mBAAmB,GAAG,SAAS,CAkBjC"}
@@ -0,0 +1,22 @@
1
+ import { entityId } from "../entity-id.js";
2
+ /** Translate authenticated media-server metadata at the wire boundary. */
3
+ export function parseMediaServerIdentity(value) {
4
+ if (!value || typeof value !== "object")
5
+ return undefined;
6
+ const record = value;
7
+ if (typeof record.endpointId !== "string")
8
+ return undefined;
9
+ if (typeof record.userId === "string") {
10
+ try {
11
+ return {
12
+ endpointId: record.endpointId,
13
+ userId: entityId(record.userId),
14
+ };
15
+ }
16
+ catch {
17
+ return undefined;
18
+ }
19
+ }
20
+ return undefined;
21
+ }
22
+ //# sourceMappingURL=media-server-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-server-identity.js","sourceRoot":"","sources":["../../src/transports/media-server-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAe,MAAM,iBAAiB,CAAC;AAOxD,0EAA0E;AAC1E,MAAM,UAAU,wBAAwB,CACtC,KAAc;IAEd,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,MAAM,GAAG,KAGd,CAAC;IACF,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,OAAO;gBACL,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,MAAM,EAAE,QAAQ,CAAS,MAAM,CAAC,MAAM,CAAC;aACxC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { userDisplayName, conversationDisplayName, createWorkspaceDirectory, createMentionCandidates, uniqueMentionCandidates, typingDisplayNames, conversationRelationship, communityForChannel, type ConversationDestination, type WorkspaceDirectory, type MentionCandidate, } from "./workspace-selectors.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,GACtB,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { userDisplayName, conversationDisplayName, createWorkspaceDirectory, createMentionCandidates, uniqueMentionCandidates, typingDisplayNames, conversationRelationship, communityForChannel, } from "./workspace-selectors.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,GAIpB,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { Community, CommunityChannel, ConversationSummary } from "../domain.js";
2
+ import type { ChannelId, CommunityId, ConversationId } from "../entity-id.js";
3
+ import type { AccountState } from "../client/state.js";
4
+ export type WorkspaceState = {
5
+ view: "friends" | "conversation" | "voice-channel";
6
+ selectedConversationId?: ConversationId;
7
+ selectedCommunityId?: CommunityId;
8
+ selectedChannelId?: ChannelId;
9
+ };
10
+ /** Owns transport-neutral workspace selection using stable native IDs. */
11
+ export declare class WorkspaceController {
12
+ private readonly account;
13
+ private current;
14
+ private directMessagesView;
15
+ private lastDirectConversationId?;
16
+ private selectedChannelByCommunity;
17
+ private listeners;
18
+ constructor(account: () => AccountState | undefined);
19
+ get state(): WorkspaceState;
20
+ get selectedConversation(): ConversationSummary | undefined;
21
+ get selectedCommunity(): Community | undefined;
22
+ get selectedChannel(): CommunityChannel | undefined;
23
+ subscribe: (listener: () => void) => () => boolean;
24
+ openConversation(conversationId: ConversationId): void;
25
+ selectCommunity(communityId: CommunityId): void;
26
+ selectChannel(channelId: ChannelId): void;
27
+ showFriends(): void;
28
+ showDirectMessages(): void;
29
+ reset(): void;
30
+ /** Reconciles selection after snapshots, membership changes, or deletion. */
31
+ reconcile(): void;
32
+ private requireConversation;
33
+ private requireCommunity;
34
+ private findChannel;
35
+ private findChannelByConversation;
36
+ private set;
37
+ private emit;
38
+ }
39
+ //# sourceMappingURL=workspace-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-controller.d.ts","sourceRoot":"","sources":["../../src/workspace/workspace-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,SAAS,GAAG,cAAc,GAAG,eAAe,CAAC;IACnD,sBAAsB,CAAC,EAAE,cAAc,CAAC;IACxC,mBAAmB,CAAC,EAAE,WAAW,CAAC;IAClC,iBAAiB,CAAC,EAAE,SAAS,CAAC;CAC/B,CAAC;AAEF,0EAA0E;AAC1E,qBAAa,mBAAmB;IAOlB,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,kBAAkB,CAAyC;IACnE,OAAO,CAAC,wBAAwB,CAAC,CAAiB;IAClD,OAAO,CAAC,0BAA0B,CAAqC;IACvE,OAAO,CAAC,SAAS,CAAyB;gBAEb,OAAO,EAAE,MAAM,YAAY,GAAG,SAAS;IAEpE,IAAI,KAAK,mBAER;IAED,IAAI,oBAAoB,IAAI,mBAAmB,GAAG,SAAS,CAG1D;IAED,IAAI,iBAAiB,IAAI,SAAS,GAAG,SAAS,CAG7C;IAED,IAAI,eAAe,IAAI,gBAAgB,GAAG,SAAS,CAKlD;IAED,SAAS,GAAI,UAAU,MAAM,IAAI,mBAG/B;IAEF,gBAAgB,CAAC,cAAc,EAAE,cAAc;IA6B/C,eAAe,CAAC,WAAW,EAAE,WAAW;IAqBxC,aAAa,CAAC,SAAS,EAAE,SAAS;IAYlC,WAAW;IAQX,kBAAkB;IAuBlB,KAAK;IAOL,6EAA6E;IAC7E,SAAS;IAmCT,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,yBAAyB;IAUjC,OAAO,CAAC,GAAG;IAKX,OAAO,CAAC,IAAI;CAGb"}
@@ -0,0 +1,188 @@
1
+ /** Owns transport-neutral workspace selection using stable native IDs. */
2
+ export class WorkspaceController {
3
+ account;
4
+ current = { view: "friends" };
5
+ directMessagesView = "friends";
6
+ lastDirectConversationId;
7
+ selectedChannelByCommunity = new Map();
8
+ listeners = new Set();
9
+ constructor(account) {
10
+ this.account = account;
11
+ }
12
+ get state() {
13
+ return this.current;
14
+ }
15
+ get selectedConversation() {
16
+ const id = this.current.selectedConversationId;
17
+ return id ? this.account()?.conversations.get(id) : undefined;
18
+ }
19
+ get selectedCommunity() {
20
+ const id = this.current.selectedCommunityId;
21
+ return id ? this.account()?.communities.get(id) : undefined;
22
+ }
23
+ get selectedChannel() {
24
+ const id = this.current.selectedChannelId;
25
+ return id
26
+ ? this.selectedCommunity?.channels.find((channel) => channel.id === id)
27
+ : undefined;
28
+ }
29
+ subscribe = (listener) => {
30
+ this.listeners.add(listener);
31
+ return () => this.listeners.delete(listener);
32
+ };
33
+ openConversation(conversationId) {
34
+ const conversation = this.requireConversation(conversationId);
35
+ const channel = (conversation.channelId
36
+ ? this.findChannel(conversation.channelId)
37
+ : undefined) ?? this.findChannelByConversation(conversation.id);
38
+ if (channel) {
39
+ this.selectedChannelByCommunity.set(channel.community.id, channel.channel.id);
40
+ this.set({
41
+ view: channelView(channel.channel),
42
+ selectedConversationId: conversation.id,
43
+ selectedCommunityId: channel.community.id,
44
+ selectedChannelId: channel.channel.id,
45
+ });
46
+ return;
47
+ }
48
+ if (conversation.kind === "community-channel")
49
+ throw new Error("Community channel not found");
50
+ this.directMessagesView = "conversation";
51
+ this.lastDirectConversationId = conversation.id;
52
+ this.set({
53
+ view: "conversation",
54
+ selectedConversationId: conversation.id,
55
+ });
56
+ }
57
+ selectCommunity(communityId) {
58
+ const community = this.requireCommunity(communityId);
59
+ const channels = [...community.channels].sort((left, right) => left.position - right.position);
60
+ const rememberedChannelId = this.selectedChannelByCommunity.get(community.id);
61
+ const channel = channels.find((candidate) => candidate.id === rememberedChannelId) ??
62
+ channels.find((candidate) => candidate.kind === "text") ??
63
+ channels[0];
64
+ if (channel)
65
+ this.selectedChannelByCommunity.set(community.id, channel.id);
66
+ this.set({
67
+ view: channel ? channelView(channel) : "friends",
68
+ selectedCommunityId: community.id,
69
+ selectedChannelId: channel?.id,
70
+ selectedConversationId: channel?.conversationId,
71
+ });
72
+ }
73
+ selectChannel(channelId) {
74
+ const found = this.findChannel(channelId);
75
+ if (!found)
76
+ throw new Error("Community channel not found");
77
+ this.selectedChannelByCommunity.set(found.community.id, found.channel.id);
78
+ this.set({
79
+ view: channelView(found.channel),
80
+ selectedCommunityId: found.community.id,
81
+ selectedChannelId: found.channel.id,
82
+ selectedConversationId: found.channel.conversationId,
83
+ });
84
+ }
85
+ showFriends() {
86
+ this.directMessagesView = "friends";
87
+ this.set({
88
+ view: "friends",
89
+ selectedConversationId: this.lastDirectConversationId,
90
+ });
91
+ }
92
+ showDirectMessages() {
93
+ if (this.directMessagesView === "friends") {
94
+ this.set({
95
+ view: "friends",
96
+ selectedConversationId: this.lastDirectConversationId,
97
+ });
98
+ return;
99
+ }
100
+ const selected = this.current.selectedConversationId
101
+ ? this.account()?.conversations.get(this.current.selectedConversationId)
102
+ : undefined;
103
+ const conversation = selected && selected.kind !== "community-channel"
104
+ ? selected
105
+ : this.lastDirectConversationId
106
+ ? this.account()?.conversations.get(this.lastDirectConversationId)
107
+ : undefined;
108
+ this.set({
109
+ view: conversation ? "conversation" : "friends",
110
+ selectedConversationId: conversation?.id,
111
+ });
112
+ }
113
+ reset() {
114
+ this.directMessagesView = "friends";
115
+ this.lastDirectConversationId = undefined;
116
+ this.selectedChannelByCommunity.clear();
117
+ this.set({ view: "friends" });
118
+ }
119
+ /** Reconciles selection after snapshots, membership changes, or deletion. */
120
+ reconcile() {
121
+ const account = this.account();
122
+ if (!account)
123
+ return this.reset();
124
+ if (this.lastDirectConversationId &&
125
+ !account.conversations.has(this.lastDirectConversationId))
126
+ this.lastDirectConversationId = undefined;
127
+ const conversationId = this.current.selectedConversationId;
128
+ const communityId = this.current.selectedCommunityId;
129
+ const channelId = this.current.selectedChannelId;
130
+ if (communityId && !account.communities.has(communityId))
131
+ return this.reset();
132
+ if (channelId && !this.findChannel(channelId)) {
133
+ if (communityId) {
134
+ this.selectedChannelByCommunity.delete(communityId);
135
+ return this.selectCommunity(communityId);
136
+ }
137
+ return this.reset();
138
+ }
139
+ if (conversationId && !account.conversations.has(conversationId))
140
+ return this.reset();
141
+ for (const [rememberedCommunityId, rememberedChannelId] of this
142
+ .selectedChannelByCommunity) {
143
+ const community = account.communities.get(rememberedCommunityId);
144
+ if (!community?.channels.some((channel) => channel.id === rememberedChannelId))
145
+ this.selectedChannelByCommunity.delete(rememberedCommunityId);
146
+ }
147
+ this.emit();
148
+ }
149
+ requireConversation(id) {
150
+ const conversation = this.account()?.conversations.get(id);
151
+ if (!conversation)
152
+ throw new Error("Conversation not found");
153
+ return conversation;
154
+ }
155
+ requireCommunity(id) {
156
+ const community = this.account()?.communities.get(id);
157
+ if (!community)
158
+ throw new Error("Community not found");
159
+ return community;
160
+ }
161
+ findChannel(channelId) {
162
+ for (const community of this.account()?.communities.values() ?? []) {
163
+ const channel = community.channels.find((candidate) => candidate.id === channelId);
164
+ if (channel)
165
+ return { community, channel };
166
+ }
167
+ return undefined;
168
+ }
169
+ findChannelByConversation(conversationId) {
170
+ for (const community of this.account()?.communities.values() ?? []) {
171
+ const channel = community.channels.find((candidate) => candidate.conversationId === conversationId);
172
+ if (channel)
173
+ return { community, channel };
174
+ }
175
+ return undefined;
176
+ }
177
+ set(state) {
178
+ this.current = state;
179
+ this.emit();
180
+ }
181
+ emit() {
182
+ this.listeners.forEach((listener) => listener());
183
+ }
184
+ }
185
+ function channelView(channel) {
186
+ return channel.kind === "voice" ? "voice-channel" : "conversation";
187
+ }
188
+ //# sourceMappingURL=workspace-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-controller.js","sourceRoot":"","sources":["../../src/workspace/workspace-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { Community, CommunityChannel, CommunityParticipant, ContactPresence, ConversationSummary, PresenceView, UserSummary } from "../domain.js";
2
+ import type { AttachmentId, ChannelId, CommunityId, ConversationId, UserId } from "../entity-id.js";
3
+ import type { FriendshipLists } from "../model/selectors.js";
4
+ import type { AccountState } from "../client/state.js";
5
+ export type ConversationDestination = {
6
+ id: string;
7
+ label: string;
8
+ detail: string;
9
+ kind: "dm" | "group_dm" | "channel";
10
+ conversationId?: ConversationId;
11
+ communityId?: CommunityId;
12
+ channelId?: ChannelId;
13
+ userId?: UserId;
14
+ avatarId?: AttachmentId;
15
+ channelKind?: CommunityChannel["kind"];
16
+ };
17
+ export type WorkspaceDirectory = {
18
+ conversations: ConversationSummary[];
19
+ destinations: ConversationDestination[];
20
+ };
21
+ export type MentionCandidate = {
22
+ userId: UserId;
23
+ username: string;
24
+ label: string;
25
+ };
26
+ export declare function userDisplayName(userId: UserId, profiles: ReadonlyMap<UserId, UserSummary>): string;
27
+ export declare function conversationDisplayName(conversation: ConversationSummary, ownUserId: UserId, profiles: ReadonlyMap<UserId, UserSummary>): string;
28
+ export declare function createWorkspaceDirectory(state: Pick<AccountState, "ownUserId" | "users" | "conversations" | "communities">): WorkspaceDirectory;
29
+ export declare function createMentionCandidates(options: {
30
+ ownUserId: UserId;
31
+ selectedConversation?: ConversationSummary;
32
+ participants: CommunityParticipant[];
33
+ profiles: ReadonlyMap<UserId, UserSummary>;
34
+ }): MentionCandidate[];
35
+ export declare function uniqueMentionCandidates(candidates: MentionCandidate[]): MentionCandidate[];
36
+ export declare function typingDisplayNames(userIds: Iterable<UserId>, participants: CommunityParticipant[], profiles: ReadonlyMap<UserId, UserSummary>): string[];
37
+ export declare function conversationRelationship(options: {
38
+ userId: UserId;
39
+ friendships: FriendshipLists;
40
+ presence: ReadonlyMap<UserId, PresenceView>;
41
+ }): {
42
+ friend: boolean;
43
+ requestIncoming: boolean;
44
+ requestSent: boolean;
45
+ presence: ContactPresence;
46
+ status: string | undefined;
47
+ };
48
+ export declare function communityForChannel(communities: Iterable<Community>, channelId: ChannelId): Community | undefined;
49
+ //# sourceMappingURL=workspace-selectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-selectors.d.ts","sourceRoot":"","sources":["../../src/workspace/workspace-selectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,YAAY,EAEZ,WAAW,EACZ,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACX,cAAc,EACd,MAAM,EACP,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,GAAG,UAAU,GAAG,SAAS,CAAC;IACpC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,WAAW,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,YAAY,EAAE,uBAAuB,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,UAI3C;AAED,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,mBAAmB,EACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,UAY3C;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,IAAI,CACT,YAAY,EACZ,WAAW,GAAG,OAAO,GAAG,eAAe,GAAG,aAAa,CACxD,GACA,kBAAkB,CAiDpB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,mBAAmB,CAAC;IAC3C,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CAC5C,sBAmBA;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,gBAAgB,EAAE,sBAcrE;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EACzB,YAAY,EAAE,oBAAoB,EAAE,EACpC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,YAU3C;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,eAAe,CAAC;IAC7B,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC7C;;;;cAQ6D,eAAe;;EAG5E;AAWD,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,EAChC,SAAS,EAAE,SAAS,yBAKrB"}
@@ -0,0 +1,110 @@
1
+ export function userDisplayName(userId, profiles) {
2
+ const profile = profiles.get(userId);
3
+ return profile?.displayName.trim() || profile?.username || "Unknown user";
4
+ }
5
+ export function conversationDisplayName(conversation, ownUserId, profiles) {
6
+ if (conversation.name?.trim())
7
+ return conversation.name.trim();
8
+ const others = conversation.participantIds.filter((userId) => userId !== ownUserId);
9
+ const participants = others.length ? others : conversation.participantIds;
10
+ return (participants
11
+ .map((userId) => userDisplayName(userId, profiles))
12
+ .join(", ") || "Conversation");
13
+ }
14
+ export function createWorkspaceDirectory(state) {
15
+ if (!state.ownUserId)
16
+ return { conversations: [], destinations: [] };
17
+ const conversations = [...state.conversations.values()]
18
+ .filter((conversation) => conversation.kind !== "community-channel")
19
+ .sort(compareConversations);
20
+ const conversationDestinations = conversations.map((conversation) => {
21
+ const userId = conversation.kind === "direct"
22
+ ? conversation.participantIds.find((candidate) => candidate !== state.ownUserId)
23
+ : undefined;
24
+ const profile = userId ? state.users.get(userId) : undefined;
25
+ return {
26
+ id: `conversation:${conversation.id}`,
27
+ label: conversationDisplayName(conversation, state.ownUserId, state.users),
28
+ detail: conversation.kind === "group"
29
+ ? "Group DM"
30
+ : profile?.username || "Direct message",
31
+ kind: conversation.kind === "group" ? "group_dm" : "dm",
32
+ conversationId: conversation.id,
33
+ userId,
34
+ avatarId: conversation.avatarId ?? profile?.avatarId,
35
+ };
36
+ });
37
+ const channelDestinations = [...state.communities.values()].flatMap((community) => community.channels.map((channel) => ({
38
+ id: `channel:${channel.id}`,
39
+ label: channel.name,
40
+ detail: community.name,
41
+ kind: "channel",
42
+ conversationId: channel.conversationId,
43
+ communityId: community.id,
44
+ channelId: channel.id,
45
+ channelKind: channel.kind,
46
+ })));
47
+ return {
48
+ conversations,
49
+ destinations: [...conversationDestinations, ...channelDestinations],
50
+ };
51
+ }
52
+ export function createMentionCandidates(options) {
53
+ const participantIds = options.participants.length
54
+ ? options.participants.map((participant) => participant.userId)
55
+ : (options.selectedConversation?.participantIds ?? [options.ownUserId]);
56
+ return uniqueMentionCandidates(participantIds
57
+ .filter((userId) => userId !== options.ownUserId)
58
+ .map((userId) => {
59
+ const profile = options.profiles.get(userId);
60
+ const nick = options.participants.find((participant) => participant.userId === userId)?.nick;
61
+ return {
62
+ userId,
63
+ username: profile?.username || nick || "user",
64
+ label: profile?.displayName || nick || profile?.username || "User",
65
+ };
66
+ }));
67
+ }
68
+ export function uniqueMentionCandidates(candidates) {
69
+ const unique = new Map();
70
+ for (const candidate of candidates) {
71
+ const label = candidate.label.trim();
72
+ if (!label)
73
+ continue;
74
+ const current = { ...candidate, label };
75
+ const existing = unique.get(candidate.userId);
76
+ if (!existing ||
77
+ (existing.label === existing.username && label !== candidate.username))
78
+ unique.set(candidate.userId, current);
79
+ }
80
+ return [...unique.values()];
81
+ }
82
+ export function typingDisplayNames(userIds, participants, profiles) {
83
+ return [...userIds].flatMap((userId) => {
84
+ const profile = profiles.get(userId);
85
+ const name = profile?.displayName ||
86
+ participants.find((participant) => participant.userId === userId)?.nick ||
87
+ profile?.username;
88
+ return name ? [name] : [];
89
+ });
90
+ }
91
+ export function conversationRelationship(options) {
92
+ const find = (items) => items.find((friendship) => friendship.userId === options.userId);
93
+ const currentPresence = options.presence.get(options.userId);
94
+ return {
95
+ friend: Boolean(find(options.friendships.accepted)),
96
+ requestIncoming: Boolean(find(options.friendships.received)),
97
+ requestSent: Boolean(find(options.friendships.sent)),
98
+ presence: (currentPresence?.availability ?? "offline"),
99
+ status: currentPresence?.customStatus?.text,
100
+ };
101
+ }
102
+ function compareConversations(left, right) {
103
+ const leftId = left.newestEventId ?? 0n;
104
+ const rightId = right.newestEventId ?? 0n;
105
+ return leftId < rightId ? 1 : leftId > rightId ? -1 : 0;
106
+ }
107
+ export function communityForChannel(communities, channelId) {
108
+ return [...communities].find((community) => community.channels.some((channel) => channel.id === channelId));
109
+ }
110
+ //# sourceMappingURL=workspace-selectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-selectors.js","sourceRoot":"","sources":["../../src/workspace/workspace-selectors.ts"],"names":[],"mappings":"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"}