@noya-app/noya-multiplayer-react 0.1.89 → 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.
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _noya_app_state_manager from '@noya-app/state-manager';
2
- import { AIToolDefinition, UserManager, SharedConnectionDataManager, NoyaManager, StateManagerOptions, StateManager, NoyaManagerOptions, SyncAdapter, TSchema, AccessType, PolicyAuthContext, LocalStorageSyncOptions, Static, ExtractRequestBody, PublishCallback, ResourceManager, TranscriptionManager, AssetTranscriptionResult, StreamFilter, ActivityEventsManager, MultiplayerPatchMetadata, SafeEval, CreateParams, MultiplayerStateManager, ResourceUrlOptions, ReconnectingWebSocketState, ClientToServerMessage, ServerToClientMessage, MultiplayerStateManagerError } from '@noya-app/state-manager';
2
+ import { AIToolDefinition, UserManager, SharedConnectionDataManager, NoyaManager, StateManagerOptions, StateManager, NoyaManagerOptions, SyncAdapter, TSchema, AccessType, PolicyAuthContext, LocalStorageSyncOptions, Static, ExtractRequestBody, PublishCallback, ResourceManager, TranscriptionManager, AssetTranscriptionResult, StreamFilter, ActivityEventsManager, MultiplayerPatchMetadata, SafeEval, CreateParams, MultiplayerStateManager, ResourceUrlOptions, ConnectionEvent as ConnectionEvent$1, ClientToServerMessage, ReconnectingWebSocketState } from '@noya-app/state-manager';
3
3
  export * from '@noya-app/state-manager';
4
4
  import React, { SetStateAction, ComponentProps, Dispatch } from 'react';
5
5
  import { Asset, ResourceCreate, CreateResourceParametersWithoutAccessibleByFileId, ModifiedResource, Resource, MediaItem, ResourceMap, ResourceCreateMap, OutputTransform, Input } from '@noya-app/noya-schemas';
@@ -172,6 +172,7 @@ type GetAppDataOptions = {
172
172
  };
173
173
  declare function enforceSchema<State>(initialState: State, schema?: TSchema): State;
174
174
  declare function parseAppDataParameter(options?: GetAppDataOptions): AppData<unknown> | null;
175
+ declare function parseInspectorParameter(options?: GetAppDataOptions): boolean | null;
175
176
  declare function getAppData<State>(initialState: State | (() => State), schema?: TSchema, options?: GetAppDataOptions): AppData<State>;
