@ikonai/sdk 0.0.28 → 0.0.29

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 (32) hide show
  1. package/assets/audio-capture-worker-fxRKlQJF.js +932 -0
  2. package/assets/audio-playback-worker-C4Eyhfrh.js +1323 -0
  3. package/assets/protocol-worker-E7o-6_bZ.js +1422 -0
  4. package/assets/video-capture-worker-CTRX9PKp.js +843 -0
  5. package/assets/video-playback-worker-CIuL9Crw.js +875 -0
  6. package/channel/channel-manager.d.ts +1 -1
  7. package/channel/channel.d.ts +1 -1
  8. package/client/endpoint-selector.d.ts +1 -1
  9. package/client/ikon-client-config.d.ts +4 -9
  10. package/client/ikon-client.d.ts +5 -1
  11. package/connection/authenticator.d.ts +1 -1
  12. package/functions/function-registry.d.ts +1 -1
  13. package/functions/index.d.ts +1 -1
  14. package/functions/types.d.ts +1 -1
  15. package/index.d.ts +8 -8
  16. package/index.js +3878 -15843
  17. package/media/audio-constants.d.ts +20 -0
  18. package/media/ikon-audio-playback.d.ts +1 -1
  19. package/media/ikon-video-playback.d.ts +0 -8
  20. package/package.json +2 -1
  21. package/transport/transport.d.ts +1 -1
  22. package/transport/web-socket-transport.d.ts +6 -1
  23. package/transport/web-transport-transport.d.ts +17 -2
  24. package/{media/audio-worker-messages.d.ts → worker/audio-playback-worker.d.ts} +10 -10
  25. package/worker/video-playback-worker.d.ts +59 -0
  26. package/assets/audio-capture-worker-C5hNMTF7.js +0 -14835
  27. package/assets/audio-worker-Ci3tYX2B.js +0 -15121
  28. package/assets/protocol-worker-DXLojSe-.js +0 -15288
  29. package/assets/video-capture-worker-OBl3bsvx.js +0 -14733
  30. package/assets/video-worker-BoOfB8qz.js +0 -14761
  31. package/worker/audio-worker.d.ts +0 -1
  32. package/worker/video-worker.d.ts +0 -1
