aboutsummaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'README.md')
-rw-r--r--README.md273
1 files changed, 273 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..4e9b0b1
--- /dev/null
+++ b/README.md
@@ -0,0 +1,273 @@
+# JCHAT - JMAP-based Chat Protocol and Implementation
+
+JCHAT is a chat protocol built on top of JMAP (JSON Meta Application Protocol) [RFC8620], providing real-time messaging capabilities with efficient synchronization and push notifications.
+
+## Project Structure
+
+```
+jchat/
+├── draft-jchat-00.txt # RFC draft specification
+├── rfc8620.txt # Base JMAP RFC for reference
+├── server/ # Erlang/OTP server implementation
+│ ├── src/ # Server source code
+│ ├── test/ # Comprehensive test suite
+│ ├── config/ # Configuration files
+│ ├── rebar.config # Build configuration
+│ └── Makefile # Build automation
+└── client/ # HTML/JavaScript web client
+ ├── index.html # Main client interface
+ ├── jmap-client.js # JMAP client library
+ ├── app.js # Application logic
+ └── package.json # Project metadata
+```
+
+## Features
+
+### Protocol Features (JCHAT RFC)
+- **Conversations**: Group messaging with metadata and participant management
+- **Messages**: Rich text messages with attachments, replies, and reactions
+- **Participants**: User roles, permissions, and presence management
+- **Real-time Updates**: Push notifications and efficient delta synchronization
+- **Standards Compliant**: Built on proven JMAP foundation
+
+### Server Implementation
+- **Erlang/OTP**: Fault-tolerant, concurrent server architecture
+- **Mnesia Database**: Built-in distributed database for persistence
+- **HTTP API**: RESTful JMAP endpoints with JSON serialization
+- **Push Notifications**: Server-Sent Events for real-time updates
+- **Comprehensive Testing**: Unit, property-based, and performance tests
+
+### Web Client
+- **Modern UI**: Responsive design with conversation list and chat interface
+- **Real-time Messaging**: Live message updates and typing indicators
+- **Cross-platform**: Works in any modern web browser
+- **JMAP Integration**: Native support for JMAP protocol features
+
+## Quick Start
+
+### Prerequisites
+- Erlang/OTP 24+ (for server)
+- Any HTTP server for client (shttpd, Python, nginx, etc.)
+- rebar3 (Erlang build tool)
+
+### Running the Server
+
+```bash
+cd server
+make compile
+make run
+```
+
+The server will start on http://localhost:8080 with the following endpoints:
+- `GET /jmap/session` - JMAP session information
+- `POST /jmap/api` - JMAP method calls
+- `GET /jmap/eventsource` - Server-Sent Events for push notifications
+
+### Running the Client
+
+The client is a dependency-free web application built with vanilla HTML, CSS, and JavaScript.
+
+#### Quick Start (no installation required)
+
+Using shttpd (recommended):
+```bash
+cd client
+shttpd . --port 3000
+```
+
+Using Python:
+```bash
+cd client
+python3 -m http.server 3000
+```
+
+Using any web server:
+```bash
+cd client
+# Point nginx, Apache, or any HTTP server to this directory
+```
+
+The client will be available at http://localhost:3000
+
+## Testing
+
+### Server Tests
+```bash
+cd server
+make test # Run all tests
+make test-unit # Unit tests only
+make test-prop # Property-based tests
+make test-perf # Performance tests
+```
+
+### Manual Testing
+1. Start the server: `cd server && make run`
+2. Start the client: `cd client && shttpd . --port 3000`
+3. Open http://localhost:3000 in your browser
+4. The client will automatically connect to the server
+
+## API Examples
+
+### Create a Conversation
+```javascript
+const conversation = await jmapClient.createConversation({
+ title: "Project Discussion",
+ participantIds: ["user1", "user2", "user3"]
+});
+```
+
+### Send a Message
+```javascript
+const message = await jmapClient.sendMessage(
+ conversationId,
+ "Hello, everyone!",
+ "text/plain"
+);
+```
+
+### Query Messages
+```javascript
+const messages = await jmapClient.queryMessages({
+ inConversation: conversationId,
+ after: "2025-08-15T10:00:00Z"
+});
+```
+
+## Architecture
+
+### JMAP Foundation
+JCHAT extends JMAP with chat-specific object types:
+- **Conversation**: Container for messages and participants
+- **Message**: Individual chat messages with rich metadata
+- **Participant**: User membership in conversations
+- **Presence**: User availability and status information
+
+### Server Architecture
+```
+┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
+│ HTTP Layer │────│ JMAP Methods │────│ Data Layer │
+│ (Cowboy) │ │ (Conversations, │ │ (Mnesia) │
+│ │ │ Messages, etc) │ │ │
+└─────────────────┘ └──────────────────┘ └─────────────────┘
+ │ │ │
+ │ ┌────────────────┐ │
+ └──────────────│ Push Manager │───────────────┘
+ │ (Server-Sent │
+ │ Events) │
+ └────────────────┘
+```
+
+### Client Architecture
+```
+┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
+│ UI Layer │────│ Application │────│ JMAP Client │
+│ (HTML/CSS) │ │ Logic │ │ Library │
+│ │ │ (JChatApp) │ │ (JMAPClient) │
+└─────────────────┘ └──────────────────┘ └─────────────────┘
+ │ │
+ │ ┌────────────────┐
+ └──────────────│ Server API │
+ │ (HTTP/JSON) │
+ └────────────────┘
+```
+
+## Protocol Details
+
+### JMAP Capability
+```
+"urn:ietf:params:jmap:chat"
+```
+
+### Core Methods
+- `Conversation/get`, `Conversation/set`, `Conversation/query`, `Conversation/changes`
+- `Message/get`, `Message/set`, `Message/query`, `Message/changes`
+- `Participant/get`, `Participant/set`, `Participant/changes`
+- `Presence/get`, `Presence/set`
+
+### Example JMAP Request
+```json
+{
+ "using": ["urn:ietf:params:jmap:core", "urn:ietf:params:jmap:chat"],
+ "methodCalls": [
+ ["Conversation/query", {
+ "accountId": "primary",
+ "sort": [{"property": "lastMessageAt", "isAscending": false}]
+ }, "c1"],
+ ["Message/query", {
+ "accountId": "primary",
+ "filter": {"inConversation": "#c1/ids/0"},
+ "sort": [{"property": "sentAt", "isAscending": true}]
+ }, "c2"]
+ ]
+}
+```
+
+## Development
+
+### Server Development
+- Add new JMAP methods in `src/jchat_methods.erl`
+- Extend data models in `src/jchat.hrl`
+- Database operations in `src/jchat_db.erl`
+- Add tests in `test/` directory
+
+### Client Development
+- UI components in `index.html` and CSS
+- JMAP protocol handling in `jmap-client.js`
+- Application logic in `app.js`
+- Build with any modern JavaScript toolchain
+
+### Testing Strategy
+1. **Unit Tests**: Individual function testing
+2. **Integration Tests**: Full JMAP request/response cycles
+3. **Property Tests**: Randomized testing with PropEr
+4. **Performance Tests**: Load testing and benchmarks
+5. **Manual Tests**: End-to-end user scenarios
+
+## Deployment
+
+### Production Server
+```bash
+cd server
+make release
+_build/prod/rel/jchat/bin/jchat start
+```
+
+### Docker Deployment
+```bash
+# Build server image
+cd server
+docker build -t jchat-server .
+
+# Build client image
+cd client
+docker build -t jchat-client .
+
+# Run with docker-compose
+docker-compose up
+```
+
+## Contributing
+
+1. Read the JCHAT RFC draft (`draft-jchat-00.txt`)
+2. Follow Erlang/OTP conventions for server code
+3. Use modern JavaScript practices for client code
+4. Add tests for all new features
+5. Update documentation as needed
+
+## Standards Compliance
+
+- **RFC 8620**: JSON Meta Application Protocol (JMAP)
+- **RFC 8259**: JSON Data Interchange Format
+- **RFC 3339**: Date and Time on the Internet
+- **RFC 7231**: HTTP/1.1 Semantics and Content
+
+## License
+
+This project is licensed under the MIT License - see the LICENSE file for details.
+
+## References
+
+- [RFC 8620 - JMAP](https://tools.ietf.org/html/rfc8620)
+- [JMAP Specifications](https://jmap.io/spec.html)
+- [Erlang/OTP Documentation](https://erlang.org/doc/)
+- [Modern Web Standards](https://developer.mozilla.org/)