mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-03-23 09:30:59 +01:00
173 lines
5.1 KiB
Markdown
173 lines
5.1 KiB
Markdown
# WebSocket Builder Reorganization - Complete
|
|
|
|
## ✅ Changes Made
|
|
|
|
The `IWebSocketResponseBuilder` interface has been moved and reorganized to follow the WireMock.Net architecture patterns correctly.
|
|
|
|
### **Before** ❌
|
|
- Location: `src/WireMock.Net.Abstractions/BuilderExtensions/IWebSocketResponseBuilder.cs`
|
|
- Returned: `IWebSocketResponseBuilder` (not chainable with other builders)
|
|
- Pattern: Isolated builder (didn't integrate with response builder chain)
|
|
|
|
### **After** ✅
|
|
- Location: `src/WireMock.Net.Shared/ResponseBuilders/IWebSocketResponseBuilder.cs`
|
|
- Returns: `IResponseBuilder` (chainable with all other builders)
|
|
- Pattern: Follows `ICallbackResponseBuilder` model for consistency
|
|
|
|
---
|
|
|
|
## 🔧 Architecture Improvement
|
|
|
|
### New Chainable Pattern
|
|
|
|
Now you can seamlessly chain WebSocket builder with other response methods:
|
|
|
|
```csharp
|
|
// ✅ NEW: Fully chainable with other response methods
|
|
Response.Create()
|
|
.WithWebSocket(ws => ws
|
|
.WithMessage("Hello")
|
|
.WithJsonMessage(new { status = "ready" })
|
|
.WithTransformer()
|
|
.WithClose(1000)
|
|
)
|
|
.WithStatusCode(200) // Back to response builder!
|
|
.WithHeader("X-Custom", "value")
|
|
.WithDelay(TimeSpan.FromMilliseconds(100));
|
|
```
|
|
|
|
### Builder Flow
|
|
|
|
```
|
|
IResponseBuilder.WithWebSocket()
|
|
↓
|
|
Creates WebSocketResponseBuilder with reference to parent IResponseBuilder
|
|
↓
|
|
Each WebSocket method returns the parent IResponseBuilder
|
|
↓
|
|
Allows chaining back to other response methods
|
|
↓
|
|
Complete fluent chain!
|
|
```
|
|
|
|
---
|
|
|
|
## 📂 File Changes
|
|
|
|
### **Moved**
|
|
- ❌ Deleted: `src/WireMock.Net.Abstractions/BuilderExtensions/IWebSocketResponseBuilder.cs`
|
|
- ✅ Created: `src/WireMock.Net.Shared/ResponseBuilders/IWebSocketResponseBuilder.cs`
|
|
|
|
### **Updated**
|
|
- ✅ `src/WireMock.Net.Minimal/ResponseBuilders/WebSocketResponseBuilder.cs`
|
|
- Now accepts `IResponseBuilder` in constructor
|
|
- Returns `IResponseBuilder` from all methods
|
|
- Maintains reference to parent builder for chaining
|
|
|
|
- ✅ `src/WireMock.Net.Minimal/ResponseBuilders/Response.WithWebSocket.cs`
|
|
- Updated to use new chainable pattern
|
|
- Creates WebSocketResponseBuilder with `this` reference
|
|
- Correctly returns builder for method chaining
|
|
|
|
---
|
|
|
|
## 💡 Why This Matters
|
|
|
|
### Consistency
|
|
- Follows the same pattern as `ICallbackResponseBuilder`
|
|
- All response builders in `WireMock.Net.Shared` follow this pattern
|
|
- Developers familiar with WireMock.Net patterns will recognize it immediately
|
|
|
|
### Flexibility
|
|
- Users can mix WebSocket configuration with other response settings
|
|
- No longer limited to WebSocket-only chains
|
|
- Better integration with response builder ecosystem
|
|
|
|
### Cleaner Architecture
|
|
- Interfaces in `WireMock.Net.Shared` are implementation-agnostic
|
|
- Models stay in `WireMock.Net.Abstractions` (IWebSocketMessage, IWebSocketResponse)
|
|
- Builders stay in `WireMock.Net.Shared` (IWebSocketResponseBuilder)
|
|
- Implementations stay in `WireMock.Net.Minimal`
|
|
|
|
---
|
|
|
|
## 🎯 Namespace Organization
|
|
|
|
### WireMock.Net.Abstractions
|
|
```
|
|
Models/
|
|
├─ IWebSocketMessage.cs (Message interface)
|
|
└─ IWebSocketResponse.cs (Response interface)
|
|
```
|
|
|
|
### WireMock.Net.Shared
|
|
```
|
|
ResponseBuilders/
|
|
├─ ICallbackResponseBuilder.cs (Callback builder)
|
|
├─ IWebSocketResponseBuilder.cs (WebSocket builder) ✅ NEW
|
|
└─ ...other builders
|
|
```
|
|
|
|
### WireMock.Net.Minimal
|
|
```
|
|
ResponseBuilders/
|
|
├─ WebSocketMessage.cs (Implementation)
|
|
├─ WebSocketResponse.cs (Implementation)
|
|
├─ WebSocketResponseBuilder.cs (Implementation)
|
|
└─ Response.WithWebSocket.cs (Extension)
|
|
|
|
RequestBuilders/
|
|
└─ Request.WithWebSocket.cs (Extension)
|
|
```
|
|
|
|
---
|
|
|
|
## ✅ Compilation Status
|
|
|
|
- ✅ `IWebSocketResponseBuilder.cs` - 0 errors
|
|
- ✅ `WebSocketResponseBuilder.cs` - 0 errors
|
|
- ✅ `Response.WithWebSocket.cs` - 0 errors
|
|
|
|
All files compile successfully with the new chainable pattern!
|
|
|
|
---
|
|
|
|
## 📝 Usage Example
|
|
|
|
```csharp
|
|
// Complete chainable WebSocket configuration
|
|
var mapping = Request.Create()
|
|
.WithWebSocketPath("/api/stream")
|
|
.WithWebSocketSubprotocol("v1")
|
|
.RespondWith(Response.Create()
|
|
.WithWebSocket(ws => ws
|
|
.WithMessage("Starting stream")
|
|
.WithMessage("Data chunk 1", delayMs: 100)
|
|
.WithMessage("Data chunk 2", delayMs: 200)
|
|
.WithJsonMessage(new { status = "complete" }, delayMs: 300)
|
|
.WithTransformer(TransformerType.Handlebars)
|
|
.WithClose(1000, "Stream complete")
|
|
)
|
|
.WithStatusCode(101) // ✅ Can chain other methods
|
|
.WithHeader("Sec-WebSocket-Accept", "*")
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 Summary
|
|
|
|
| Aspect | Before | After |
|
|
|--------|--------|-------|
|
|
| **Location** | Abstractions | Shared |
|
|
| **Chainability** | ❌ Returns IWebSocketResponseBuilder | ✅ Returns IResponseBuilder |
|
|
| **Pattern** | Isolated | Integrated (like ICallbackResponseBuilder) |
|
|
| **Flexibility** | Limited | ✅ Full fluent chain support |
|
|
| **Architecture** | Non-standard | ✅ Follows WireMock.Net conventions |
|
|
|
|
---
|
|
|
|
**Status**: ✅ **Complete and Verified**
|
|
|
|
The WebSocket builder now follows WireMock.Net architecture best practices with full chainable support!
|