176
177
  declare function getSyncAdapter<S, M extends object = object, E extends object = object, MenuT extends string = string, I extends Record<string, any> = Record<string, unknown>>(params?: {
177
178
  multiplayerUrl?: string;
@@ -637,21 +638,12 @@ declare function useObservable<T, P extends PathKey[] | string>(observable: Obse
637
638
 
638
639
  declare function useResourceUrl(idOrStableId: string | undefined, options?: ResourceUrlOptions): string | undefined;
639
640
 
640
- type ConnectionEvent<State> = {
641
- type: "stateChange";
642
- state: ReconnectingWebSocketState;
643
- } | {
644
- type: "send";
645
- message: ClientToServerMessage<State>;
646
- } | {
647
- type: "receive";
648
- message: ServerToClientMessage<State>;
649
- } | {
650
- type: "error";
651
- error: MultiplayerStateManagerError;
652
- };
641
+ type ConnectionEvent<State> = ConnectionEvent$1<State>;
653
642
  type ConnectionOptions<State> = {
654
643
  debug?: boolean;
644
+ heartbeatIntervalMs?: number;
645
+ silentTimeoutMs?: number;
646
+ realtimeInputWatchdogMs?: number;
655
647
  onConnectionEvent?: (event: ConnectionEvent<State>) => void;
656
648
  };
657
649
  declare class WebSocketConnection<State> {
@@ -659,15 +651,72 @@ declare class WebSocketConnection<State> {
659
651
  private options;
660
652
  private ws;
661
653
  private closedForever;
654
+ private heartbeatIntervalHandle?;
655
+ private silentTimeoutHandle?;
656
+ private simulationClockPulseIntervalHandle?;
657
+ private simulationClockPulseSocket?;
658
+ private simulationClockDirectFailed;
659
+ private heartbeatSequence;
660
+ private pendingSimulationFrames;
661
+ private frameFlushHandle?;
662
+ private frameFlushScheduler?;
663
+ private droppedSimulationFrames;
664
+ private pendingFrameReceipts;
665
+ private deliveredSimulationFrameCursors;
666
+ private queuedRealtimeInputs;
667
+ /**
668
+ * A batch stays here until the server explicitly confirms ingestion.
669
+ * Reconnects resend these exact batches, so a frame that was already in
670
+ * flight can never create a hole in an input stream.
671
+ */
672
+ private unconfirmedRealtimeBatches;
673
+ private lastSentRealtimeSequences;
674
+ private readonly realtimeInputSessionId;
675
+ private nextRealtimeInputBatchSequence;
676
+ private realtimeInputWatchdogHandle?;
677
+ private realtimeBatchesSent;
678
+ private realtimeInputsSent;
662
679
  constructor(url: URL, options?: ConnectionOptions<State>);
663
680
  connect(): Promise<void>;
664
681
  private handleOpen;
665
682
  private handleMessage;
683
+ private emitReceivedMessage;
684
+ private scheduleSimulationFrameFlush;
685
+ private flushSimulationFrames;
686
+ private shouldSuppressNonMonotonicObject;
687
+ private cancelSimulationFrameFlush;
666
688
  private handleClose;
689
+ private startHeartbeat;
690
+ private armSilentTimeout;
691
+ private stopHeartbeat;
692
+ private applySimulationClockConfig;
693
+ private openSimulationClockPulseSocket;
694
+ private stopSimulationClockPulses;
695
+ getSimulationFrameDiagnostics(): {
696
+ pending: number;
697
+ dropped: number;
698
+ pendingReceipts: number;
699
+ queuedRealtimeInputs: number;
700
+ replayRealtimeInputs: number;
701
+ unconfirmedRealtimeBatches: number;
702
+ realtimeBatchesSent: number;
703
+ realtimeInputsSent: number;
704
+ realtimeWatchdogArmed: boolean;
705
+ simulationClockPulsesActive: boolean;
706
+ };
667
707
  send(message: ClientToServerMessage<State>): void;
708
+ private sendTransportMessage;
709
+ private getRealtimeInputSequence;
710
+ private getContiguousRealtimeInputCount;
711
+ private flushRealtimeBatch;
712
+ private flushPendingFrameReceipts;
713
+ private armRealtimeInputWatchdog;
714
+ private stopRealtimeInputWatchdog;
715
+ private replayUnconfirmedRealtimeBatches;
716
+ private confirmRealtimeInputBatches;
668
717
  close(): void;
669
718
  addListener(listener: (state: ReconnectingWebSocketState) => void): () => void;
670
719
  removeListener(listener: (state: ReconnectingWebSocketState) => void): void;
671
720
  }
672
721
 
673
- export { type AnyNoyaSingletonBindings, type AnyNoyaSingletonOptions, AnyNoyaStateContext, type AnyNoyaStateContextValue, type AppData, type AppTheme, type AppViewType, type ConnectionEvent, type ConnectionOptions, FallbackUntilInitialized, type GetAppDataOptions, type NoyaStateProviderProps, type RenderUserPointer, type RenderUserPointerProps, StateInspector, type StateInspectorAnchor, type StateInspectorOptions, type UseMultiplayerStateOptions, type UseNoyaStateOptions, type UseNoyaStateResult, type UserPointerData, UserPointersOverlay, type UserPointersOverlayProps, WebSocketConnection, buildResourcePatchPayload, createDefaultAppData, createNoyaContext, createStateInspectorRoot, decodeAll, deleteNoyaSingleton, encodeAll, enforceSchema, exportAll, fetchAssetMap, getAppData, getNoyaManagerSingleton, getNoyaSingletonBindings, getSyncAdapter, importAll, initializeNoyaSingleton, parseAppDataParameter, replaceDeep, resourceToCreateParameters, resourceToMediaItem, useAIManager, useActivityEvents, useActivityEventsForManager, useAnyNoyaManager, useAnyNoyaStateContext, useAnySharedConnectionData, useAsset, useAssetManager, useAssets, useBindNoyaManager, useCallableAITools, useColorScheme, useEnqueueInput, useFileName, useFilePropertyManager, useIOManager, useInputs, useIsInitialized, useIsProcessing, useManagedHistory, useManagedState, useMultiplayerState, useNoyaActiveUsers, useNoyaAssetTranscription, useNoyaCurrentUser, useNoyaCurrentUserId, useNoyaStateInternal, useNoyaTranscriptionManager, useNoyaUser, useNoyaUserManager, useNoyaUsers, useObservable, useOptionalAnyNoyaStateContext, useOutputTransforms, usePipelineManager, usePublish, useRegisterAITool, useResourceManager, useResourceUrl, useResources, useScriptEvaluator, useSecret, useSecretManager, useSecrets, useSetFileNameState, useStateInspector, useViewType };
722
+ export { type AnyNoyaSingletonBindings, type AnyNoyaSingletonOptions, AnyNoyaStateContext, type AnyNoyaStateContextValue, type AppData, type AppTheme, type AppViewType, type ConnectionEvent, type ConnectionOptions, FallbackUntilInitialized, type GetAppDataOptions, type NoyaStateProviderProps, type RenderUserPointer, type RenderUserPointerProps, StateInspector, type StateInspectorAnchor, type StateInspectorOptions, type UseMultiplayerStateOptions, type UseNoyaStateOptions, type UseNoyaStateResult, type UserPointerData, UserPointersOverlay, type UserPointersOverlayProps, WebSocketConnection, buildResourcePatchPayload, createDefaultAppData, createNoyaContext, createStateInspectorRoot, decodeAll, deleteNoyaSingleton, encodeAll, enforceSchema, exportAll, fetchAssetMap, getAppData, getNoyaManagerSingleton, getNoyaSingletonBindings, getSyncAdapter, importAll, initializeNoyaSingleton, parseAppDataParameter, parseInspectorParameter, replaceDeep, resourceToCreateParameters, resourceToMediaItem, useAIManager, useActivityEvents, useActivityEventsForManager, useAnyNoyaManager, useAnyNoyaStateContext, useAnySharedConnectionData, useAsset, useAssetManager, useAssets, useBindNoyaManager, useCallableAITools, useColorScheme, useEnqueueInput, useFileName, useFilePropertyManager, useIOManager, useInputs, useIsInitialized, useIsProcessing, useManagedHistory, useManagedState, useMultiplayerState, useNoyaActiveUsers, useNoyaAssetTranscription, useNoyaCurrentUser, useNoyaCurrentUserId, useNoyaStateInternal, useNoyaTranscriptionManager, useNoyaUser, useNoyaUserManager, useNoyaUsers, useObservable, useOptionalAnyNoyaStateContext, useOutputTransforms, usePipelineManager, usePublish, useRegisterAITool, useResourceManager, useResourceUrl, useResources, useScriptEvaluator, useSecret, useSecretManager, useSecrets, useSetFileNameState, useStateInspector, useViewType };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _noya_app_state_manager from '@noya-app/state-manager';
2
- import { AIToolDefinition, UserManager, SharedConnectionDataManager, NoyaManager, StateManagerOptions, StateManager, NoyaManagerOptions, SyncAdapter, TSchema, AccessType, PolicyAuthContext, LocalStorageSyncOptions, Static, ExtractRequestBody, PublishCallback, ResourceManager, TranscriptionManager, AssetTranscriptionResult, StreamFilter, ActivityEventsManager, MultiplayerPatchMetadata, SafeEval, CreateParams, MultiplayerStateManager, ResourceUrlOptions, ReconnectingWebSocketState, ClientToServerMessage, ServerToClientMessage, MultiplayerStateManagerError } from '@noya-app/state-manager';
2
+ import { AIToolDefinition, UserManager, SharedConnectionDataManager, NoyaManager, StateManagerOptions, StateManager, NoyaManagerOptions, SyncAdapter, TSchema, AccessType, PolicyAuthContext, LocalStorageSyncOptions, Static, ExtractRequestBody, PublishCallback, ResourceManager, TranscriptionManager, AssetTranscriptionResult, StreamFilter, ActivityEventsManager, MultiplayerPatchMetadata, SafeEval, CreateParams, MultiplayerStateManager, ResourceUrlOptions, ConnectionEvent as ConnectionEvent$1, ClientToServerMessage, ReconnectingWebSocketState } from '@noya-app/state-manager';
3
3
  export * from '@noya-app/state-manager';
4
4
  import React, { SetStateAction, ComponentProps, Dispatch } from 'react';
5
5
  import { Asset, ResourceCreate, CreateResourceParametersWithoutAccessibleByFileId, ModifiedResource, Resource, MediaItem, ResourceMap, ResourceCreateMap, OutputTransform, Input } from '@noya-app/noya-schemas';
@@ -172,6 +172,7 @@ type GetAppDataOptions = {
172
172
  };
173
173
  declare function enforceSchema<State>(initialState: State, schema?: TSchema): State;
174
174
  declare function parseAppDataParameter(options?: GetAppDataOptions): AppData<unknown> | null;
175
+ declare function parseInspectorParameter(options?: GetAppDataOptions): boolean | null;
175
176
  declare function getAppData<State>(initialState: State | (() => State), schema?: TSchema, options?: GetAppDataOptions): AppData<State>;
176
177
  declare function getSyncAdapter<S, M extends object = object, E extends object = object, MenuT extends string = string, I extends Record<string, any> = Record<string, unknown>>(params?: {
177
178
  multiplayerUrl?: string;
@@ -637,21 +638,12 @@ declare function useObservable<T, P extends PathKey[] | string>(observable: Obse
637
638
 
638
639
  declare function useResourceUrl(idOrStableId: string | undefined, options?: ResourceUrlOptions): string | undefined;
639
640
 
640
- type ConnectionEvent<State> = {
641
- type: "stateChange";
642
- state: ReconnectingWebSocketState;
643
- } | {
644
- type: "send";
645
- message: ClientToServerMessage<State>;
646
- } | {
647
- type: "receive";
648
- message: ServerToClientMessage<State>;
649
- } | {
650
- type: "error";
651
- error: MultiplayerStateManagerError;
652
- };
641
+ type ConnectionEvent<State> = ConnectionEvent$1<State>;
653
642
  type ConnectionOptions<State> = {
654
643
  debug?: boolean;
644
+ heartbeatIntervalMs?: number;
645
+ silentTimeoutMs?: number;
646
+ realtimeInputWatchdogMs?: number;
655
647
  onConnectionEvent?: (event: ConnectionEvent<State>) => void;
656
648
  };
657
649
  declare class WebSocketConnection<State> {
@@ -659,15 +651,72 @@ declare class WebSocketConnection<State> {
659
651
  private options;
660
652
  private ws;
661
653
  private closedForever;
654
+ private heartbeatIntervalHandle?;
655
+ private silentTimeoutHandle?;
656
+ private simulationClockPulseIntervalHandle?;
657
+ private simulationClockPulseSocket?;
658
+ private simulationClockDirectFailed;
659
+ private heartbeatSequence;
660
+ private pendingSimulationFrames;
661
+ private frameFlushHandle?;
662
+ private frameFlushScheduler?;
663
+ private droppedSimulationFrames;
664
+ private pendingFrameReceipts;
665
+ private deliveredSimulationFrameCursors;
666
+ private queuedRealtimeInputs;
667
+ /**
668
+ * A batch stays here until the server explicitly confirms ingestion.
669
+ * Reconnects resend these exact batches, so a frame that was already in
670
+ * flight can never create a hole in an input stream.
671
+ */
672
+ private unconfirmedRealtimeBatches;
673
+ private lastSentRealtimeSequences;
674
+ private readonly realtimeInputSessionId;
675
+ private nextRealtimeInputBatchSequence;
676
+ private realtimeInputWatchdogHandle?;
677
+ private realtimeBatchesSent;
678
+ private realtimeInputsSent;
662
679
  constructor(url: URL, options?: ConnectionOptions<State>);
663
680
  connect(): Promise<void>;
664
681
  private handleOpen;
665
682
  private handleMessage;
683
+ private emitReceivedMessage;
684
+ private scheduleSimulationFrameFlush;
685
+ private flushSimulationFrames;
686
+ private shouldSuppressNonMonotonicObject;
687
+ private cancelSimulationFrameFlush;
666
688
  private handleClose;
689
+ private startHeartbeat;
690
+ private armSilentTimeout;
691
+ private stopHeartbeat;
692
+ private applySimulationClockConfig;
693
+ private openSimulationClockPulseSocket;
694
+ private stopSimulationClockPulses;
695
+ getSimulationFrameDiagnostics(): {
696
+ pending: number;
697
+ dropped: number;
698
+ pendingReceipts: number;
699
+ queuedRealtimeInputs: number;
700
+ replayRealtimeInputs: number;
701
+ unconfirmedRealtimeBatches: number;
702
+ realtimeBatchesSent: number;
703
+ realtimeInputsSent: number;
704
+ realtimeWatchdogArmed: boolean;
705
+ simulationClockPulsesActive: boolean;
706
+ };
667
707
  send(message: ClientToServerMessage<State>): void;
708
+ private sendTransportMessage;
709
+ private getRealtimeInputSequence;
710
+ private getContiguousRealtimeInputCount;
711
+ private flushRealtimeBatch;
712
+ private flushPendingFrameReceipts;
713
+ private armRealtimeInputWatchdog;
714
+ private stopRealtimeInputWatchdog;
715
+ private replayUnconfirmedRealtimeBatches;
716
+ private confirmRealtimeInputBatches;
668
717
  close(): void;
669
718
  addListener(listener: (state: ReconnectingWebSocketState) => void): () => void;
670
719
  removeListener(listener: (state: ReconnectingWebSocketState) => void): void;
671
720
  }
672
721
 
673
- export { type AnyNoyaSingletonBindings, type AnyNoyaSingletonOptions, AnyNoyaStateContext, type AnyNoyaStateContextValue, type AppData, type AppTheme, type AppViewType, type ConnectionEvent, type ConnectionOptions, FallbackUntilInitialized, type GetAppDataOptions, type NoyaStateProviderProps, type RenderUserPointer, type RenderUserPointerProps, StateInspector, type StateInspectorAnchor, type StateInspectorOptions, type UseMultiplayerStateOptions, type UseNoyaStateOptions, type UseNoyaStateResult, type UserPointerData, UserPointersOverlay, type UserPointersOverlayProps, WebSocketConnection, buildResourcePatchPayload, createDefaultAppData, createNoyaContext, createStateInspectorRoot, decodeAll, deleteNoyaSingleton, encodeAll, enforceSchema, exportAll, fetchAssetMap, getAppData, getNoyaManagerSingleton, getNoyaSingletonBindings, getSyncAdapter, importAll, initializeNoyaSingleton, parseAppDataParameter, replaceDeep, resourceToCreateParameters, resourceToMediaItem, useAIManager, useActivityEvents, useActivityEventsForManager, useAnyNoyaManager, useAnyNoyaStateContext, useAnySharedConnectionData, useAsset, useAssetManager, useAssets, useBindNoyaManager, useCallableAITools, useColorScheme, useEnqueueInput, useFileName, useFilePropertyManager, useIOManager, useInputs, useIsInitialized, useIsProcessing, useManagedHistory, useManagedState, useMultiplayerState, useNoyaActiveUsers, useNoyaAssetTranscription, useNoyaCurrentUser, useNoyaCurrentUserId, useNoyaStateInternal, useNoyaTranscriptionManager, useNoyaUser, useNoyaUserManager, useNoyaUsers, useObservable, useOptionalAnyNoyaStateContext, useOutputTransforms, usePipelineManager, usePublish, useRegisterAITool, useResourceManager, useResourceUrl, useResources, useScriptEvaluator, useSecret, useSecretManager, useSecrets, useSetFileNameState, useStateInspector, useViewType };
722
+ export { type AnyNoyaSingletonBindings, type AnyNoyaSingletonOptions, AnyNoyaStateContext, type AnyNoyaStateContextValue, type AppData, type AppTheme, type AppViewType, type ConnectionEvent, type ConnectionOptions, FallbackUntilInitialized, type GetAppDataOptions, type NoyaStateProviderProps, type RenderUserPointer, type RenderUserPointerProps, StateInspector, type StateInspectorAnchor, type StateInspectorOptions, type UseMultiplayerStateOptions, type UseNoyaStateOptions, type UseNoyaStateResult, type UserPointerData, UserPointersOverlay, type UserPointersOverlayProps, WebSocketConnection, buildResourcePatchPayload, createDefaultAppData, createNoyaContext, createStateInspectorRoot, decodeAll, deleteNoyaSingleton, encodeAll, enforceSchema, exportAll, fetchAssetMap, getAppData, getNoyaManagerSingleton, getNoyaSingletonBindings, getSyncAdapter, importAll, initializeNoyaSingleton, parseAppDataParameter, parseInspectorParameter, replaceDeep, resourceToCreateParameters, resourceToMediaItem, useAIManager, useActivityEvents, useActivityEventsForManager, useAnyNoyaManager, useAnyNoyaStateContext, useAnySharedConnectionData, useAsset, useAssetManager, useAssets, useBindNoyaManager, useCallableAITools, useColorScheme, useEnqueueInput, useFileName, useFilePropertyManager, useIOManager, useInputs, useIsInitialized, useIsProcessing, useManagedHistory, useManagedState, useMultiplayerState, useNoyaActiveUsers, useNoyaAssetTranscription, useNoyaCurrentUser, useNoyaCurrentUserId, useNoyaStateInternal, useNoyaTranscriptionManager, useNoyaUser, useNoyaUserManager, useNoyaUsers, useObservable, useOptionalAnyNoyaStateContext, useOutputTransforms, usePipelineManager, usePublish, useRegisterAITool, useResourceManager, useResourceUrl, useResources, useScriptEvaluator, useSecret, useSecretManager, useSecrets, useSetFileNameState, useStateInspector, useViewType };