import { BaseObserver, DBAdapter, SyncStatus } from '@powersync/common'; import { ConnectionManager, SubscribedStream, type StreamingSyncImplementation, type StreamingSyncImplementationListener, Mutex, ResolvedSyncOptions } from '@powersync/shared-internals'; import * as Comlink from 'comlink'; import { WebStreamingSyncImplementation, WebStreamingSyncImplementationOptions } from '../../db/sync/WebStreamingSyncImplementation.js'; import { AbstractSharedSyncClientProvider } from './AbstractSharedSyncClientProvider.js'; import { BroadcastLogger } from './BroadcastLogger.js'; import { ResolvedWebSQLOpenOptions } from '../../db/adapters/options.js'; /** * @internal * Manual message events for shared sync clients */ export declare enum SharedSyncClientEvent { /** * This client requests the shared sync manager should * close it's connection to the client. */ CLOSE_CLIENT = "close-client", CLOSE_ACK = "close-ack" } /** * @internal */ export type ManualSharedSyncPayload = { event: SharedSyncClientEvent; data: any; }; /** * @internal */ export type SharedSyncInitOptions = { streamOptions: Omit; dbParams: ResolvedWebSQLOpenOptions; enableBroadcastLogs: boolean; }; /** * @internal */ export interface SharedSyncImplementationListener extends StreamingSyncImplementationListener { initialized: () => void; } /** * @internal */ export type WrappedSyncPort = { port: MessagePort; clientProvider: Comlink.Remote; db?: DBAdapter; currentSubscriptions: SubscribedStream[]; closeListeners: (() => void | Promise)[]; isClosing: boolean; }; /** * @internal * Shared sync implementation which runs inside a shared webworker */ export declare class SharedSyncImplementation extends BaseObserver { #private; protected ports: WrappedSyncPort[]; protected isInitialized: Promise; protected statusListener?: () => void; protected syncParams: SharedSyncInitOptions | null; protected lastConnectOptions: ResolvedSyncOptions | undefined; protected portMutex: Mutex; private subscriptions; protected connectionManager: ConnectionManager; private syncStatus?; logger: BroadcastLogger; protected readonly database: DBAdapter; private sharedCloseSignal; constructor(); get isConnected(): boolean; /** * Gets the last client port which we know is safe from unexpected closes. */ protected getLastWrappedPort(): Promise; /** * In some very rare cases a specific tab might not respond to requests. * This returns a random port which is not closing. */ protected getRandomWrappedPort(): Promise; waitUntilStatusMatches(predicate: (status: SyncStatus) => boolean): Promise; waitForReady(): Promise; private collectActiveSubscriptions; updateSubscriptions(port: WrappedSyncPort, subscriptions: SubscribedStream[]): void; setLogLevel(level: number): void; /** * Configures the DBAdapter connection and a streaming sync client. */ setParams(params: SharedSyncInitOptions): Promise; dispose(): Promise; /** * Connects to the PowerSync backend instance. * Multiple tabs can safely call this in their initialization. * The connection will simply be reconnected whenever a new tab * connects. */ connect(options: ResolvedSyncOptions, serializedSchema: any): Promise; disconnect(): Promise; /** * Adds a new client tab's message port to the list of connected ports */ addPort(port: MessagePort): Promise<{ port: MessagePort; clientProvider: Comlink.Remote; currentSubscriptions: never[]; closeListeners: never[]; isClosing: false; }>; /** * Removes a message port client from this manager's managed * clients. */ removePort(port: WrappedSyncPort): Promise<() => void>; triggerCrudUpload(): void; requestCheckpoint(): Promise; protected withSyncImplementation(callback: (sync: StreamingSyncImplementation) => Promise): Promise; protected generateStreamingImplementation(): WebStreamingSyncImplementation; /** * Requests a random client to share its database connection with us. */ private openInternalDB; private generateReconnectableDatabase; }