Elasticsearch
Lightweight, dependency-free Elasticsearch emulator speaking the REST API over HTTP/JSON.
| Key | Value |
|---|---|
| Port | 9200 |
| Protocol | REST API (HTTP + JSON) |
| Size | ~90 KB |
| Startup | fast |
Default Connection
http://parlel-bridge:9200
Supported Operations
| Operation | Request |
|---|---|
| Cluster health | GET /_cluster/health |
| Create index | PUT /{index} |
| Delete index | DELETE /{index} |
| Index a document | PUT/POST /{index}/_doc/{id} |
| Get a document | GET /{index}/_doc/{id} |
| Delete a document | DELETE /{index}/_doc/{id} |
| Search | GET/POST /{index}/_search |
Usage
The parlel/bridge sidecar exposes Elasticsearch at http://parlel-bridge:9200,
carrying the REST (HTTP/JSON) protocol over the sandbox HTTPS preview proxy. Your
app connects with an unmodified HTTP / @elastic/elasticsearch client — no
Parlel code in the app.
# docker-compose.test.yml
include:
- path: parlel-bridge.yml # image: parlel/bridge
services:
app:
build: .
env_file: test.env
depends_on:
parlel-bridge: { condition: service_healthy }
PARLEL_API_KEY=pk_... docker compose -f docker-compose.test.yml up
// Unmodified real client, pointed at the bridge hostname
// (or `localhost` if you run the bridge outside Docker and publish ports)
const base = "http://parlel-bridge:9200";
await fetch(`${base}/products`, { method: "PUT" });
await fetch(`${base}/products/_doc/1`, {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: "Widget", price: 9.99 }),
});
const res = await fetch(`${base}/products/_search`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ query: { match_all: {} } }),
});
Or with the official client:
import { Client } from "@elastic/elasticsearch";
const es = new Client({ node: "http://parlel-bridge:9200" });
await es.search({ index: "products", query: { match_all: {} } });
Surface coverage
This emulator faithfully replicates the API surface most application code and agents exercise. Anything below the supported lines is either an intentional design choice for a fast, zero-cost local emulator (✓ By design) or a candidate for a future release (⟳ Roadmap) — never a silent inaccuracy.
Legend: ✅ fully supported · ◐ accepted (stored, not strictly enforced) · ✓ by design · ⟳ on the roadmap.
| Feature | Status |
|---|---|
| Index + document CRUD | Supported |
match_all / basic search | Supported |
| Complex query DSL / aggregations | Not evaluated |
| Mappings / analyzers | Accepted, not enforced |
Configuration — test.env
Copy these into your test.env (used by the bridge sidecar flow). Tokens are Parlel's seeded test credentials — any non-empty value is accepted by the emulator, so you rarely need to change them. Swap in real credentials only when pointing at the live service in prod.env.
ELASTIC_PASSWORD=parlel
xpack.security.enabled=false
<!-- parlel:testenv:end -->