@touchcastllc/napster-companion-api-dev 1.6.0-alpha.4 → 1.6.0-alpha.5

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.
@@ -0,0 +1,2 @@
1
+ export type { Transport } from "./types";
2
+ export { createWebRtcTransport } from "./webrtcTransport";
@@ -0,0 +1,25 @@
1
+ import type { DataChannelCommand } from "../../types";
2
+ /**
3
+ * The control plane of a session: the channel that carries client commands.
4
+ *
5
+ * Deliberately narrow. It knows nothing about media and nothing about how a
6
+ * session is established — WebRTC implements it over an RTCDataChannel, and a
7
+ * WebSocket session will implement it over the socket itself, carrying the
8
+ * identical command payloads.
9
+ *
10
+ * Session policy (e.g. `stopInteraction`) lives in `sendCommand`, NOT here, so
11
+ * a future implementation cannot forget to honour it.
12
+ *
13
+ * Ownership: whoever creates a transport owns its lifecycle and is responsible
14
+ * for clearing the store slot (`setTransport(null)`) when the underlying
15
+ * connection closes. An implementation must not register its own close handler
16
+ * to do that — it would compete with the owner's.
17
+ */
18
+ export interface Transport {
19
+ /** Send a command. Returns false when the channel cannot carry it. */
20
+ send(command: DataChannelCommand): boolean;
21
+ /** Whether the control channel is ready to accept commands. */
22
+ isOpen(): boolean;
23
+ /** Close the control channel. */
24
+ close(): void;
25
+ }
@@ -0,0 +1,12 @@
1
+ import type { Transport } from "./types";
2
+ /**
3
+ * Wrap an RTCDataChannel as a {@link Transport}.
4
+ *
5
+ * Framing belongs to the transport, not the caller: a WebSocket session may
6
+ * need a different envelope, and callers should not know which one they are on.
7
+ *
8
+ * The adapter deliberately attaches no event handlers — the WebRTC controller
9
+ * owns the channel's lifecycle and clears the store slot from its own
10
+ * `onclose`. See the spec's "Lifecycle and ownership" section.
11
+ */
12
+ export declare function createWebRtcTransport(dc: RTCDataChannel): Transport;
@@ -2,5 +2,5 @@ export { store } from "./store";
2
2
  export type { RootState } from "./store";
3
3
  export { setOnFeaturesUpdateCallback } from "./middleware/featuresUpdateMiddleware";
4
4
  export * from "./selectors";
5
- export { setSessionId, setDataChannel, setStopInteraction, setMuted, setAutoMicActive, setVolume, setAvatarSpeaking, setScreenSharing, setUserTalking, setConnectionToken, setCloseConnectionHandler, setSessionTerminatedByServer, resetAvatar, } from "./slices/avatarSlice";
5
+ export { setSessionId, setTransport, setStopInteraction, setMuted, setAutoMicActive, setVolume, setAvatarSpeaking, setScreenSharing, setUserTalking, setConnectionToken, setCloseConnectionHandler, setSessionTerminatedByServer, resetAvatar, } from "./slices/avatarSlice";
6
6
  export { setFeatures, resetFeatures, setDebugMode } from "./slices/appSlice";
@@ -1,10 +1,11 @@
1
1
  import { RootState } from "./index";
2
2
  import { FeatureConfig } from "../types";
3
+ import type { Transport } from "../services/transport";
3
4
  /**
4
5
  * Avatar state selectors
5
6
  */
6
7
  export declare const selectSessionId: (state: RootState) => string | undefined;
7
- export declare const selectDataChannel: (state: RootState) => RTCDataChannel | null;
8
+ export declare const selectTransport: (state: RootState) => Transport | null;
8
9
  export declare const selectMuted: (state: RootState) => boolean;
9
10
  export declare const selectAutoMicActive: (state: RootState) => boolean;
10
11
  export declare const selectAvatarSpeaking: (state: RootState) => boolean;
@@ -1,6 +1,7 @@
1
+ import type { Transport } from "../../services/transport";
1
2
  export interface AvatarState {
2
3
  sessionId?: string;
3
- dataChannel: RTCDataChannel | null;
4
+ transport: Transport | null;
4
5
  stopInteraction: boolean;
5
6
  muted: boolean;
6
7
  autoMicActive: boolean;
@@ -12,5 +13,5 @@ export interface AvatarState {
12
13
  closeConnectionHandler?: () => void;
13
14
  sessionTerminatedByServer: boolean;
14
15
  }
15
- export declare const setSessionId: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<string | undefined, "avatar/setSessionId">, setDataChannel: import("@reduxjs/toolkit").ActionCreatorWithPayload<RTCDataChannel | null, "avatar/setDataChannel">, setStopInteraction: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "avatar/setStopInteraction">, setMuted: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "avatar/setMuted">, setAutoMicActive: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "avatar/setAutoMicActive">, setVolume: import("@reduxjs/toolkit").ActionCreatorWithPayload<number, "avatar/setVolume">, setAvatarSpeaking: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "avatar/setAvatarSpeaking">, setScreenSharing: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "avatar/setScreenSharing">, setUserTalking: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "avatar/setUserTalking">, setConnectionToken: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<string | undefined, "avatar/setConnectionToken">, setCloseConnectionHandler: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<(() => void) | undefined, "avatar/setCloseConnectionHandler">, setSessionTerminatedByServer: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "avatar/setSessionTerminatedByServer">, resetAvatar: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"avatar/resetAvatar">;
16
+ export declare const setSessionId: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<string | undefined, "avatar/setSessionId">, setTransport: import("@reduxjs/toolkit").ActionCreatorWithPayload<Transport | null, "avatar/setTransport">, setStopInteraction: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "avatar/setStopInteraction">, setMuted: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "avatar/setMuted">, setAutoMicActive: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "avatar/setAutoMicActive">, setVolume: import("@reduxjs/toolkit").ActionCreatorWithPayload<number, "avatar/setVolume">, setAvatarSpeaking: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "avatar/setAvatarSpeaking">, setScreenSharing: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "avatar/setScreenSharing">, setUserTalking: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "avatar/setUserTalking">, setConnectionToken: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<string | undefined, "avatar/setConnectionToken">, setCloseConnectionHandler: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<(() => void) | undefined, "avatar/setCloseConnectionHandler">, setSessionTerminatedByServer: import("@reduxjs/toolkit").ActionCreatorWithPayload<boolean, "avatar/setSessionTerminatedByServer">, resetAvatar: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"avatar/resetAvatar">;
16
17
  export declare const avatarReducer: import("redux").Reducer<AvatarState>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@touchcastllc/napster-companion-api-dev",
3
- "version": "1.6.0-alpha.4",
3
+ "version": "1.6.0-alpha.5",
4
4
  "keywords": [
5
5
  "napster",
6
6
  "companion-api",