@evolu/relay 1.1.2-preview.5 → 4.0.0

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/Dockerfile DELETED
@@ -1,27 +0,0 @@
1
- FROM node:22-alpine
2
-
3
- ARG RELAY_VERSION=latest
4
-
5
- # Install required dependencies and create non-root user
6
- RUN apk add --no-cache wget && \
7
- addgroup --system --gid 1001 nodejs && \
8
- adduser --system --uid 1001 evolu --ingroup nodejs && \
9
- npm install -g @evolu/relay@${RELAY_VERSION} && \
10
- mkdir -p /app/data && \
11
- chown -R evolu:nodejs /app
12
-
13
- WORKDIR /app
14
- USER evolu
15
-
16
- ENV RELAY_PORT=4000 \
17
- RELAY_NAME=evolu-relay \
18
- RELAY_ENABLE_LOGGING=false \
19
- NODE_ENV=production \
20
- LOG_LEVEL=error
21
-
22
- EXPOSE ${RELAY_PORT}
23
-
24
- HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \
25
- CMD wget --no-verbose --tries=1 --spider http://localhost:${RELAY_PORT}
26
-
27
- CMD ["sh", "-c", "npx @evolu/relay@${RELAY_VERSION} start --port $RELAY_PORT --name $RELAY_NAME $([ \"$RELAY_ENABLE_LOGGING\" = \"true\" ] && echo --enable-logging)"]
package/README.docker.md DELETED
@@ -1,154 +0,0 @@
1
- # Evolu Relay - Docker Setup
2
-
3
- Docker configuration for the Evolu Relay.
4
-
5
- ## 🚀 Quick Start for Developers
6
-
7
- **Just one command to get started:**
8
-
9
- ```bash
10
- cd apps/relay
11
- pnpm docker:up
12
- ```
13
-
14
- That's it! This will:
15
-
16
- - ✅ Automatically build the Docker image
17
- - ✅ Start the Evolu Relay service
18
- - ✅ Show real-time logs
19
- - ✅ Make the service available at `http://localhost:4000`
20
-
21
- Press `Ctrl+C` to stop the service.
22
-
23
- ### Background Mode (Optional)
24
-
25
- ```bash
26
- cd apps/relay
27
-
28
- # Start in background
29
- pnpm docker:up:detached
30
-
31
- # View logs when needed
32
- pnpm docker:logs
33
-
34
- # Stop when done
35
- pnpm docker:down
36
- ```
37
-
38
- ## 🔧 Advanced Usage
39
-
40
- ### All Available Commands
41
-
42
- | Command | Description | Auto-builds? | Persistence |
43
- | ------------------------- | ---------------------------------------------- | ------------ | ------------ |
44
- | `pnpm docker:up` | **Recommended**: Start in foreground with logs | ✅ Yes | Named volume |
45
- | `pnpm docker:up:detached` | Start in background | ✅ Yes | Named volume |
46
- | `pnpm docker:down` | Stop services | N/A | N/A |
47
- | `pnpm docker:restart` | Restart with rebuild | ✅ Yes | Named volume |
48
- | `pnpm docker:logs` | View logs (live) | N/A | N/A |
49
- | `pnpm docker:shell` | Access running container shell | N/A | N/A |
50
- | `pnpm docker:stats` | View container resource usage | N/A | N/A |
51
- | `pnpm docker:inspect` | View container details | N/A | N/A |
52
- | `pnpm docker:build` | Build image only | N/A | N/A |
53
- | `pnpm docker:clean` | Clean up containers and images | N/A | N/A |
54
- | `pnpm docker:clean:all` | **Full cleanup**: Remove everything | N/A | N/A |
55
-
56
- ### Manual Docker Commands (Alternative)
57
-
58
- ```bash
59
- # Build manually
60
- docker-compose build
61
-
62
- # Run with Docker Compose
63
- docker-compose up --build
64
-
65
- # Run directly with Docker
66
- docker run -p 4000:4000 evolu/relay:latest
67
- ```
68
-
69
- ## ❓ FAQ
70
-
71
- **Q: Do I need to build the image first?**
72
- A: No! `pnpm docker:up` automatically builds and starts everything.
73
-
74
- **Q: How do I update after code changes?**
75
- A: Just run `pnpm docker:restart` or stop and start again.
76
-
77
- **Q: How do I know if it's working?**
78
- A: Check `http://localhost:4000` - you should get a "426 Upgrade Required" response (this is correct for WebSocket servers).
79
-
80
- **Q: How do I see what's happening?**
81
- A: Use `pnpm docker:logs` to view live logs.
82
-
83
- **Q: How do I access the container?**
84
- A: Use `pnpm docker:shell` to get shell access inside the running container.
85
-
86
- **Q: How do I clean up everything?**
87
- A: Run `pnpm docker:clean:all` to remove all containers, images, and networks.
88
-
89
- ## 📁 Docker Files
90
-
91
- - `Dockerfile` - Multi-stage Docker build configuration
92
- - `docker-compose.yml` - Docker Compose configuration with health checks
93
- - `.dockerignore` - Files to exclude from Docker build context
94
-
95
- ## ⚙️ Configuration
96
-
97
- - **Port**: 4000 (modify in `docker-compose.yml` if needed)
98
- - **Environment**: `NODE_ENV=production` in Docker
99
- - **Health Check**: Built-in health monitoring via Docker Compose
100
- - **Data Persistence**: SQLite database automatically persists via Docker volumes
101
-
102
- ### Container Details
103
-
104
- | Component | Value | Description |
105
- | ------------------ | --------------------- | ---------------------------------- |
106
- | **Container Name** | `evolu-relay-server` | Easy identification |
107
- | **Image Name** | `evolu/relay:latest` | Tagged for production deployment |
108
- | **Network** | `evolu-relay-network` | Isolated Docker network |
109
- | **Volume** | `evolu-relay-data` | Persistent SQLite database storage |
110
- | **User** | `evolu:nodejs` (1001) | Non-root user for security |
111
- | **Memory Limit** | 1GB | Resource constraint |
112
- | **CPU Limit** | 1.0 | CPU resource constraint |
113
-
114
- ## 🚨 Troubleshooting
115
-
116
- | Issue | Solution |
117
- | ------------------------ | ---------------------------------------------------------- |
118
- | Build fails | Run `pnpm docker:clean:all` and try again |
119
- | Port already in use | Change port in `docker-compose.yml` or stop other services |
120
- | Container won't start | Check logs with `pnpm docker:logs` |
121
- | Need container access | Use `pnpm docker:shell` for interactive shell |
122
- | Performance issues | Check resources with `pnpm docker:stats` |
123
- | Need to reset everything | Run `pnpm docker:clean:all` |
124
-
125
- ## 🔍 Monitoring & Debugging
126
-
127
- ### Real-time Monitoring
128
-
129
- ```bash
130
- # View live logs
131
- pnpm docker:logs
132
-
133
- # Monitor resource usage
134
- pnpm docker:stats
135
-
136
- # Container details
137
- pnpm docker:inspect
138
-
139
- # Access container shell
140
- pnpm docker:shell
141
- ```
142
-
143
- ### Inside Container Commands
144
-
145
- ```bash
146
- # Access container
147
- pnpm docker:shell
148
-
149
- # Then inside container:
150
- ls -la /app/apps/relay/data/ # View database files
151
- ps aux # Check running processes
152
- top # Monitor resource usage
153
- netstat -tlnp # Check port bindings
154
- ```
package/data/.gitkeep DELETED
@@ -1,2 +0,0 @@
1
- # This directory is used for persistent SQLite database storage in production deployments
2
- # The .gitkeep file ensures this directory exists in git while ignoring its contents
package/dist/package.json DELETED
@@ -1,41 +0,0 @@
1
- {
2
- "name": "@evolu/relay",
3
- "version": "1.1.2-preview.5",
4
- "type": "module",
5
- "bin": {
6
- "@evolu/relay": "dist/src/cli.js"
7
- },
8
- "scripts": {
9
- "dev": "tsx --watch src/cli.ts -- start",
10
- "build": "shx rm -rf dist && tsc",
11
- "start": "node dist/src/cli.js",
12
- "clean": "shx rm -rf .turbo node_modules dist db.sqlite",
13
- "docker:build": "docker-compose build --no-cache",
14
- "docker:up": "docker-compose up --build",
15
- "docker:up:detached": "docker-compose up -d --build",
16
- "docker:down": "docker-compose down -v",
17
- "docker:restart": "docker-compose down && docker-compose up --build",
18
- "docker:logs": "docker-compose logs -f evolu-relay",
19
- "docker:shell": "docker exec -it evolu-relay-server sh",
20
- "docker:inspect": "docker inspect evolu-relay-server",
21
- "docker:stats": "docker stats evolu-relay-server",
22
- "docker:clean": "docker-compose down -v && docker system prune -f",
23
- "docker:clean:all": "docker-compose down -v && docker system prune -af && docker volume prune -f"
24
- },
25
- "dependencies": {
26
- "@evolu/common": "workspace:*",
27
- "@evolu/nodejs": "workspace:*",
28
- "commander": "^14.0.1"
29
- },
30
- "devDependencies": {
31
- "@evolu/tsconfig": "workspace:*",
32
- "@types/node": "^22.17.1",
33
- "typescript": "^5.9.2"
34
- },
35
- "engines": {
36
- "node": ">=22.0.0"
37
- },
38
- "publishConfig": {
39
- "access": "public"
40
- }
41
- }
package/dist/src/cli.d.ts DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=cli.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
package/dist/src/cli.js DELETED
@@ -1,43 +0,0 @@
1
- #!/usr/bin/env node
2
- import { Command, Option } from "commander";
3
- import packageJson from "../package.json" with { type: "json" };
4
- import { logger } from "./logger.js";
5
- import { startNodeJsRelay } from "./nodejs.js";
6
- import { cliParams } from "./params.js";
7
- function main() {
8
- const program = new Command()
9
- .name("@evolu/relay")
10
- .description("Evolu Relay server")
11
- .version(packageJson.version || "1.0.0", "-v, --version", "display the version number");
12
- program
13
- .command("start")
14
- .description("start the relay server")
15
- .addOption(new Option("-n, --name <name>", "database name").default("evolu-relay"))
16
- .addOption(new Option("-l, --enable-logging", "enable logging").default(false))
17
- .addOption(new Option("-p, --port <number>", "port to listen on")
18
- .default(4000)
19
- .argParser(Number))
20
- // .addOption(
21
- // new Option("--platform <platform>", "platform")
22
- // .choices(["nodejs", "bun"])
23
- // .default("nodejs"),
24
- // )
25
- .action(async (options) => {
26
- logger.enabled = true;
27
- const params = cliParams.fromUnknown(options);
28
- logger.log("Evolu Relay", packageJson.version);
29
- if (!params.ok) {
30
- logger.error(params.error.reason);
31
- process.exit(1);
32
- }
33
- try {
34
- await startNodeJsRelay(params.value);
35
- }
36
- catch (error) {
37
- logger.error(error);
38
- process.exit(1);
39
- }
40
- });
41
- program.parse();
42
- }
43
- main();
@@ -1,2 +0,0 @@
1
- export declare const logger: import("@evolu/common").Console;
2
- //# sourceMappingURL=logger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,MAAM,iCAAkB,CAAC"}
@@ -1,4 +0,0 @@
1
- import { createConsole } from "@evolu/common";
2
- // TODO: use createConsoleWithTime after release
3
- // export const logger = createConsoleWithTime({ timestampType: "absolute" });
4
- export const logger = createConsole();
@@ -1,3 +0,0 @@
1
- import { CliParams } from "./params.js";
2
- export declare function startNodeJsRelay(options: CliParams): Promise<void>;
3
- //# sourceMappingURL=nodejs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nodejs.d.ts","sourceRoot":"","sources":["../../src/nodejs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBxE"}
@@ -1,24 +0,0 @@
1
- import { createNodeJsRelay } from "@evolu/nodejs";
2
- import { mkdirSync } from "fs";
3
- import { once } from "node:events";
4
- import { logger } from "./logger.js";
5
- export async function startNodeJsRelay(options) {
6
- // Ensure the database is created in a predictable location for Docker.
7
- mkdirSync("data", { recursive: true });
8
- process.chdir("data");
9
- if (options.enableLogging) {
10
- logger.enabled = true;
11
- }
12
- const relay = await createNodeJsRelay({ console: logger })({
13
- port: options.port,
14
- enableLogging: options.enableLogging,
15
- name: options.name,
16
- });
17
- await Promise.race([
18
- once(process, "SIGINT"), // Ctrl-C
19
- once(process, "SIGTERM"), // OS/k8s/etc requested termination
20
- ]);
21
- logger.enabled = true;
22
- logger.log("Shutting down relay server");
23
- relay[Symbol.dispose]();
24
- }
@@ -1,7 +0,0 @@
1
- export declare const cliParams: import("@evolu/common").ObjectType<{
2
- name: import("@evolu/common").BrandType<import("@evolu/common").Type<"String", string, string, import("@evolu/common").StringError, string, import("@evolu/common").StringError>, "SimpleName", import("@evolu/common").RegexError<"SimpleName">, import("@evolu/common").StringError>;
3
- enableLogging: import("@evolu/common").Type<"Boolean", boolean, boolean, import("@evolu/common").BooleanError, boolean, import("@evolu/common").BooleanError>;
4
- port: import("@evolu/common").Type<"Number", number, number, import("@evolu/common").NumberError, number, import("@evolu/common").NumberError>;
5
- }>;
6
- export type CliParams = typeof cliParams.Type;
7
- //# sourceMappingURL=params.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../src/params.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS;;;;EAIpB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,IAAI,CAAC"}
@@ -1,6 +0,0 @@
1
- import { Boolean, Number, object, SimpleName } from "@evolu/common";
2
- export const cliParams = object({
3
- name: SimpleName,
4
- enableLogging: Boolean,
5
- port: Number,
6
- });
@@ -1,60 +0,0 @@
1
- services:
2
- evolu-relay:
3
- container_name: evolu-relay-server
4
- image: evolu/relay:latest
5
- build:
6
- context: .
7
- dockerfile: Dockerfile
8
- tags:
9
- - evolu/relay:latest
10
- ports:
11
- - "${RELAY_PORT:-4000}:${RELAY_PORT:-4000}"
12
- volumes:
13
- # Use named volume by default, can be overridden with bind mount if needed
14
- - evolu-relay-data:/app/data
15
- environment:
16
- - NODE_ENV=${NODE_ENV:-production}
17
- - LOG_LEVEL=${LOG_LEVEL:-error}
18
- - RELAY_NAME=${RELAY_NAME:-evolu-relay}
19
- - RELAY_PORT=${RELAY_PORT:-4000}
20
- - RELAY_ENABLE_LOGGING=${RELAY_ENABLE_LOGGING:-false}
21
- restart: unless-stopped
22
- deploy:
23
- resources:
24
- limits:
25
- memory: ${MEMORY_LIMIT:-1G}
26
- cpus: ${CPU_LIMIT:-1.0}
27
- reservations:
28
- memory: ${MEMORY_RESERVED:-512M}
29
- cpus: ${CPU_RESERVED:-0.5}
30
- healthcheck:
31
- test:
32
- [
33
- "CMD",
34
- "wget",
35
- "--no-verbose",
36
- "--tries=1",
37
- "--spider",
38
- "http://localhost:4000",
39
- ]
40
- interval: 30s
41
- timeout: 5s
42
- retries: 3
43
- start_period: 30s
44
- logging:
45
- driver: "json-file"
46
- options:
47
- max-size: ${LOG_MAX_SIZE:-50m}
48
- max-file: ${LOG_MAX_FILES:-5}
49
- networks:
50
- - evolu-network
51
-
52
- volumes:
53
- evolu-relay-data:
54
- driver: local
55
- name: evolu-relay-data
56
-
57
- networks:
58
- evolu-network:
59
- name: evolu-relay-network
60
- driver: bridge
package/src/cli.ts DELETED
@@ -1,59 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import { Command, Option } from "commander";
4
- import packageJson from "../package.json" with { type: "json" };
5
- import { logger } from "./logger.js";
6
- import { startNodeJsRelay } from "./nodejs.js";
7
- import { cliParams } from "./params.js";
8
-
9
- function main() {
10
- const program = new Command()
11
- .name("@evolu/relay")
12
- .description("Evolu Relay server")
13
- .version(
14
- packageJson.version || "1.0.0",
15
- "-v, --version",
16
- "display the version number",
17
- );
18
-
19
- program
20
- .command("start")
21
- .description("start the relay server")
22
- .addOption(
23
- new Option("-n, --name <name>", "database name").default("evolu-relay"),
24
- )
25
- .addOption(
26
- new Option("-l, --enable-logging", "enable logging").default(false),
27
- )
28
- .addOption(
29
- new Option("-p, --port <number>", "port to listen on")
30
- .default(4000)
31
- .argParser(Number),
32
- )
33
- // .addOption(
34
- // new Option("--platform <platform>", "platform")
35
- // .choices(["nodejs", "bun"])
36
- // .default("nodejs"),
37
- // )
38
- .action(async (options: unknown) => {
39
- logger.enabled = true;
40
- const params = cliParams.fromUnknown(options);
41
- logger.log("Evolu Relay", packageJson.version);
42
-
43
- if (!params.ok) {
44
- logger.error(params.error.reason);
45
- process.exit(1);
46
- }
47
-
48
- try {
49
- await startNodeJsRelay(params.value);
50
- } catch (error: unknown) {
51
- logger.error(error);
52
- process.exit(1);
53
- }
54
- });
55
-
56
- program.parse();
57
- }
58
-
59
- main();
package/src/logger.ts DELETED
@@ -1,5 +0,0 @@
1
- import { createConsole } from "@evolu/common";
2
-
3
- // TODO: use createConsoleWithTime after release
4
- // export const logger = createConsoleWithTime({ timestampType: "absolute" });
5
- export const logger = createConsole();
package/src/nodejs.ts DELETED
@@ -1,30 +0,0 @@
1
- import { createNodeJsRelay } from "@evolu/nodejs";
2
- import { mkdirSync } from "fs";
3
- import { once } from "node:events";
4
- import { logger } from "./logger.js";
5
- import { CliParams } from "./params.js";
6
-
7
- export async function startNodeJsRelay(options: CliParams): Promise<void> {
8
- // Ensure the database is created in a predictable location for Docker.
9
- mkdirSync("data", { recursive: true });
10
- process.chdir("data");
11
-
12
- if (options.enableLogging) {
13
- logger.enabled = true;
14
- }
15
-
16
- const relay = await createNodeJsRelay({ console: logger })({
17
- port: options.port,
18
- enableLogging: options.enableLogging,
19
- name: options.name,
20
- });
21
-
22
- await Promise.race([
23
- once(process, "SIGINT"), // Ctrl-C
24
- once(process, "SIGTERM"), // OS/k8s/etc requested termination
25
- ]);
26
-
27
- logger.enabled = true;
28
- logger.log("Shutting down relay server");
29
- relay[Symbol.dispose]();
30
- }
package/src/params.ts DELETED
@@ -1,9 +0,0 @@
1
- import { Boolean, Number, object, SimpleName } from "@evolu/common";
2
-
3
- export const cliParams = object({
4
- name: SimpleName,
5
- enableLogging: Boolean,
6
- port: Number,
7
- });
8
-
9
- export type CliParams = typeof cliParams.Type;
package/tsconfig.json DELETED
@@ -1,10 +0,0 @@
1
- {
2
- "extends": "@evolu/tsconfig/universal-esm.json",
3
- "compilerOptions": {
4
- "outDir": "dist",
5
- "module": "nodenext",
6
- "resolveJsonModule": true
7
- },
8
- "include": ["src"],
9
- "exclude": ["node_modules"]
10
- }