- Add type-explicit ToBinary/SerializeToBinary overloads to preserve runtime type info for object? serialization, fixing deserialization bugs. - Refactor VarUInt encoding/decoding to a prefix-tiered scheme (1–5 bytes), replacing LEB128 and preventing buffer overrun/corruption. - Update all SignalR and serialization call sites to use new overloads. - Sync SignalR binary protocol VarUInt decoding logic; fix test regressions. - Add SIGNALR_BINARY_PROTOCOL_VARUINT.md with new wire-format spec and rationale. - Add debug logging for argument serialization. - Update .gitignore to not ignore itself. - Resolves 65 KB value cap and missing in-band abort marker; requires both sender/receiver to use new framing for full compatibility. |
||
|---|---|---|
| .. | ||
| AcBinaryHubProtocol.cs | ||
| AcBinaryHubProtocolOptions.cs | ||
| AcHubConnectionOptions.cs | ||
| AcSignalRClientBase.cs | ||
| AcSignalRConnectionExtensions.cs | ||
| AcSignalRProtocolExtensions.cs | ||
| AcSignalRTags.cs | ||
| AyCodeBinaryHubProtocol.cs | ||
| BinaryProtocolMode.cs | ||
| IAcSignalRHubBase.cs | ||
| IAcSignalRHubClient.cs | ||
| ISignalParams.cs | ||
| README.md | ||
| SendToClientType.cs | ||
| SignalMessageTagAttribute.cs | ||
| SignalRCrudTags.cs | ||
| SignalRRequestModel.cs | ||
| SignalRSerializationHelper.cs | ||
README.md
SignalRs
Custom binary SignalR protocol, client infrastructure, message tagging, and serialization helpers.
Architecture: For full dispatch flow, tag system, and tech debt documentation see
AyCode.Services/docs/SIGNALR/README.md. Binary protocol: For wire format, zero-copy pipeline, and three-path read logic seeAyCode.Services/docs/SIGNALR_BINARY_PROTOCOL/README.md. Known issues:AyCode.Services/docs/SIGNALR/SIGNALR_ISSUES.md
Key Files
Protocol
AcBinaryHubProtocol.cs— Unsealed baseIHubProtocolreplacing JSON+Base64 withAcBinarySerializer. Handles all 9 SignalR message types. Write:BufferWriterBinaryOutputstandalone +AcBinarySerializer.Serialize(value, output)zero-copy to pipe.byte[]fast-path writes tag+VarUInt+bytes via BWO. Read:SequenceReader<byte>from pipe'sReadOnlySequence. Three-pathReadSingleArgument: byte[] fast-path (0x44 tag),IsRawBytesData(raw byte[]), typed deser viaSignalDataType._currentSignalParamscaptures arg[2] for type-aware arg[3] deserialization.AyCodeBinaryHubProtocol.cs— Derived protocol (currently empty). Exists for registration and future project-specific hooks. Register this instead ofAcBinaryHubProtocol.
Client
AcSignalRClientBase.cs— Abstract SignalR client managingHubConnection, request/response tracking via pooledSignalRRequestModel.SendCoreAsyncbuildsSignalParams(withIsRawBytesDatawhenT == byte[]). CRUD helpers (Post, Get, GetAll, GetAllInto). Configurable timeouts.IAcSignalRHubClient.cs— Client interface +SignalResponseDataMessage(sealed,RawResponseDataisobject?— typed object or byte[],GetResponseData<T>()direct cast). Legacy message types (IdMessage,SignalPostJsonDataMessage) marked[Obsolete].IAcSignalRHubBase.cs— Base hub interface:OnReceiveMessage(int messageTag, int? requestId, SignalParams signalParams, object data).ISignalParams.cs—ISignalParamsbase interface +SignalParams(Status, DataSerializerType, Parametersbyte[]?, SignalDataTypestring?, IsRawBytesDatabool). Metadata travels as separate hub argument (AcBinary serialized). Parameters and data are independent — both nullable in any direction.
Message Tagging
SignalMessageTagAttribute.cs— Three attributes:TagAttribute(base, int messageTag),SignalRAttribute(server method routing + client notification),SignalRSendToClientAttribute(client-side receive).AcSignalRTags.cs— Static constants:None,PingTag,EchoTag.SignalRCrudTags.cs— Sealed class bundling 5 independent CRUD tag integers.GetMessageTagByTrackingState()mapsTrackingState-> tag. SeeAyCode.Services.Server/docs/SIGNALR_DATASOURCE/README.md.SendToClientType.cs— Enum: None, Others, Caller, All.
Serialization & Pooling
SignalRSerializationHelper.cs— Static helpers:SerializeToBinary(),DeserializeFromBinary(), compressed JSON variants.SignalRRequestModel.cs— Poolable (IResettable) request tracking model withObjectPoolfor reuse.