import { BootStatus, Devtools, RejectedPushError, MigrationsReport, SyncBackend, SyncState, UnknownError, } from '@livestore/common' import { StreamEventsOptionsFields } from '@livestore/common/leader-thread' import { EventSequenceNumber, LiveStoreEvent } from '@livestore/common/schema' import { Schema, Transferable } from '@livestore/utils/effect' export const WorkerArgv = Schema.parseJson( Schema.Struct({ clientId: Schema.String, storeId: Schema.String, sessionId: Schema.String, extraArgs: Schema.UndefinedOr(Schema.JsonValue), }), ) export const StorageTypeInMemory = Schema.Struct({ type: Schema.Literal('in-memory'), /** * Only works with single-threaded leader thread for now. * Should be mostly used for testing. */ importSnapshot: Schema.optional(Schema.Uint8Array as any as Schema.Schema>), }) export type StorageTypeInMemory = typeof StorageTypeInMemory.Type export const StorageTypeFs = Schema.Struct({ type: Schema.Literal('fs'), /** * Where to store the database files * * @default Current working directory */ baseDirectory: Schema.optional(Schema.String), }) export type StorageTypeFs = typeof StorageTypeFs.Type export const StorageType = Schema.Union(StorageTypeInMemory, StorageTypeFs) export type StorageType = typeof StorageType.Type export type StorageTypeEncoded = typeof StorageType.Encoded // export const SyncBackendOptionsWebsocket = Schema.Struct({ // type: Schema.Literal('websocket'), // url: Schema.String, // storeId: Schema.String, // }) // export const SyncBackendOptions = Schema.Union(SyncBackendOptionsWebsocket) export const SyncBackendOptions = Schema.Record({ key: Schema.String, value: Schema.JsonValue }) export type SyncBackendOptions = Record export class LeaderWorkerOuterInitialMessage extends Schema.TaggedRequest()( 'InitialMessage', { payload: { port: Transferable.MessagePort }, success: Schema.Void, failure: Schema.Never, }, ) {} export class LeaderWorkerOuterRequest extends Schema.Union(LeaderWorkerOuterInitialMessage) {} export class LeaderWorkerInnerInitialMessage extends Schema.TaggedRequest()( 'InitialMessage', { payload: { storeId: Schema.String, clientId: Schema.String, storage: StorageType, syncPayloadEncoded: Schema.UndefinedOr(Schema.JsonValue), devtools: Schema.Union( Schema.Struct({ enabled: Schema.Literal(true), schemaPath: Schema.String, port: Schema.Number, host: Schema.String, schemaAlias: Schema.String, useExistingDevtoolsServer: Schema.Boolean, }), Schema.Struct({ enabled: Schema.Literal(false) }), ), }, success: Schema.Void, failure: UnknownError, }, ) {} export class LeaderWorkerInnerBootStatusStream extends Schema.TaggedRequest()( 'BootStatusStream', { payload: {}, success: BootStatus, failure: Schema.Never, }, ) {} export class LeaderWorkerInnerPullStream extends Schema.TaggedRequest()('PullStream', { payload: { cursor: Schema.typeSchema(EventSequenceNumber.Client.Composite), }, success: Schema.Struct({ payload: SyncState.PayloadUpstream, }), failure: Schema.Never, }) {} export class LeaderWorkerInnerStreamEvents extends Schema.TaggedRequest()( 'StreamEvents', { payload: StreamEventsOptionsFields, success: LiveStoreEvent.Client.Encoded, failure: Schema.Never, }, ) {} export class LeaderWorkerInnerPushToLeader extends Schema.TaggedRequest()( 'PushToLeader', { payload: { batch: Schema.Array(Schema.typeSchema(LiveStoreEvent.Client.Encoded)), }, success: Schema.Void as Schema.Schema, failure: RejectedPushError, }, ) {} export class LeaderWorkerInnerExport extends Schema.TaggedRequest()('Export', { payload: {}, success: Transferable.Uint8Array as Schema.Schema>, failure: Schema.Never, }) {} export class LeaderWorkerInnerGetRecreateSnapshot extends Schema.TaggedRequest()( 'GetRecreateSnapshot', { payload: {}, success: Schema.Struct({ snapshot: Transferable.Uint8Array as Schema.Schema>, migrationsReport: MigrationsReport, }), failure: Schema.Never, }, ) {} export class LeaderWorkerInnerExportEventlog extends Schema.TaggedRequest()( 'ExportEventlog', { payload: {}, success: Transferable.Uint8Array as Schema.Schema>, failure: Schema.Never, }, ) {} export class LeaderWorkerInnerGetLeaderHead extends Schema.TaggedRequest()( 'GetLeaderHead', { payload: {}, success: Schema.typeSchema(EventSequenceNumber.Client.Composite), failure: Schema.Never, }, ) {} export class LeaderWorkerInnerGetLeaderSyncState extends Schema.TaggedRequest()( 'GetLeaderSyncState', { payload: {}, success: SyncState.SyncState, failure: Schema.Never, }, ) {} export class LeaderWorkerInnerSyncStateStream extends Schema.TaggedRequest()( 'SyncStateStream', { payload: {}, success: SyncState.SyncState, failure: Schema.Never, }, ) {} export class LeaderWorkerInnerGetNetworkStatus extends Schema.TaggedRequest()( 'GetNetworkStatus', { payload: {}, success: SyncBackend.NetworkStatus, failure: Schema.Never, }, ) {} export class LeaderWorkerInnerNetworkStatusStream extends Schema.TaggedRequest()( 'NetworkStatusStream', { payload: {}, success: SyncBackend.NetworkStatus, failure: Schema.Never, }, ) {} export class LeaderWorkerInnerShutdown extends Schema.TaggedRequest()('Shutdown', { payload: {}, success: Schema.Void, failure: Schema.Never, }) {} export class LeaderWorkerInnerExtraDevtoolsMessage extends Schema.TaggedRequest()( 'ExtraDevtoolsMessage', { payload: { message: Devtools.Leader.MessageToApp, }, success: Schema.Void, failure: Schema.Never, }, ) {} export const LeaderWorkerInnerRequest = Schema.Union( LeaderWorkerInnerInitialMessage, LeaderWorkerInnerBootStatusStream, LeaderWorkerInnerPullStream, LeaderWorkerInnerStreamEvents, LeaderWorkerInnerPushToLeader, LeaderWorkerInnerExport, LeaderWorkerInnerGetRecreateSnapshot, LeaderWorkerInnerExportEventlog, LeaderWorkerInnerGetLeaderHead, LeaderWorkerInnerGetLeaderSyncState, LeaderWorkerInnerSyncStateStream, LeaderWorkerInnerGetNetworkStatus, LeaderWorkerInnerNetworkStatusStream, LeaderWorkerInnerShutdown, LeaderWorkerInnerExtraDevtoolsMessage, ) export type LeaderWorkerInnerRequest = typeof LeaderWorkerInnerRequest.Type