// src/testing/deterministic/deterministic-test-backend-gatt.ts import type { BackendConnection, BackendSubscription, GattBackend } from '../../backend-contract/backend' import type { CharacteristicPath, DescriptorPath } from '../../backend-contract/gatt' import type { BackendOperationDispatch, OperationOptions, OperationTerminalRecord, ReadRequest, ReadResult, SubscribeRequest, WriteRequest, WriteResult } from '../../backend-contract/operations' export interface DeterministicGattRuntime { discover( connection: BackendConnection, options: import('../../backend-contract/operations').PublicOperationOptions ): Promise> read< Connection extends string, Database extends string, Service extends string, Characteristic extends string, Operation extends string >( path: CharacteristicPath, request: ReadRequest ): Promise> write< Connection extends string, Database extends string, Service extends string, Characteristic extends string, Operation extends string >( path: CharacteristicPath, request: WriteRequest ): Promise> readDescriptor< Connection extends string, Database extends string, Service extends string, Characteristic extends string, Descriptor extends string, Operation extends string >( path: DescriptorPath, request: ReadRequest ): Promise> writeDescriptor< Connection extends string, Database extends string, Service extends string, Characteristic extends string, Descriptor extends string, Operation extends string >( path: DescriptorPath, request: WriteRequest ): Promise> subscribeFromBackend< Connection extends string, Database extends string, Service extends string, Characteristic extends string, Operation extends string >( path: CharacteristicPath, request: SubscribeRequest ): Promise> unsubscribeFromBackend< Connection extends string, Database extends string, Service extends string, Characteristic extends string, Operation extends string >( subscription: BackendSubscription, operation: OperationOptions ): Promise> createBackendOperationDispatch( operation: OperationOptions, start: (operation: OperationOptions) => Promise ): BackendOperationDispatch } export function createDeterministicGattBackend(runtime: DeterministicGattRuntime): GattBackend { return { discover: async ( connection: BackendConnection, options: import('../../backend-contract/operations').PublicOperationOptions ) => runtime.discover(connection, options), read: < Connection extends string, Database extends string, Service extends string, Characteristic extends string, Operation extends string >( path: CharacteristicPath, request: ReadRequest ) => runtime.createBackendOperationDispatch(request.operation, operation => runtime.read(path, { operation })), write: < Connection extends string, Database extends string, Service extends string, Characteristic extends string, Operation extends string >( path: CharacteristicPath, request: WriteRequest ) => runtime.createBackendOperationDispatch(request.operation, operation => runtime.write(path, { ...request, operation }) ), readDescriptor: < Connection extends string, Database extends string, Service extends string, Characteristic extends string, Descriptor extends string, Operation extends string >( path: DescriptorPath, request: ReadRequest ) => runtime.createBackendOperationDispatch(request.operation, operation => runtime.readDescriptor(path, { operation }) ), writeDescriptor: < Connection extends string, Database extends string, Service extends string, Characteristic extends string, Descriptor extends string, Operation extends string >( path: DescriptorPath, request: WriteRequest ) => runtime.createBackendOperationDispatch(request.operation, operation => runtime.writeDescriptor(path, { ...request, operation }) ), subscribe: < Connection extends string, Database extends string, Service extends string, Characteristic extends string, Operation extends string >( path: CharacteristicPath, request: SubscribeRequest ) => runtime.createBackendOperationDispatch(request.operation, operation => runtime.subscribeFromBackend(path, { ...request, operation }) ), unsubscribe: < Connection extends string, Database extends string, Service extends string, Characteristic extends string, Operation extends string >( subscription: BackendSubscription, operation: OperationOptions ) => runtime.createBackendOperationDispatch(operation, dispatchedOperation => runtime.unsubscribeFromBackend(subscription, dispatchedOperation) ) } }