@@ -0,0 +1,20 @@
1
+ export declare const REQUESTED_OUTPUT_SAMPLE_RATE = 48000;
2
+ export declare const OUTPUT_CHANNELS = 2;
3
+ export declare const AUDIO_BUFFER_MAX_MS = 1500;
4
+ export declare const MAX_PENDING_WORKLET_MESSAGES = 512;
5
+ export declare const AUDIO_CONTEXT_LATENCY_HINT: AudioContextOptions['latencyHint'];
6
+ export declare const BUFFER_TARGET_MIN_MS = 120;
7
+ export declare const BUFFER_TARGET_MAX_MS = 300;
8
+ export declare const JITTER_MULTIPLIER = 4;
9
+ export declare const CONTROL_PERIOD_MS = 200;
10
+ export declare const UNDERRUN_JUMP_MS = 100;
11
+ export declare const STABLE_TIME_TO_DECREASE_MS = 8000;
12
+ export declare const DECREASE_STEP_MS = 10;
13
+ export declare const FADE_IN_DURATION_MS = 100;
14
+ export declare const FADE_OUT_DURATION_MS = 50;
15
+ export declare const RENDER_QUANTUM_SIZE = 128;
16
+ export declare const BUFFER_REDUCTION_CROSSFADE_MS = 20;
17
+ export declare const JITTER_EMA_DIVISOR = 10;
18
+ export declare const PCM_POST_TARGET_MS = 80;
19
+ export declare const PCM_POST_MAX_INTERVAL_MS = 50;
20
+ export declare const MAX_PENDING_FRAMES = 64;
@@ -45,7 +45,7 @@ export interface IkonAudioPlaybackConfig {
45
45
  *
46
46
  * The key separation of responsibilities is:
47
47
  * - protocol I/O: handled by IkonClient (optionally in ProtocolWorker)
48
- * - decoding: done in a dedicated AudioWorker
48
+ * - decoding: done in a dedicated AudioPlaybackWorker
49
49
  * - rendering: done in AudioWorklet when available
50
50
  *
51
51
  * This keeps frequent audio frames off the UI thread and avoids forcing the SDK
@@ -21,19 +21,11 @@ export declare class IkonVideoPlayback {
21
21
  private readonly client;
22
22
  private readonly config;
23
23
  private enabled;
24
- private prepared;
25
24
  private stateUnsubscribe;
26
25
  private worker;
27
26
  private protocolPort;
28
27
  private readonly surfaces;
29
28
  constructor(client: IkonClient, config?: IkonVideoPlaybackConfig);
30
- /**
31
- * Prepare the video pipeline. This can reduce time-to-first-frame by creating
32
- * the worker and attaching the protocol subscription early.
33
- *
34
- * Video still requires an explicit canvas surface to actually present frames.
35
- */
36
- prepare(): Promise<void>;
37
29
  /**
38
30
  * Attach a canvas for a specific video stream id.
39
31
  *
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "@ikonai/sdk",
3
- "version": "0.0.28",
3
+ "version": "0.0.29",
4
4
  "type": "module",
5
5
  "main": "./index.js",
6
6
  "types": "./index.d.ts",
7
+ "sideEffects": false,
7
8
  "exports": {
8
9
  ".": {
9
10
  "import": "./index.js",
@@ -1,4 +1,4 @@
1
- import { ProtocolMessage } from '../../../../shared/generated/src/index.ts';
1
+ import { ProtocolMessage } from '../../../../shared/protocol/src/index.ts';
2
2
  /**
3
3
  * Transport interface for Ikon server connections.
4
4
  * Designed to support both WebSocket and WebTransport implementations.
@@ -1,4 +1,4 @@
1
- import { ProtocolMessage } from '../../../../shared/generated/src/index.ts';
1
+ import { ProtocolMessage } from '../../../../shared/protocol/src/index.ts';
2
2
  import { Transport, TransportConfig } from './transport';
3
3
  /**
4
4
  * WebSocket transport implementation for Ikon server connections.
@@ -6,6 +6,7 @@ import { Transport, TransportConfig } from './transport';
6
6
  export declare class WebSocketTransport implements Transport {
7
7
  private ws;
8
8
  private keepaliveTimeout;
9
+ private keepaliveResponseMessage;
9
10
  private readonly keepaliveTimeoutMs;
10
11
  private readonly callbacks;
11
12
  private readonly sessionId;
@@ -14,6 +15,10 @@ export declare class WebSocketTransport implements Transport {
14
15
  connect(uri: string, authTicket: Uint8Array): Promise<void>;
15
16
  send(message: ProtocolMessage): void;
16
17
  close(): void;
18
+ /**
19
+ * Get or create a cached keepalive response message.
20
+ */
21
+ private getKeepaliveResponse;
17
22
  private handleProtocolMessage;
18
23
  private resetKeepaliveTimeout;
19
24
  private clearKeepaliveTimeout;
@@ -1,4 +1,4 @@
1
- import { ProtocolMessage } from '../../../../shared/generated/src/index.ts';
1
+ import { ProtocolMessage } from '../../../../shared/protocol/src/index.ts';
2
2
  import { Transport, TransportConfig } from './transport';
3
3
  /**
4
4
  * Check if WebTransport is supported in the current environment.
@@ -22,6 +22,11 @@ export declare class WebTransportTransport implements Transport {
22
22
  private keepaliveTimeout;
23
23
  private readLoopActive;
24
24
  private receiveBuffer;
25
+ private receiveBufferOffset;
26
+ private receiveBufferLength;
27
+ private receiveDataView;
28
+ private receiveDataViewBuffer;
29
+ private keepaliveResponseMessage;
25
30
  private readonly keepaliveTimeoutMs;
26
31
  private readonly callbacks;
27
32
  private readonly sessionId;
@@ -35,12 +40,22 @@ export declare class WebTransportTransport implements Transport {
35
40
  */
36
41
  private startReadLoop;
37
42
  /**
38
- * Append incoming data to the receive buffer.
43
+ * Append incoming data to the receive buffer using grow-only strategy.
44
+ * Compacts when offset exceeds half capacity and data is sparse.
39
45
  */
40
46
  private appendToBuffer;
47
+ /**
48
+ * Get or create a cached DataView for the receive buffer.
49
+ */
50
+ private getReceiveDataView;
51
+ /**
52
+ * Get or create a cached keepalive response message.
53
+ */
54
+ private getKeepaliveResponse;
41
55
  /**
42
56
  * Process complete messages from the receive buffer.
43
57
  * Protocol messages start with a 4-byte little-endian length field.
58
+ * Uses subarray views to avoid per-message allocations.
44
59
  */
45
60
  private processBufferedMessages;
46
61
  /**
@@ -1,26 +1,26 @@
1
- export type AudioWorkerTransport = 'sab' | 'pcm';
2
- export type AudioWorkerConfigureMessage = {
1
+ export type AudioPlaybackWorkerTransport = 'sab' | 'pcm';
2
+ export type AudioPlaybackWorkerConfigureMessage = {
3
3
  type: 'configure';
4
- transport: AudioWorkerTransport;
4
+ transport: AudioPlaybackWorkerTransport;
5
5
  outputSampleRate: number;
6
6
  outputChannels: number;
7
7
  preferWebCodecs?: boolean;
8
8
  };
9
- export type AudioWorkerAttachProtocolPortMessage = {
9
+ export type AudioPlaybackWorkerAttachProtocolPortMessage = {
10
10
  type: 'attachProtocolPort';
11
11
  port: MessagePort;
12
12
  };
13
- export type AudioWorkerRebindMessage = {
13
+ export type AudioPlaybackWorkerRebindMessage = {
14
14
  type: 'rebind';
15
- transport: AudioWorkerTransport;
15
+ transport: AudioPlaybackWorkerTransport;
16
16
  outputSampleRate?: number;
17
17
  outputChannels?: number;
18
18
  };
19
- export type AudioWorkerDisposeMessage = {
19
+ export type AudioPlaybackWorkerDisposeMessage = {
20
20
  type: 'dispose';
21
21
  };
22
- export type AudioWorkerIn = AudioWorkerConfigureMessage | AudioWorkerAttachProtocolPortMessage | AudioWorkerRebindMessage | AudioWorkerDisposeMessage;
23
- export type AudioWorkerOut = {
22
+ export type AudioPlaybackWorkerIn = AudioPlaybackWorkerConfigureMessage | AudioPlaybackWorkerAttachProtocolPortMessage | AudioPlaybackWorkerRebindMessage | AudioPlaybackWorkerDisposeMessage;
23
+ export type AudioPlaybackWorkerOut = {
24
24
  type: 'streamBegin';
25
25
  streamId: string;
26
26
  sharedArrayBuffer?: SharedArrayBuffer;
@@ -43,7 +43,7 @@ export type AudioWorkerOut = {
43
43
  type: 'frame';
44
44
  streamId: string;
45
45
  epoch: number;
46
- tsInterleavedSamples: number;
46
+ timestampInterleavedSamples: number;
47
47
  frameSizeInterleavedSamples: number;
48
48
  isFirst: boolean;
49
49
  isLast: boolean;
@@ -0,0 +1,59 @@
1
+ import { VideoCodec } from '../../../../shared/protocol/src/index.ts';
2
+ export type VideoPlaybackWorkerConfigureMessage = {
3
+ type: 'configure';
4
+ };
5
+ export type VideoPlaybackWorkerAttachProtocolPortMessage = {
6
+ type: 'attachProtocolPort';
7
+ port: MessagePort;
8
+ };
9
+ export type VideoPlaybackWorkerAttachSurfaceMessage = {
10
+ type: 'attachSurface';
11
+ streamId: string;
12
+ canvas: OffscreenCanvas;
13
+ };
14
+ export type VideoPlaybackWorkerDetachSurfaceMessage = {
15
+ type: 'detachSurface';
16
+ streamId: string;
17
+ };
18
+ export type VideoPlaybackWorkerWatchStreamMessage = {
19
+ type: 'watchStream';
20
+ streamId: string;
21
+ };
22
+ export type VideoPlaybackWorkerUnwatchStreamMessage = {
23
+ type: 'unwatchStream';
24
+ streamId: string;
25
+ };
26
+ export type VideoPlaybackWorkerSetEnabledMessage = {
27
+ type: 'setEnabled';
28
+ enabled: boolean;
29
+ };
30
+ export type VideoPlaybackWorkerDisposeMessage = {
31
+ type: 'dispose';
32
+ };
33
+ export type VideoPlaybackWorkerIn = VideoPlaybackWorkerConfigureMessage | VideoPlaybackWorkerAttachProtocolPortMessage | VideoPlaybackWorkerAttachSurfaceMessage | VideoPlaybackWorkerDetachSurfaceMessage | VideoPlaybackWorkerWatchStreamMessage | VideoPlaybackWorkerUnwatchStreamMessage | VideoPlaybackWorkerSetEnabledMessage | VideoPlaybackWorkerDisposeMessage;
34
+ export type VideoPlaybackWorkerOut = {
35
+ type: 'streamBegin';
36
+ streamId: string;
37
+ width: number;
38
+ height: number;
39
+ codec: VideoCodec;
40
+ } | {
41
+ type: 'streamEnd';
42
+ streamId: string;
43
+ } | {
44
+ type: 'frame';
45
+ streamId: string;
46
+ width: number;
47
+ height: number;
48
+ bitmap: ImageBitmap;
49
+ } | {
50
+ type: 'requestIdr';
51
+ streamId: string;
52
+ } | {
53
+ type: 'error';
54
+ error: {
55
+ name: string;
56
+ message: string;
57
+ stack?: string;
58
+ };
59
+ };