@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
package/README.md CHANGED
@@ -1,3 +1,122 @@
1
- # Temporary Holding Version
1
+ # Sideband Client
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Sideband Client is the shared TypeScript SDK used by Sideband applications. It
4
+ owns authenticated client sessions, application state, messaging, communities,
5
+ calls, presence, activity, attachments, and private conversations over the
6
+ Sideband Binary Protocol (SBP).
7
+
8
+ The core client does not depend on React or Electron. Host applications provide
9
+ credential storage, message persistence, media, private-conversation crypto,
10
+ and private-transfer integrations appropriate to their platform.
11
+
12
+ ## Installation
13
+
14
+ Sideband Client is an ESM-only package intended for modern bundlers and
15
+ JavaScript runtimes with native ES module support.
16
+
17
+ ```sh
18
+ npm install @sidebandchat/client
19
+ ```
20
+
21
+ ## Usage
22
+
23
+ ```ts
24
+ import {
25
+ SidebandClient,
26
+ discoverInstanceEndpoint,
27
+ type ConversationId,
28
+ type CredentialStore,
29
+ type StoredCredential,
30
+ } from "@sidebandchat/client";
31
+
32
+ const stored = new Map<string, StoredCredential>();
33
+ const key = (account: { instanceDomain: string; userId: string }) =>
34
+ `${account.instanceDomain}:${account.userId}`;
35
+
36
+ const credentials: CredentialStore = {
37
+ load: async (account) => stored.get(key(account)),
38
+ save: async (credential) => {
39
+ stored.set(key(credential), credential);
40
+ },
41
+ delete: async (account) => {
42
+ stored.delete(key(account));
43
+ },
44
+ };
45
+
46
+ const client = new SidebandClient({
47
+ clientFamily: "example",
48
+ clientVersion: "1.0.0",
49
+ credentials,
50
+ });
51
+
52
+ declare const credential: StoredCredential;
53
+ declare const conversationId: ConversationId;
54
+
55
+ const unsubscribe = client.subscribe(() => {
56
+ console.log(client.state.connection, client.accountState);
57
+ });
58
+
59
+ const endpoint = await discoverInstanceEndpoint("chat.example.com");
60
+ await client.connect(endpoint, credential);
61
+
62
+ await client.messaging.send({
63
+ conversationId,
64
+ body: "Hello from Sideband",
65
+ });
66
+
67
+ unsubscribe();
68
+ client.disconnect();
69
+ ```
70
+
71
+ `credential` is a `StoredCredential` obtained through Sideband's identity
72
+ and account bootstrap flow. Applications should keep it in secure platform
73
+ storage rather than ordinary browser storage.
74
+
75
+ ## Client services
76
+
77
+ An online `SidebandClient` exposes feature services for:
78
+
79
+ - `messaging` — messages, history, reactions, replies, GIF search, and groups
80
+ - `social` — profiles, friendships, blocks, and notification settings
81
+ - `communities` — communities, channels, roles, permissions, and invitations
82
+ - `attachments` — upload admission, completion, and content grants
83
+ - `calls` — call signaling and authenticated media admission
84
+ - `privateConversations` — encrypted private sessions and file transfers
85
+ - `devices` — account device listing and revocation
86
+ - `realtime` — presence, typing, activity, and realtime preferences
87
+ - `workspace` — transport-independent workspace selection
88
+
89
+ Accessing an online-only service while disconnected throws an error. Connection
90
+ and account snapshots are observable through `client.subscribe()`.
91
+
92
+ ## Platform integrations
93
+
94
+ Applications can provide the following integrations through
95
+ `SidebandClientOptions`:
96
+
97
+ - `credentials` securely persists account credentials.
98
+ - `messages` returns a persistent message cache for an account.
99
+ - `media` connects admitted calls to the platform's WebRTC implementation.
100
+ - `privateCrypto` provides private-conversation encryption and trust storage.
101
+ - `privateTransfers` streams private files using platform-owned resources.
102
+ - `mediaPreferences` persists mute, deafen, and audio-device choices.
103
+
104
+ The package also provides optional browser-oriented entry points for call
105
+ media, OMEMO, private-transfer framing and transport, and Blob hashing.
106
+ Applications can dynamically load these only when the corresponding feature is
107
+ used.
108
+
109
+ ## Development
110
+
111
+ ```sh
112
+ npm install
113
+ npm run check
114
+ ```
115
+
116
+ `npm run check` verifies formatting, lint, compilation, tests, coverage, and the
117
+ published package contents.
118
+
119
+ ## License
120
+
121
+ Sideband Client is licensed under the [GNU General Public License v3.0](LICENSE).
122
+ See [COPYRIGHT](COPYRIGHT) for copyright and trademark information.
@@ -0,0 +1,131 @@
1
+ import type { UserTune } from "../domain.js";
2
+ import type { UserId } from "../entity-id.js";
3
+ export declare const PAUSED_ACTIVITY_GRACE_MS = 15000;
4
+ export declare const ACTIVITY_REFRESH_MS = 30000;
5
+ export type MediaPlaybackState = "playing" | "paused" | "stopped" | "unknown";
6
+ export type MediaActivitySession = {
7
+ id: string;
8
+ title?: string;
9
+ artist?: string;
10
+ album?: string;
11
+ artworkUrl?: string;
12
+ durationMs?: number;
13
+ positionMs?: number;
14
+ playbackState: MediaPlaybackState;
15
+ applicationId: string;
16
+ applicationName?: string;
17
+ trackId?: string;
18
+ trackUri?: string;
19
+ platform: string;
20
+ platformValues: Array<{
21
+ key: string;
22
+ value: string;
23
+ }>;
24
+ };
25
+ export type MediaActivityCapabilities = {
26
+ platform: string;
27
+ supported: boolean;
28
+ availability: "available" | "unsupported";
29
+ sessionEnumeration: boolean;
30
+ eventNotifications: boolean;
31
+ artwork: boolean;
32
+ trackIds: boolean;
33
+ trackUris: boolean;
34
+ positionNotifications: boolean;
35
+ notes: string[];
36
+ };
37
+ export type MediaActivityChange = {
38
+ kind: "added" | "changed";
39
+ sessionId?: string;
40
+ session: MediaActivitySession;
41
+ } | {
42
+ kind: "removed";
43
+ sessionId: string;
44
+ } | {
45
+ kind: "reset";
46
+ sessions: MediaActivitySession[];
47
+ } | {
48
+ kind: "error";
49
+ message: string;
50
+ };
51
+ export type ActivitySharingPreference = {
52
+ enabled: boolean;
53
+ applicationId: string;
54
+ };
55
+ export type ActivitySharingPlatform = {
56
+ loadPreference: (account: UserId) => Promise<ActivitySharingPreference>;
57
+ savePreference: (account: UserId, preference: ActivitySharingPreference) => Promise<unknown>;
58
+ startSessions: () => Promise<{
59
+ capabilities: MediaActivityCapabilities;
60
+ sessions: MediaActivitySession[];
61
+ }>;
62
+ stopSessions: () => Promise<unknown>;
63
+ subscribe: (listener: (change: MediaActivityChange) => void) => () => void;
64
+ };
65
+ export type ActivitySharingContext = {
66
+ account: UserId;
67
+ connected: boolean;
68
+ };
69
+ export type ActivitySharingState = {
70
+ enabled: boolean;
71
+ loading: boolean;
72
+ applicationId: string;
73
+ sessions: MediaActivitySession[];
74
+ tune?: UserTune;
75
+ capabilities?: MediaActivityCapabilities;
76
+ error?: string;
77
+ };
78
+ export type ActivitySharingControllerOptions = {
79
+ context: ActivitySharingContext;
80
+ platform: ActivitySharingPlatform;
81
+ publishTune: (tune?: UserTune) => Promise<unknown>;
82
+ formatError: (reason: unknown) => string;
83
+ now?: () => number;
84
+ setTimer?: typeof setTimeout;
85
+ clearTimer?: typeof clearTimeout;
86
+ setInterval?: typeof setInterval;
87
+ clearInterval?: typeof clearInterval;
88
+ };
89
+ export declare class ActivitySharingController {
90
+ private readonly options;
91
+ private current;
92
+ private context;
93
+ private readonly listeners;
94
+ private sessionUnsubscribe?;
95
+ private pauseTimer?;
96
+ private refreshTimer?;
97
+ private lastPlayingTune?;
98
+ private lastPlayingObservedAt;
99
+ private lastPublished;
100
+ private lastPublishedActivity;
101
+ private generation;
102
+ private started;
103
+ constructor(options: ActivitySharingControllerOptions);
104
+ get state(): ActivitySharingState;
105
+ subscribe: (listener: () => void) => () => boolean;
106
+ start(): void;
107
+ updateContext(context: ActivitySharingContext): void;
108
+ setEnabled(enabled: boolean): Promise<void>;
109
+ setApplication(applicationId: string): Promise<void>;
110
+ dispose(): void;
111
+ private loadPreference;
112
+ private refreshSessionObservation;
113
+ private stopSessionObservation;
114
+ private setSessions;
115
+ private recomputeTune;
116
+ private setTune;
117
+ private publishCurrentActivity;
118
+ private publish;
119
+ private refreshPublicationTimer;
120
+ private clearPublicationState;
121
+ private cancelPauseTimer;
122
+ private cancelRefreshTimer;
123
+ private now;
124
+ private setTimer;
125
+ private clearTimer;
126
+ private setInterval;
127
+ private clearInterval;
128
+ private setState;
129
+ }
130
+ export declare function selectActivitySession(sessions: MediaActivitySession[], applicationId: string): MediaActivitySession;
131
+ //# sourceMappingURL=activity-sharing-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-sharing-controller.d.ts","sourceRoot":"","sources":["../../src/activity/activity-sharing-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,351 @@
1
+ export const PAUSED_ACTIVITY_GRACE_MS = 15_000;
2
+ export const ACTIVITY_REFRESH_MS = 30_000;
3
+ export class ActivitySharingController {
4
+ options;
5
+ current = {
6
+ enabled: false,
7
+ loading: true,
8
+ applicationId: "",
9
+ sessions: [],
10
+ };
11
+ context;
12
+ listeners = new Set();
13
+ sessionUnsubscribe;
14
+ pauseTimer;
15
+ refreshTimer;
16
+ lastPlayingTune;
17
+ lastPlayingObservedAt = 0;
18
+ lastPublished = "";
19
+ lastPublishedActivity = "";
20
+ generation = 0;
21
+ started = false;
22
+ constructor(options) {
23
+ this.options = options;
24
+ this.context = options.context;
25
+ }
26
+ get state() {
27
+ return this.current;
28
+ }
29
+ subscribe = (listener) => {
30
+ this.listeners.add(listener);
31
+ return () => this.listeners.delete(listener);
32
+ };
33
+ start() {
34
+ if (this.started)
35
+ return;
36
+ this.started = true;
37
+ void this.loadPreference();
38
+ }
39
+ updateContext(context) {
40
+ const accountChanged = context.account !== this.context.account;
41
+ const connectionChanged = context.connected !== this.context.connected;
42
+ if (!accountChanged && !connectionChanged)
43
+ return;
44
+ this.context = context;
45
+ if (accountChanged) {
46
+ this.stopSessionObservation();
47
+ this.clearPublicationState();
48
+ this.setState({
49
+ enabled: false,
50
+ loading: true,
51
+ applicationId: "",
52
+ sessions: [],
53
+ });
54
+ void this.loadPreference();
55
+ return;
56
+ }
57
+ if (!context.connected)
58
+ this.clearPublicationState();
59
+ this.publishCurrentActivity();
60
+ this.refreshPublicationTimer();
61
+ }
62
+ async setEnabled(enabled) {
63
+ const previous = this.current.enabled;
64
+ this.setState({ ...this.current, enabled, error: undefined });
65
+ this.refreshSessionObservation();
66
+ this.recomputeTune();
67
+ try {
68
+ await this.options.platform.savePreference(this.context.account, {
69
+ enabled,
70
+ applicationId: this.current.applicationId,
71
+ });
72
+ }
73
+ catch (reason) {
74
+ this.setState({
75
+ ...this.current,
76
+ enabled: previous,
77
+ error: this.options.formatError(reason),
78
+ });
79
+ this.refreshSessionObservation();
80
+ this.recomputeTune();
81
+ }
82
+ }
83
+ async setApplication(applicationId) {
84
+ const previous = this.current.applicationId;
85
+ this.setState({ ...this.current, applicationId });
86
+ this.recomputeTune();
87
+ try {
88
+ await this.options.platform.savePreference(this.context.account, {
89
+ enabled: this.current.enabled,
90
+ applicationId,
91
+ });
92
+ }
93
+ catch (reason) {
94
+ this.setState({
95
+ ...this.current,
96
+ applicationId: previous,
97
+ error: this.options.formatError(reason),
98
+ });
99
+ this.recomputeTune();
100
+ }
101
+ }
102
+ dispose() {
103
+ this.started = false;
104
+ this.generation += 1;
105
+ this.stopSessionObservation();
106
+ this.cancelPauseTimer();
107
+ this.cancelRefreshTimer();
108
+ this.listeners.clear();
109
+ }
110
+ async loadPreference() {
111
+ const generation = ++this.generation;
112
+ this.setState({ ...this.current, loading: true, error: undefined });
113
+ try {
114
+ const preference = await this.options.platform.loadPreference(this.context.account);
115
+ if (!this.started || generation !== this.generation)
116
+ return;
117
+ this.setState({
118
+ ...this.current,
119
+ enabled: preference.enabled,
120
+ applicationId: preference.applicationId,
121
+ loading: false,
122
+ });
123
+ this.refreshSessionObservation();
124
+ }
125
+ catch (reason) {
126
+ if (!this.started || generation !== this.generation)
127
+ return;
128
+ this.setState({
129
+ ...this.current,
130
+ loading: false,
131
+ error: this.options.formatError(reason),
132
+ });
133
+ }
134
+ }
135
+ refreshSessionObservation() {
136
+ if (!this.started || !this.current.enabled) {
137
+ this.stopSessionObservation();
138
+ if (this.current.sessions.length || this.current.capabilities) {
139
+ this.setState({
140
+ ...this.current,
141
+ sessions: [],
142
+ capabilities: undefined,
143
+ });
144
+ }
145
+ return;
146
+ }
147
+ if (this.sessionUnsubscribe)
148
+ return;
149
+ const generation = ++this.generation;
150
+ this.sessionUnsubscribe = this.options.platform.subscribe((change) => {
151
+ if (change.kind === "error") {
152
+ this.setState({ ...this.current, error: change.message });
153
+ }
154
+ else if (change.kind === "reset") {
155
+ this.setSessions(change.sessions);
156
+ }
157
+ else if (change.kind === "removed") {
158
+ this.setSessions(this.current.sessions.filter((session) => session.id !== change.sessionId));
159
+ }
160
+ else {
161
+ this.setSessions(upsertSession(this.current.sessions, change.session));
162
+ }
163
+ });
164
+ void this.options.platform
165
+ .startSessions()
166
+ .then(({ capabilities, sessions }) => {
167
+ if (!this.started || generation !== this.generation)
168
+ return;
169
+ this.setState({
170
+ ...this.current,
171
+ capabilities,
172
+ sessions,
173
+ error: capabilities.supported
174
+ ? this.current.error
175
+ : "Music sharing is not available on this platform.",
176
+ });
177
+ this.recomputeTune();
178
+ })
179
+ .catch((reason) => {
180
+ if (this.started && generation === this.generation)
181
+ this.setState({
182
+ ...this.current,
183
+ error: this.options.formatError(reason),
184
+ });
185
+ });
186
+ }
187
+ stopSessionObservation() {
188
+ this.generation += 1;
189
+ this.sessionUnsubscribe?.();
190
+ this.sessionUnsubscribe = undefined;
191
+ void this.options.platform.stopSessions().catch(() => undefined);
192
+ }
193
+ setSessions(sessions) {
194
+ this.setState({ ...this.current, sessions });
195
+ this.recomputeTune();
196
+ }
197
+ recomputeTune() {
198
+ this.cancelPauseTimer();
199
+ const selected = this.current.enabled
200
+ ? selectActivitySession(this.current.sessions, this.current.applicationId)
201
+ : undefined;
202
+ if (selected?.playbackState === "playing") {
203
+ const tune = sessionTune(selected);
204
+ this.lastPlayingTune = tune;
205
+ this.lastPlayingObservedAt = this.now();
206
+ this.setTune(tune);
207
+ return;
208
+ }
209
+ if (selected?.playbackState === "paused" && this.lastPlayingTune) {
210
+ this.pauseTimer = this.setTimer(() => {
211
+ this.pauseTimer = undefined;
212
+ this.setTune(undefined);
213
+ }, PAUSED_ACTIVITY_GRACE_MS);
214
+ return;
215
+ }
216
+ this.setTune(undefined);
217
+ }
218
+ setTune(tune) {
219
+ if (!tune) {
220
+ this.lastPlayingTune = undefined;
221
+ this.lastPlayingObservedAt = 0;
222
+ }
223
+ this.setState({ ...this.current, tune });
224
+ this.publishCurrentActivity();
225
+ this.refreshPublicationTimer();
226
+ }
227
+ publishCurrentActivity() {
228
+ if (!this.context.connected)
229
+ return;
230
+ const tune = this.current.enabled ? this.current.tune : undefined;
231
+ const activity = activitySignature(tune);
232
+ if (activity === this.lastPublishedActivity)
233
+ return;
234
+ this.lastPublishedActivity = activity;
235
+ this.publish(tune);
236
+ }
237
+ publish(tune) {
238
+ const signature = JSON.stringify(tune ?? null);
239
+ if (signature === this.lastPublished)
240
+ return;
241
+ this.lastPublished = signature;
242
+ void this.options.publishTune(tune).catch((reason) => {
243
+ this.clearPublicationState();
244
+ this.setState({
245
+ ...this.current,
246
+ error: this.options.formatError(reason),
247
+ });
248
+ });
249
+ }
250
+ refreshPublicationTimer() {
251
+ this.cancelRefreshTimer();
252
+ if (!this.started || !this.context.connected || !this.current.enabled)
253
+ return;
254
+ this.refreshTimer = this.setInterval(() => {
255
+ const tune = currentTune(this.lastPlayingTune, this.lastPlayingObservedAt, this.now());
256
+ if (!tune)
257
+ return;
258
+ this.lastPublished = JSON.stringify(tune);
259
+ void this.options.publishTune(tune).catch((reason) => {
260
+ this.clearPublicationState();
261
+ this.setState({
262
+ ...this.current,
263
+ error: this.options.formatError(reason),
264
+ });
265
+ });
266
+ }, ACTIVITY_REFRESH_MS);
267
+ }
268
+ clearPublicationState() {
269
+ this.lastPublished = "";
270
+ this.lastPublishedActivity = "";
271
+ }
272
+ cancelPauseTimer() {
273
+ if (this.pauseTimer !== undefined)
274
+ this.clearTimer(this.pauseTimer);
275
+ this.pauseTimer = undefined;
276
+ }
277
+ cancelRefreshTimer() {
278
+ if (this.refreshTimer !== undefined)
279
+ this.clearInterval(this.refreshTimer);
280
+ this.refreshTimer = undefined;
281
+ }
282
+ now() {
283
+ return (this.options.now ?? Date.now)();
284
+ }
285
+ setTimer(callback, delay) {
286
+ return this.options.setTimer
287
+ ? this.options.setTimer(callback, delay)
288
+ : setTimeout(callback, delay);
289
+ }
290
+ clearTimer(timer) {
291
+ if (this.options.clearTimer)
292
+ this.options.clearTimer(timer);
293
+ else
294
+ clearTimeout(timer);
295
+ }
296
+ setInterval(callback, delay) {
297
+ return (this.options.setInterval ?? setInterval)(callback, delay);
298
+ }
299
+ clearInterval(timer) {
300
+ (this.options.clearInterval ?? clearInterval)(timer);
301
+ }
302
+ setState(state) {
303
+ this.current = state;
304
+ this.listeners.forEach((listener) => listener());
305
+ }
306
+ }
307
+ export function selectActivitySession(sessions, applicationId) {
308
+ const candidates = applicationId
309
+ ? sessions.filter((session) => session.applicationId === applicationId)
310
+ : sessions;
311
+ return (candidates.find((session) => session.playbackState === "playing") ??
312
+ candidates.find((session) => session.playbackState === "paused") ??
313
+ candidates[0]);
314
+ }
315
+ function sessionTune(session) {
316
+ return {
317
+ title: session.title,
318
+ artist: session.artist,
319
+ album: session.album,
320
+ durationMs: session.durationMs,
321
+ positionMs: session.positionMs,
322
+ playbackState: session.playbackState,
323
+ applicationId: session.applicationId,
324
+ applicationName: session.applicationName,
325
+ trackId: session.trackId,
326
+ trackUri: session.trackUri,
327
+ };
328
+ }
329
+ function upsertSession(sessions, session) {
330
+ return sessions.some((item) => item.id === session.id)
331
+ ? sessions.map((item) => (item.id === session.id ? session : item))
332
+ : [...sessions, session];
333
+ }
334
+ function activitySignature(tune) {
335
+ if (!tune)
336
+ return "null";
337
+ const activity = { ...tune };
338
+ delete activity.positionMs;
339
+ return JSON.stringify(activity);
340
+ }
341
+ function currentTune(tune, observedAt, now) {
342
+ if (!tune)
343
+ return undefined;
344
+ if (tune.positionMs === undefined || tune.playbackState !== "playing")
345
+ return tune;
346
+ return {
347
+ ...tune,
348
+ positionMs: Math.min(tune.durationMs ?? Infinity, tune.positionMs + Math.max(0, now - observedAt)),
349
+ };
350
+ }
351
+ //# sourceMappingURL=activity-sharing-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-sharing-controller.js","sourceRoot":"","sources":["../../src/activity/activity-sharing-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { ActivitySharingController, selectActivitySession, type MediaPlaybackState, type MediaActivitySession, type MediaActivityCapabilities, type MediaActivityChange, type ActivitySharingPreference, type ActivitySharingPlatform, type ActivitySharingContext, type ActivitySharingState, type ActivitySharingControllerOptions, } from "./activity-sharing-controller.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/activity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,gCAAgC,GACtC,MAAM,kCAAkC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ActivitySharingController, selectActivitySession, } from "./activity-sharing-controller.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/activity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,qBAAqB,GAUtB,MAAM,kCAAkC,CAAC"}