@voidhash/mimic-effect 0.0.1-alpha.9 → 0.0.2
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/.turbo/turbo-build.log +8 -8
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/MimicServer.ts +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @voidhash/mimic-effect@0.0.
|
|
2
|
+
> @voidhash/mimic-effect@0.0.2 build /home/runner/work/mimic/mimic/packages/mimic-effect
|
|
3
3
|
> tsdown
|
|
4
4
|
|
|
5
5
|
[34mℹ[39m tsdown [2mv0.18.2[22m powered by rolldown [2mv1.0.0-beta.55[22m
|
|
@@ -10,14 +10,14 @@
|
|
|
10
10
|
[34mℹ[39m Build start
|
|
11
11
|
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[1mindex.cjs[22m [2m45.26 kB[22m [2m│ gzip: 8.80 kB[22m
|
|
12
12
|
[34mℹ[39m [33m[CJS][39m 1 files, total: 45.26 kB
|
|
13
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22mindex.d.cts.map [2m 6.49 kB[22m [2m│ gzip: 2.42 kB[22m
|
|
14
|
-
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mindex.d.cts[22m[39m [2m30.92 kB[22m [2m│ gzip: 5.80 kB[22m
|
|
15
|
-
[34mℹ[39m [33m[CJS][39m 2 files, total: 37.41 kB
|
|
16
|
-
[32m✔[39m Build complete in [32m6068ms[39m
|
|
17
13
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[1mindex.mjs[22m [2m40.55 kB[22m [2m│ gzip: 8.11 kB[22m
|
|
18
|
-
[34mℹ[39m [34m[ESM][39m [2mdist/[22mindex.mjs.map [2m91.
|
|
14
|
+
[34mℹ[39m [34m[ESM][39m [2mdist/[22mindex.mjs.map [2m91.80 kB[22m [2m│ gzip: 16.23 kB[22m
|
|
19
15
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mindex.d.mts.map [2m 6.96 kB[22m [2m│ gzip: 2.56 kB[22m
|
|
20
16
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22mchunk-C6wwvPpM.mjs [2m 0.36 kB[22m [2m│ gzip: 0.25 kB[22m
|
|
21
17
|
[34mℹ[39m [34m[ESM][39m [2mdist/[22m[32m[1mindex.d.mts[22m[39m [2m30.93 kB[22m [2m│ gzip: 5.80 kB[22m
|
|
22
|
-
[34mℹ[39m [34m[ESM][39m 5 files, total: 170.
|
|
23
|
-
[32m✔[39m Build complete in [
|
|
18
|
+
[34mℹ[39m [34m[ESM][39m 5 files, total: 170.59 kB
|
|
19
|
+
[32m✔[39m Build complete in [32m5872ms[39m
|
|
20
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22mindex.d.cts.map [2m 6.49 kB[22m [2m│ gzip: 2.41 kB[22m
|
|
21
|
+
[34mℹ[39m [33m[CJS][39m [2mdist/[22m[32m[1mindex.d.cts[22m[39m [2m30.92 kB[22m [2m│ gzip: 5.80 kB[22m
|
|
22
|
+
[34mℹ[39m [33m[CJS][39m 2 files, total: 37.41 kB
|
|
23
|
+
[32m✔[39m Build complete in [32m5873ms[39m
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/DocumentProtocol.ts","../src/MimicConfig.ts","../src/MimicDataStorage.ts","../src/DocumentManager.ts","../src/MimicAuthService.ts","../src/MimicServer.ts","../src/storage/InMemoryDataStorage.ts","../src/auth/NoAuth.ts","../src/PresenceManager.ts","../src/errors.ts","../src/WebSocketHandler.ts"],"sourcesContent":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/DocumentProtocol.ts","../src/MimicConfig.ts","../src/MimicDataStorage.ts","../src/DocumentManager.ts","../src/MimicAuthService.ts","../src/MimicServer.ts","../src/storage/InMemoryDataStorage.ts","../src/auth/NoAuth.ts","../src/PresenceManager.ts","../src/errors.ts","../src/WebSocketHandler.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/DocumentProtocol.ts","../src/MimicConfig.ts","../src/MimicDataStorage.ts","../src/DocumentManager.ts","../src/MimicAuthService.ts","../src/MimicServer.ts","../src/storage/InMemoryDataStorage.ts","../src/auth/NoAuth.ts","../src/PresenceManager.ts","../src/errors.ts","../src/WebSocketHandler.ts"],"sourcesContent":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/DocumentProtocol.ts","../src/MimicConfig.ts","../src/MimicDataStorage.ts","../src/DocumentManager.ts","../src/MimicAuthService.ts","../src/MimicServer.ts","../src/storage/InMemoryDataStorage.ts","../src/auth/NoAuth.ts","../src/PresenceManager.ts","../src/errors.ts","../src/WebSocketHandler.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["make","layer","layer","layerEffect","make","instance: DocumentInstance","layer: Layer.Layer<\n DocumentManagerTag,\n never,\n MimicServerConfigTag | MimicDataStorageTag\n>","layer","docPresence: DocumentPresence","presences: Record<string, PresenceEntry>","layer: Layer.Layer<PresenceManagerTag>","layerDefault: Layer.Layer<PresenceManagerTag>","layer","state: ConnectionState","layer: Layer.Layer<MimicDataStorageTag>","layerDefault","layer","noAuthService: MimicAuthService","layer: Layer.Layer<MimicAuthServiceTag>","layer","MimicConfig.layer","WebSocketHandler.makeHandler","DocumentManager.layer","PresenceManager.layer","InMemoryDataStorage.layerDefault","NoAuth.layerDefault","extractDocumentId","MimicConfig.MimicServerConfigTag","DocumentManager.DocumentManagerTag","PresenceManager.PresenceManagerTag","WebSocketHandler.extractDocumentId","WebSocketHandler.handleConnection","wsPath: PathInput"],"sources":["../src/MimicConfig.ts","../src/MimicDataStorage.ts","../src/DocumentManager.ts","../src/MimicAuthService.ts","../src/PresenceManager.ts","../src/errors.ts","../src/WebSocketHandler.ts","../src/storage/InMemoryDataStorage.ts","../src/auth/NoAuth.ts","../src/MimicServer.ts","../src/DocumentProtocol.ts"],"sourcesContent":["/**\n * @since 0.0.1\n * Configuration types for the Mimic server.\n */\nimport * as Context from \"effect/Context\";\nimport * as Duration from \"effect/Duration\";\nimport type { DurationInput } from \"effect/Duration\";\nimport * as Layer from \"effect/Layer\";\nimport type { Primitive, Presence } from \"@voidhash/mimic\";\n\n// =============================================================================\n// Mimic Server Configuration\n// =============================================================================\n\n/**\n * Configuration for the Mimic server.\n * \n * Note: Authentication and persistence are now handled by injectable services\n * (MimicAuthService and MimicDataStorage) rather than config options.\n */\nexport interface MimicServerConfig<TSchema extends Primitive.AnyPrimitive = Primitive.AnyPrimitive> {\n /**\n * The schema defining the document structure.\n */\n readonly schema: TSchema;\n\n /**\n * Maximum idle time for a document before it is cleaned up.\n * @default \"5 minutes\"\n */\n readonly maxIdleTime: Duration.Duration;\n\n /**\n * Maximum number of processed transaction IDs to track for deduplication.\n * @default 1000\n */\n readonly maxTransactionHistory: number;\n\n /**\n * Heartbeat interval for WebSocket connections.\n * @default \"30 seconds\"\n */\n readonly heartbeatInterval: Duration.Duration;\n\n /**\n * Timeout for heartbeat responses before considering connection dead.\n * @default \"10 seconds\"\n */\n readonly heartbeatTimeout: Duration.Duration;\n\n /**\n * Optional presence schema for ephemeral per-user data.\n * When provided, enables presence features on WebSocket connections.\n * @default undefined (presence disabled)\n */\n readonly presence: Presence.AnyPresence | undefined;\n}\n\n/**\n * Options for creating a MimicServerConfig.\n */\nexport interface MimicServerConfigOptions<TSchema extends Primitive.AnyPrimitive = Primitive.AnyPrimitive> {\n /**\n * The schema defining the document structure.\n */\n readonly schema: TSchema;\n\n /**\n * Maximum idle time for a document before it is cleaned up.\n * @default \"5 minutes\"\n */\n readonly maxIdleTime?: DurationInput;\n\n /**\n * Maximum number of processed transaction IDs to track for deduplication.\n * @default 1000\n */\n readonly maxTransactionHistory?: number;\n\n /**\n * Heartbeat interval for WebSocket connections.\n * @default \"30 seconds\"\n */\n readonly heartbeatInterval?: DurationInput;\n\n /**\n * Timeout for heartbeat responses.\n * @default \"10 seconds\"\n */\n readonly heartbeatTimeout?: DurationInput;\n\n /**\n * Optional presence schema for ephemeral per-user data.\n * When provided, enables presence features on WebSocket connections.\n * @default undefined (presence disabled)\n */\n readonly presence?: Presence.AnyPresence;\n}\n\n/**\n * Create a MimicServerConfig from options.\n */\nexport const make = <TSchema extends Primitive.AnyPrimitive>(\n options: MimicServerConfigOptions<TSchema>\n): MimicServerConfig<TSchema> => ({\n schema: options.schema,\n maxIdleTime: Duration.decode(options.maxIdleTime ?? \"5 minutes\"),\n maxTransactionHistory: options.maxTransactionHistory ?? 1000,\n heartbeatInterval: Duration.decode(options.heartbeatInterval ?? \"30 seconds\"),\n heartbeatTimeout: Duration.decode(options.heartbeatTimeout ?? \"10 seconds\"),\n presence: options.presence,\n});\n\n// =============================================================================\n// Context Tag\n// =============================================================================\n\n/**\n * Context tag for MimicServerConfig.\n */\nexport class MimicServerConfigTag extends Context.Tag(\n \"@voidhash/mimic-server-effect/MimicServerConfig\"\n)<MimicServerConfigTag, MimicServerConfig>() {}\n\n/**\n * Create a Layer that provides MimicServerConfig.\n */\nexport const layer = <TSchema extends Primitive.AnyPrimitive>(\n options: MimicServerConfigOptions<TSchema>\n): Layer.Layer<MimicServerConfigTag> =>\n Layer.succeed(MimicServerConfigTag, make(options));\n","/**\n * @since 0.0.1\n * Data storage service interface for Mimic documents.\n * Provides pluggable storage adapters with load/save hooks for data transformation.\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Context from \"effect/Context\";\nimport * as Layer from \"effect/Layer\";\nimport * as Data from \"effect/Data\";\n\n// =============================================================================\n// Error Types\n// =============================================================================\n\n/**\n * Error when loading a document from storage fails.\n */\nexport class StorageLoadError extends Data.TaggedError(\"StorageLoadError\")<{\n readonly documentId: string;\n readonly cause: unknown;\n}> {\n override get message(): string {\n return `Failed to load document ${this.documentId}: ${String(this.cause)}`;\n }\n}\n\n/**\n * Error when saving a document to storage fails.\n */\nexport class StorageSaveError extends Data.TaggedError(\"StorageSaveError\")<{\n readonly documentId: string;\n readonly cause: unknown;\n}> {\n override get message(): string {\n return `Failed to save document ${this.documentId}: ${String(this.cause)}`;\n }\n}\n\n/**\n * Error when deleting a document from storage fails.\n */\nexport class StorageDeleteError extends Data.TaggedError(\"StorageDeleteError\")<{\n readonly documentId: string;\n readonly cause: unknown;\n}> {\n override get message(): string {\n return `Failed to delete document ${this.documentId}: ${String(this.cause)}`;\n }\n}\n\n/**\n * Union of all storage errors.\n */\nexport type StorageError = StorageLoadError | StorageSaveError | StorageDeleteError;\n\n// =============================================================================\n// Storage Service Interface\n// =============================================================================\n\n/**\n * Data storage service interface.\n * Implementations can persist documents to various backends (memory, S3, database, etc.)\n */\nexport interface MimicDataStorage {\n /**\n * Load a document's state from storage.\n * @param documentId - The unique identifier for the document\n * @returns The document state, or undefined if not found\n */\n readonly load: (\n documentId: string\n ) => Effect.Effect<unknown | undefined, StorageLoadError>;\n\n /**\n * Save a document's state to storage.\n * @param documentId - The unique identifier for the document\n * @param state - The document state to persist\n */\n readonly save: (\n documentId: string,\n state: unknown\n ) => Effect.Effect<void, StorageSaveError>;\n\n /**\n * Delete a document from storage.\n * @param documentId - The unique identifier for the document\n */\n readonly delete: (\n documentId: string\n ) => Effect.Effect<void, StorageDeleteError>;\n\n /**\n * Transform data after loading from storage.\n * Useful for migrations, decryption, decompression, etc.\n * @param state - The raw state loaded from storage\n * @returns The transformed state\n */\n readonly onLoad: (state: unknown) => Effect.Effect<unknown>;\n\n /**\n * Transform/validate data before saving to storage.\n * Useful for encryption, compression, validation, etc.\n * @param state - The state to be saved\n * @returns The transformed state\n */\n readonly onSave: (state: unknown) => Effect.Effect<unknown>;\n}\n\n// =============================================================================\n// Context Tag\n// =============================================================================\n\n/**\n * Context tag for MimicDataStorage service.\n */\nexport class MimicDataStorageTag extends Context.Tag(\n \"@voidhash/mimic-server-effect/MimicDataStorage\"\n)<MimicDataStorageTag, MimicDataStorage>() {}\n\n// =============================================================================\n// Layer Constructors\n// =============================================================================\n\n/**\n * Create a MimicDataStorage layer from a storage implementation.\n */\nexport const layer = (storage: MimicDataStorage): Layer.Layer<MimicDataStorageTag> =>\n Layer.succeed(MimicDataStorageTag, storage);\n\n/**\n * Create a MimicDataStorage layer from an Effect that produces a storage implementation.\n */\nexport const layerEffect = <E, R>(\n effect: Effect.Effect<MimicDataStorage, E, R>\n): Layer.Layer<MimicDataStorageTag, E, R> =>\n Layer.effect(MimicDataStorageTag, effect);\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Create a simple storage implementation with minimal configuration.\n */\nexport const make = (options: {\n readonly load: (documentId: string) => Effect.Effect<unknown | undefined, StorageLoadError>;\n readonly save: (documentId: string, state: unknown) => Effect.Effect<void, StorageSaveError>;\n readonly delete?: (documentId: string) => Effect.Effect<void, StorageDeleteError>;\n readonly onLoad?: (state: unknown) => Effect.Effect<unknown>;\n readonly onSave?: (state: unknown) => Effect.Effect<unknown>;\n}): MimicDataStorage => ({\n load: options.load,\n save: options.save,\n delete: options.delete ?? (() => Effect.void),\n onLoad: options.onLoad ?? ((state) => Effect.succeed(state)),\n onSave: options.onSave ?? ((state) => Effect.succeed(state)),\n});\n","/**\n * @since 0.0.1\n * Document manager that handles multiple document instances.\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as PubSub from \"effect/PubSub\";\nimport * as Ref from \"effect/Ref\";\nimport * as HashMap from \"effect/HashMap\";\nimport * as Context from \"effect/Context\";\nimport * as Scope from \"effect/Scope\";\nimport * as Stream from \"effect/Stream\";\nimport type { Primitive, Transaction } from \"@voidhash/mimic\";\nimport { ServerDocument } from \"@voidhash/mimic/server\";\n\nimport * as Protocol from \"./DocumentProtocol.js\";\nimport { MimicServerConfigTag } from \"./MimicConfig.js\";\nimport { MimicDataStorageTag } from \"./MimicDataStorage.js\";\nimport { DocumentNotFoundError } from \"./errors.js\";\n\n// =============================================================================\n// Document Instance\n// =============================================================================\n\n/**\n * A managed document instance that holds state and manages subscribers.\n */\ninterface DocumentInstance {\n /** The underlying ServerDocument */\n readonly document: ServerDocument.ServerDocument<Primitive.AnyPrimitive>;\n /** PubSub for broadcasting messages to subscribers */\n readonly pubsub: PubSub.PubSub<Protocol.ServerBroadcast>;\n /** Reference count for cleanup */\n readonly refCount: Ref.Ref<number>;\n}\n\n// =============================================================================\n// Document Manager Service\n// =============================================================================\n\n/**\n * Service interface for the DocumentManager.\n */\nexport interface DocumentManager {\n /**\n * Submit a transaction to a document.\n */\n readonly submit: (\n documentId: string,\n transaction: Transaction.Transaction\n ) => Effect.Effect<Protocol.SubmitResult>;\n\n /**\n * Get a snapshot of a document.\n */\n readonly getSnapshot: (\n documentId: string\n ) => Effect.Effect<Protocol.SnapshotMessage>;\n\n /**\n * Subscribe to broadcasts for a document.\n * Returns a Stream of server broadcasts.\n */\n readonly subscribe: (\n documentId: string\n ) => Effect.Effect<\n Stream.Stream<Protocol.ServerBroadcast>,\n never,\n Scope.Scope\n >;\n}\n\n/**\n * Context tag for DocumentManager.\n */\nexport class DocumentManagerTag extends Context.Tag(\n \"@voidhash/mimic-server-effect/DocumentManager\"\n)<DocumentManagerTag, DocumentManager>() {}\n\n// =============================================================================\n// Document Manager Implementation\n// =============================================================================\n\n/**\n * Create the DocumentManager service.\n */\nconst makeDocumentManager = Effect.gen(function* () {\n const config = yield* MimicServerConfigTag;\n const storage = yield* MimicDataStorageTag;\n \n // Map of document ID to document instance\n const documents = yield* Ref.make(\n HashMap.empty<string, DocumentInstance>()\n );\n\n // Get or create a document instance\n const getOrCreateDocument = (\n documentId: string\n ): Effect.Effect<DocumentInstance> =>\n Effect.gen(function* () {\n const current = yield* Ref.get(documents);\n const existing = HashMap.get(current, documentId);\n\n if (existing._tag === \"Some\") {\n // Increment ref count\n yield* Ref.update(existing.value.refCount, (n) => n + 1);\n return existing.value;\n }\n\n // Load initial state from storage\n const rawState = yield* Effect.catchAll(\n storage.load(documentId),\n () => Effect.succeed(undefined)\n );\n\n // Transform loaded state with onLoad hook\n const initialState = rawState !== undefined\n ? yield* storage.onLoad(rawState)\n : undefined;\n\n // Create PubSub for broadcasting\n const pubsub = yield* PubSub.unbounded<Protocol.ServerBroadcast>();\n\n // Create ServerDocument with broadcast callback\n const serverDocument = ServerDocument.make({\n schema: config.schema,\n initialState: initialState as Primitive.InferState<typeof config.schema> | undefined,\n maxTransactionHistory: config.maxTransactionHistory,\n onBroadcast: (transactionMessage) => {\n // Get current state and save to storage\n const currentState = serverDocument.get();\n \n // Run save in background (fire-and-forget with error logging)\n Effect.runFork(\n Effect.gen(function* () {\n if (currentState !== undefined) {\n const transformedState = yield* storage.onSave(currentState);\n yield* Effect.catchAll(\n storage.save(documentId, transformedState),\n (error) => Effect.logError(\"Failed to save document\", error)\n );\n }\n })\n );\n\n // Broadcast to subscribers\n Effect.runSync(\n PubSub.publish(pubsub, {\n type: \"transaction\",\n transaction: transactionMessage.transaction as Protocol.Transaction,\n version: transactionMessage.version,\n })\n );\n },\n onRejection: (transactionId, reason) => {\n Effect.runSync(\n PubSub.publish(pubsub, {\n type: \"error\",\n transactionId,\n reason,\n })\n );\n },\n });\n\n const refCount = yield* Ref.make(1);\n\n const instance: DocumentInstance = {\n document: serverDocument,\n pubsub,\n refCount,\n };\n\n // Store in map\n yield* Ref.update(documents, (map) =>\n HashMap.set(map, documentId, instance)\n );\n\n return instance;\n });\n\n // Submit a transaction\n const submit = (\n documentId: string,\n transaction: Transaction.Transaction\n ): Effect.Effect<Protocol.SubmitResult> =>\n Effect.gen(function* () {\n const instance = yield* getOrCreateDocument(documentId);\n const result = instance.document.submit(transaction);\n return result;\n });\n\n // Get a snapshot\n const getSnapshot = (\n documentId: string\n ): Effect.Effect<Protocol.SnapshotMessage> =>\n Effect.gen(function* () {\n const instance = yield* getOrCreateDocument(documentId);\n const snapshot = instance.document.getSnapshot();\n return snapshot;\n });\n\n // Subscribe to broadcasts\n const subscribe = (\n documentId: string\n ): Effect.Effect<\n Stream.Stream<Protocol.ServerBroadcast>,\n never,\n Scope.Scope\n > =>\n Effect.gen(function* () {\n const instance = yield* getOrCreateDocument(documentId);\n\n // Subscribe to the PubSub\n const queue = yield* PubSub.subscribe(instance.pubsub);\n\n // Ensure cleanup on scope close\n yield* Effect.addFinalizer(() =>\n Effect.gen(function* () {\n // Decrement ref count\n const count = yield* Ref.updateAndGet(\n instance.refCount,\n (n) => n - 1\n );\n\n // If no more subscribers, we could clean up the document\n // For now, we keep it alive (could add idle timeout)\n })\n );\n\n // Convert queue to stream\n return Stream.fromQueue(queue);\n });\n\n const manager: DocumentManager = {\n submit,\n getSnapshot,\n subscribe,\n };\n\n return manager;\n});\n\n/**\n * Layer that provides DocumentManager.\n * Requires MimicServerConfigTag and MimicDataStorageTag.\n */\nexport const layer: Layer.Layer<\n DocumentManagerTag,\n never,\n MimicServerConfigTag | MimicDataStorageTag\n> = Layer.effect(DocumentManagerTag, makeDocumentManager);\n","/**\n * @since 0.0.1\n * Authentication service interface for Mimic connections.\n * Provides pluggable authentication adapters.\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Context from \"effect/Context\";\nimport * as Layer from \"effect/Layer\";\n\n// =============================================================================\n// Authentication Types\n// =============================================================================\n\n/**\n * Result of an authentication attempt.\n */\nexport type AuthResult =\n | { readonly success: true; readonly userId?: string }\n | { readonly success: false; readonly error: string };\n\n/**\n * Authentication handler function type.\n * Can be synchronous or return a Promise.\n */\nexport type AuthHandler = (token: string) => Promise<AuthResult> | AuthResult;\n\n// =============================================================================\n// Auth Service Interface\n// =============================================================================\n\n/**\n * Authentication service interface.\n * Implementations can authenticate connections using various methods (JWT, API keys, etc.)\n */\nexport interface MimicAuthService {\n /**\n * Authenticate a connection using the provided token.\n * @param token - The authentication token provided by the client\n * @returns The authentication result\n */\n readonly authenticate: (token: string) => Effect.Effect<AuthResult>;\n}\n\n// =============================================================================\n// Context Tag\n// =============================================================================\n\n/**\n * Context tag for MimicAuthService service.\n */\nexport class MimicAuthServiceTag extends Context.Tag(\n \"@voidhash/mimic-server-effect/MimicAuthService\"\n)<MimicAuthServiceTag, MimicAuthService>() {}\n\n// =============================================================================\n// Layer Constructors\n// =============================================================================\n\n/**\n * Create a MimicAuthService layer from an auth handler function.\n */\nexport const layer = (options: {\n readonly authHandler: AuthHandler;\n}): Layer.Layer<MimicAuthServiceTag> =>\n Layer.succeed(MimicAuthServiceTag, {\n authenticate: (token: string) =>\n Effect.promise(() => Promise.resolve(options.authHandler(token))),\n });\n\n/**\n * Create a MimicAuthService layer from an auth service implementation.\n */\nexport const layerService = (service: MimicAuthService): Layer.Layer<MimicAuthServiceTag> =>\n Layer.succeed(MimicAuthServiceTag, service);\n\n/**\n * Create a MimicAuthService layer from an Effect that produces an auth service.\n */\nexport const layerEffect = <E, R>(\n effect: Effect.Effect<MimicAuthService, E, R>\n): Layer.Layer<MimicAuthServiceTag, E, R> =>\n Layer.effect(MimicAuthServiceTag, effect);\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Create an auth service from an auth handler function.\n */\nexport const make = (authHandler: AuthHandler): MimicAuthService => ({\n authenticate: (token: string) =>\n Effect.promise(() => Promise.resolve(authHandler(token))),\n});\n\n/**\n * Create an auth service from an Effect-based authenticate function.\n */\nexport const makeEffect = (\n authenticate: (token: string) => Effect.Effect<AuthResult>\n): MimicAuthService => ({\n authenticate,\n});\n","/**\n * @since 0.0.1\n * Presence manager for ephemeral per-connection state.\n * Handles in-memory storage and broadcasting of presence updates.\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as PubSub from \"effect/PubSub\";\nimport * as Ref from \"effect/Ref\";\nimport * as HashMap from \"effect/HashMap\";\nimport * as Context from \"effect/Context\";\nimport * as Scope from \"effect/Scope\";\nimport * as Stream from \"effect/Stream\";\nimport type { Presence } from \"@voidhash/mimic\";\n\n// =============================================================================\n// Presence Entry Types\n// =============================================================================\n\n/**\n * A presence entry stored in the manager.\n */\nexport interface PresenceEntry {\n /** The presence data */\n readonly data: unknown;\n /** Optional user ID from authentication */\n readonly userId?: string;\n}\n\n// =============================================================================\n// Presence Events\n// =============================================================================\n\n/**\n * Event emitted when a presence is updated.\n */\nexport interface PresenceUpdateEvent {\n readonly type: \"presence_update\";\n /** The connection ID of the user who updated */\n readonly id: string;\n /** The presence data */\n readonly data: unknown;\n /** Optional user ID from authentication */\n readonly userId?: string;\n}\n\n/**\n * Event emitted when a presence is removed (user disconnected).\n */\nexport interface PresenceRemoveEvent {\n readonly type: \"presence_remove\";\n /** The connection ID of the user who disconnected */\n readonly id: string;\n}\n\n/**\n * Union of all presence events.\n */\nexport type PresenceEvent = PresenceUpdateEvent | PresenceRemoveEvent;\n\n// =============================================================================\n// Presence Snapshot\n// =============================================================================\n\n/**\n * A snapshot of all presence entries for a document.\n */\nexport interface PresenceSnapshot {\n /** Map of connectionId to presence entry */\n readonly presences: Record<string, PresenceEntry>;\n}\n\n// =============================================================================\n// Document Presence Instance\n// =============================================================================\n\n/**\n * Per-document presence state.\n */\ninterface DocumentPresence {\n /** Map of connectionId to presence entry */\n readonly entries: Ref.Ref<HashMap.HashMap<string, PresenceEntry>>;\n /** PubSub for broadcasting presence events */\n readonly pubsub: PubSub.PubSub<PresenceEvent>;\n}\n\n// =============================================================================\n// Presence Manager Service\n// =============================================================================\n\n/**\n * Service interface for the PresenceManager.\n */\nexport interface PresenceManager {\n /**\n * Get a snapshot of all presences for a document.\n */\n readonly getSnapshot: (\n documentId: string\n ) => Effect.Effect<PresenceSnapshot>;\n\n /**\n * Set/update presence for a connection.\n * Broadcasts the update to all subscribers.\n */\n readonly set: (\n documentId: string,\n connectionId: string,\n entry: PresenceEntry\n ) => Effect.Effect<void>;\n\n /**\n * Remove presence for a connection (e.g., on disconnect).\n * Broadcasts the removal to all subscribers.\n */\n readonly remove: (\n documentId: string,\n connectionId: string\n ) => Effect.Effect<void>;\n\n /**\n * Subscribe to presence events for a document.\n * Returns a Stream of presence events.\n */\n readonly subscribe: (\n documentId: string\n ) => Effect.Effect<\n Stream.Stream<PresenceEvent>,\n never,\n Scope.Scope\n >;\n}\n\n/**\n * Context tag for PresenceManager.\n */\nexport class PresenceManagerTag extends Context.Tag(\n \"@voidhash/mimic-server-effect/PresenceManager\"\n)<PresenceManagerTag, PresenceManager>() {}\n\n// =============================================================================\n// Presence Manager Implementation\n// =============================================================================\n\n/**\n * Create the PresenceManager service.\n */\nconst makePresenceManager = Effect.gen(function* () {\n // Map of document ID to document presence state\n const documents = yield* Ref.make(\n HashMap.empty<string, DocumentPresence>()\n );\n\n // Get or create a document presence instance\n const getOrCreateDocument = (\n documentId: string\n ): Effect.Effect<DocumentPresence> =>\n Effect.gen(function* () {\n const current = yield* Ref.get(documents);\n const existing = HashMap.get(current, documentId);\n\n if (existing._tag === \"Some\") {\n return existing.value;\n }\n\n // Create new document presence\n const entries = yield* Ref.make(\n HashMap.empty<string, PresenceEntry>()\n );\n const pubsub = yield* PubSub.unbounded<PresenceEvent>();\n\n const docPresence: DocumentPresence = {\n entries,\n pubsub,\n };\n\n // Store in map\n yield* Ref.update(documents, (map) =>\n HashMap.set(map, documentId, docPresence)\n );\n\n return docPresence;\n });\n\n // Get snapshot of all presences for a document\n const getSnapshot = (documentId: string): Effect.Effect<PresenceSnapshot> =>\n Effect.gen(function* () {\n const docPresence = yield* getOrCreateDocument(documentId);\n const entriesMap = yield* Ref.get(docPresence.entries);\n\n // Convert HashMap to Record\n const presences: Record<string, PresenceEntry> = {};\n for (const [id, entry] of entriesMap) {\n presences[id] = entry;\n }\n\n return { presences };\n });\n\n // Set/update presence for a connection\n const set = (\n documentId: string,\n connectionId: string,\n entry: PresenceEntry\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n const docPresence = yield* getOrCreateDocument(documentId);\n\n // Update the entry\n yield* Ref.update(docPresence.entries, (map) =>\n HashMap.set(map, connectionId, entry)\n );\n\n // Broadcast the update\n yield* PubSub.publish(docPresence.pubsub, {\n type: \"presence_update\",\n id: connectionId,\n data: entry.data,\n userId: entry.userId,\n });\n });\n\n // Remove presence for a connection\n const remove = (\n documentId: string,\n connectionId: string\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n const current = yield* Ref.get(documents);\n const existing = HashMap.get(current, documentId);\n\n if (existing._tag === \"None\") {\n return; // Document doesn't exist, nothing to remove\n }\n\n const docPresence = existing.value;\n\n // Check if the connection has a presence\n const entries = yield* Ref.get(docPresence.entries);\n const hasEntry = HashMap.has(entries, connectionId);\n\n if (!hasEntry) {\n return; // No presence to remove\n }\n\n // Remove the entry\n yield* Ref.update(docPresence.entries, (map) =>\n HashMap.remove(map, connectionId)\n );\n\n // Broadcast the removal\n yield* PubSub.publish(docPresence.pubsub, {\n type: \"presence_remove\",\n id: connectionId,\n });\n });\n\n // Subscribe to presence events\n const subscribe = (\n documentId: string\n ): Effect.Effect<Stream.Stream<PresenceEvent>, never, Scope.Scope> =>\n Effect.gen(function* () {\n const docPresence = yield* getOrCreateDocument(documentId);\n\n // Subscribe to the PubSub\n const queue = yield* PubSub.subscribe(docPresence.pubsub);\n\n // Convert queue to stream\n return Stream.fromQueue(queue);\n });\n\n const manager: PresenceManager = {\n getSnapshot,\n set,\n remove,\n subscribe,\n };\n\n return manager;\n});\n\n/**\n * Layer that provides PresenceManager.\n */\nexport const layer: Layer.Layer<PresenceManagerTag> = Layer.effect(\n PresenceManagerTag,\n makePresenceManager\n);\n\n/**\n * Default layer that provides PresenceManager.\n * Uses the default priority for layer composition.\n */\nexport const layerDefault: Layer.Layer<PresenceManagerTag> = Layer.effectDiscard(\n Effect.succeed(undefined)\n).pipe(Layer.provideMerge(layer));\n\n","/**\n * @since 0.0.1\n * Error types for the Mimic server.\n */\nimport * as Data from \"effect/Data\";\n\n// =============================================================================\n// Error Types\n// =============================================================================\n\n/**\n * Error when a document type is not found in the schema registry.\n */\nexport class DocumentTypeNotFoundError extends Data.TaggedError(\n \"DocumentTypeNotFoundError\"\n)<{\n readonly documentType: string;\n}> {\n override get message(): string {\n return `Document type not found: ${this.documentType}`;\n }\n}\n\n/**\n * Error when a document is not found.\n */\nexport class DocumentNotFoundError extends Data.TaggedError(\n \"DocumentNotFoundError\"\n)<{\n readonly documentId: string;\n}> {\n override get message(): string {\n return `Document not found: ${this.documentId}`;\n }\n}\n\n/**\n * Error when authentication fails.\n */\nexport class AuthenticationError extends Data.TaggedError(\n \"AuthenticationError\"\n)<{\n readonly reason: string;\n}> {\n override get message(): string {\n return `Authentication failed: ${this.reason}`;\n }\n}\n\n/**\n * Error when a transaction is rejected.\n */\nexport class TransactionRejectedError extends Data.TaggedError(\n \"TransactionRejectedError\"\n)<{\n readonly transactionId: string;\n readonly reason: string;\n}> {\n override get message(): string {\n return `Transaction ${this.transactionId} rejected: ${this.reason}`;\n }\n}\n\n/**\n * Error when parsing a client message fails.\n */\nexport class MessageParseError extends Data.TaggedError(\"MessageParseError\")<{\n readonly cause: unknown;\n}> {\n override get message(): string {\n return `Failed to parse message: ${String(this.cause)}`;\n }\n}\n\n/**\n * Error when the WebSocket connection is invalid.\n */\nexport class InvalidConnectionError extends Data.TaggedError(\n \"InvalidConnectionError\"\n)<{\n readonly reason: string;\n}> {\n override get message(): string {\n return `Invalid connection: ${this.reason}`;\n }\n}\n\n/**\n * Error when the document ID is missing from the URL path.\n */\nexport class MissingDocumentIdError extends Data.TaggedError(\n \"MissingDocumentIdError\"\n)<{\n readonly path?: string;\n}> {\n override get message(): string {\n return this.path \n ? `Document ID is required in the URL path: ${this.path}`\n : \"Document ID is required in the URL path\";\n }\n}\n\n/**\n * Union of all Mimic server errors.\n */\nexport type MimicServerError =\n | DocumentTypeNotFoundError\n | DocumentNotFoundError\n | AuthenticationError\n | TransactionRejectedError\n | MessageParseError\n | InvalidConnectionError\n | MissingDocumentIdError;\n","/**\n * @since 0.0.1\n * WebSocket connection handler using Effect Platform Socket API.\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Stream from \"effect/Stream\";\nimport * as Fiber from \"effect/Fiber\";\nimport * as Scope from \"effect/Scope\";\nimport * as Duration from \"effect/Duration\";\nimport type * as Socket from \"@effect/platform/Socket\";\nimport { Transaction, Presence } from \"@voidhash/mimic\";\n\nimport * as Protocol from \"./DocumentProtocol.js\";\nimport { MimicServerConfigTag } from \"./MimicConfig.js\";\nimport { MimicAuthServiceTag } from \"./MimicAuthService.js\";\nimport { DocumentManagerTag } from \"./DocumentManager.js\";\nimport { PresenceManagerTag } from \"./PresenceManager.js\";\nimport type * as PresenceManager from \"./PresenceManager.js\";\nimport {\n MessageParseError,\n MissingDocumentIdError,\n} from \"./errors.js\";\n\n// =============================================================================\n// Client Message Types (matching mimic-client Transport.ts)\n// =============================================================================\n\ninterface SubmitMessage {\n readonly type: \"submit\";\n readonly transaction: Protocol.Transaction;\n}\n\ninterface EncodedSubmitMessage {\n readonly type: \"submit\";\n readonly transaction: Transaction.EncodedTransaction;\n}\n\ninterface RequestSnapshotMessage {\n readonly type: \"request_snapshot\";\n}\n\ninterface PingMessage {\n readonly type: \"ping\";\n}\n\ninterface AuthMessage {\n readonly type: \"auth\";\n readonly token: string;\n}\n\ninterface PresenceSetMessage {\n readonly type: \"presence_set\";\n readonly data: unknown;\n}\n\ninterface PresenceClearMessage {\n readonly type: \"presence_clear\";\n}\n\ntype ClientMessage =\n | SubmitMessage\n | RequestSnapshotMessage\n | PingMessage\n | AuthMessage\n | PresenceSetMessage\n | PresenceClearMessage;\n\ntype EncodedClientMessage =\n | EncodedSubmitMessage\n | RequestSnapshotMessage\n | PingMessage\n | AuthMessage\n | PresenceSetMessage\n | PresenceClearMessage;\n\n// =============================================================================\n// Server Message Types (matching mimic-client Transport.ts)\n// =============================================================================\n\ninterface PongMessage {\n readonly type: \"pong\";\n}\n\ninterface AuthResultMessage {\n readonly type: \"auth_result\";\n readonly success: boolean;\n readonly error?: string;\n}\n\ninterface EncodedTransactionMessage {\n readonly type: \"transaction\";\n readonly transaction: Transaction.EncodedTransaction;\n readonly version: number;\n}\n\n// Presence server messages\ninterface PresenceSnapshotMessage {\n readonly type: \"presence_snapshot\";\n readonly selfId: string;\n readonly presences: Record<string, { data: unknown; userId?: string }>;\n}\n\ninterface PresenceUpdateMessage {\n readonly type: \"presence_update\";\n readonly id: string;\n readonly data: unknown;\n readonly userId?: string;\n}\n\ninterface PresenceRemoveMessage {\n readonly type: \"presence_remove\";\n readonly id: string;\n}\n\ntype ServerMessage =\n | Protocol.TransactionMessage\n | Protocol.SnapshotMessage\n | Protocol.ErrorMessage\n | PongMessage\n | AuthResultMessage\n | PresenceSnapshotMessage\n | PresenceUpdateMessage\n | PresenceRemoveMessage;\n\ntype EncodedServerMessage =\n | EncodedTransactionMessage\n | Protocol.SnapshotMessage\n | Protocol.ErrorMessage\n | PongMessage\n | AuthResultMessage\n | PresenceSnapshotMessage\n | PresenceUpdateMessage\n | PresenceRemoveMessage;\n\n// =============================================================================\n// WebSocket Connection State\n// =============================================================================\n\ninterface ConnectionState {\n readonly documentId: string;\n readonly connectionId: string;\n readonly authenticated: boolean;\n readonly userId?: string;\n}\n\n// =============================================================================\n// URL Path Parsing\n// =============================================================================\n\n/**\n * Extract document ID from URL path.\n * Expected format: /doc/{documentId}\n */\nexport const extractDocumentId = (\n path: string\n): Effect.Effect<string, MissingDocumentIdError> => {\n // Remove leading slash and split\n const parts = path.replace(/^\\/+/, \"\").split(\"/\");\n\n // Find the last occurrence of 'doc' in the path\n const docIndex = parts.lastIndexOf(\"doc\");\n const part = parts[docIndex + 1];\n if (docIndex !== -1 && part) {\n return Effect.succeed(decodeURIComponent(part));\n }\n return Effect.fail(new MissingDocumentIdError({}));\n};\n\n// =============================================================================\n// Message Parsing\n// =============================================================================\n\n/**\n * Decodes an encoded client message from the wire format.\n */\nconst decodeClientMessage = (encoded: EncodedClientMessage): ClientMessage => {\n if (encoded.type === \"submit\") {\n return {\n type: \"submit\",\n transaction: Transaction.decode(encoded.transaction),\n };\n }\n return encoded;\n};\n\n/**\n * Encodes a server message for the wire format.\n */\nconst encodeServerMessageForWire = (message: ServerMessage): EncodedServerMessage => {\n if (message.type === \"transaction\") {\n return {\n type: \"transaction\",\n transaction: Transaction.encode(message.transaction),\n version: message.version,\n };\n }\n return message;\n};\n\nconst parseClientMessage = (\n data: string | Uint8Array\n): Effect.Effect<ClientMessage, MessageParseError> =>\n Effect.try({\n try: () => {\n const text =\n typeof data === \"string\" ? data : new TextDecoder().decode(data);\n const encoded = JSON.parse(text) as EncodedClientMessage;\n return decodeClientMessage(encoded);\n },\n catch: (cause) => new MessageParseError({ cause }),\n });\n\nconst encodeServerMessage = (message: ServerMessage): string =>\n JSON.stringify(encodeServerMessageForWire(message));\n\n// =============================================================================\n// WebSocket Handler\n// =============================================================================\n\n/**\n * Handle a WebSocket connection for a document.\n *\n * @param socket - The Effect Platform Socket\n * @param path - The URL path (e.g., \"/doc/my-document-id\")\n * @returns An Effect that handles the connection lifecycle\n */\nexport const handleConnection = (\n socket: Socket.Socket,\n path: string\n): Effect.Effect<\n void,\n Socket.SocketError | MissingDocumentIdError | MessageParseError,\n MimicServerConfigTag | MimicAuthServiceTag | DocumentManagerTag | PresenceManagerTag | Scope.Scope\n> =>\n Effect.gen(function* () {\n const config = yield* MimicServerConfigTag;\n const authService = yield* MimicAuthServiceTag;\n const documentManager = yield* DocumentManagerTag;\n const presenceManager = yield* PresenceManagerTag;\n\n // Extract document ID from path\n const documentId = yield* extractDocumentId(path);\n const connectionId = crypto.randomUUID();\n\n // Track connection state\n let state: ConnectionState = {\n documentId,\n connectionId,\n authenticated: false, // Start unauthenticated, auth service will validate\n };\n\n // Track if this connection has set presence (for cleanup)\n let hasPresence = false;\n\n // Get the socket writer\n const write = yield* socket.writer;\n\n // Helper to send a message to the client\n const sendMessage = (message: ServerMessage) =>\n write(encodeServerMessage(message));\n\n // Send presence snapshot after auth\n const sendPresenceSnapshot = Effect.gen(function* () {\n if (!config.presence) return;\n\n const snapshot = yield* presenceManager.getSnapshot(documentId);\n yield* sendMessage({\n type: \"presence_snapshot\",\n selfId: connectionId,\n presences: snapshot.presences,\n });\n });\n\n // Handle authentication using the auth service\n const handleAuth = (token: string) =>\n Effect.gen(function* () {\n const result = yield* authService.authenticate(token);\n\n if (result.success) {\n state = {\n ...state,\n authenticated: true,\n userId: result.userId,\n };\n yield* sendMessage({ type: \"auth_result\", success: true });\n\n // Send presence snapshot after successful auth\n yield* sendPresenceSnapshot;\n } else {\n yield* sendMessage({\n type: \"auth_result\",\n success: false,\n error: result.error,\n });\n }\n });\n\n // Handle presence set\n const handlePresenceSet = (data: unknown) =>\n Effect.gen(function* () {\n if (!state.authenticated) return;\n if (!config.presence) return;\n\n // Validate presence data against schema\n const validated = Presence.validateSafe(config.presence, data);\n if (validated === undefined) {\n yield* Effect.logWarning(\"Invalid presence data received\", { connectionId, data });\n return;\n }\n\n // Store in presence manager\n yield* presenceManager.set(documentId, connectionId, {\n data: validated,\n userId: state.userId,\n });\n\n hasPresence = true;\n });\n\n // Handle presence clear\n const handlePresenceClear = Effect.gen(function* () {\n if (!state.authenticated) return;\n if (!config.presence) return;\n\n yield* presenceManager.remove(documentId, connectionId);\n hasPresence = false;\n });\n\n // Handle a client message\n const handleMessage = (message: ClientMessage) =>\n Effect.gen(function* () {\n switch (message.type) {\n case \"auth\":\n yield* handleAuth(message.token);\n break;\n\n case \"ping\":\n yield* sendMessage({ type: \"pong\" });\n break;\n\n case \"submit\":\n if (!state.authenticated) {\n yield* sendMessage({\n type: \"error\",\n transactionId: message.transaction.id,\n reason: \"Not authenticated\",\n });\n return;\n }\n // Submit to the document manager\n const submitResult = yield* documentManager.submit(\n documentId,\n message.transaction as any\n );\n // If rejected, send error (success is broadcast to all)\n if (!submitResult.success) {\n yield* sendMessage({\n type: \"error\",\n transactionId: message.transaction.id,\n reason: submitResult.reason,\n });\n }\n break;\n\n case \"request_snapshot\":\n if (!state.authenticated) {\n return;\n }\n const snapshot = yield* Effect.catchAll(\n documentManager.getSnapshot(documentId),\n () =>\n Effect.succeed({\n type: \"snapshot\" as const,\n state: null,\n version: 0,\n })\n );\n yield* sendMessage(snapshot);\n break;\n\n case \"presence_set\":\n yield* handlePresenceSet(message.data);\n break;\n\n case \"presence_clear\":\n yield* handlePresenceClear;\n break;\n }\n });\n\n // Subscribe to document broadcasts\n const subscribeFiber = yield* Effect.fork(\n Effect.gen(function* () {\n // Wait until authenticated before subscribing\n while (!state.authenticated) {\n yield* Effect.sleep(Duration.millis(100));\n }\n\n // Subscribe to the document\n const broadcastStream = yield* Effect.catchAll(\n documentManager.subscribe(documentId),\n () => Effect.succeed(Stream.empty)\n );\n\n // Forward broadcasts to the WebSocket\n yield* Stream.runForEach(broadcastStream, (broadcast) =>\n sendMessage(broadcast as ServerMessage)\n );\n }).pipe(Effect.scoped)\n );\n\n // Subscribe to presence events (if presence is enabled)\n const presenceFiber = yield* Effect.fork(\n Effect.gen(function* () {\n if (!config.presence) return;\n\n // Wait until authenticated before subscribing\n while (!state.authenticated) {\n yield* Effect.sleep(Duration.millis(100));\n }\n\n // Subscribe to presence events\n const presenceStream = yield* presenceManager.subscribe(documentId);\n\n // Forward presence events to the WebSocket, filtering out our own events (no-echo)\n yield* Stream.runForEach(presenceStream, (event) =>\n Effect.gen(function* () {\n // Don't echo our own presence events\n if (event.id === connectionId) return;\n\n if (event.type === \"presence_update\") {\n yield* sendMessage({\n type: \"presence_update\",\n id: event.id,\n data: event.data,\n userId: event.userId,\n });\n } else if (event.type === \"presence_remove\") {\n yield* sendMessage({\n type: \"presence_remove\",\n id: event.id,\n });\n }\n })\n );\n }).pipe(Effect.scoped)\n );\n\n // Ensure cleanup on disconnect\n yield* Effect.addFinalizer(() =>\n Effect.gen(function* () {\n // Interrupt the subscribe fibers\n yield* Fiber.interrupt(subscribeFiber);\n yield* Fiber.interrupt(presenceFiber);\n\n // Remove presence if we had any\n if (hasPresence && config.presence) {\n yield* presenceManager.remove(documentId, connectionId);\n }\n })\n );\n\n // Process incoming messages\n yield* socket.runRaw((data) =>\n Effect.gen(function* () {\n const message = yield* parseClientMessage(data);\n yield* handleMessage(message);\n }).pipe(\n Effect.catchAll((error) =>\n Effect.logError(\"Message handling error\", error)\n )\n )\n );\n });\n\n// =============================================================================\n// WebSocket Server Handler Factory\n// =============================================================================\n\n/**\n * Create a handler function for the WebSocket server.\n * Returns a function that takes a socket and document ID.\n */\nexport const makeHandler = Effect.gen(function* () {\n const config = yield* MimicServerConfigTag;\n const authService = yield* MimicAuthServiceTag;\n const documentManager = yield* DocumentManagerTag;\n const presenceManager = yield* PresenceManagerTag;\n\n return (socket: Socket.Socket, documentId: string) =>\n handleConnectionWithDocumentId(socket, documentId).pipe(\n Effect.provideService(MimicServerConfigTag, config),\n Effect.provideService(MimicAuthServiceTag, authService),\n Effect.provideService(DocumentManagerTag, documentManager),\n Effect.provideService(PresenceManagerTag, presenceManager),\n Effect.scoped\n );\n});\n\n/**\n * Handle a WebSocket connection for a document (using document ID directly).\n */\nconst handleConnectionWithDocumentId = (\n socket: Socket.Socket,\n documentId: string\n): Effect.Effect<\n void,\n Socket.SocketError | MessageParseError,\n MimicServerConfigTag | MimicAuthServiceTag | DocumentManagerTag | PresenceManagerTag | Scope.Scope\n> =>\n Effect.gen(function* () {\n const config = yield* MimicServerConfigTag;\n const authService = yield* MimicAuthServiceTag;\n const documentManager = yield* DocumentManagerTag;\n const presenceManager = yield* PresenceManagerTag;\n\n const connectionId = crypto.randomUUID();\n\n // Track connection state\n let state: ConnectionState = {\n documentId,\n connectionId,\n authenticated: false,\n };\n\n // Track if this connection has set presence (for cleanup)\n let hasPresence = false;\n\n // Get the socket writer\n const write = yield* socket.writer;\n\n // Helper to send a message to the client\n const sendMessage = (message: ServerMessage) =>\n write(encodeServerMessage(message));\n\n // Send presence snapshot after auth\n const sendPresenceSnapshot = Effect.gen(function* () {\n if (!config.presence) return;\n\n const snapshot = yield* presenceManager.getSnapshot(documentId);\n yield* sendMessage({\n type: \"presence_snapshot\",\n selfId: connectionId,\n presences: snapshot.presences,\n });\n });\n\n // Handle authentication using the auth service\n const handleAuth = (token: string) =>\n Effect.gen(function* () {\n const result = yield* authService.authenticate(token);\n\n if (result.success) {\n state = {\n ...state,\n authenticated: true,\n userId: result.userId,\n };\n yield* sendMessage({ type: \"auth_result\", success: true });\n\n // Send presence snapshot after successful auth\n yield* sendPresenceSnapshot;\n } else {\n yield* sendMessage({\n type: \"auth_result\",\n success: false,\n error: result.error,\n });\n }\n });\n\n // Handle presence set\n const handlePresenceSet = (data: unknown) =>\n Effect.gen(function* () {\n if (!state.authenticated) return;\n if (!config.presence) return;\n\n // Validate presence data against schema\n const validated = Presence.validateSafe(config.presence, data);\n if (validated === undefined) {\n yield* Effect.logWarning(\"Invalid presence data received\", { connectionId, data });\n return;\n }\n\n // Store in presence manager\n yield* presenceManager.set(documentId, connectionId, {\n data: validated,\n userId: state.userId,\n });\n\n hasPresence = true;\n });\n\n // Handle presence clear\n const handlePresenceClear = Effect.gen(function* () {\n if (!state.authenticated) return;\n if (!config.presence) return;\n\n yield* presenceManager.remove(documentId, connectionId);\n hasPresence = false;\n });\n\n // Handle a client message\n const handleMessage = (message: ClientMessage) =>\n Effect.gen(function* () {\n switch (message.type) {\n case \"auth\":\n yield* handleAuth(message.token);\n break;\n\n case \"ping\":\n yield* sendMessage({ type: \"pong\" });\n break;\n\n case \"submit\":\n if (!state.authenticated) {\n yield* sendMessage({\n type: \"error\",\n transactionId: message.transaction.id,\n reason: \"Not authenticated\",\n });\n return;\n }\n const submitResult = yield* documentManager.submit(\n documentId,\n message.transaction as any\n );\n if (!submitResult.success) {\n yield* sendMessage({\n type: \"error\",\n transactionId: message.transaction.id,\n reason: submitResult.reason,\n });\n }\n break;\n\n case \"request_snapshot\":\n if (!state.authenticated) {\n return;\n }\n const snapshot = yield* documentManager.getSnapshot(documentId);\n yield* sendMessage(snapshot);\n break;\n\n case \"presence_set\":\n yield* handlePresenceSet(message.data);\n break;\n\n case \"presence_clear\":\n yield* handlePresenceClear;\n break;\n }\n });\n\n // Subscribe to document broadcasts\n const subscribeFiber = yield* Effect.fork(\n Effect.gen(function* () {\n // Wait until authenticated before subscribing\n while (!state.authenticated) {\n yield* Effect.sleep(Duration.millis(100));\n }\n\n // Subscribe to the document\n const broadcastStream = yield* documentManager.subscribe(documentId);\n\n // Forward broadcasts to the WebSocket\n yield* Stream.runForEach(broadcastStream, (broadcast) =>\n sendMessage(broadcast as ServerMessage)\n );\n }).pipe(Effect.scoped)\n );\n\n // Subscribe to presence events (if presence is enabled)\n const presenceFiber = yield* Effect.fork(\n Effect.gen(function* () {\n if (!config.presence) return;\n\n // Wait until authenticated before subscribing\n while (!state.authenticated) {\n yield* Effect.sleep(Duration.millis(100));\n }\n\n // Subscribe to presence events\n const presenceStream = yield* presenceManager.subscribe(documentId);\n\n // Forward presence events to the WebSocket, filtering out our own events (no-echo)\n yield* Stream.runForEach(presenceStream, (event) =>\n Effect.gen(function* () {\n // Don't echo our own presence events\n if (event.id === connectionId) return;\n\n if (event.type === \"presence_update\") {\n yield* sendMessage({\n type: \"presence_update\",\n id: event.id,\n data: event.data,\n userId: event.userId,\n });\n } else if (event.type === \"presence_remove\") {\n yield* sendMessage({\n type: \"presence_remove\",\n id: event.id,\n });\n }\n })\n );\n }).pipe(Effect.scoped)\n );\n\n // Ensure cleanup on disconnect\n yield* Effect.addFinalizer(() =>\n Effect.gen(function* () {\n // Interrupt the subscribe fibers\n yield* Fiber.interrupt(subscribeFiber);\n yield* Fiber.interrupt(presenceFiber);\n\n // Remove presence if we had any\n if (hasPresence && config.presence) {\n yield* presenceManager.remove(documentId, connectionId);\n }\n })\n );\n\n // Process incoming messages\n yield* socket.runRaw((data) =>\n Effect.gen(function* () {\n const message = yield* parseClientMessage(data);\n yield* handleMessage(message);\n }).pipe(\n Effect.catchAll((error) =>\n Effect.logError(\"Message handling error\", error)\n )\n )\n );\n });\n","/**\n * @since 0.0.1\n * In-memory data storage implementation for Mimic documents.\n * Provides ephemeral storage - data is lost when the server restarts.\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as Ref from \"effect/Ref\";\nimport * as HashMap from \"effect/HashMap\";\n\nimport {\n MimicDataStorageTag,\n type MimicDataStorage,\n} from \"../MimicDataStorage.js\";\n\n// =============================================================================\n// In-Memory Storage Implementation\n// =============================================================================\n\n/**\n * Create an in-memory storage service.\n * Uses a HashMap to store documents in memory.\n */\nconst makeInMemoryStorage = Effect.gen(function* () {\n // Create a mutable reference to a HashMap for storing documents\n const store = yield* Ref.make(HashMap.empty<string, unknown>());\n\n const storage: MimicDataStorage = {\n load: (documentId: string) =>\n Effect.gen(function* () {\n const current = yield* Ref.get(store);\n const result = HashMap.get(current, documentId);\n return result._tag === \"Some\" ? result.value : undefined;\n }),\n\n save: (documentId: string, state: unknown) =>\n Ref.update(store, (map) => HashMap.set(map, documentId, state)),\n\n delete: (documentId: string) =>\n Ref.update(store, (map) => HashMap.remove(map, documentId)),\n\n onLoad: (state: unknown) => Effect.succeed(state),\n\n onSave: (state: unknown) => Effect.succeed(state),\n };\n\n return storage;\n});\n\n// =============================================================================\n// Layer\n// =============================================================================\n\n/**\n * Layer that provides in-memory data storage.\n * This is the default storage implementation - ephemeral and non-persistent.\n */\nexport const layer: Layer.Layer<MimicDataStorageTag> = Layer.effect(\n MimicDataStorageTag,\n makeInMemoryStorage\n);\n\n/**\n * Default layer alias for convenience.\n */\nexport const layerDefault = layer;\n","/**\n * @since 0.0.1\n * No authentication implementation for Mimic connections.\n * All connections are automatically authenticated (open access).\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\n\nimport {\n MimicAuthServiceTag,\n type MimicAuthService,\n} from \"../MimicAuthService.js\";\n\n// =============================================================================\n// No-Auth Implementation\n// =============================================================================\n\n/**\n * Authentication service that auto-succeeds all authentication requests.\n * Use this for development or when authentication is handled externally.\n */\nconst noAuthService: MimicAuthService = {\n authenticate: (_token: string) =>\n Effect.succeed({ success: true as const }),\n};\n\n// =============================================================================\n// Layer\n// =============================================================================\n\n/**\n * Layer that provides no authentication (open access).\n * All connections are automatically authenticated.\n * \n * WARNING: Only use this for development or when authentication\n * is handled at a different layer (e.g., API gateway, reverse proxy).\n */\nexport const layer: Layer.Layer<MimicAuthServiceTag> = Layer.succeed(\n MimicAuthServiceTag,\n noAuthService\n);\n\n/**\n * Default layer alias for convenience.\n */\nexport const layerDefault = layer;\n","/**\n * @since 0.0.1\n * Mimic server layer composition.\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as Context from \"effect/Context\";\nimport type * as Socket from \"@effect/platform/Socket\";\nimport { SocketServer } from \"@effect/platform/SocketServer\";\nimport type { Primitive, Presence } from \"@voidhash/mimic\";\n\nimport * as DocumentManager from \"./DocumentManager.js\";\nimport * as WebSocketHandler from \"./WebSocketHandler.js\";\nimport * as MimicConfig from \"./MimicConfig.js\";\nimport { MimicDataStorageTag } from \"./MimicDataStorage.js\";\nimport { MimicAuthServiceTag } from \"./MimicAuthService.js\";\nimport * as PresenceManager from \"./PresenceManager.js\";\nimport * as InMemoryDataStorage from \"./storage/InMemoryDataStorage.js\";\nimport * as NoAuth from \"./auth/NoAuth.js\";\nimport { HttpLayerRouter, HttpServerRequest, HttpServerResponse } from \"@effect/platform\";\nimport { PathInput } from \"@effect/platform/HttpRouter\";\n\n// =============================================================================\n// Handler Tag\n// =============================================================================\n\n/**\n * Tag for the WebSocket handler function.\n */\nexport class MimicWebSocketHandler extends Context.Tag(\n \"@voidhash/mimic-server-effect/MimicWebSocketHandler\"\n)<\n MimicWebSocketHandler,\n (socket: Socket.Socket, documentId: string) => Effect.Effect<void, unknown>\n>() {}\n\n// =============================================================================\n// Layer Composition Options\n// =============================================================================\n\n/**\n * Options for creating a Mimic server layer.\n */\nexport interface MimicLayerOptions<TSchema extends Primitive.AnyPrimitive> {\n /**\n * Base path for document routes (used for path matching).\n * @example \"/mimic/todo\" - documents accessed at \"/mimic/todo/:documentId\"\n */\n readonly basePath?: PathInput;\n /**\n * The schema defining the document structure.\n */\n readonly schema: TSchema;\n /**\n * Maximum number of processed transaction IDs to track for deduplication.\n * @default 1000\n */\n readonly maxTransactionHistory?: number;\n /**\n * Optional presence schema for ephemeral per-user data.\n * When provided, enables presence features on WebSocket connections.\n */\n readonly presence?: Presence.AnyPresence;\n}\n\n// =============================================================================\n// Layer Composition\n// =============================================================================\n\n/**\n * Create a Mimic WebSocket handler layer.\n * \n * This layer provides a handler function that can be used with any WebSocket server\n * implementation. The handler takes a socket and document ID and manages the\n * document synchronization.\n * \n * By default, uses in-memory storage and no authentication.\n * Override these by providing MimicDataStorage and MimicAuthService layers.\n * \n * @example\n * ```typescript\n * import { MimicServer, MimicAuthService } from \"@voidhash/mimic-effect\";\n * import { Primitive } from \"@voidhash/mimic\";\n * \n * const TodoSchema = Primitive.Struct({\n * title: Primitive.String(),\n * completed: Primitive.Boolean(),\n * });\n * \n * // Create the handler layer with defaults\n * const HandlerLayer = MimicServer.layer({\n * basePath: \"/mimic/todo\",\n * schema: TodoSchema\n * });\n * \n * // Or with custom auth\n * const HandlerLayerWithAuth = MimicServer.layer({\n * basePath: \"/mimic/todo\",\n * schema: TodoSchema\n * }).pipe(\n * Layer.provideMerge(MimicAuthService.layer({\n * authHandler: (token) => ({ success: true, userId: \"user-123\" })\n * }))\n * );\n * ```\n */\nexport const layer = <TSchema extends Primitive.AnyPrimitive>(\n options: MimicLayerOptions<TSchema>\n): Layer.Layer<MimicWebSocketHandler | DocumentManager.DocumentManagerTag> => {\n const configLayer = MimicConfig.layer({\n schema: options.schema,\n maxTransactionHistory: options.maxTransactionHistory,\n presence: options.presence,\n });\n\n return Layer.merge(\n // Handler layer\n Layer.effect(MimicWebSocketHandler, WebSocketHandler.makeHandler).pipe(\n Layer.provide(DocumentManager.layer),\n Layer.provide(PresenceManager.layer),\n Layer.provide(configLayer)\n ),\n // Document manager layer\n DocumentManager.layer.pipe(Layer.provide(configLayer))\n ).pipe(\n // Provide defaults if not overridden\n Layer.provide(InMemoryDataStorage.layerDefault),\n Layer.provide(NoAuth.layerDefault)\n );\n};\n\n/**\n * Create the Mimic server handler layer.\n * This layer provides the WebSocket handler that can be used with any WebSocket server.\n *\n * @example\n * ```typescript\n * import { MimicServer } from \"@voidhash/mimic-server-effect\";\n * import { SocketServer } from \"@effect/platform/SocketServer\";\n * import { Primitive } from \"@voidhash/mimic\";\n *\n * // Define your document schema\n * const TodoSchema = Primitive.Struct({\n * title: Primitive.String(),\n * completed: Primitive.Boolean(),\n * });\n *\n * // Create the server layer\n * const serverLayer = MimicServer.handlerLayer({\n * schema: TodoSchema,\n * });\n *\n * // Run with your socket server\n * Effect.gen(function* () {\n * const handler = yield* MimicServer.MimicWebSocketHandler;\n * const server = yield* SocketServer;\n *\n * yield* server.run((socket) =>\n * // Extract document ID from request and call handler\n * handler(socket, \"my-document-id\")\n * );\n * }).pipe(\n * Effect.provide(serverLayer),\n * Effect.provide(YourSocketServerLayer),\n * );\n * ```\n */\nexport const handlerLayer = <TSchema extends Primitive.AnyPrimitive>(\n options: MimicConfig.MimicServerConfigOptions<TSchema>\n): Layer.Layer<MimicWebSocketHandler> =>\n Layer.effect(MimicWebSocketHandler, WebSocketHandler.makeHandler).pipe(\n Layer.provide(DocumentManager.layer),\n Layer.provide(PresenceManager.layer),\n Layer.provide(MimicConfig.layer(options)),\n // Provide defaults\n Layer.provide(InMemoryDataStorage.layerDefault),\n Layer.provide(NoAuth.layerDefault)\n );\n\n/**\n * Create the document manager layer.\n */\nexport const documentManagerLayer = <TSchema extends Primitive.AnyPrimitive>(\n options: MimicConfig.MimicServerConfigOptions<TSchema>\n): Layer.Layer<DocumentManager.DocumentManagerTag> =>\n DocumentManager.layer.pipe(\n Layer.provide(MimicConfig.layer(options)),\n // Provide defaults\n Layer.provide(InMemoryDataStorage.layerDefault),\n Layer.provide(NoAuth.layerDefault)\n );\n\n// =============================================================================\n// Convenience Functions\n// =============================================================================\n\n/**\n * Run a Mimic WebSocket server with the provided handler.\n *\n * This is a helper that:\n * 1. Gets the WebSocket handler from context\n * 2. Runs the socket server with the handler\n *\n * Note: The document ID extraction from socket is implementation-specific.\n * You may need to customize this based on your socket server.\n */\nexport const run = (\n extractDocumentId: (socket: Socket.Socket) => Effect.Effect<string>\n) =>\n Effect.gen(function* () {\n const handler = yield* MimicWebSocketHandler;\n const server = yield* SocketServer;\n\n yield* server.run((socket) =>\n Effect.gen(function* () {\n const documentId = yield* extractDocumentId(socket);\n yield* handler(socket, documentId);\n }).pipe(\n Effect.catchAll((error) =>\n Effect.logError(\"Connection error\", error)\n )\n )\n );\n });\n\n\n/**\n * Create the HTTP handler effect for WebSocket upgrade.\n * This handler:\n * 1. Extracts the document ID from the URL path\n * 2. Upgrades the HTTP connection to WebSocket\n * 3. Delegates to the WebSocketHandler for document sync\n */\nconst makeMimicHandler = Effect.gen(function* () {\n const config = yield* MimicConfig.MimicServerConfigTag;\n const authService = yield* MimicAuthServiceTag;\n const documentManager = yield* DocumentManager.DocumentManagerTag;\n const presenceManager = yield* PresenceManager.PresenceManagerTag;\n\n return Effect.gen(function* () {\n const request = yield* HttpServerRequest.HttpServerRequest;\n\n // Extract document ID from the URL path\n // Expected format: /basePath/doc/{documentId}\n const documentId = yield* WebSocketHandler.extractDocumentId(request.url);\n\n // Upgrade to WebSocket\n const socket = yield* request.upgrade;\n\n // Handle the WebSocket connection\n yield* WebSocketHandler.handleConnection(socket, request.url).pipe(\n Effect.provideService(MimicConfig.MimicServerConfigTag, config),\n Effect.provideService(MimicAuthServiceTag, authService),\n Effect.provideService(DocumentManager.DocumentManagerTag, documentManager),\n Effect.provideService(PresenceManager.PresenceManagerTag, presenceManager),\n Effect.scoped,\n Effect.catchAll((error) =>\n Effect.logError(\"WebSocket connection error\", error)\n )\n );\n\n // Return empty response - the WebSocket upgrade handles the connection\n return HttpServerResponse.empty();\n }).pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logWarning(\"WebSocket upgrade failed\", error);\n return HttpServerResponse.text(\"WebSocket upgrade failed\", {\n status: 400,\n });\n })\n )\n );\n});\n\n\n\n/**\n * Create a Mimic server layer that integrates with HttpLayerRouter.\n *\n * This function creates a layer that:\n * 1. Registers a WebSocket route at the specified base path\n * 2. Handles WebSocket upgrades for document sync\n * 3. Provides all required dependencies (config, auth, storage, document manager)\n *\n * By default, uses in-memory storage and no authentication.\n * To override these defaults, provide custom layers before the defaults:\n *\n * @example\n * ```typescript\n * import { MimicServer, MimicAuthService } from \"@voidhash/mimic-effect\";\n * import { HttpLayerRouter } from \"@effect/platform\";\n * import { Primitive } from \"@voidhash/mimic\";\n *\n * const TodoSchema = Primitive.Struct({\n * title: Primitive.String(),\n * completed: Primitive.Boolean(),\n * });\n *\n * // Create the Mimic route layer with defaults\n * const MimicRoute = MimicServer.layerHttpLayerRouter({\n * basePath: \"/mimic/todo\",\n * schema: TodoSchema\n * });\n *\n * // Or with custom auth - use Layer.provide to inject before defaults\n * const MimicRouteWithAuth = MimicServer.layerHttpLayerRouter({\n * basePath: \"/mimic/todo\",\n * schema: TodoSchema,\n * authLayer: MimicAuthService.layer({\n * authHandler: (token) => ({ success: true, userId: token })\n * })\n * });\n *\n * // Merge with other routes and serve\n * const AllRoutes = Layer.mergeAll(MimicRoute, OtherRoutes);\n * HttpLayerRouter.serve(AllRoutes).pipe(\n * Layer.provide(BunHttpServer.layer({ port: 3000 })),\n * Layer.launch,\n * BunRuntime.runMain\n * );\n * ```\n */\nexport const layerHttpLayerRouter = <TSchema extends Primitive.AnyPrimitive>(\n options: MimicLayerOptions<TSchema> & {\n /** Custom auth layer. Defaults to NoAuth (all connections allowed). */\n readonly authLayer?: Layer.Layer<MimicAuthServiceTag>;\n /** Custom storage layer. Defaults to InMemoryDataStorage. */\n readonly storageLayer?: Layer.Layer<MimicDataStorageTag>;\n }\n): Layer.Layer<never, never, HttpLayerRouter.HttpRouter> => {\n // Build the base path pattern for WebSocket routes\n // Append /doc/* to match /basePath/doc/{documentId}\n const basePath = options.basePath ?? \"/mimic\";\n const wsPath: PathInput = `${basePath}/doc/*` as PathInput;\n\n // Create the config layer\n const configLayer = MimicConfig.layer({\n schema: options.schema,\n maxTransactionHistory: options.maxTransactionHistory,\n presence: options.presence,\n });\n\n // Use provided layers or defaults\n const authLayer = options.authLayer ?? NoAuth.layerDefault;\n const storageLayer = options.storageLayer ?? InMemoryDataStorage.layerDefault;\n\n // Create the route registration effect\n const registerRoute = Effect.gen(function* () {\n const router = yield* HttpLayerRouter.HttpRouter;\n const handler = yield* makeMimicHandler;\n yield* router.add(\"GET\", wsPath, handler);\n });\n\n // Build the layer with all dependencies\n return Layer.scopedDiscard(registerRoute).pipe(\n Layer.provide(DocumentManager.layer),\n Layer.provide(PresenceManager.layer),\n Layer.provide(configLayer),\n Layer.provide(storageLayer),\n Layer.provide(authLayer)\n );\n};","/**\n * @since 0.0.1\n * Protocol and schema definitions for document communication.\n */\nimport * as Schema from \"effect/Schema\";\n\n// =============================================================================\n// Schema Definitions\n// =============================================================================\n\n/**\n * Schema for a transaction operation.\n */\nexport const OperationSchema = Schema.Struct({\n kind: Schema.String,\n path: Schema.Unknown, // OperationPath is complex, treat as unknown\n payload: Schema.Unknown,\n});\n\n/**\n * Schema for a transaction.\n */\nexport const TransactionSchema = Schema.Struct({\n id: Schema.String,\n ops: Schema.Array(OperationSchema),\n timestamp: Schema.Number,\n});\n\nexport type Transaction = Schema.Schema.Type<typeof TransactionSchema>;\n\n/**\n * Schema for a server message that broadcasts a committed transaction.\n */\nexport const TransactionMessageSchema = Schema.Struct({\n type: Schema.Literal(\"transaction\"),\n transaction: TransactionSchema,\n version: Schema.Number,\n});\n\nexport type TransactionMessage = Schema.Schema.Type<typeof TransactionMessageSchema>;\n\n/**\n * Schema for a server message containing a snapshot.\n */\nexport const SnapshotMessageSchema = Schema.Struct({\n type: Schema.Literal(\"snapshot\"),\n state: Schema.Unknown,\n version: Schema.Number,\n});\n\nexport type SnapshotMessage = Schema.Schema.Type<typeof SnapshotMessageSchema>;\n\n/**\n * Schema for a server error message.\n */\nexport const ErrorMessageSchema = Schema.Struct({\n type: Schema.Literal(\"error\"),\n transactionId: Schema.String,\n reason: Schema.String,\n});\n\nexport type ErrorMessage = Schema.Schema.Type<typeof ErrorMessageSchema>;\n\n/**\n * Schema for a pong message.\n */\nexport const PongMessageSchema = Schema.Struct({\n type: Schema.Literal(\"pong\"),\n});\n\nexport type PongMessage = Schema.Schema.Type<typeof PongMessageSchema>;\n\n/**\n * Schema for authentication result message.\n */\nexport const AuthResultMessageSchema = Schema.Struct({\n type: Schema.Literal(\"auth_result\"),\n success: Schema.Boolean,\n error: Schema.optional(Schema.String),\n});\n\nexport type AuthResultMessage = Schema.Schema.Type<typeof AuthResultMessageSchema>;\n\n/**\n * Union of all server broadcast messages.\n */\nexport const ServerBroadcastSchema = Schema.Union(\n TransactionMessageSchema,\n ErrorMessageSchema\n);\n\nexport type ServerBroadcast = Schema.Schema.Type<typeof ServerBroadcastSchema>;\n\n// =============================================================================\n// Submit Result\n// =============================================================================\n\n/**\n * Result of submitting a transaction.\n */\nexport const SubmitResultSchema = Schema.Union(\n Schema.Struct({\n success: Schema.Literal(true),\n version: Schema.Number,\n }),\n Schema.Struct({\n success: Schema.Literal(false),\n reason: Schema.String,\n })\n);\n\nexport type SubmitResult = Schema.Schema.Type<typeof SubmitResultSchema>;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["make","layer","layer","layerEffect","make","instance: DocumentInstance","layer: Layer.Layer<\n DocumentManagerTag,\n never,\n MimicServerConfigTag | MimicDataStorageTag\n>","layer","docPresence: DocumentPresence","presences: Record<string, PresenceEntry>","layer: Layer.Layer<PresenceManagerTag>","layerDefault: Layer.Layer<PresenceManagerTag>","layer","state: ConnectionState","layer: Layer.Layer<MimicDataStorageTag>","layerDefault","layer","noAuthService: MimicAuthService","layer: Layer.Layer<MimicAuthServiceTag>","layer","MimicConfig.layer","WebSocketHandler.makeHandler","DocumentManager.layer","PresenceManager.layer","InMemoryDataStorage.layerDefault","NoAuth.layerDefault","extractDocumentId","MimicConfig.MimicServerConfigTag","DocumentManager.DocumentManagerTag","PresenceManager.PresenceManagerTag","WebSocketHandler.extractDocumentId","WebSocketHandler.handleConnection","wsPath: PathInput"],"sources":["../src/MimicConfig.ts","../src/MimicDataStorage.ts","../src/DocumentManager.ts","../src/MimicAuthService.ts","../src/PresenceManager.ts","../src/errors.ts","../src/WebSocketHandler.ts","../src/storage/InMemoryDataStorage.ts","../src/auth/NoAuth.ts","../src/MimicServer.ts","../src/DocumentProtocol.ts"],"sourcesContent":["/**\n * @since 0.0.1\n * Configuration types for the Mimic server.\n */\nimport * as Context from \"effect/Context\";\nimport * as Duration from \"effect/Duration\";\nimport type { DurationInput } from \"effect/Duration\";\nimport * as Layer from \"effect/Layer\";\nimport type { Primitive, Presence } from \"@voidhash/mimic\";\n\n// =============================================================================\n// Mimic Server Configuration\n// =============================================================================\n\n/**\n * Configuration for the Mimic server.\n * \n * Note: Authentication and persistence are now handled by injectable services\n * (MimicAuthService and MimicDataStorage) rather than config options.\n */\nexport interface MimicServerConfig<TSchema extends Primitive.AnyPrimitive = Primitive.AnyPrimitive> {\n /**\n * The schema defining the document structure.\n */\n readonly schema: TSchema;\n\n /**\n * Maximum idle time for a document before it is cleaned up.\n * @default \"5 minutes\"\n */\n readonly maxIdleTime: Duration.Duration;\n\n /**\n * Maximum number of processed transaction IDs to track for deduplication.\n * @default 1000\n */\n readonly maxTransactionHistory: number;\n\n /**\n * Heartbeat interval for WebSocket connections.\n * @default \"30 seconds\"\n */\n readonly heartbeatInterval: Duration.Duration;\n\n /**\n * Timeout for heartbeat responses before considering connection dead.\n * @default \"10 seconds\"\n */\n readonly heartbeatTimeout: Duration.Duration;\n\n /**\n * Optional presence schema for ephemeral per-user data.\n * When provided, enables presence features on WebSocket connections.\n * @default undefined (presence disabled)\n */\n readonly presence: Presence.AnyPresence | undefined;\n}\n\n/**\n * Options for creating a MimicServerConfig.\n */\nexport interface MimicServerConfigOptions<TSchema extends Primitive.AnyPrimitive = Primitive.AnyPrimitive> {\n /**\n * The schema defining the document structure.\n */\n readonly schema: TSchema;\n\n /**\n * Maximum idle time for a document before it is cleaned up.\n * @default \"5 minutes\"\n */\n readonly maxIdleTime?: DurationInput;\n\n /**\n * Maximum number of processed transaction IDs to track for deduplication.\n * @default 1000\n */\n readonly maxTransactionHistory?: number;\n\n /**\n * Heartbeat interval for WebSocket connections.\n * @default \"30 seconds\"\n */\n readonly heartbeatInterval?: DurationInput;\n\n /**\n * Timeout for heartbeat responses.\n * @default \"10 seconds\"\n */\n readonly heartbeatTimeout?: DurationInput;\n\n /**\n * Optional presence schema for ephemeral per-user data.\n * When provided, enables presence features on WebSocket connections.\n * @default undefined (presence disabled)\n */\n readonly presence?: Presence.AnyPresence;\n}\n\n/**\n * Create a MimicServerConfig from options.\n */\nexport const make = <TSchema extends Primitive.AnyPrimitive>(\n options: MimicServerConfigOptions<TSchema>\n): MimicServerConfig<TSchema> => ({\n schema: options.schema,\n maxIdleTime: Duration.decode(options.maxIdleTime ?? \"5 minutes\"),\n maxTransactionHistory: options.maxTransactionHistory ?? 1000,\n heartbeatInterval: Duration.decode(options.heartbeatInterval ?? \"30 seconds\"),\n heartbeatTimeout: Duration.decode(options.heartbeatTimeout ?? \"10 seconds\"),\n presence: options.presence,\n});\n\n// =============================================================================\n// Context Tag\n// =============================================================================\n\n/**\n * Context tag for MimicServerConfig.\n */\nexport class MimicServerConfigTag extends Context.Tag(\n \"@voidhash/mimic-server-effect/MimicServerConfig\"\n)<MimicServerConfigTag, MimicServerConfig>() {}\n\n/**\n * Create a Layer that provides MimicServerConfig.\n */\nexport const layer = <TSchema extends Primitive.AnyPrimitive>(\n options: MimicServerConfigOptions<TSchema>\n): Layer.Layer<MimicServerConfigTag> =>\n Layer.succeed(MimicServerConfigTag, make(options));\n","/**\n * @since 0.0.1\n * Data storage service interface for Mimic documents.\n * Provides pluggable storage adapters with load/save hooks for data transformation.\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Context from \"effect/Context\";\nimport * as Layer from \"effect/Layer\";\nimport * as Data from \"effect/Data\";\n\n// =============================================================================\n// Error Types\n// =============================================================================\n\n/**\n * Error when loading a document from storage fails.\n */\nexport class StorageLoadError extends Data.TaggedError(\"StorageLoadError\")<{\n readonly documentId: string;\n readonly cause: unknown;\n}> {\n override get message(): string {\n return `Failed to load document ${this.documentId}: ${String(this.cause)}`;\n }\n}\n\n/**\n * Error when saving a document to storage fails.\n */\nexport class StorageSaveError extends Data.TaggedError(\"StorageSaveError\")<{\n readonly documentId: string;\n readonly cause: unknown;\n}> {\n override get message(): string {\n return `Failed to save document ${this.documentId}: ${String(this.cause)}`;\n }\n}\n\n/**\n * Error when deleting a document from storage fails.\n */\nexport class StorageDeleteError extends Data.TaggedError(\"StorageDeleteError\")<{\n readonly documentId: string;\n readonly cause: unknown;\n}> {\n override get message(): string {\n return `Failed to delete document ${this.documentId}: ${String(this.cause)}`;\n }\n}\n\n/**\n * Union of all storage errors.\n */\nexport type StorageError = StorageLoadError | StorageSaveError | StorageDeleteError;\n\n// =============================================================================\n// Storage Service Interface\n// =============================================================================\n\n/**\n * Data storage service interface.\n * Implementations can persist documents to various backends (memory, S3, database, etc.)\n */\nexport interface MimicDataStorage {\n /**\n * Load a document's state from storage.\n * @param documentId - The unique identifier for the document\n * @returns The document state, or undefined if not found\n */\n readonly load: (\n documentId: string\n ) => Effect.Effect<unknown | undefined, StorageLoadError>;\n\n /**\n * Save a document's state to storage.\n * @param documentId - The unique identifier for the document\n * @param state - The document state to persist\n */\n readonly save: (\n documentId: string,\n state: unknown\n ) => Effect.Effect<void, StorageSaveError>;\n\n /**\n * Delete a document from storage.\n * @param documentId - The unique identifier for the document\n */\n readonly delete: (\n documentId: string\n ) => Effect.Effect<void, StorageDeleteError>;\n\n /**\n * Transform data after loading from storage.\n * Useful for migrations, decryption, decompression, etc.\n * @param state - The raw state loaded from storage\n * @returns The transformed state\n */\n readonly onLoad: (state: unknown) => Effect.Effect<unknown>;\n\n /**\n * Transform/validate data before saving to storage.\n * Useful for encryption, compression, validation, etc.\n * @param state - The state to be saved\n * @returns The transformed state\n */\n readonly onSave: (state: unknown) => Effect.Effect<unknown>;\n}\n\n// =============================================================================\n// Context Tag\n// =============================================================================\n\n/**\n * Context tag for MimicDataStorage service.\n */\nexport class MimicDataStorageTag extends Context.Tag(\n \"@voidhash/mimic-server-effect/MimicDataStorage\"\n)<MimicDataStorageTag, MimicDataStorage>() {}\n\n// =============================================================================\n// Layer Constructors\n// =============================================================================\n\n/**\n * Create a MimicDataStorage layer from a storage implementation.\n */\nexport const layer = (storage: MimicDataStorage): Layer.Layer<MimicDataStorageTag> =>\n Layer.succeed(MimicDataStorageTag, storage);\n\n/**\n * Create a MimicDataStorage layer from an Effect that produces a storage implementation.\n */\nexport const layerEffect = <E, R>(\n effect: Effect.Effect<MimicDataStorage, E, R>\n): Layer.Layer<MimicDataStorageTag, E, R> =>\n Layer.effect(MimicDataStorageTag, effect);\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Create a simple storage implementation with minimal configuration.\n */\nexport const make = (options: {\n readonly load: (documentId: string) => Effect.Effect<unknown | undefined, StorageLoadError>;\n readonly save: (documentId: string, state: unknown) => Effect.Effect<void, StorageSaveError>;\n readonly delete?: (documentId: string) => Effect.Effect<void, StorageDeleteError>;\n readonly onLoad?: (state: unknown) => Effect.Effect<unknown>;\n readonly onSave?: (state: unknown) => Effect.Effect<unknown>;\n}): MimicDataStorage => ({\n load: options.load,\n save: options.save,\n delete: options.delete ?? (() => Effect.void),\n onLoad: options.onLoad ?? ((state) => Effect.succeed(state)),\n onSave: options.onSave ?? ((state) => Effect.succeed(state)),\n});\n","/**\n * @since 0.0.1\n * Document manager that handles multiple document instances.\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as PubSub from \"effect/PubSub\";\nimport * as Ref from \"effect/Ref\";\nimport * as HashMap from \"effect/HashMap\";\nimport * as Context from \"effect/Context\";\nimport * as Scope from \"effect/Scope\";\nimport * as Stream from \"effect/Stream\";\nimport type { Primitive, Transaction } from \"@voidhash/mimic\";\nimport { ServerDocument } from \"@voidhash/mimic/server\";\n\nimport * as Protocol from \"./DocumentProtocol.js\";\nimport { MimicServerConfigTag } from \"./MimicConfig.js\";\nimport { MimicDataStorageTag } from \"./MimicDataStorage.js\";\nimport { DocumentNotFoundError } from \"./errors.js\";\n\n// =============================================================================\n// Document Instance\n// =============================================================================\n\n/**\n * A managed document instance that holds state and manages subscribers.\n */\ninterface DocumentInstance {\n /** The underlying ServerDocument */\n readonly document: ServerDocument.ServerDocument<Primitive.AnyPrimitive>;\n /** PubSub for broadcasting messages to subscribers */\n readonly pubsub: PubSub.PubSub<Protocol.ServerBroadcast>;\n /** Reference count for cleanup */\n readonly refCount: Ref.Ref<number>;\n}\n\n// =============================================================================\n// Document Manager Service\n// =============================================================================\n\n/**\n * Service interface for the DocumentManager.\n */\nexport interface DocumentManager {\n /**\n * Submit a transaction to a document.\n */\n readonly submit: (\n documentId: string,\n transaction: Transaction.Transaction\n ) => Effect.Effect<Protocol.SubmitResult>;\n\n /**\n * Get a snapshot of a document.\n */\n readonly getSnapshot: (\n documentId: string\n ) => Effect.Effect<Protocol.SnapshotMessage>;\n\n /**\n * Subscribe to broadcasts for a document.\n * Returns a Stream of server broadcasts.\n */\n readonly subscribe: (\n documentId: string\n ) => Effect.Effect<\n Stream.Stream<Protocol.ServerBroadcast>,\n never,\n Scope.Scope\n >;\n}\n\n/**\n * Context tag for DocumentManager.\n */\nexport class DocumentManagerTag extends Context.Tag(\n \"@voidhash/mimic-server-effect/DocumentManager\"\n)<DocumentManagerTag, DocumentManager>() {}\n\n// =============================================================================\n// Document Manager Implementation\n// =============================================================================\n\n/**\n * Create the DocumentManager service.\n */\nconst makeDocumentManager = Effect.gen(function* () {\n const config = yield* MimicServerConfigTag;\n const storage = yield* MimicDataStorageTag;\n \n // Map of document ID to document instance\n const documents = yield* Ref.make(\n HashMap.empty<string, DocumentInstance>()\n );\n\n // Get or create a document instance\n const getOrCreateDocument = (\n documentId: string\n ): Effect.Effect<DocumentInstance> =>\n Effect.gen(function* () {\n const current = yield* Ref.get(documents);\n const existing = HashMap.get(current, documentId);\n\n if (existing._tag === \"Some\") {\n // Increment ref count\n yield* Ref.update(existing.value.refCount, (n) => n + 1);\n return existing.value;\n }\n\n // Load initial state from storage\n const rawState = yield* Effect.catchAll(\n storage.load(documentId),\n () => Effect.succeed(undefined)\n );\n\n // Transform loaded state with onLoad hook\n const initialState = rawState !== undefined\n ? yield* storage.onLoad(rawState)\n : undefined;\n\n // Create PubSub for broadcasting\n const pubsub = yield* PubSub.unbounded<Protocol.ServerBroadcast>();\n\n // Create ServerDocument with broadcast callback\n const serverDocument = ServerDocument.make({\n schema: config.schema,\n initialState: initialState as Primitive.InferState<typeof config.schema> | undefined,\n maxTransactionHistory: config.maxTransactionHistory,\n onBroadcast: (transactionMessage) => {\n // Get current state and save to storage\n const currentState = serverDocument.get();\n \n // Run save in background (fire-and-forget with error logging)\n Effect.runFork(\n Effect.gen(function* () {\n if (currentState !== undefined) {\n const transformedState = yield* storage.onSave(currentState);\n yield* Effect.catchAll(\n storage.save(documentId, transformedState),\n (error) => Effect.logError(\"Failed to save document\", error)\n );\n }\n })\n );\n\n // Broadcast to subscribers\n Effect.runSync(\n PubSub.publish(pubsub, {\n type: \"transaction\",\n transaction: transactionMessage.transaction as Protocol.Transaction,\n version: transactionMessage.version,\n })\n );\n },\n onRejection: (transactionId, reason) => {\n Effect.runSync(\n PubSub.publish(pubsub, {\n type: \"error\",\n transactionId,\n reason,\n })\n );\n },\n });\n\n const refCount = yield* Ref.make(1);\n\n const instance: DocumentInstance = {\n document: serverDocument,\n pubsub,\n refCount,\n };\n\n // Store in map\n yield* Ref.update(documents, (map) =>\n HashMap.set(map, documentId, instance)\n );\n\n return instance;\n });\n\n // Submit a transaction\n const submit = (\n documentId: string,\n transaction: Transaction.Transaction\n ): Effect.Effect<Protocol.SubmitResult> =>\n Effect.gen(function* () {\n const instance = yield* getOrCreateDocument(documentId);\n const result = instance.document.submit(transaction);\n return result;\n });\n\n // Get a snapshot\n const getSnapshot = (\n documentId: string\n ): Effect.Effect<Protocol.SnapshotMessage> =>\n Effect.gen(function* () {\n const instance = yield* getOrCreateDocument(documentId);\n const snapshot = instance.document.getSnapshot();\n return snapshot;\n });\n\n // Subscribe to broadcasts\n const subscribe = (\n documentId: string\n ): Effect.Effect<\n Stream.Stream<Protocol.ServerBroadcast>,\n never,\n Scope.Scope\n > =>\n Effect.gen(function* () {\n const instance = yield* getOrCreateDocument(documentId);\n\n // Subscribe to the PubSub\n const queue = yield* PubSub.subscribe(instance.pubsub);\n\n // Ensure cleanup on scope close\n yield* Effect.addFinalizer(() =>\n Effect.gen(function* () {\n // Decrement ref count\n const count = yield* Ref.updateAndGet(\n instance.refCount,\n (n) => n - 1\n );\n\n // If no more subscribers, we could clean up the document\n // For now, we keep it alive (could add idle timeout)\n })\n );\n\n // Convert queue to stream\n return Stream.fromQueue(queue);\n });\n\n const manager: DocumentManager = {\n submit,\n getSnapshot,\n subscribe,\n };\n\n return manager;\n});\n\n/**\n * Layer that provides DocumentManager.\n * Requires MimicServerConfigTag and MimicDataStorageTag.\n */\nexport const layer: Layer.Layer<\n DocumentManagerTag,\n never,\n MimicServerConfigTag | MimicDataStorageTag\n> = Layer.effect(DocumentManagerTag, makeDocumentManager);\n","/**\n * @since 0.0.1\n * Authentication service interface for Mimic connections.\n * Provides pluggable authentication adapters.\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Context from \"effect/Context\";\nimport * as Layer from \"effect/Layer\";\n\n// =============================================================================\n// Authentication Types\n// =============================================================================\n\n/**\n * Result of an authentication attempt.\n */\nexport type AuthResult =\n | { readonly success: true; readonly userId?: string }\n | { readonly success: false; readonly error: string };\n\n/**\n * Authentication handler function type.\n * Can be synchronous or return a Promise.\n */\nexport type AuthHandler = (token: string) => Promise<AuthResult> | AuthResult;\n\n// =============================================================================\n// Auth Service Interface\n// =============================================================================\n\n/**\n * Authentication service interface.\n * Implementations can authenticate connections using various methods (JWT, API keys, etc.)\n */\nexport interface MimicAuthService {\n /**\n * Authenticate a connection using the provided token.\n * @param token - The authentication token provided by the client\n * @returns The authentication result\n */\n readonly authenticate: (token: string) => Effect.Effect<AuthResult>;\n}\n\n// =============================================================================\n// Context Tag\n// =============================================================================\n\n/**\n * Context tag for MimicAuthService service.\n */\nexport class MimicAuthServiceTag extends Context.Tag(\n \"@voidhash/mimic-server-effect/MimicAuthService\"\n)<MimicAuthServiceTag, MimicAuthService>() {}\n\n// =============================================================================\n// Layer Constructors\n// =============================================================================\n\n/**\n * Create a MimicAuthService layer from an auth handler function.\n */\nexport const layer = (options: {\n readonly authHandler: AuthHandler;\n}): Layer.Layer<MimicAuthServiceTag> =>\n Layer.succeed(MimicAuthServiceTag, {\n authenticate: (token: string) =>\n Effect.promise(() => Promise.resolve(options.authHandler(token))),\n });\n\n/**\n * Create a MimicAuthService layer from an auth service implementation.\n */\nexport const layerService = (service: MimicAuthService): Layer.Layer<MimicAuthServiceTag> =>\n Layer.succeed(MimicAuthServiceTag, service);\n\n/**\n * Create a MimicAuthService layer from an Effect that produces an auth service.\n */\nexport const layerEffect = <E, R>(\n effect: Effect.Effect<MimicAuthService, E, R>\n): Layer.Layer<MimicAuthServiceTag, E, R> =>\n Layer.effect(MimicAuthServiceTag, effect);\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Create an auth service from an auth handler function.\n */\nexport const make = (authHandler: AuthHandler): MimicAuthService => ({\n authenticate: (token: string) =>\n Effect.promise(() => Promise.resolve(authHandler(token))),\n});\n\n/**\n * Create an auth service from an Effect-based authenticate function.\n */\nexport const makeEffect = (\n authenticate: (token: string) => Effect.Effect<AuthResult>\n): MimicAuthService => ({\n authenticate,\n});\n","/**\n * @since 0.0.1\n * Presence manager for ephemeral per-connection state.\n * Handles in-memory storage and broadcasting of presence updates.\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as PubSub from \"effect/PubSub\";\nimport * as Ref from \"effect/Ref\";\nimport * as HashMap from \"effect/HashMap\";\nimport * as Context from \"effect/Context\";\nimport * as Scope from \"effect/Scope\";\nimport * as Stream from \"effect/Stream\";\nimport type { Presence } from \"@voidhash/mimic\";\n\n// =============================================================================\n// Presence Entry Types\n// =============================================================================\n\n/**\n * A presence entry stored in the manager.\n */\nexport interface PresenceEntry {\n /** The presence data */\n readonly data: unknown;\n /** Optional user ID from authentication */\n readonly userId?: string;\n}\n\n// =============================================================================\n// Presence Events\n// =============================================================================\n\n/**\n * Event emitted when a presence is updated.\n */\nexport interface PresenceUpdateEvent {\n readonly type: \"presence_update\";\n /** The connection ID of the user who updated */\n readonly id: string;\n /** The presence data */\n readonly data: unknown;\n /** Optional user ID from authentication */\n readonly userId?: string;\n}\n\n/**\n * Event emitted when a presence is removed (user disconnected).\n */\nexport interface PresenceRemoveEvent {\n readonly type: \"presence_remove\";\n /** The connection ID of the user who disconnected */\n readonly id: string;\n}\n\n/**\n * Union of all presence events.\n */\nexport type PresenceEvent = PresenceUpdateEvent | PresenceRemoveEvent;\n\n// =============================================================================\n// Presence Snapshot\n// =============================================================================\n\n/**\n * A snapshot of all presence entries for a document.\n */\nexport interface PresenceSnapshot {\n /** Map of connectionId to presence entry */\n readonly presences: Record<string, PresenceEntry>;\n}\n\n// =============================================================================\n// Document Presence Instance\n// =============================================================================\n\n/**\n * Per-document presence state.\n */\ninterface DocumentPresence {\n /** Map of connectionId to presence entry */\n readonly entries: Ref.Ref<HashMap.HashMap<string, PresenceEntry>>;\n /** PubSub for broadcasting presence events */\n readonly pubsub: PubSub.PubSub<PresenceEvent>;\n}\n\n// =============================================================================\n// Presence Manager Service\n// =============================================================================\n\n/**\n * Service interface for the PresenceManager.\n */\nexport interface PresenceManager {\n /**\n * Get a snapshot of all presences for a document.\n */\n readonly getSnapshot: (\n documentId: string\n ) => Effect.Effect<PresenceSnapshot>;\n\n /**\n * Set/update presence for a connection.\n * Broadcasts the update to all subscribers.\n */\n readonly set: (\n documentId: string,\n connectionId: string,\n entry: PresenceEntry\n ) => Effect.Effect<void>;\n\n /**\n * Remove presence for a connection (e.g., on disconnect).\n * Broadcasts the removal to all subscribers.\n */\n readonly remove: (\n documentId: string,\n connectionId: string\n ) => Effect.Effect<void>;\n\n /**\n * Subscribe to presence events for a document.\n * Returns a Stream of presence events.\n */\n readonly subscribe: (\n documentId: string\n ) => Effect.Effect<\n Stream.Stream<PresenceEvent>,\n never,\n Scope.Scope\n >;\n}\n\n/**\n * Context tag for PresenceManager.\n */\nexport class PresenceManagerTag extends Context.Tag(\n \"@voidhash/mimic-server-effect/PresenceManager\"\n)<PresenceManagerTag, PresenceManager>() {}\n\n// =============================================================================\n// Presence Manager Implementation\n// =============================================================================\n\n/**\n * Create the PresenceManager service.\n */\nconst makePresenceManager = Effect.gen(function* () {\n // Map of document ID to document presence state\n const documents = yield* Ref.make(\n HashMap.empty<string, DocumentPresence>()\n );\n\n // Get or create a document presence instance\n const getOrCreateDocument = (\n documentId: string\n ): Effect.Effect<DocumentPresence> =>\n Effect.gen(function* () {\n const current = yield* Ref.get(documents);\n const existing = HashMap.get(current, documentId);\n\n if (existing._tag === \"Some\") {\n return existing.value;\n }\n\n // Create new document presence\n const entries = yield* Ref.make(\n HashMap.empty<string, PresenceEntry>()\n );\n const pubsub = yield* PubSub.unbounded<PresenceEvent>();\n\n const docPresence: DocumentPresence = {\n entries,\n pubsub,\n };\n\n // Store in map\n yield* Ref.update(documents, (map) =>\n HashMap.set(map, documentId, docPresence)\n );\n\n return docPresence;\n });\n\n // Get snapshot of all presences for a document\n const getSnapshot = (documentId: string): Effect.Effect<PresenceSnapshot> =>\n Effect.gen(function* () {\n const docPresence = yield* getOrCreateDocument(documentId);\n const entriesMap = yield* Ref.get(docPresence.entries);\n\n // Convert HashMap to Record\n const presences: Record<string, PresenceEntry> = {};\n for (const [id, entry] of entriesMap) {\n presences[id] = entry;\n }\n\n return { presences };\n });\n\n // Set/update presence for a connection\n const set = (\n documentId: string,\n connectionId: string,\n entry: PresenceEntry\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n const docPresence = yield* getOrCreateDocument(documentId);\n\n // Update the entry\n yield* Ref.update(docPresence.entries, (map) =>\n HashMap.set(map, connectionId, entry)\n );\n\n // Broadcast the update\n yield* PubSub.publish(docPresence.pubsub, {\n type: \"presence_update\",\n id: connectionId,\n data: entry.data,\n userId: entry.userId,\n });\n });\n\n // Remove presence for a connection\n const remove = (\n documentId: string,\n connectionId: string\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n const current = yield* Ref.get(documents);\n const existing = HashMap.get(current, documentId);\n\n if (existing._tag === \"None\") {\n return; // Document doesn't exist, nothing to remove\n }\n\n const docPresence = existing.value;\n\n // Check if the connection has a presence\n const entries = yield* Ref.get(docPresence.entries);\n const hasEntry = HashMap.has(entries, connectionId);\n\n if (!hasEntry) {\n return; // No presence to remove\n }\n\n // Remove the entry\n yield* Ref.update(docPresence.entries, (map) =>\n HashMap.remove(map, connectionId)\n );\n\n // Broadcast the removal\n yield* PubSub.publish(docPresence.pubsub, {\n type: \"presence_remove\",\n id: connectionId,\n });\n });\n\n // Subscribe to presence events\n const subscribe = (\n documentId: string\n ): Effect.Effect<Stream.Stream<PresenceEvent>, never, Scope.Scope> =>\n Effect.gen(function* () {\n const docPresence = yield* getOrCreateDocument(documentId);\n\n // Subscribe to the PubSub\n const queue = yield* PubSub.subscribe(docPresence.pubsub);\n\n // Convert queue to stream\n return Stream.fromQueue(queue);\n });\n\n const manager: PresenceManager = {\n getSnapshot,\n set,\n remove,\n subscribe,\n };\n\n return manager;\n});\n\n/**\n * Layer that provides PresenceManager.\n */\nexport const layer: Layer.Layer<PresenceManagerTag> = Layer.effect(\n PresenceManagerTag,\n makePresenceManager\n);\n\n/**\n * Default layer that provides PresenceManager.\n * Uses the default priority for layer composition.\n */\nexport const layerDefault: Layer.Layer<PresenceManagerTag> = Layer.effectDiscard(\n Effect.succeed(undefined)\n).pipe(Layer.provideMerge(layer));\n\n","/**\n * @since 0.0.1\n * Error types for the Mimic server.\n */\nimport * as Data from \"effect/Data\";\n\n// =============================================================================\n// Error Types\n// =============================================================================\n\n/**\n * Error when a document type is not found in the schema registry.\n */\nexport class DocumentTypeNotFoundError extends Data.TaggedError(\n \"DocumentTypeNotFoundError\"\n)<{\n readonly documentType: string;\n}> {\n override get message(): string {\n return `Document type not found: ${this.documentType}`;\n }\n}\n\n/**\n * Error when a document is not found.\n */\nexport class DocumentNotFoundError extends Data.TaggedError(\n \"DocumentNotFoundError\"\n)<{\n readonly documentId: string;\n}> {\n override get message(): string {\n return `Document not found: ${this.documentId}`;\n }\n}\n\n/**\n * Error when authentication fails.\n */\nexport class AuthenticationError extends Data.TaggedError(\n \"AuthenticationError\"\n)<{\n readonly reason: string;\n}> {\n override get message(): string {\n return `Authentication failed: ${this.reason}`;\n }\n}\n\n/**\n * Error when a transaction is rejected.\n */\nexport class TransactionRejectedError extends Data.TaggedError(\n \"TransactionRejectedError\"\n)<{\n readonly transactionId: string;\n readonly reason: string;\n}> {\n override get message(): string {\n return `Transaction ${this.transactionId} rejected: ${this.reason}`;\n }\n}\n\n/**\n * Error when parsing a client message fails.\n */\nexport class MessageParseError extends Data.TaggedError(\"MessageParseError\")<{\n readonly cause: unknown;\n}> {\n override get message(): string {\n return `Failed to parse message: ${String(this.cause)}`;\n }\n}\n\n/**\n * Error when the WebSocket connection is invalid.\n */\nexport class InvalidConnectionError extends Data.TaggedError(\n \"InvalidConnectionError\"\n)<{\n readonly reason: string;\n}> {\n override get message(): string {\n return `Invalid connection: ${this.reason}`;\n }\n}\n\n/**\n * Error when the document ID is missing from the URL path.\n */\nexport class MissingDocumentIdError extends Data.TaggedError(\n \"MissingDocumentIdError\"\n)<{\n readonly path?: string;\n}> {\n override get message(): string {\n return this.path \n ? `Document ID is required in the URL path: ${this.path}`\n : \"Document ID is required in the URL path\";\n }\n}\n\n/**\n * Union of all Mimic server errors.\n */\nexport type MimicServerError =\n | DocumentTypeNotFoundError\n | DocumentNotFoundError\n | AuthenticationError\n | TransactionRejectedError\n | MessageParseError\n | InvalidConnectionError\n | MissingDocumentIdError;\n","/**\n * @since 0.0.1\n * WebSocket connection handler using Effect Platform Socket API.\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Stream from \"effect/Stream\";\nimport * as Fiber from \"effect/Fiber\";\nimport * as Scope from \"effect/Scope\";\nimport * as Duration from \"effect/Duration\";\nimport type * as Socket from \"@effect/platform/Socket\";\nimport { Transaction, Presence } from \"@voidhash/mimic\";\n\nimport * as Protocol from \"./DocumentProtocol.js\";\nimport { MimicServerConfigTag } from \"./MimicConfig.js\";\nimport { MimicAuthServiceTag } from \"./MimicAuthService.js\";\nimport { DocumentManagerTag } from \"./DocumentManager.js\";\nimport { PresenceManagerTag } from \"./PresenceManager.js\";\nimport type * as PresenceManager from \"./PresenceManager.js\";\nimport {\n MessageParseError,\n MissingDocumentIdError,\n} from \"./errors.js\";\n\n// =============================================================================\n// Client Message Types (matching mimic-client Transport.ts)\n// =============================================================================\n\ninterface SubmitMessage {\n readonly type: \"submit\";\n readonly transaction: Protocol.Transaction;\n}\n\ninterface EncodedSubmitMessage {\n readonly type: \"submit\";\n readonly transaction: Transaction.EncodedTransaction;\n}\n\ninterface RequestSnapshotMessage {\n readonly type: \"request_snapshot\";\n}\n\ninterface PingMessage {\n readonly type: \"ping\";\n}\n\ninterface AuthMessage {\n readonly type: \"auth\";\n readonly token: string;\n}\n\ninterface PresenceSetMessage {\n readonly type: \"presence_set\";\n readonly data: unknown;\n}\n\ninterface PresenceClearMessage {\n readonly type: \"presence_clear\";\n}\n\ntype ClientMessage =\n | SubmitMessage\n | RequestSnapshotMessage\n | PingMessage\n | AuthMessage\n | PresenceSetMessage\n | PresenceClearMessage;\n\ntype EncodedClientMessage =\n | EncodedSubmitMessage\n | RequestSnapshotMessage\n | PingMessage\n | AuthMessage\n | PresenceSetMessage\n | PresenceClearMessage;\n\n// =============================================================================\n// Server Message Types (matching mimic-client Transport.ts)\n// =============================================================================\n\ninterface PongMessage {\n readonly type: \"pong\";\n}\n\ninterface AuthResultMessage {\n readonly type: \"auth_result\";\n readonly success: boolean;\n readonly error?: string;\n}\n\ninterface EncodedTransactionMessage {\n readonly type: \"transaction\";\n readonly transaction: Transaction.EncodedTransaction;\n readonly version: number;\n}\n\n// Presence server messages\ninterface PresenceSnapshotMessage {\n readonly type: \"presence_snapshot\";\n readonly selfId: string;\n readonly presences: Record<string, { data: unknown; userId?: string }>;\n}\n\ninterface PresenceUpdateMessage {\n readonly type: \"presence_update\";\n readonly id: string;\n readonly data: unknown;\n readonly userId?: string;\n}\n\ninterface PresenceRemoveMessage {\n readonly type: \"presence_remove\";\n readonly id: string;\n}\n\ntype ServerMessage =\n | Protocol.TransactionMessage\n | Protocol.SnapshotMessage\n | Protocol.ErrorMessage\n | PongMessage\n | AuthResultMessage\n | PresenceSnapshotMessage\n | PresenceUpdateMessage\n | PresenceRemoveMessage;\n\ntype EncodedServerMessage =\n | EncodedTransactionMessage\n | Protocol.SnapshotMessage\n | Protocol.ErrorMessage\n | PongMessage\n | AuthResultMessage\n | PresenceSnapshotMessage\n | PresenceUpdateMessage\n | PresenceRemoveMessage;\n\n// =============================================================================\n// WebSocket Connection State\n// =============================================================================\n\ninterface ConnectionState {\n readonly documentId: string;\n readonly connectionId: string;\n readonly authenticated: boolean;\n readonly userId?: string;\n}\n\n// =============================================================================\n// URL Path Parsing\n// =============================================================================\n\n/**\n * Extract document ID from URL path.\n * Expected format: /doc/{documentId}\n */\nexport const extractDocumentId = (\n path: string\n): Effect.Effect<string, MissingDocumentIdError> => {\n // Remove leading slash and split\n const parts = path.replace(/^\\/+/, \"\").split(\"/\");\n\n // Find the last occurrence of 'doc' in the path\n const docIndex = parts.lastIndexOf(\"doc\");\n const part = parts[docIndex + 1];\n if (docIndex !== -1 && part) {\n return Effect.succeed(decodeURIComponent(part));\n }\n return Effect.fail(new MissingDocumentIdError({}));\n};\n\n// =============================================================================\n// Message Parsing\n// =============================================================================\n\n/**\n * Decodes an encoded client message from the wire format.\n */\nconst decodeClientMessage = (encoded: EncodedClientMessage): ClientMessage => {\n if (encoded.type === \"submit\") {\n return {\n type: \"submit\",\n transaction: Transaction.decode(encoded.transaction),\n };\n }\n return encoded;\n};\n\n/**\n * Encodes a server message for the wire format.\n */\nconst encodeServerMessageForWire = (message: ServerMessage): EncodedServerMessage => {\n if (message.type === \"transaction\") {\n return {\n type: \"transaction\",\n transaction: Transaction.encode(message.transaction),\n version: message.version,\n };\n }\n return message;\n};\n\nconst parseClientMessage = (\n data: string | Uint8Array\n): Effect.Effect<ClientMessage, MessageParseError> =>\n Effect.try({\n try: () => {\n const text =\n typeof data === \"string\" ? data : new TextDecoder().decode(data);\n const encoded = JSON.parse(text) as EncodedClientMessage;\n return decodeClientMessage(encoded);\n },\n catch: (cause) => new MessageParseError({ cause }),\n });\n\nconst encodeServerMessage = (message: ServerMessage): string =>\n JSON.stringify(encodeServerMessageForWire(message));\n\n// =============================================================================\n// WebSocket Handler\n// =============================================================================\n\n/**\n * Handle a WebSocket connection for a document.\n *\n * @param socket - The Effect Platform Socket\n * @param path - The URL path (e.g., \"/doc/my-document-id\")\n * @returns An Effect that handles the connection lifecycle\n */\nexport const handleConnection = (\n socket: Socket.Socket,\n path: string\n): Effect.Effect<\n void,\n Socket.SocketError | MissingDocumentIdError | MessageParseError,\n MimicServerConfigTag | MimicAuthServiceTag | DocumentManagerTag | PresenceManagerTag | Scope.Scope\n> =>\n Effect.gen(function* () {\n const config = yield* MimicServerConfigTag;\n const authService = yield* MimicAuthServiceTag;\n const documentManager = yield* DocumentManagerTag;\n const presenceManager = yield* PresenceManagerTag;\n\n // Extract document ID from path\n const documentId = yield* extractDocumentId(path);\n const connectionId = crypto.randomUUID();\n\n // Track connection state\n let state: ConnectionState = {\n documentId,\n connectionId,\n authenticated: false, // Start unauthenticated, auth service will validate\n };\n\n // Track if this connection has set presence (for cleanup)\n let hasPresence = false;\n\n // Get the socket writer\n const write = yield* socket.writer;\n\n // Helper to send a message to the client\n const sendMessage = (message: ServerMessage) =>\n write(encodeServerMessage(message));\n\n // Send presence snapshot after auth\n const sendPresenceSnapshot = Effect.gen(function* () {\n if (!config.presence) return;\n\n const snapshot = yield* presenceManager.getSnapshot(documentId);\n yield* sendMessage({\n type: \"presence_snapshot\",\n selfId: connectionId,\n presences: snapshot.presences,\n });\n });\n\n // Handle authentication using the auth service\n const handleAuth = (token: string) =>\n Effect.gen(function* () {\n const result = yield* authService.authenticate(token);\n\n if (result.success) {\n state = {\n ...state,\n authenticated: true,\n userId: result.userId,\n };\n yield* sendMessage({ type: \"auth_result\", success: true });\n\n // Send presence snapshot after successful auth\n yield* sendPresenceSnapshot;\n } else {\n yield* sendMessage({\n type: \"auth_result\",\n success: false,\n error: result.error,\n });\n }\n });\n\n // Handle presence set\n const handlePresenceSet = (data: unknown) =>\n Effect.gen(function* () {\n if (!state.authenticated) return;\n if (!config.presence) return;\n\n // Validate presence data against schema\n const validated = Presence.validateSafe(config.presence, data);\n if (validated === undefined) {\n yield* Effect.logWarning(\"Invalid presence data received\", { connectionId, data });\n return;\n }\n\n // Store in presence manager\n yield* presenceManager.set(documentId, connectionId, {\n data: validated,\n userId: state.userId,\n });\n\n hasPresence = true;\n });\n\n // Handle presence clear\n const handlePresenceClear = Effect.gen(function* () {\n if (!state.authenticated) return;\n if (!config.presence) return;\n\n yield* presenceManager.remove(documentId, connectionId);\n hasPresence = false;\n });\n\n // Handle a client message\n const handleMessage = (message: ClientMessage) =>\n Effect.gen(function* () {\n switch (message.type) {\n case \"auth\":\n yield* handleAuth(message.token);\n break;\n\n case \"ping\":\n yield* sendMessage({ type: \"pong\" });\n break;\n\n case \"submit\":\n if (!state.authenticated) {\n yield* sendMessage({\n type: \"error\",\n transactionId: message.transaction.id,\n reason: \"Not authenticated\",\n });\n return;\n }\n // Submit to the document manager\n const submitResult = yield* documentManager.submit(\n documentId,\n message.transaction as any\n );\n // If rejected, send error (success is broadcast to all)\n if (!submitResult.success) {\n yield* sendMessage({\n type: \"error\",\n transactionId: message.transaction.id,\n reason: submitResult.reason,\n });\n }\n break;\n\n case \"request_snapshot\":\n if (!state.authenticated) {\n return;\n }\n const snapshot = yield* Effect.catchAll(\n documentManager.getSnapshot(documentId),\n () =>\n Effect.succeed({\n type: \"snapshot\" as const,\n state: null,\n version: 0,\n })\n );\n yield* sendMessage(snapshot);\n break;\n\n case \"presence_set\":\n yield* handlePresenceSet(message.data);\n break;\n\n case \"presence_clear\":\n yield* handlePresenceClear;\n break;\n }\n });\n\n // Subscribe to document broadcasts\n const subscribeFiber = yield* Effect.fork(\n Effect.gen(function* () {\n // Wait until authenticated before subscribing\n while (!state.authenticated) {\n yield* Effect.sleep(Duration.millis(100));\n }\n\n // Subscribe to the document\n const broadcastStream = yield* Effect.catchAll(\n documentManager.subscribe(documentId),\n () => Effect.succeed(Stream.empty)\n );\n\n // Forward broadcasts to the WebSocket\n yield* Stream.runForEach(broadcastStream, (broadcast) =>\n sendMessage(broadcast as ServerMessage)\n );\n }).pipe(Effect.scoped)\n );\n\n // Subscribe to presence events (if presence is enabled)\n const presenceFiber = yield* Effect.fork(\n Effect.gen(function* () {\n if (!config.presence) return;\n\n // Wait until authenticated before subscribing\n while (!state.authenticated) {\n yield* Effect.sleep(Duration.millis(100));\n }\n\n // Subscribe to presence events\n const presenceStream = yield* presenceManager.subscribe(documentId);\n\n // Forward presence events to the WebSocket, filtering out our own events (no-echo)\n yield* Stream.runForEach(presenceStream, (event) =>\n Effect.gen(function* () {\n // Don't echo our own presence events\n if (event.id === connectionId) return;\n\n if (event.type === \"presence_update\") {\n yield* sendMessage({\n type: \"presence_update\",\n id: event.id,\n data: event.data,\n userId: event.userId,\n });\n } else if (event.type === \"presence_remove\") {\n yield* sendMessage({\n type: \"presence_remove\",\n id: event.id,\n });\n }\n })\n );\n }).pipe(Effect.scoped)\n );\n\n // Ensure cleanup on disconnect\n yield* Effect.addFinalizer(() =>\n Effect.gen(function* () {\n // Interrupt the subscribe fibers\n yield* Fiber.interrupt(subscribeFiber);\n yield* Fiber.interrupt(presenceFiber);\n\n // Remove presence if we had any\n if (hasPresence && config.presence) {\n yield* presenceManager.remove(documentId, connectionId);\n }\n })\n );\n\n // Process incoming messages\n yield* socket.runRaw((data) =>\n Effect.gen(function* () {\n const message = yield* parseClientMessage(data);\n yield* handleMessage(message);\n }).pipe(\n Effect.catchAll((error) =>\n Effect.logError(\"Message handling error\", error)\n )\n )\n );\n });\n\n// =============================================================================\n// WebSocket Server Handler Factory\n// =============================================================================\n\n/**\n * Create a handler function for the WebSocket server.\n * Returns a function that takes a socket and document ID.\n */\nexport const makeHandler = Effect.gen(function* () {\n const config = yield* MimicServerConfigTag;\n const authService = yield* MimicAuthServiceTag;\n const documentManager = yield* DocumentManagerTag;\n const presenceManager = yield* PresenceManagerTag;\n\n return (socket: Socket.Socket, documentId: string) =>\n handleConnectionWithDocumentId(socket, documentId).pipe(\n Effect.provideService(MimicServerConfigTag, config),\n Effect.provideService(MimicAuthServiceTag, authService),\n Effect.provideService(DocumentManagerTag, documentManager),\n Effect.provideService(PresenceManagerTag, presenceManager),\n Effect.scoped\n );\n});\n\n/**\n * Handle a WebSocket connection for a document (using document ID directly).\n */\nconst handleConnectionWithDocumentId = (\n socket: Socket.Socket,\n documentId: string\n): Effect.Effect<\n void,\n Socket.SocketError | MessageParseError,\n MimicServerConfigTag | MimicAuthServiceTag | DocumentManagerTag | PresenceManagerTag | Scope.Scope\n> =>\n Effect.gen(function* () {\n const config = yield* MimicServerConfigTag;\n const authService = yield* MimicAuthServiceTag;\n const documentManager = yield* DocumentManagerTag;\n const presenceManager = yield* PresenceManagerTag;\n\n const connectionId = crypto.randomUUID();\n\n // Track connection state\n let state: ConnectionState = {\n documentId,\n connectionId,\n authenticated: false,\n };\n\n // Track if this connection has set presence (for cleanup)\n let hasPresence = false;\n\n // Get the socket writer\n const write = yield* socket.writer;\n\n // Helper to send a message to the client\n const sendMessage = (message: ServerMessage) =>\n write(encodeServerMessage(message));\n\n // Send presence snapshot after auth\n const sendPresenceSnapshot = Effect.gen(function* () {\n if (!config.presence) return;\n\n const snapshot = yield* presenceManager.getSnapshot(documentId);\n yield* sendMessage({\n type: \"presence_snapshot\",\n selfId: connectionId,\n presences: snapshot.presences,\n });\n });\n\n // Handle authentication using the auth service\n const handleAuth = (token: string) =>\n Effect.gen(function* () {\n const result = yield* authService.authenticate(token);\n\n if (result.success) {\n state = {\n ...state,\n authenticated: true,\n userId: result.userId,\n };\n yield* sendMessage({ type: \"auth_result\", success: true });\n\n // Send presence snapshot after successful auth\n yield* sendPresenceSnapshot;\n } else {\n yield* sendMessage({\n type: \"auth_result\",\n success: false,\n error: result.error,\n });\n }\n });\n\n // Handle presence set\n const handlePresenceSet = (data: unknown) =>\n Effect.gen(function* () {\n if (!state.authenticated) return;\n if (!config.presence) return;\n\n // Validate presence data against schema\n const validated = Presence.validateSafe(config.presence, data);\n if (validated === undefined) {\n yield* Effect.logWarning(\"Invalid presence data received\", { connectionId, data });\n return;\n }\n\n // Store in presence manager\n yield* presenceManager.set(documentId, connectionId, {\n data: validated,\n userId: state.userId,\n });\n\n hasPresence = true;\n });\n\n // Handle presence clear\n const handlePresenceClear = Effect.gen(function* () {\n if (!state.authenticated) return;\n if (!config.presence) return;\n\n yield* presenceManager.remove(documentId, connectionId);\n hasPresence = false;\n });\n\n // Handle a client message\n const handleMessage = (message: ClientMessage) =>\n Effect.gen(function* () {\n switch (message.type) {\n case \"auth\":\n yield* handleAuth(message.token);\n break;\n\n case \"ping\":\n yield* sendMessage({ type: \"pong\" });\n break;\n\n case \"submit\":\n if (!state.authenticated) {\n yield* sendMessage({\n type: \"error\",\n transactionId: message.transaction.id,\n reason: \"Not authenticated\",\n });\n return;\n }\n const submitResult = yield* documentManager.submit(\n documentId,\n message.transaction as any\n );\n if (!submitResult.success) {\n yield* sendMessage({\n type: \"error\",\n transactionId: message.transaction.id,\n reason: submitResult.reason,\n });\n }\n break;\n\n case \"request_snapshot\":\n if (!state.authenticated) {\n return;\n }\n const snapshot = yield* documentManager.getSnapshot(documentId);\n yield* sendMessage(snapshot);\n break;\n\n case \"presence_set\":\n yield* handlePresenceSet(message.data);\n break;\n\n case \"presence_clear\":\n yield* handlePresenceClear;\n break;\n }\n });\n\n // Subscribe to document broadcasts\n const subscribeFiber = yield* Effect.fork(\n Effect.gen(function* () {\n // Wait until authenticated before subscribing\n while (!state.authenticated) {\n yield* Effect.sleep(Duration.millis(100));\n }\n\n // Subscribe to the document\n const broadcastStream = yield* documentManager.subscribe(documentId);\n\n // Forward broadcasts to the WebSocket\n yield* Stream.runForEach(broadcastStream, (broadcast) =>\n sendMessage(broadcast as ServerMessage)\n );\n }).pipe(Effect.scoped)\n );\n\n // Subscribe to presence events (if presence is enabled)\n const presenceFiber = yield* Effect.fork(\n Effect.gen(function* () {\n if (!config.presence) return;\n\n // Wait until authenticated before subscribing\n while (!state.authenticated) {\n yield* Effect.sleep(Duration.millis(100));\n }\n\n // Subscribe to presence events\n const presenceStream = yield* presenceManager.subscribe(documentId);\n\n // Forward presence events to the WebSocket, filtering out our own events (no-echo)\n yield* Stream.runForEach(presenceStream, (event) =>\n Effect.gen(function* () {\n // Don't echo our own presence events\n if (event.id === connectionId) return;\n\n if (event.type === \"presence_update\") {\n yield* sendMessage({\n type: \"presence_update\",\n id: event.id,\n data: event.data,\n userId: event.userId,\n });\n } else if (event.type === \"presence_remove\") {\n yield* sendMessage({\n type: \"presence_remove\",\n id: event.id,\n });\n }\n })\n );\n }).pipe(Effect.scoped)\n );\n\n // Ensure cleanup on disconnect\n yield* Effect.addFinalizer(() =>\n Effect.gen(function* () {\n // Interrupt the subscribe fibers\n yield* Fiber.interrupt(subscribeFiber);\n yield* Fiber.interrupt(presenceFiber);\n\n // Remove presence if we had any\n if (hasPresence && config.presence) {\n yield* presenceManager.remove(documentId, connectionId);\n }\n })\n );\n\n // Process incoming messages\n yield* socket.runRaw((data) =>\n Effect.gen(function* () {\n const message = yield* parseClientMessage(data);\n yield* handleMessage(message);\n }).pipe(\n Effect.catchAll((error) =>\n Effect.logError(\"Message handling error\", error)\n )\n )\n );\n });\n","/**\n * @since 0.0.1\n * In-memory data storage implementation for Mimic documents.\n * Provides ephemeral storage - data is lost when the server restarts.\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as Ref from \"effect/Ref\";\nimport * as HashMap from \"effect/HashMap\";\n\nimport {\n MimicDataStorageTag,\n type MimicDataStorage,\n} from \"../MimicDataStorage.js\";\n\n// =============================================================================\n// In-Memory Storage Implementation\n// =============================================================================\n\n/**\n * Create an in-memory storage service.\n * Uses a HashMap to store documents in memory.\n */\nconst makeInMemoryStorage = Effect.gen(function* () {\n // Create a mutable reference to a HashMap for storing documents\n const store = yield* Ref.make(HashMap.empty<string, unknown>());\n\n const storage: MimicDataStorage = {\n load: (documentId: string) =>\n Effect.gen(function* () {\n const current = yield* Ref.get(store);\n const result = HashMap.get(current, documentId);\n return result._tag === \"Some\" ? result.value : undefined;\n }),\n\n save: (documentId: string, state: unknown) =>\n Ref.update(store, (map) => HashMap.set(map, documentId, state)),\n\n delete: (documentId: string) =>\n Ref.update(store, (map) => HashMap.remove(map, documentId)),\n\n onLoad: (state: unknown) => Effect.succeed(state),\n\n onSave: (state: unknown) => Effect.succeed(state),\n };\n\n return storage;\n});\n\n// =============================================================================\n// Layer\n// =============================================================================\n\n/**\n * Layer that provides in-memory data storage.\n * This is the default storage implementation - ephemeral and non-persistent.\n */\nexport const layer: Layer.Layer<MimicDataStorageTag> = Layer.effect(\n MimicDataStorageTag,\n makeInMemoryStorage\n);\n\n/**\n * Default layer alias for convenience.\n */\nexport const layerDefault = layer;\n","/**\n * @since 0.0.1\n * No authentication implementation for Mimic connections.\n * All connections are automatically authenticated (open access).\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\n\nimport {\n MimicAuthServiceTag,\n type MimicAuthService,\n} from \"../MimicAuthService.js\";\n\n// =============================================================================\n// No-Auth Implementation\n// =============================================================================\n\n/**\n * Authentication service that auto-succeeds all authentication requests.\n * Use this for development or when authentication is handled externally.\n */\nconst noAuthService: MimicAuthService = {\n authenticate: (_token: string) =>\n Effect.succeed({ success: true as const }),\n};\n\n// =============================================================================\n// Layer\n// =============================================================================\n\n/**\n * Layer that provides no authentication (open access).\n * All connections are automatically authenticated.\n * \n * WARNING: Only use this for development or when authentication\n * is handled at a different layer (e.g., API gateway, reverse proxy).\n */\nexport const layer: Layer.Layer<MimicAuthServiceTag> = Layer.succeed(\n MimicAuthServiceTag,\n noAuthService\n);\n\n/**\n * Default layer alias for convenience.\n */\nexport const layerDefault = layer;\n","/**\n * @since 0.0.1\n * Mimic server layer composition.\n */\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport * as Context from \"effect/Context\";\nimport type * as Socket from \"@effect/platform/Socket\";\nimport { SocketServer } from \"@effect/platform/SocketServer\";\nimport type { Primitive, Presence } from \"@voidhash/mimic\";\n\nimport * as DocumentManager from \"./DocumentManager.js\";\nimport * as WebSocketHandler from \"./WebSocketHandler.js\";\nimport * as MimicConfig from \"./MimicConfig.js\";\nimport { MimicDataStorageTag } from \"./MimicDataStorage.js\";\nimport { MimicAuthServiceTag } from \"./MimicAuthService.js\";\nimport * as PresenceManager from \"./PresenceManager.js\";\nimport * as InMemoryDataStorage from \"./storage/InMemoryDataStorage.js\";\nimport * as NoAuth from \"./auth/NoAuth.js\";\nimport { HttpLayerRouter, HttpServerRequest, HttpServerResponse } from \"@effect/platform\";\nimport { PathInput } from \"@effect/platform/HttpRouter\";\n\n// =============================================================================\n// Handler Tag\n// =============================================================================\n\n/**\n * Tag for the WebSocket handler function.\n */\nexport class MimicWebSocketHandler extends Context.Tag(\n \"@voidhash/mimic-server-effect/MimicWebSocketHandler\"\n)<\n MimicWebSocketHandler,\n (socket: Socket.Socket, documentId: string) => Effect.Effect<void, unknown>\n>() {}\n\n// =============================================================================\n// Layer Composition Options\n// =============================================================================\n\n/**\n * Options for creating a Mimic server layer.\n */\nexport interface MimicLayerOptions<TSchema extends Primitive.AnyPrimitive> {\n /**\n * Base path for document routes (used for path matching).\n * @example \"/mimic/todo\" - documents accessed at \"/mimic/todo/:documentId\"\n */\n readonly basePath?: PathInput;\n /**\n * The schema defining the document structure.\n */\n readonly schema: TSchema;\n /**\n * Maximum number of processed transaction IDs to track for deduplication.\n * @default 1000\n */\n readonly maxTransactionHistory?: number;\n /**\n * Optional presence schema for ephemeral per-user data.\n * When provided, enables presence features on WebSocket connections.\n */\n readonly presence?: Presence.AnyPresence;\n}\n\n// =============================================================================\n// Layer Composition\n// =============================================================================\n\n/**\n * Create a Mimic WebSocket handler layer.\n * \n * This layer provides a handler function that can be used with any WebSocket server\n * implementation. The handler takes a socket and document ID and manages the\n * document synchronization.\n * \n * By default, uses in-memory storage and no authentication.\n * Override these by providing MimicDataStorage and MimicAuthService layers.\n * \n * @example\n * ```typescript\n * import { MimicServer, MimicAuthService } from \"@voidhash/mimic-effect\";\n * import { Primitive } from \"@voidhash/mimic\";\n * \n * const TodoSchema = Primitive.Struct({\n * title: Primitive.String(),\n * completed: Primitive.Boolean(),\n * });\n * \n * // Create the handler layer with defaults\n * const HandlerLayer = MimicServer.layer({\n * basePath: \"/mimic/todo\",\n * schema: TodoSchema\n * });\n * \n * // Or with custom auth\n * const HandlerLayerWithAuth = MimicServer.layer({\n * basePath: \"/mimic/todo\",\n * schema: TodoSchema\n * }).pipe(\n * Layer.provideMerge(MimicAuthService.layer({\n * authHandler: (token) => ({ success: true, userId: \"user-123\" })\n * }))\n * );\n * ```\n */\nexport const layer = <TSchema extends Primitive.AnyPrimitive>(\n options: MimicLayerOptions<TSchema>\n): Layer.Layer<MimicWebSocketHandler | DocumentManager.DocumentManagerTag> => {\n const configLayer = MimicConfig.layer({\n schema: options.schema,\n maxTransactionHistory: options.maxTransactionHistory,\n presence: options.presence,\n });\n\n return Layer.merge(\n // Handler layer\n Layer.effect(MimicWebSocketHandler, WebSocketHandler.makeHandler).pipe(\n Layer.provide(DocumentManager.layer),\n Layer.provide(PresenceManager.layer),\n Layer.provide(configLayer)\n ),\n // Document manager layer\n DocumentManager.layer.pipe(Layer.provide(configLayer))\n ).pipe(\n // Provide defaults if not overridden\n Layer.provide(InMemoryDataStorage.layerDefault),\n Layer.provide(NoAuth.layerDefault)\n );\n};\n\n/**\n * Create the Mimic server handler layer.\n * This layer provides the WebSocket handler that can be used with any WebSocket server.\n *\n * @example\n * ```typescript\n * import { MimicServer } from \"@voidhash/mimic-server-effect\";\n * import { SocketServer } from \"@effect/platform/SocketServer\";\n * import { Primitive } from \"@voidhash/mimic\";\n *\n * // Define your document schema\n * const TodoSchema = Primitive.Struct({\n * title: Primitive.String(),\n * completed: Primitive.Boolean(),\n * });\n *\n * // Create the server layer\n * const serverLayer = MimicServer.handlerLayer({\n * schema: TodoSchema,\n * });\n *\n * // Run with your socket server\n * Effect.gen(function* () {\n * const handler = yield* MimicServer.MimicWebSocketHandler;\n * const server = yield* SocketServer;\n *\n * yield* server.run((socket) =>\n * // Extract document ID from request and call handler\n * handler(socket, \"my-document-id\")\n * );\n * }).pipe(\n * Effect.provide(serverLayer),\n * Effect.provide(YourSocketServerLayer),\n * );\n * ```\n */\nexport const handlerLayer = <TSchema extends Primitive.AnyPrimitive>(\n options: MimicConfig.MimicServerConfigOptions<TSchema>\n): Layer.Layer<MimicWebSocketHandler> =>\n Layer.effect(MimicWebSocketHandler, WebSocketHandler.makeHandler).pipe(\n Layer.provide(DocumentManager.layer),\n Layer.provide(PresenceManager.layer),\n Layer.provide(MimicConfig.layer(options)),\n // Provide defaults\n Layer.provide(InMemoryDataStorage.layerDefault),\n Layer.provide(NoAuth.layerDefault)\n );\n\n/**\n * Create the document manager layer.\n */\nexport const documentManagerLayer = <TSchema extends Primitive.AnyPrimitive>(\n options: MimicConfig.MimicServerConfigOptions<TSchema>\n): Layer.Layer<DocumentManager.DocumentManagerTag> =>\n DocumentManager.layer.pipe(\n Layer.provide(MimicConfig.layer(options)),\n // Provide defaults\n Layer.provide(InMemoryDataStorage.layerDefault),\n Layer.provide(NoAuth.layerDefault)\n );\n\n// =============================================================================\n// Convenience Functions\n// =============================================================================\n\n/**\n * Run a Mimic WebSocket server with the provided handler.\n *\n * This is a helper that:\n * 1. Gets the WebSocket handler from context\n * 2. Runs the socket server with the handler\n *\n * Note: The document ID extraction from socket is implementation-specific.\n * You may need to customize this based on your socket server.\n */\nexport const run = (\n extractDocumentId: (socket: Socket.Socket) => Effect.Effect<string>\n) =>\n Effect.gen(function* () {\n const handler = yield* MimicWebSocketHandler;\n const server = yield* SocketServer;\n\n yield* server.run((socket) =>\n Effect.gen(function* () {\n const documentId = yield* extractDocumentId(socket);\n yield* handler(socket, documentId);\n }).pipe(\n Effect.catchAll((error) =>\n Effect.logError(\"Connection error\", error)\n )\n )\n );\n });\n\n\n/**\n * Create the HTTP handler effect for WebSocket upgrade.\n * This handler:\n * 1. Extracts the document ID from the URL path\n * 2. Upgrades the HTTP connection to WebSocket\n * 3. Delegates to the WebSocketHandler for document sync\n */\nconst makeMimicHandler = Effect.gen(function* () {\n const config = yield* MimicConfig.MimicServerConfigTag;\n const authService = yield* MimicAuthServiceTag;\n const documentManager = yield* DocumentManager.DocumentManagerTag;\n const presenceManager = yield* PresenceManager.PresenceManagerTag;\n\n return Effect.gen(function* () {\n const request = yield* HttpServerRequest.HttpServerRequest;\n\n // Extract document ID from the URL path\n // Expected format: /basePath/doc/{documentId}\n const documentId = yield* WebSocketHandler.extractDocumentId(request.url);\n\n // Upgrade to WebSocket\n const socket = yield* request.upgrade;\n\n // Handle the WebSocket connection\n yield* WebSocketHandler.handleConnection(socket, request.url).pipe(\n Effect.provideService(MimicConfig.MimicServerConfigTag, config),\n Effect.provideService(MimicAuthServiceTag, authService),\n Effect.provideService(DocumentManager.DocumentManagerTag, documentManager),\n Effect.provideService(PresenceManager.PresenceManagerTag, presenceManager),\n Effect.scoped,\n Effect.catchAll((error) =>\n Effect.logError(\"WebSocket connection error\", error)\n )\n );\n\n // Return empty response - the WebSocket upgrade handles the connection\n return HttpServerResponse.empty();\n }).pipe(\n Effect.catchAll((error) =>\n Effect.gen(function* () {\n yield* Effect.logWarning(\"WebSocket upgrade failed\", error);\n return HttpServerResponse.text(\"WebSocket upgrade failed\", {\n status: 400,\n });\n })\n )\n );\n});\n\n\n\n/**\n * Create a Mimic server layer that integrates with HttpLayerRouter.\n *\n * This function creates a layer that:\n * 1. Registers a WebSocket route at the specified base path\n * 2. Handles WebSocket upgrades for document sync\n * 3. Provides all required dependencies (config, auth, storage, document manager)\n *\n * By default, uses in-memory storage and no authentication.\n * To override these defaults, provide custom layers before the defaults:\n *\n * @example\n * ```typescript\n * import { MimicServer, MimicAuthService } from \"@voidhash/mimic-effect\";\n * import { HttpLayerRouter } from \"@effect/platform\";\n * import { Primitive } from \"@voidhash/mimic\";\n *\n * const TodoSchema = Primitive.Struct({\n * title: Primitive.String(),\n * completed: Primitive.Boolean(),\n * });\n *\n * // Create the Mimic route layer with defaults\n * const MimicRoute = MimicServer.layerHttpLayerRouter({\n * basePath: \"/mimic/todo\",\n * schema: TodoSchema\n * });\n *\n * // Or with custom auth - use Layer.provide to inject before defaults\n * const MimicRouteWithAuth = MimicServer.layerHttpLayerRouter({\n * basePath: \"/mimic/todo\",\n * schema: TodoSchema,\n * authLayer: MimicAuthService.layer({\n * authHandler: (token) => ({ success: true, userId: token })\n * })\n * });\n *\n * // Merge with other routes and serve\n * const AllRoutes = Layer.mergeAll(MimicRoute, OtherRoutes);\n * HttpLayerRouter.serve(AllRoutes).pipe(\n * Layer.provide(BunHttpServer.layer({ port: 3000 })),\n * Layer.launch,\n * BunRuntime.runMain\n * );\n * ```\n */\nexport const layerHttpLayerRouter = <TSchema extends Primitive.AnyPrimitive>(\n options: MimicLayerOptions<TSchema> & {\n /** Custom auth layer. Defaults to NoAuth (all connections allowed). */\n readonly authLayer?: Layer.Layer<MimicAuthServiceTag>;\n /** Custom storage layer. Defaults to InMemoryDataStorage. */\n readonly storageLayer?: Layer.Layer<MimicDataStorageTag>;\n }\n) => {\n // Build the base path pattern for WebSocket routes\n // Append /doc/* to match /basePath/doc/{documentId}\n const basePath = options.basePath ?? \"/mimic\";\n const wsPath: PathInput = `${basePath}/doc/*` as PathInput;\n\n // Create the config layer\n const configLayer = MimicConfig.layer({\n schema: options.schema,\n maxTransactionHistory: options.maxTransactionHistory,\n presence: options.presence,\n });\n\n // Use provided layers or defaults\n const authLayer = options.authLayer ?? NoAuth.layerDefault;\n const storageLayer = options.storageLayer ?? InMemoryDataStorage.layerDefault;\n\n // Create the route registration effect\n const registerRoute = Effect.gen(function* () {\n const router = yield* HttpLayerRouter.HttpRouter;\n const handler = yield* makeMimicHandler;\n yield* router.add(\"GET\", wsPath, handler);\n });\n\n // Build the layer with all dependencies\n return Layer.scopedDiscard(registerRoute).pipe(\n Layer.provide(DocumentManager.layer),\n Layer.provide(PresenceManager.layer),\n Layer.provide(configLayer),\n Layer.provide(storageLayer),\n Layer.provide(authLayer)\n );\n};","/**\n * @since 0.0.1\n * Protocol and schema definitions for document communication.\n */\nimport * as Schema from \"effect/Schema\";\n\n// =============================================================================\n// Schema Definitions\n// =============================================================================\n\n/**\n * Schema for a transaction operation.\n */\nexport const OperationSchema = Schema.Struct({\n kind: Schema.String,\n path: Schema.Unknown, // OperationPath is complex, treat as unknown\n payload: Schema.Unknown,\n});\n\n/**\n * Schema for a transaction.\n */\nexport const TransactionSchema = Schema.Struct({\n id: Schema.String,\n ops: Schema.Array(OperationSchema),\n timestamp: Schema.Number,\n});\n\nexport type Transaction = Schema.Schema.Type<typeof TransactionSchema>;\n\n/**\n * Schema for a server message that broadcasts a committed transaction.\n */\nexport const TransactionMessageSchema = Schema.Struct({\n type: Schema.Literal(\"transaction\"),\n transaction: TransactionSchema,\n version: Schema.Number,\n});\n\nexport type TransactionMessage = Schema.Schema.Type<typeof TransactionMessageSchema>;\n\n/**\n * Schema for a server message containing a snapshot.\n */\nexport const SnapshotMessageSchema = Schema.Struct({\n type: Schema.Literal(\"snapshot\"),\n state: Schema.Unknown,\n version: Schema.Number,\n});\n\nexport type SnapshotMessage = Schema.Schema.Type<typeof SnapshotMessageSchema>;\n\n/**\n * Schema for a server error message.\n */\nexport const ErrorMessageSchema = Schema.Struct({\n type: Schema.Literal(\"error\"),\n transactionId: Schema.String,\n reason: Schema.String,\n});\n\nexport type ErrorMessage = Schema.Schema.Type<typeof ErrorMessageSchema>;\n\n/**\n * Schema for a pong message.\n */\nexport const PongMessageSchema = Schema.Struct({\n type: Schema.Literal(\"pong\"),\n});\n\nexport type PongMessage = Schema.Schema.Type<typeof PongMessageSchema>;\n\n/**\n * Schema for authentication result message.\n */\nexport const AuthResultMessageSchema = Schema.Struct({\n type: Schema.Literal(\"auth_result\"),\n success: Schema.Boolean,\n error: Schema.optional(Schema.String),\n});\n\nexport type AuthResultMessage = Schema.Schema.Type<typeof AuthResultMessageSchema>;\n\n/**\n * Union of all server broadcast messages.\n */\nexport const ServerBroadcastSchema = Schema.Union(\n TransactionMessageSchema,\n ErrorMessageSchema\n);\n\nexport type ServerBroadcast = Schema.Schema.Type<typeof ServerBroadcastSchema>;\n\n// =============================================================================\n// Submit Result\n// =============================================================================\n\n/**\n * Result of submitting a transaction.\n */\nexport const SubmitResultSchema = Schema.Union(\n Schema.Struct({\n success: Schema.Literal(true),\n version: Schema.Number,\n }),\n Schema.Struct({\n success: Schema.Literal(false),\n reason: Schema.String,\n })\n);\n\nexport type SubmitResult = Schema.Schema.Type<typeof SubmitResultSchema>;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voidhash/mimic-effect",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -24,11 +24,11 @@
|
|
|
24
24
|
"typescript": "5.8.3",
|
|
25
25
|
"vite-tsconfig-paths": "^5.1.4",
|
|
26
26
|
"vitest": "^3.2.4",
|
|
27
|
-
"@voidhash/tsconfig": "0.0.
|
|
27
|
+
"@voidhash/tsconfig": "0.0.2"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
30
|
"effect": "^3.19.12",
|
|
31
|
-
"@voidhash/mimic": "0.0.
|
|
31
|
+
"@voidhash/mimic": "0.0.2"
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
34
|
"build": "tsdown",
|
package/src/MimicServer.ts
CHANGED
|
@@ -328,7 +328,7 @@ export const layerHttpLayerRouter = <TSchema extends Primitive.AnyPrimitive>(
|
|
|
328
328
|
/** Custom storage layer. Defaults to InMemoryDataStorage. */
|
|
329
329
|
readonly storageLayer?: Layer.Layer<MimicDataStorageTag>;
|
|
330
330
|
}
|
|
331
|
-
)
|
|
331
|
+
) => {
|
|
332
332
|
// Build the base path pattern for WebSocket routes
|
|
333
333
|
// Append /doc/* to match /basePath/doc/{documentId}
|
|
334
334
|
const basePath = options.basePath ?? "/mimic";
|